Compare commits

..

No commits in common. 'master' and 'netcore2.2' have entirely different histories.

@ -1,51 +0,0 @@
# 该工作流用于构建 .NET 项目
# 更多信息参考https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
# 工作流名称
name: .NET
# 触发条件:指定事件触发工作流
on:
# 1. 当代码推送到 master 分支时触发
push:
branches: [ "master" ]
# 2. 当向 master 分支提交拉取请求PR时触发
pull_request:
branches: [ "master" ]
# 定义作业Job一个工作流可包含多个作业默认串行执行
jobs:
# 作业名称build构建
build:
# 作业运行环境:基于最新版 Ubuntu 系统
runs-on: ubuntu-latest
# 作业步骤:按顺序执行的具体操作
steps:
# 步骤1拉取代码仓库到运行环境
# 使用官方 actionactions/checkout@v4负责获取仓库源码
- uses: actions/checkout@v4
# 步骤2配置 .NET 环境
# 使用官方 actionactions/setup-dotnet@v4安装指定版本 .NET SDK
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
# 指定要安装的 .NET 版本9.0.x 表示最新的 9.0 系列版本)
dotnet-version: 9.0.x
# 步骤3还原项目依赖
# 执行 dotnet restore 命令,恢复项目所需的 NuGet 包
- name: Restore dependencies
run: dotnet restore ./src/KopSoftWms
# 步骤4构建项目
# 执行 dotnet build 命令构建项目,--no-restore 表示跳过依赖还原(已单独执行过)
- name: Build
run: dotnet build ./src/KopSoftWms --no-restore
# 步骤5测试项目已注释暂不执行
# 执行 dotnet test 命令运行单元测试,--no-build 表示跳过构建(已单独执行过)
# --verbosity normal 表示输出普通详细程度的日志
# - name: Test
# run: dotnet test ./src/KopSoftWms --no-build --verbosity normal

@ -1,4 +1,7 @@
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"version": "0.2.0",
"configurations": [
{
@ -6,7 +9,8 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/KopSoftWms/bin/Debug/net9.0/KopSoftWms.dll",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/src/KopSoftWms/bin/Debug/netcoreapp2.2/KopSoftWms.dll",
"args": [],
"cwd": "${workspaceFolder}/src/KopSoftWms",
"stopAtEntry": false,
@ -20,7 +24,6 @@
"/Views": "${workspaceFolder}/Views"
}
},
{
"name": ".NET Core Attach",
"type": "coreclr",

@ -0,0 +1,25 @@
USE master
go
if exists (select * from sysdatabases where name='KopSoftWms')
drop database KopSoftWms
go
create database KopSoftWms
on primary
(
name='KopSoftWms_data',
filename='D:\KopSoft\KopSoftWms\DB\KopSoftWms_data.mdf',
size=10MB,
maxsize=unlimited,
filegrowth=20%
)
log on
(
name='KopSoftWms_log',
filename='D:\KopSoft\KopSoftWms\DB\KopSoftWms_log.ldf',
size=10MB,
maxsize=unlimited,
filegrowth=20%
)
go

File diff suppressed because it is too large Load Diff

@ -0,0 +1,593 @@
/*
Navicat Premium Data Transfer
Source Server : local-mysql
Source Server Type : MySQL
Source Server Version : 50713
Source Host : localhost:3306
Source Schema : kopwms
Target Server Type : MySQL
Target Server Version : 50713
File Encoding : 65001
Date: 26/06/2019 21:34:05
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept` (
`DeptId` bigint(20) NOT NULL,
`DeptNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DeptName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`DeptId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for sys_dict
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict` (
`DictId` bigint(20) NOT NULL,
`DictNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DictName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DictType` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`DictId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for sys_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`LogId` bigint(20) NOT NULL,
`LogType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`Url` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Browser` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`LogIp` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`LogId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for sys_menu_wms
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu_wms`;
CREATE TABLE `sys_menu_wms` (
`MenuId` bigint(20) NOT NULL,
`MenuName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuUrl` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuIcon` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuParent` bigint(20) NULL DEFAULT NULL,
`Sort` int(11) NULL DEFAULT NULL,
`Status` tinyint(4) NULL DEFAULT NULL COMMENT '启用1 禁用0',
`MenuType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'menu btn',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MenuId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu_wms
-- ----------------------------
INSERT INTO `sys_menu_wms` VALUES (1, '系统管理', '#', NULL, -1, 1, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:10:42', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (2, '用户管理', '/User', NULL, 1, 4, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:12:56', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (3, '部门管理', '/Dept', NULL, 1, 3, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:14:38', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (4, '角色管理', '/Role', NULL, 1, 2, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:14:57', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (5, '数据字典', '/Dict', NULL, 1, 5, 1, 'menu', 1, NULL, NULL, '2018-10-21 14:44:30', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (6, '基础资料', '#', NULL, -1, 6, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:19:07', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (7, '物料管理', '/Material', NULL, 6, 7, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:37', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (8, '客户管理', '/Customer', NULL, 6, 8, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:44', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (9, '供应商管理', '/Supplier', NULL, 6, 9, 1, 'menu', 1, NULL, NULL, '2018-10-21 10:25:53', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (10, '承运商管理', '/Carrier', NULL, 6, 10, 1, 'menu', 1, NULL, NULL, '2018-10-21 10:25:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (11, '仓库管理', '#', NULL, -1, 11, 1, 'menu', 1, NULL, NULL, '2018-12-18 23:01:36', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (12, '仓库管理', '/Warehouse', NULL, 11, 12, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:48:09', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (13, '库区管理', '/ReservoirArea', NULL, 11, 13, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:49:11', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (14, '货架管理', '/StorageRack', '', 11, 14, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:49:14', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (15, '设备管理', '#', '', -1, 15, 1, 'menu', 1, NULL, NULL, '2018-11-25 22:32:33', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (16, '设备单元', '/Device', NULL, 15, 16, 1, 'menu', 1, NULL, NULL, '2018-11-26 22:28:25', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (17, '生产管理', '#', '', -1, 17, 1, 'menu', 1, NULL, NULL, '2018-11-30 21:22:54', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (18, '生产工单', '/ProductionOrder', NULL, 17, 18, 1, 'menu', 1, NULL, NULL, '2018-11-30 21:24:22', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (19, '工艺管理', '#', NULL, -1, 19, 1, 'menu', 1, NULL, NULL, '2018-12-06 15:43:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (20, 'BOM管理', '/BOM', NULL, 19, 20, 1, 'menu', 1, NULL, NULL, '2018-12-06 15:44:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (21, '工艺路线', '/Routing', NULL, 19, 21, 1, 'menu', 1, NULL, NULL, '2018-12-17 23:04:45', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (22, '日志管理', '#', '', -1, 22, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:51', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (23, '系统日志', '/Log', NULL, 22, 23, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:54', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (24, '入库管理', '/StockIn', NULL, 11, 24, 1, 'menu', 1, NULL, NULL, '2018-12-19 14:09:08', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (25, '条码系统', '#', NULL, -1, 25, 1, 'menu', 1, NULL, NULL, '2018-12-26 14:26:25', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (26, '报表管理', '#', NULL, -1, 26, 1, 'menu', 1, NULL, NULL, '2018-12-26 14:29:30', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (27, '出库管理', '/StockOut', NULL, 11, 27, 1, 'menu', 1, NULL, NULL, '2019-01-22 11:06:17', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (28, '设备报修', '/Devicerepair', NULL, 15, 28, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (29, '库存查询', '/Inventory', NULL, 11, 29, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (30, '库存记录', '/InventoryRecord', NULL, 11, 30, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (31, '登录统计', '/Log/Bar', NULL, 22, 31, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (32, '发货记录', '/Delivery', NULL, 11, 32, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (33, '库存移动', '/InventoryMove', NULL, 11, 33, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`RoleId` bigint(20) NOT NULL,
`RoleName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`RoleType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'admin #',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (494712986628259840, '系统管理员', 'admin', 1, '系统管理员', 491786087098744832, '2018-09-27 11:32:43', 504990858139926528, '2019-03-03 20:46:05');
-- ----------------------------
-- Table structure for sys_rolemenu
-- ----------------------------
DROP TABLE IF EXISTS `sys_rolemenu`;
CREATE TABLE `sys_rolemenu` (
`RoleMenuId` bigint(20) NOT NULL,
`RoleId` bigint(20) NULL DEFAULT NULL,
`MenuId` bigint(20) NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`RoleMenuId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_rolemenu
-- ----------------------------
INSERT INTO `sys_rolemenu` VALUES (494712986762477568, 494712986628259840, 1, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477569, 494712986628259840, 2, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477570, 494712986628259840, 3, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477571, 494712986628259840, 4, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477572, 494712986628259840, 5, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681041502208, 494712986628259840, 6, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681083445248, 494712986628259840, 7, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681137971200, 494712986628259840, 8, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681158942720, 494712986628259840, 9, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681188302848, 494712986628259840, 12, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681217662976, 494712986628259840, 10, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681247023104, 494712986628259840, 11, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681272188928, 494712986628259840, 13, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681427378176, 494712986628259840, 14, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458121347072, 494712986628259840, 15, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458222010368, 494712986628259840, 16, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458251370496, 494712986628259840, 17, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (503466471221886976, 494712986628259840, 18, 491786087098744832, '2018-10-21 15:16:01', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (517164210220695552, 494712986628259840, 19, 504990858139926528, '2018-11-28 10:25:56', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (517164210333941760, 494712986628259840, 20, 504990858139926528, '2018-11-28 10:25:56', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (522056475653177344, 494712986628259840, 21, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056476315877376, 494712986628259840, 22, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056476953411584, 494712986628259840, 23, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056477603528704, 494712986628259840, 24, 491786087098744832, '2018-12-11 22:26:04', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (524603534847508480, 494712986628259840, 26, 504990858139926528, '2018-12-18 23:07:09', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (524603762120065024, 494712986628259840, 25, 504990858139926528, '2018-12-18 23:08:04', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537140827936260096, 494712986628259840, 28, 504990858139926528, '2019-01-22 13:25:53', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537141837408763904, 494712986628259840, 29, 504990858139926528, '2019-01-22 13:29:54', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537141837408763905, 494712986628259840, 30, 504990858139926528, '2019-01-22 13:29:54', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537177594374651904, 494712986628259840, 27, 504990858139926528, '2019-01-22 15:51:59', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537507366317326336, 494712986628259840, 31, 504990858139926528, '2019-01-23 13:42:23', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (548367997115301888, 494712986628259840, 32, 504990858139926528, '2019-02-22 12:58:39', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (551747124224589824, 494712986628259840, 33, 504990858139926528, '2019-03-03 20:46:05', NULL, NULL);
-- ----------------------------
-- Table structure for sys_serialnum
-- ----------------------------
DROP TABLE IF EXISTS `sys_serialnum`;
CREATE TABLE `sys_serialnum` (
`SerialNumberId` int(11) NOT NULL,
`SerialNumber` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`SerialCount` int(11) NULL DEFAULT NULL,
`TableName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表名',
`Prefix` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '前缀',
`Digit` int(11) NULL DEFAULT NULL COMMENT '位数',
`Mantissa` int(11) NULL DEFAULT NULL COMMENT '尾数',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`SerialNumberId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_serialnum
-- ----------------------------
INSERT INTO `sys_serialnum` VALUES (1, 'R20190301002520000001', 1, 'Wms_stockin', 'R', 22, 6, 1, '入库单', 1, '2019-01-07 11:16:09', 504990858139926528, '2019-03-01 00:25:20');
INSERT INTO `sys_serialnum` VALUES (2, 'C20190303212032000001', 1, 'Wms_stockout', 'C', 22, 6, 1, '出库单', 1, '2019-02-13 09:24:58', 504990858139926528, '2019-03-03 21:20:32');
INSERT INTO `sys_serialnum` VALUES (3, 'M20190304224033000002', 2, 'Wms_inventorymove', 'M', 22, 6, 1, '库存移动', 1, '2019-03-03 13:16:43', 504990858139926528, '2019-03-04 22:40:34');
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`UserId` bigint(20) NOT NULL,
`UserName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`UserNickname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Pwd` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Sort` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Mobile` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Sex` tinyint(4) NULL DEFAULT NULL COMMENT '0男 1女',
`DeptId` bigint(20) NULL DEFAULT NULL,
`LoginIp` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`LoginDate` datetime(0) NULL DEFAULT NULL,
`LoginTime` int(11) NULL DEFAULT NULL,
`IsEabled` tinyint(4) NULL DEFAULT NULL COMMENT '1 启用 0 禁用',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`RoleId` bigint(20) NULL DEFAULT NULL,
`HeadImg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`UserId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (491786087098744832, 'admin', 'admin', '202cb962ac59075b964b07152d234b70', NULL, NULL, '15678676789', NULL, 1, 0, '127.0.0.1', '2019-02-27 22:10:00', 1060, 1, 1, '系统管理员', 491786087098744832, '2018-09-19 09:42:20', NULL, NULL, 494712986628259840, NULL);
-- ----------------------------
-- Table structure for wms_carrier
-- ----------------------------
DROP TABLE IF EXISTS `wms_carrier`;
CREATE TABLE `wms_carrier` (
`CarrierId` bigint(20) NOT NULL,
`CarrierNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '承运商编号',
`CarrierName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '承运商名称',
`Address` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '承运商地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`CarrierPerson` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`CarrierLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`CarrierId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_customer
-- ----------------------------
DROP TABLE IF EXISTS `wms_customer`;
CREATE TABLE `wms_customer` (
`CustomerId` bigint(20) NOT NULL,
`CustomerNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户编号',
`CustomerName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户名称',
`Address` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`CustomerPerson` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`CustomerLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`CustomerId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_delivery
-- ----------------------------
DROP TABLE IF EXISTS `wms_delivery`;
CREATE TABLE `wms_delivery` (
`DeliveryId` bigint(20) NOT NULL COMMENT '发货主键',
`StockOutId` bigint(20) NULL DEFAULT NULL COMMENT '出库单主表Id',
`CarrierId` bigint(20) NULL DEFAULT NULL COMMENT '承运商Id',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`DeliveryDate` datetime(0) NULL DEFAULT NULL COMMENT '发货日期',
`TrackingNo` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递单号',
PRIMARY KEY (`DeliveryId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_inventory
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventory`;
CREATE TABLE `wms_inventory` (
`InventoryId` bigint(20) NOT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL,
`StoragerackId` bigint(20) NULL DEFAULT NULL,
`Qty` decimal(18, 2) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NOT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventoryId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_inventorymove
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventorymove`;
CREATE TABLE `wms_inventorymove` (
`InventorymoveId` bigint(20) NOT NULL COMMENT '库存移动主键',
`InventorymoveNo` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '库存移动编号',
`SourceStoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '原货架Id',
`AimStoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '目标货架',
`Status` tinyint(4) NULL DEFAULT NULL COMMENT '状态',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventorymoveId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_inventoryrecord
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventoryrecord`;
CREATE TABLE `wms_inventoryrecord` (
`InventoryrecordId` bigint(20) NOT NULL,
`StockInDetailId` bigint(20) NULL DEFAULT NULL,
`Qty` decimal(18, 2) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NOT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventoryrecordId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_invmovedetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_invmovedetail`;
CREATE TABLE `wms_invmovedetail` (
`MoveDetailId` bigint(20) NOT NULL COMMENT '主键',
`InventorymoveId` bigint(20) NULL DEFAULT NULL COMMENT '库存移动Id',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MoveDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_material
-- ----------------------------
DROP TABLE IF EXISTS `wms_material`;
CREATE TABLE `wms_material` (
`MaterialId` bigint(20) NOT NULL,
`MaterialNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品编号',
`MaterialName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称',
`MaterialType` bigint(20) NULL DEFAULT NULL COMMENT '产品类型',
`Unit` bigint(20) NULL DEFAULT NULL COMMENT '单位',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属货架',
`ReservoirAreaId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属库区',
`WarehouseId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属仓库',
`Qty` decimal(18, 0) NULL DEFAULT NULL COMMENT '安全库存',
`ExpiryDate` decimal(18, 0) NULL DEFAULT NULL COMMENT '有效期',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MaterialId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_reservoirarea
-- ----------------------------
DROP TABLE IF EXISTS `wms_reservoirarea`;
CREATE TABLE `wms_reservoirarea` (
`ReservoirAreaId` bigint(20) NOT NULL COMMENT '主键',
`ReservoirAreaNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '库区编号',
`ReservoirAreaName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '库区名称',
`WarehouseId` bigint(20) NOT NULL COMMENT '所属仓库ID',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`ReservoirAreaId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_stockin
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockin`;
CREATE TABLE `wms_stockin` (
`StockInId` bigint(20) NOT NULL COMMENT '主键',
`StockInNo` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '入库单号',
`StockInType` bigint(20) NULL DEFAULT NULL COMMENT '入库类型',
`SupplierId` bigint(20) NULL DEFAULT NULL COMMENT '供应商',
`OrderNo` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单号',
`StockInStatus` tinyint(4) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockInId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_stockindetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockindetail`;
CREATE TABLE `wms_stockindetail` (
`StockInDetailId` bigint(20) NOT NULL COMMENT '主键',
`StockInId` bigint(20) NULL DEFAULT NULL COMMENT '入库单号',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanInQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActInQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '货架',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockInDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_stockout
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockout`;
CREATE TABLE `wms_stockout` (
`StockOutId` bigint(20) NOT NULL,
`StockOutNo` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '出库单,系统自动生成',
`OrderNo` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '出库订单',
`StockOutType` bigint(20) NULL DEFAULT NULL COMMENT '出库类型',
`CustomerId` bigint(20) NULL DEFAULT NULL COMMENT '客户',
`StockOutStatus` tinyint(4) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockOutId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_stockoutdetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockoutdetail`;
CREATE TABLE `wms_stockoutdetail` (
`StockOutDetailId` bigint(20) NOT NULL COMMENT '主键',
`StockOutId` bigint(20) NULL DEFAULT NULL COMMENT '出库单',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanOutQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActOutQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '货架',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockOutDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_storagerack
-- ----------------------------
DROP TABLE IF EXISTS `wms_storagerack`;
CREATE TABLE `wms_storagerack` (
`StorageRackId` bigint(20) NOT NULL COMMENT '货架Id',
`StorageRackNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货架编号',
`StorageRackName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '货架名称',
`ReservoirAreaId` bigint(20) NOT NULL COMMENT '所属库区',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`WarehouseId` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`StorageRackId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_supplier
-- ----------------------------
DROP TABLE IF EXISTS `wms_supplier`;
CREATE TABLE `wms_supplier` (
`SupplierId` bigint(20) NOT NULL,
`SupplierNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '供应商编号',
`SupplierName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '供应商名称',
`Address` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '供应商地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`SupplierPerson` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`SupplierLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`SupplierId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for wms_warehouse
-- ----------------------------
DROP TABLE IF EXISTS `wms_warehouse`;
CREATE TABLE `wms_warehouse` (
`WarehouseId` bigint(20) NOT NULL,
`WarehouseNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '仓库编号',
`WarehouseName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '仓库名称',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '是否删除 1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`WarehouseId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

@ -1,657 +0,0 @@
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50739
Source Host : localhost:3306
Source Schema : kopsoftwms
Target Server Type : MySQL
Target Server Version : 50739
File Encoding : 65001
Date: 08/12/2022 20:46:25
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept` (
`DeptId` bigint(20) NOT NULL,
`DeptNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DeptName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`DeptId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_dept
-- ----------------------------
-- ----------------------------
-- Table structure for sys_dict
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict` (
`DictId` bigint(20) NOT NULL,
`DictNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DictName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`DictType` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`DictId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_dict
-- ----------------------------
-- ----------------------------
-- Table structure for sys_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`LogId` bigint(20) NOT NULL,
`LogType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`Url` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Browser` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
`LogIp` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`LogId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_log
-- ----------------------------
-- ----------------------------
-- Table structure for sys_menu_wms
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu_wms`;
CREATE TABLE `sys_menu_wms` (
`MenuId` bigint(20) NOT NULL,
`MenuName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuUrl` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuIcon` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MenuParent` bigint(20) NULL DEFAULT NULL,
`Sort` int(11) NULL DEFAULT NULL,
`Status` tinyint(4) NULL DEFAULT NULL COMMENT '启用1 禁用0',
`MenuType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'menu btn',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MenuId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_menu_wms
-- ----------------------------
INSERT INTO `sys_menu_wms` VALUES (1, '系统管理', '#', NULL, -1, 1, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:10:42', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (2, '用户管理', '/User', NULL, 1, 4, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:12:56', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (3, '部门管理', '/Dept', NULL, 1, 3, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:14:38', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (4, '角色管理', '/Role', NULL, 1, 2, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:14:57', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (5, '数据字典', '/Dict', NULL, 1, 5, 1, 'menu', 1, NULL, NULL, '2018-10-21 14:44:30', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (6, '基础资料', '#', NULL, -1, 6, 1, 'menu', 1, NULL, NULL, '2018-09-24 12:19:07', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (7, '物料管理', '/Material', NULL, 6, 7, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:37', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (8, '客户管理', '/Customer', NULL, 6, 8, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:44', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (9, '供应商管理', '/Supplier', NULL, 6, 9, 1, 'menu', 1, NULL, NULL, '2018-10-21 10:25:53', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (10, '承运商管理', '/Carrier', NULL, 6, 10, 1, 'menu', 1, NULL, NULL, '2018-10-21 10:25:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (11, '仓库管理', '#', NULL, -1, 11, 1, 'menu', 1, NULL, NULL, '2018-12-18 23:01:36', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (12, '仓库管理', '/Warehouse', NULL, 11, 12, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:48:09', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (13, '库区管理', '/ReservoirArea', NULL, 11, 13, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:49:11', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (14, '货架管理', '/StorageRack', '', 11, 14, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:49:14', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (15, '设备管理', '#', '', -1, 15, 1, 'menu', 1, NULL, NULL, '2018-11-25 22:32:33', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (16, '设备单元', '/Device', NULL, 15, 16, 1, 'menu', 1, NULL, NULL, '2018-11-26 22:28:25', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (17, '生产管理', '#', '', -1, 17, 1, 'menu', 1, NULL, NULL, '2018-11-30 21:22:54', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (18, '生产工单', '/ProductionOrder', NULL, 17, 18, 1, 'menu', 1, NULL, NULL, '2018-11-30 21:24:22', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (19, '工艺管理', '#', NULL, -1, 19, 1, 'menu', 1, NULL, NULL, '2018-12-06 15:43:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (20, 'BOM管理', '/BOM', NULL, 19, 20, 1, 'menu', 1, NULL, NULL, '2018-12-06 15:44:58', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (21, '工艺路线', '/Routing', NULL, 19, 21, 1, 'menu', 1, NULL, NULL, '2018-12-17 23:04:45', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (22, '日志管理', '#', '', -1, 22, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:51', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (23, '系统日志', '/Log', NULL, 22, 23, 1, 'menu', 1, NULL, NULL, '2018-10-09 08:50:54', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (24, '入库管理', '/StockIn', NULL, 11, 24, 1, 'menu', 1, NULL, NULL, '2018-12-19 14:09:08', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (25, '条码系统', '#', NULL, -1, 25, 1, 'menu', 1, NULL, NULL, '2018-12-26 14:26:25', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (26, '报表管理', '#', NULL, -1, 26, 1, 'menu', 1, NULL, NULL, '2018-12-26 14:29:30', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (27, '出库管理', '/StockOut', NULL, 11, 27, 1, 'menu', 1, NULL, NULL, '2019-01-22 11:06:17', NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (28, '设备报修', '/Devicerepair', NULL, 15, 28, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (29, '库存查询', '/Inventory', NULL, 11, 29, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (30, '库存记录', '/InventoryRecord', NULL, 11, 30, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (31, '登录统计', '/Log/Bar', NULL, 22, 31, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (32, '发货记录', '/Delivery', NULL, 11, 32, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_wms` VALUES (33, '库存移动', '/InventoryMove', NULL, 11, 33, 1, 'menu', 1, NULL, NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`RoleId` bigint(20) NOT NULL,
`RoleName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`RoleType` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'admin #',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (494712986628259840, '系统管理员', 'admin', 1, '系统管理员', 491786087098744832, '2018-09-27 11:32:43', 504990858139926528, '2019-03-03 20:46:05');
-- ----------------------------
-- Table structure for sys_rolemenu
-- ----------------------------
DROP TABLE IF EXISTS `sys_rolemenu`;
CREATE TABLE `sys_rolemenu` (
`RoleMenuId` bigint(20) NOT NULL,
`RoleId` bigint(20) NULL DEFAULT NULL,
`MenuId` bigint(20) NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`RoleMenuId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_rolemenu
-- ----------------------------
INSERT INTO `sys_rolemenu` VALUES (494712986762477568, 494712986628259840, 1, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477569, 494712986628259840, 2, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477570, 494712986628259840, 3, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477571, 494712986628259840, 4, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:00');
INSERT INTO `sys_rolemenu` VALUES (494712986762477572, 494712986628259840, 5, 491786087098744832, '2018-09-27 11:32:47', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681041502208, 494712986628259840, 6, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681083445248, 494712986628259840, 7, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681137971200, 494712986628259840, 8, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681158942720, 494712986628259840, 9, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681188302848, 494712986628259840, 12, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:01');
INSERT INTO `sys_rolemenu` VALUES (499030681217662976, 494712986628259840, 10, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681247023104, 494712986628259840, 11, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681272188928, 494712986628259840, 13, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (499030681427378176, 494712986628259840, 14, 491786087098744832, '2018-10-09 09:29:46', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458121347072, 494712986628259840, 15, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458222010368, 494712986628259840, 16, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:02');
INSERT INTO `sys_rolemenu` VALUES (503408458251370496, 494712986628259840, 17, 491786087098744832, '2018-10-21 11:25:29', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (503466471221886976, 494712986628259840, 18, 491786087098744832, '2018-10-21 15:16:01', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (517164210220695552, 494712986628259840, 19, 504990858139926528, '2018-11-28 10:25:56', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (517164210333941760, 494712986628259840, 20, 504990858139926528, '2018-11-28 10:25:56', 491786087098744832, '2018-12-11 22:26:03');
INSERT INTO `sys_rolemenu` VALUES (522056475653177344, 494712986628259840, 21, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056476315877376, 494712986628259840, 22, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056476953411584, 494712986628259840, 23, 491786087098744832, '2018-12-11 22:26:03', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (522056477603528704, 494712986628259840, 24, 491786087098744832, '2018-12-11 22:26:04', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (524603534847508480, 494712986628259840, 26, 504990858139926528, '2018-12-18 23:07:09', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (524603762120065024, 494712986628259840, 25, 504990858139926528, '2018-12-18 23:08:04', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537140827936260096, 494712986628259840, 28, 504990858139926528, '2019-01-22 13:25:53', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537141837408763904, 494712986628259840, 29, 504990858139926528, '2019-01-22 13:29:54', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537141837408763905, 494712986628259840, 30, 504990858139926528, '2019-01-22 13:29:54', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537177594374651904, 494712986628259840, 27, 504990858139926528, '2019-01-22 15:51:59', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (537507366317326336, 494712986628259840, 31, 504990858139926528, '2019-01-23 13:42:23', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (548367997115301888, 494712986628259840, 32, 504990858139926528, '2019-02-22 12:58:39', NULL, NULL);
INSERT INTO `sys_rolemenu` VALUES (551747124224589824, 494712986628259840, 33, 504990858139926528, '2019-03-03 20:46:05', NULL, NULL);
-- ----------------------------
-- Table structure for sys_serialnum
-- ----------------------------
DROP TABLE IF EXISTS `sys_serialnum`;
CREATE TABLE `sys_serialnum` (
`SerialNumberId` int(11) NOT NULL,
`SerialNumber` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`SerialCount` int(11) NULL DEFAULT NULL,
`TableName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表名',
`Prefix` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '前缀',
`Digit` int(11) NULL DEFAULT NULL COMMENT '位数',
`Mantissa` int(11) NULL DEFAULT NULL COMMENT '尾数',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`SerialNumberId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_serialnum
-- ----------------------------
INSERT INTO `sys_serialnum` VALUES (1, 'R20190301002520000001', 1, 'Wms_stockin', 'R', 22, 6, 1, '入库单', 1, '2019-01-07 11:16:09', 504990858139926528, '2019-03-01 00:25:20');
INSERT INTO `sys_serialnum` VALUES (2, 'C20190303212032000001', 1, 'Wms_stockout', 'C', 22, 6, 1, '出库单', 1, '2019-02-13 09:24:58', 504990858139926528, '2019-03-03 21:20:32');
INSERT INTO `sys_serialnum` VALUES (3, 'M20190304224033000002', 2, 'Wms_inventorymove', 'M', 22, 6, 1, '库存移动', 1, '2019-03-03 13:16:43', 504990858139926528, '2019-03-04 22:40:34');
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`UserId` bigint(20) NOT NULL,
`UserName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`UserNickname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Pwd` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Sort` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Mobile` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Sex` tinyint(4) NULL DEFAULT NULL COMMENT '0男 1女',
`DeptId` bigint(20) NULL DEFAULT NULL,
`LoginIp` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`LoginDate` datetime NULL DEFAULT NULL,
`LoginTime` int(11) NULL DEFAULT NULL,
`IsEabled` tinyint(4) NULL DEFAULT NULL COMMENT '1 启用 0 禁用',
`IsDel` tinyint(4) NOT NULL COMMENT '1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
`RoleId` bigint(20) NULL DEFAULT NULL,
`HeadImg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`UserId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (491786087098744832, 'admin', 'admin', '1616c059c4a731ede06e26d3373bdd54', NULL, 'william.yang@kopsoft.cn', '15262337653', NULL, 1, 0, '127.0.0.1', '2022-12-08 20:45:26', 1, 1, 1, '系统管理员', 491786087098744832, '2018-09-19 09:42:20', 491786087098744832, '2022-12-08 20:15:34', 494712986628259840, 'upload\\head\\666633556364425888df1a11bdc083da.jpg');
-- ----------------------------
-- Table structure for wms_delivery
-- ----------------------------
DROP TABLE IF EXISTS `wms_delivery`;
CREATE TABLE `wms_delivery` (
`DeliveryId` bigint(20) NOT NULL COMMENT '发货主键',
`StockOutId` bigint(20) NULL DEFAULT NULL COMMENT '出库单主表Id',
`CarrierId` bigint(20) NULL DEFAULT NULL COMMENT '承运商Id',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
`DeliveryDate` datetime NULL DEFAULT NULL COMMENT '发货日期',
`TrackingNo` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递单号',
PRIMARY KEY (`DeliveryId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_delivery
-- ----------------------------
-- ----------------------------
-- Table structure for wms_inventory
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventory`;
CREATE TABLE `wms_inventory` (
`InventoryId` bigint(20) NOT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL,
`StoragerackId` bigint(20) NULL DEFAULT NULL,
`Qty` decimal(18, 2) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NOT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventoryId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_inventory
-- ----------------------------
-- ----------------------------
-- Table structure for wms_inventorymove
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventorymove`;
CREATE TABLE `wms_inventorymove` (
`InventorymoveId` bigint(20) NOT NULL COMMENT '库存移动主键',
`InventorymoveNo` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '库存移动编号',
`SourceStoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '原货架Id',
`AimStoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '目标货架',
`Status` tinyint(4) NULL DEFAULT NULL COMMENT '状态',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventorymoveId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_inventorymove
-- ----------------------------
-- ----------------------------
-- Table structure for wms_inventoryrecord
-- ----------------------------
DROP TABLE IF EXISTS `wms_inventoryrecord`;
CREATE TABLE `wms_inventoryrecord` (
`InventoryrecordId` bigint(20) NOT NULL,
`StockInDetailId` bigint(20) NULL DEFAULT NULL,
`Qty` decimal(18, 2) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NOT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`InventoryrecordId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_inventoryrecord
-- ----------------------------
-- ----------------------------
-- Table structure for wms_invmovedetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_invmovedetail`;
CREATE TABLE `wms_invmovedetail` (
`MoveDetailId` bigint(20) NOT NULL COMMENT '主键',
`InventorymoveId` bigint(20) NULL DEFAULT NULL COMMENT '库存移动Id',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MoveDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_invmovedetail
-- ----------------------------
-- ----------------------------
-- Table structure for wms_material
-- ----------------------------
DROP TABLE IF EXISTS `wms_material`;
CREATE TABLE `wms_material` (
`MaterialId` bigint(20) NOT NULL,
`MaterialNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品编号',
`MaterialName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称',
`MaterialType` bigint(20) NULL DEFAULT NULL COMMENT '产品类型',
`Unit` bigint(20) NULL DEFAULT NULL COMMENT '单位',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属货架',
`ReservoirAreaId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属库区',
`WarehouseId` bigint(20) NULL DEFAULT NULL COMMENT '默认所属仓库',
`Qty` decimal(18, 0) NULL DEFAULT NULL COMMENT '安全库存',
`ExpiryDate` decimal(18, 0) NULL DEFAULT NULL COMMENT '有效期',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MaterialId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_material
-- ----------------------------
-- ----------------------------
-- Table structure for wms_reservoirarea
-- ----------------------------
DROP TABLE IF EXISTS `wms_reservoirarea`;
CREATE TABLE `wms_reservoirarea` (
`ReservoirAreaId` bigint(20) NOT NULL COMMENT '主键',
`ReservoirAreaNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '库区编号',
`ReservoirAreaName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '库区名称',
`WarehouseId` bigint(20) NOT NULL COMMENT '所属仓库ID',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`ReservoirAreaId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_reservoirarea
-- ----------------------------
-- ----------------------------
-- Table structure for wms_stockin
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockin`;
CREATE TABLE `wms_stockin` (
`StockInId` bigint(20) NOT NULL COMMENT '主键',
`StockInNo` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '入库单号',
`StockInType` bigint(20) NULL DEFAULT NULL COMMENT '入库类型',
`SupplierId` bigint(20) NULL DEFAULT NULL COMMENT '供应商',
`OrderNo` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单号',
`StockInStatus` tinyint(4) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockInId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_stockin
-- ----------------------------
-- ----------------------------
-- Table structure for wms_stockindetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockindetail`;
CREATE TABLE `wms_stockindetail` (
`StockInDetailId` bigint(20) NOT NULL COMMENT '主键',
`StockInId` bigint(20) NULL DEFAULT NULL COMMENT '入库单号',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanInQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActInQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '货架',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockInDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_stockindetail
-- ----------------------------
-- ----------------------------
-- Table structure for wms_stockout
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockout`;
CREATE TABLE `wms_stockout` (
`StockOutId` bigint(20) NOT NULL,
`StockOutNo` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '出库单,系统自动生成',
`OrderNo` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '出库订单',
`StockOutType` bigint(20) NULL DEFAULT NULL COMMENT '出库类型',
`CustomerId` bigint(20) NULL DEFAULT NULL COMMENT '客户',
`StockOutStatus` tinyint(4) NULL DEFAULT NULL,
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockOutId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_stockout
-- ----------------------------
-- ----------------------------
-- Table structure for wms_stockoutdetail
-- ----------------------------
DROP TABLE IF EXISTS `wms_stockoutdetail`;
CREATE TABLE `wms_stockoutdetail` (
`StockOutDetailId` bigint(20) NOT NULL COMMENT '主键',
`StockOutId` bigint(20) NULL DEFAULT NULL COMMENT '出库单',
`Status` tinyint(4) NULL DEFAULT NULL,
`MaterialId` bigint(20) NULL DEFAULT NULL COMMENT '物料',
`PlanOutQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '计划数量',
`ActOutQty` decimal(18, 0) NULL DEFAULT NULL COMMENT '实际数量',
`StoragerackId` bigint(20) NULL DEFAULT NULL COMMENT '货架',
`AuditinId` bigint(20) NULL DEFAULT NULL COMMENT '审核人',
`AuditinTime` datetime NULL DEFAULT NULL COMMENT '审核时间',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`StockOutDetailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_stockoutdetail
-- ----------------------------
-- ----------------------------
-- Table structure for wms_storagerack
-- ----------------------------
DROP TABLE IF EXISTS `wms_storagerack`;
CREATE TABLE `wms_storagerack` (
`StorageRackId` bigint(20) NOT NULL COMMENT '货架Id',
`StorageRackNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货架编号',
`StorageRackName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '货架名称',
`ReservoirAreaId` bigint(20) NOT NULL COMMENT '所属库区',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
`WarehouseId` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`StorageRackId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_storagerack
-- ----------------------------
-- ----------------------------
-- Table structure for wms_warehouse
-- ----------------------------
DROP TABLE IF EXISTS `wms_warehouse`;
CREATE TABLE `wms_warehouse` (
`WarehouseId` bigint(20) NOT NULL,
`WarehouseNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '仓库编号',
`WarehouseName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '仓库名称',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '是否删除 1未删除 0删除',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`WarehouseId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of wms_warehouse
-- ----------------------------
-- ----------------------------
-- Table structure for wms_supplier
-- ----------------------------
DROP TABLE IF EXISTS `wms_supplier`;
CREATE TABLE `wms_supplier` (
`SupplierId` bigint(20) NOT NULL,
`SupplierNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '供应商编号',
`SupplierName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '供应商名称',
`Address` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '供应商地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`SupplierPerson` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`SupplierLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`SupplierId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for wms_carrier
-- ----------------------------
DROP TABLE IF EXISTS `wms_carrier`;
CREATE TABLE `wms_carrier` (
`CarrierId` bigint(20) NOT NULL,
`CarrierNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '承运商编号',
`CarrierName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '承运商名称',
`Address` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '承运商地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`CarrierPerson` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`CarrierLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`CarrierId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for wms_customer
-- ----------------------------
DROP TABLE IF EXISTS `wms_customer`;
CREATE TABLE `wms_customer` (
`CustomerId` bigint(20) NOT NULL,
`CustomerNo` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户编号',
`CustomerName` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户名称',
`Address` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户地址',
`Tel` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`CustomerPerson` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
`CustomerLevel` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '级别',
`Email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',
`Remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`IsDel` tinyint(4) NULL DEFAULT NULL COMMENT '1 0',
`CreateBy` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`CreateDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`ModifiedBy` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
`ModifiedDate` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`CustomerId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<LatestDevTFM>net9.0</LatestDevTFM>
<ReleaseTFMs>net6.0;net7.0;net8.0;net9.0</ReleaseTFMs>
<TestTFMs>net6.0;net7.0;net8.0;net9.0</TestTFMs>
</PropertyGroup>
</Project>

@ -1,30 +1,72 @@
[![Build Status](https://lysilver.visualstudio.com/kopsoftwms/_apis/build/status/lysilver.KopSoftWms?branchName=master)](https://lysilver.visualstudio.com/kopsoftwms/_build/latest?definitionId=3&branchName=master)
## DotNet开源免费WMS仓库管理系统
* kopSoftWMS仓库管理系统 http://wms.kopsoft.cn/
* Gitee https://gitee.com/yulou/kopSoftWMS
* GitHub https://github.com/lysilver/kopSoftWMS
## 项目介绍
****
* KopSoft标签(条码)打印软件 http://print.kopsoft.cn/
* Gitee https://gitee.com/williamyang3/KopSoftPrint
* GitHub https://github.com/williamyang3/KopSoftPrint
*
* KopSoft仓库管理系统 http://wms.kopsoft.cn/
* Gitee https://gitee.com/yulou/KopSoftWms
* GitHub https://github.com/lysilver/KopSoftWms
*
* KopSoft制造执行系统 http://mes.kopsoft.cn/
* Gitee https://gitee.com/yulou/KopSoftMES
* GitHub https://github.com/lysilver/KopSoftMES
*
* KopSoft数据采集与监控,电子看板 http://kanban.kopsoft.cn/
* Gitee https://gitee.com/williamyang3/KopSoftSCADA
* GitHub https://github.com/williamyang3/KopSoftSCADA
*
* 开源不易更多商业产品ERP企业资源计划,WMS仓库管理系统,MES制造执行系统,EMS设备管理系统,QMS质量管理系统请移步 http://mom.kopsoft.cn/
* 商务合作:15262337653
****
## kopSoftWMS功能模块
| 版本 | 分支 |
| ---- | ---- |
| netcore2.2 | master |
| netcore3.0 | netcore3.0 |
| netcore3.1 | netcore3.1 |
* 用户管理,部门管理,角色管理,物料管理,供应商管理,
* 入库管理(采购入库、生产入库、销售退货、拆包装入库),
* 出库管理(生产领料、采购退货、销售发货、拆包装出库、报废出库),
* 盘点管理等,
## 功能模块
- [x] 用户管理
- [x] 部门管理
- [x] 角色管理
- [x] 数据字典
- [x] 物料管理
- [x] 客户管理
- [x] 供应商管理
- [x] 承运商管理
- [x] 仓库管理
- [x] 库区管理
- [x] 货架管理
- [x] 入库管理
- [x] 出库管理
- [x] 库存查询
- [x] 库存记录
- [x] 发货记录
- [x] 库存移动
- [x] 系统日志
- [x] 登陆统计
## 技术栈
## 技术
`net core`
* 基于微软.NET 9.0开发,支持 sqlserver、mysql 等主流数据库ORM 采用国内开源 ORM 框架 SqlSugar
* 前端采用 bootstrap、adminlte、layer、bootstrap-datetimepicker、bootstrap-table、bootstrap-select等
* 后端采用 asp.net mvc core、fluentValidation、nlog、Jil、DI、Ganss 、雪花算法、Xunit、npoi等
* 基于.Net Core 2.2~3.1开发;
* 支持sqlserver、mysql数据库其他数据库未测试脚本在docs/sql
* 前端采用 vue、polyfill、qs、 axios、 bootstrap、adminlte、layer、bootstrap-datetimepicker、bootstrap-table、bootstrap-select等
* 后端采用 asp.net mvc core、fluentValidation、nlog、Jil、DI、Ganss、雪花算法、Xunit、npoi
* ORM 采用 一款简单易用的开源ORM框架 SqlSugar http://www.codeisbug.com/Home/Doc
| 版本 | 分支 |
| ---- | ---- |
| netcore9.0 | master |
## 申明
* 本代码只做学习交流使用!
* 写的不好请谅解!
## 使用
* 该架子在某顺风车业务使用
* 本项目仅供个人学习使用商业授权请联系kopSoft原作者。

@ -11,21 +11,14 @@ steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '9.0.304'
version: '2.2.203'
includePreviewVersions: true
- task: DeleteFiles@1
displayName: 'Remove unneeded files'
inputs:
contents: |
**/bin/*
**/obj/*
- task: DotNetCoreCLI@2
displayName: Build
inputs:
command: build
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration)'
arguments: '--configuration Release'

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

@ -1,9 +1,8 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://+5000
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["KopSoftWms/KopSoftWms.csproj", "KopSoftWms/"]
COPY ["Orm/Orm.csproj", "Orm/"]
@ -27,4 +26,4 @@ RUN dotnet publish "KopSoftWms.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "KopSoftWms.dll", "--urls","http://*:5000"]
ENTRYPOINT ["dotnet", "KopSoftWms.dll"]

@ -1,8 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(LatestDevTFM)</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>YL.Core.Dto</RootNamespace>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<ItemGroup>

@ -1,4 +1,8 @@
namespace YL.Core.Dto
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Dto
{
public class IssuePie
{

@ -1,4 +1,8 @@
namespace YL.Core.Dto
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Dto
{
public class LineChart
{

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Dto
{

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text;
using YL.Core.Entity;
namespace YL.Core.Dto

@ -1,5 +1,9 @@
using System.Text.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
using Jil;
namespace YL.Core.Dto
{
/// <summary>
@ -11,25 +15,25 @@ namespace YL.Core.Dto
/// <summary>
/// 表示该行用来声明事件的类型。浏览器在收到数据时,会产生对应类型的事件
/// </summary>
[JsonPropertyName("event")]
[JilDirective("event")]
public string Event { get; set; }
/// <summary>
/// 表示该行包含的是数据。以 data 开头的行可以出现多次。所有这些行都是该事件的数据。
/// </summary>
[JsonPropertyName("data")]
[JilDirective("data")]
public string Data { get; set; }
/// <summary>
///表示该行用来声明事件的标识符(即数据的编号),不常用
/// </summary>
[JsonPropertyName("id")]
[JilDirective("id")]
public string Id { get; set; }
/// <summary>
/// 表示该行用来声明浏览器在连接断开之后进行再次连接之前的等待时间
/// </summary>
[JsonPropertyName("retry")]
[JilDirective("retry")]
public string Retry { get; set; }
}
}

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using YL.Core.Entity;
namespace YL.Core.Dto

@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Entity
{
public class BaseEntity
{
/// <summary>
/// Desc:1未删除
/// Desc:1未删除 0删除
/// Default:
/// Nullable:True
/// </summary>

@ -1,15 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(LatestDevTFM)</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>YL.Core.Entity</RootNamespace>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="12.0.0" />
<PackageReference Include="FluentValidation.AspNetCore" Version="11.3.1" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="sqlSugarCore" Version="5.1.4.199" />
<PackageReference Include="FluentValidation" Version="8.6.2" />
<PackageReference Include="FluentValidation.AspNetCore" Version="8.6.2" />
<PackageReference Include="MediatR" Version="8.0.1" />
<PackageReference Include="sqlSugarCore" Version="5.0.0.13" />
</ItemGroup>
</Project>

@ -1,4 +1,7 @@
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Entity.Fluent.Validation
{

@ -1,4 +1,7 @@
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
using FluentValidation;
namespace YL.Core.Entity.Fluent.Validation
{

@ -1,4 +1,7 @@
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
using FluentValidation;
namespace YL.Core.Entity.Fluent.Validation
{

@ -1,4 +1,7 @@
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
using FluentValidation;
namespace YL.Core.Entity.Fluent.Validation
{

@ -1,4 +1,7 @@
using FluentValidation;
using System;
using System.Collections.Generic;
using System.Text;
namespace YL.Core.Entity.Fluent.Validation
{

@ -4,10 +4,8 @@ using System;
namespace YL.Core.Entity
{
///<summary>
///
///
///</summary>
[SugarTable(tableName: "sys_dept")]
public partial class Sys_dept
{
public Sys_dept()

@ -6,12 +6,11 @@ namespace YL.Core.Entity
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_dict")]
public partial class Sys_dict
{
public Sys_dict()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
@ -20,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long DictId { get; set; }
/// <summary>

@ -7,7 +7,6 @@ namespace YL.Core.Entity
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_log")]
public partial class Sys_log : INotification
{
public Sys_log()
@ -19,7 +18,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long LogId { get; set; }
/// <summary>

@ -6,7 +6,6 @@ namespace YL.Core.Entity
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_menu_wms")]
public partial class Sys_menu
{
public Sys_menu()
@ -18,7 +17,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long MenuId { get; set; }
/// <summary>

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System.Linq;
using System.Text;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_role")]
public partial class Sys_role
{
public Sys_role()
{
IsDel = 1;
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
@ -20,7 +21,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long RoleId { get; set; }
/// <summary>

@ -6,7 +6,6 @@ namespace YL.Core.Entity
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_rolemenu")]
public partial class Sys_rolemenu
{
public Sys_rolemenu()
@ -19,7 +18,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long RoleMenuId { get; set; }
/// <summary>

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_serialnum")]
public partial class Sys_serialnum
{
public Sys_serialnum()
{
IsDel = 1;
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
@ -20,7 +21,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public int SerialNumberId { get; set; }
/// <summary>

@ -1,12 +1,13 @@
using SqlSugar;
using System;
using System.Linq;
using System.Text;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "sys_user")]
public partial class Sys_user
{
public Sys_user()
@ -18,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long UserId { get; set; }
/// <summary>

@ -1,14 +1,13 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
[SugarTable(tableName: "wms_carrier")]
public partial class Wms_Carrier
{
public Wms_Carrier()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
@ -17,7 +16,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long CarrierId { get; set; }
/// <summary>
@ -111,4 +110,4 @@ namespace YL.Core.Entity
/// </summary>
public DateTime? ModifiedDate { get; set; }
}
}
}

@ -1,114 +1,96 @@
using SqlSugar;
using System;
namespace YL.Core.Entity
{
[SugarTable(tableName: "wms_customer")]
public class Wms_Customer
{
public Wms_Customer()
{
this.IsDel = 1;
this.CreateDate = DateTime.Now;
}
/// <summary>
/// Desc:客户id
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public long CustomerId { get; set; }
/// <summary>
/// Desc:客户编号
/// Default:
/// Nullable:False
/// </summary>
public string CustomerNo { get; set; }
/// <summary>
/// Desc:客户名称
/// Default:
/// Nullable:False
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// Desc:地址
/// Default:
/// Nullable:False
/// </summary>
public string Address { get; set; }
/// <summary>
/// Desc:联系人
/// Default:
/// Nullable:False
/// </summary>
public string CustomerPerson { get; set; }
/// <summary>
/// Desc:级别
/// Default:
/// Nullable:False
/// </summary>
public string CustomerLevel { get; set; }
/// <summary>
/// Desc:邮件
/// Default:
/// Nullable:True
/// </summary>
public string Email { get; set; }
/// <summary>
/// Desc:电话
/// Default:
/// Nullable:True
/// </summary>
public string Tel { get; set; }
/// <summary>
/// Desc:是否删除 1未删除 0删除
/// Default:1
/// Nullable:True
/// </summary>
public byte? IsDel { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string Remark { get; set; }
/// <summary>
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
public long? CreateBy { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:DateTime.Now
/// Nullable:True
/// </summary>
public DateTime? CreateDate { get; set; }
/// <summary>
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
public long? ModifiedBy { get; set; }
/// <summary>
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? ModifiedDate { get; set; }
}
}
using System;
using SqlSugar;
namespace YL.Core.Entity
{
public class Wms_Customer
{
public Wms_Customer()
{
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
/// <summary> /// Desc:客户id /// Default: /// Nullable:False /// </summary> [SugarColumn(IsPrimaryKey = true)] public long CustomerId { get; set; }
/// <summary> /// Desc:客户编号 /// Default: /// Nullable:False /// </summary> public string CustomerNo { get; set; }
/// <summary> /// Desc:客户名称 /// Default: /// Nullable:False /// </summary> public string CustomerName { get; set; }
/// <summary>
/// Desc:地址
/// Default:
/// Nullable:False
/// </summary>
public string Address { get; set; }
/// <summary>
/// Desc:联系人
/// Default:
/// Nullable:False
/// </summary>
public string CustomerPerson { get; set; }
/// <summary>
/// Desc:级别
/// Default:
/// Nullable:False
/// </summary>
public string CustomerLevel { get; set; }
/// <summary>
/// Desc:邮件
/// Default:
/// Nullable:True
/// </summary>
public string Email { get; set; }
/// <summary>
/// Desc:电话
/// Default:
/// Nullable:True
/// </summary>
public string Tel { get; set; }
/// <summary>
/// Desc:是否删除 1未删除 0删除
/// Default:1
/// Nullable:True
/// </summary>
public byte? IsDel { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string Remark { get; set; }
/// <summary>
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
public long? CreateBy { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:DateTime.Now
/// Nullable:True
/// </summary>
public DateTime? CreateDate { get; set; }
/// <summary>
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
public long? ModifiedBy { get; set; }
/// <summary>
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? ModifiedDate { get; set; }
}
}

@ -6,13 +6,12 @@ namespace YL.Core.Entity
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_delivery")]
public partial class Wms_delivery
{
public Wms_delivery()
{
CreateDate = DateTime.Now;
IsDel = 1;
IsDel = Convert.ToByte("1");
}
/// <summary>
@ -20,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long DeliveryId { get; set; }
/// <summary>

@ -1,18 +1,17 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_device")]
public partial class Wms_device
{
public Wms_device()
{
this.CreateDate = DateTime.Now;
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
}
/// <summary>
@ -20,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long DeviceId { get; set; }
/// <summary>

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_inventory")]
public partial class Wms_inventory
{
public Wms_inventory()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
@ -20,7 +21,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long InventoryId { get; set; }
/// <summary>

@ -1,18 +1,17 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///<summary>
///库存移动
///</summary>
[SugarTable(tableName: "wms_inventorymove")]
public partial class Wms_inventorymove
{
public Wms_inventorymove()
{
CreateDate = DateTime.Now;
IsDel = 1;
IsDel = Convert.ToByte("1");
}
/// <summary>

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_inventoryrecord")]
///</summary>
public partial class Wms_inventoryrecord
{
public Wms_inventoryrecord()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}

@ -1,18 +1,17 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_invmovedetail")]
public partial class Wms_invmovedetail
{
public Wms_invmovedetail()
{
CreateDate = DateTime.Now;
IsDel = 1;
IsDel = Convert.ToByte("1");
}
/// <summary>
@ -20,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long MoveDetailId { get; set; }
/// <summary>

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System.Linq;
using System.Text;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_material")]
public partial class Wms_material
{
public Wms_material()
{
IsDel = 1;
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
@ -20,7 +21,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long MaterialId { get; set; }
/// <summary>

@ -2,16 +2,15 @@
using System;
namespace YL.Core.Entity
{
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_reservoirarea")]
public partial class Wms_reservoirarea
{
public Wms_reservoirarea()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
@ -20,7 +19,7 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long ReservoirAreaId { get; set; }
/// <summary>

@ -1,95 +1,104 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace YL.Core.Entity
{
/// <summary>
/// 入库单表实体类,映射数据库中的"wms_stockin"表
/// 用于存储入库单的主表信息,包括入库单号、类型、状态等核心数据
/// </summary>
[SugarTable(tableName: "wms_stockin")] // 指定数据库表名
///<summary>
///
///</summary>
public partial class Wms_stockin
{
/// <summary>
/// 构造函数,初始化默认值
/// </summary>
public Wms_stockin()
{
IsDel = 1; // 默认未删除1未删除0已删除
CreateDate = DateTime.Now; // 默认创建时间为当前时间
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
/// <summary>
/// 入库单ID主键
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>自增主键或雪花ID唯一标识入库单记录</remarks>
[SugarColumn(IsPrimaryKey = true)] // 标记为主键
[SugarColumn(IsPrimaryKey = true)]
public long StockInId { get; set; }
/// <summary>
/// 入库单号
/// Desc:入库单号
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>系统生成的唯一入库单据编号,用于业务流转和查询</remarks>
public string StockInNo { get; set; }
/// <summary>
/// 入库类型ID
/// Desc:入库类型
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,通常关联字典表中的入库类型数据(如采购入库、退货入库等)</remarks>
public long? StockInType { get; set; }
/// <summary>
/// 供应商ID
/// Desc:供应商
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到供应商表的主键,标识该入库单对应的供应商(适用于采购入库等场景)</remarks>
public long? SupplierId { get; set; }
/// <summary>
/// 外部订单号
/// Desc:订单号
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联的外部系统订单编号(如采购订单号),用于跨系统追溯</remarks>
public string OrderNo { get; set; }
/// <summary>
/// 入库单状态
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联状态枚举(如初始、已审核、已完成等),用字节类型存储,控制业务流程</remarks>
public byte? StockInStatus { get; set; }
/// <summary>
/// 备注信息
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>存储入库单的整体说明,如特殊处理要求、异常情况记录等</remarks>
public string Remark { get; set; }
/// <summary>
/// 是否删除标识
/// Desc:1 0
/// Default:1
/// Nullable:True
/// </summary>
/// <remarks>1未删除0已删除逻辑删除保留数据用于追溯</remarks>
public byte? IsDel { get; set; }
/// <summary>
/// 创建人ID
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到用户表的主键,记录创建该入库单的用户</remarks>
public long? CreateBy { get; set; }
/// <summary>
/// 创建时间
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>入库单的创建时间,默认值为当前时间</remarks>
public DateTime? CreateDate { get; set; }
/// <summary>
/// 修改人ID
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到用户表的主键,记录最后修改该入库单的用户</remarks>
public long? ModifiedBy { get; set; }
/// <summary>
/// 修改时间
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>入库单的最后修改时间,为空表示未修改过</remarks>
public DateTime? ModifiedDate { get; set; }
}
}

@ -1,113 +1,123 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
/// <summary>
/// 入库单明细表实体类,映射数据库中的"wms_stockindetail"表
/// 用于存储入库单的明细信息,包括物料、数量、货架 货架等具体数据
/// </summary>
[SugarTable(tableName: "wms_stockindetail")] // 指定数据库表名
///<summary>
///
///</summary>
public partial class Wms_stockindetail
{
/// <summary>
/// 构造函数,初始化默认值
/// </summary>
public Wms_stockindetail()
{
IsDel = 1; // 默认未删除1未删除0已删除
CreateDate = DateTime.Now; // 默认创建时间为当前时间
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
/// <summary>
/// 入库明细ID主键
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>自增主键或雪花ID唯一标识入库明细记录</remarks>
[SugarColumn(IsPrimaryKey = true)] // 标记为主键
[SugarColumn(IsPrimaryKey = true)]
public long StockInDetailId { get; set; }
/// <summary>
/// 关联的入库单ID
/// Desc:入库单号
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键关联到入库单表wms_stockin的主键标识所属入库单</remarks>
public long? StockInId { get; set; }
/// <summary>
/// 明细状态
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>通常关联状态枚举(如初始、已审核、已完成等),用字节类型存储</remarks>
public byte? Status { get; set; }
/// <summary>
/// 物料ID
/// Desc:物料
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到物料表的主键,标识入库的物料</remarks>
public long? MaterialId { get; set; }
/// <summary>
/// 计划入库数量
/// Desc:计划数量
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>预期入库的物料数量,用于与实际入库数量对比</remarks>
public decimal? PlanInQty { get; set; }
/// <summary>
/// 实际入库数量
/// Desc:实际数量
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>实际完成入库的物料数量,可能与计划数量存在差异</remarks>
public decimal? ActInQty { get; set; }
/// <summary>
/// 货架ID
/// Desc:货架
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键关联到货架表wms_storagerack的主键标识物料存放的货架</remarks>
public long? StoragerackId { get; set; }
/// <summary>
/// 审核人ID
/// Desc:审核人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到用户表的主键,记录审核该明细的用户</remarks>
public long? AuditinId { get; set; }
/// <summary>
/// 审核时间
/// Desc:审核时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>该明细的审核完成时间,为空表示未审核</remarks>
public DateTime? AuditinTime { get; set; }
/// <summary>
/// 是否删除标识
/// Desc:1 0
/// Default:1
/// Nullable:True
/// </summary>
/// <remarks>1未删除0已删除逻辑删除不实际从数据库删除记录</remarks>
public byte? IsDel { get; set; }
/// <summary>
/// 备注信息
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>存储该入库明细的额外说明,如物料特殊情况、处理备注等</remarks>
public string Remark { get; set; }
/// <summary>
/// 创建人ID
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到用户表的主键,记录创建该明细的用户</remarks>
public long? CreateBy { get; set; }
/// <summary>
/// 创建时间
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>明细记录的创建时间,默认值为当前时间</remarks>
public DateTime? CreateDate { get; set; }
/// <summary>
/// 修改人ID
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>外键,关联到用户表的主键,记录最后修改该明细的用户</remarks>
public long? ModifiedBy { get; set; }
/// <summary>
/// 修改时间
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>明细记录的最后修改时间,为空表示未修改过</remarks>
public DateTime? ModifiedDate { get; set; }
}
}

@ -1,17 +1,18 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_stockout")]
public partial class Wms_stockout
{
public Wms_stockout()
{
IsDel = 1;
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
@ -93,7 +94,7 @@ namespace YL.Core.Entity
/// </summary>
public long? ModifiedBy { get; set; }
/// <summary>
/// <summary>
/// Desc:修改时间
/// Default:
/// Nullable:True

@ -1,17 +1,17 @@
using SqlSugar;
using System;
using System;
using System.Linq;
using System.Text;
namespace YL.Core.Entity
{
///<summary>
///
///</summary>
[SugarTable(tableName: "wms_stockoutdetail")]
public partial class Wms_stockoutdetail
{
public Wms_stockoutdetail()
{
IsDel = 1; ;
IsDel = Convert.ToByte("1");
CreateDate = DateTime.Now;
}
@ -20,7 +20,6 @@ namespace YL.Core.Entity
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public long StockOutDetailId { get; set; }
/// <summary>

@ -3,87 +3,93 @@ using System;
namespace YL.Core.Entity
{
/// <summary>
/// 货架实体类,映射数据库中的"wms_storagerack"表
/// 用于存储货架的基本信息,包括所属仓库、库区等关联关系
/// </summary>
[SugarTable(tableName: "wms_storagerack")] // 指定数据库表名
///<summary>
///
///</summary>
public partial class Wms_storagerack
{
/// <summary>
/// 构造函数,初始化默认值
/// </summary>
public Wms_storagerack()
{
this.IsDel = 1; // 默认未删除1未删除0已删除
this.CreateDate = DateTime.Now; // 默认创建时间为当前时间
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
/// <summary>
/// 货架ID主键
/// Desc:货架Id
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>自增主键或雪花ID唯一标识货架记录</remarks>
[SugarColumn(IsPrimaryKey = true)] // 标记为主键
[SugarColumn(IsPrimaryKey = true)]
public long StorageRackId { get; set; }
/// <summary>
/// 货架编号
/// Desc:货架编号
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>货架的唯一编号用于系统内识别如A01、B02等</remarks>
public string StorageRackNo { get; set; }
/// <summary>
/// 货架名称
/// Desc:货架名称
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>货架的显示名称,用于界面展示(可为空)</remarks>
public string StorageRackName { get; set; }
/// <summary>
/// 所属仓库ID
/// Desc:所属仓库
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>关联到仓库表wms_warehouse的主键标识货架所属仓库</remarks>
public long? WarehouseId { get; set; }
/// <summary>
/// 所属库区ID
/// Desc:所属库区
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>关联到储位区表wms_reservoirarea的主键标识货架所属库区</remarks>
public long? ReservoirAreaId { get; set; }
/// <summary>
/// 备注信息
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>存储货架的额外说明,如位置描述、用途等</remarks>
public string Remark { get; set; }
/// <summary>
/// 是否删除标识
/// Desc:1 0
/// Default:1
/// Nullable:True
/// </summary>
/// <remarks>1未删除0已删除逻辑删除</remarks>
public byte? IsDel { get; set; }
/// <summary>
/// 创建人ID
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联到用户表的用户ID记录创建该货架的用户</remarks>
public long? CreateBy { get; set; }
/// <summary>
/// 创建时间
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>货架记录的创建时间,默认值为当前时间</remarks>
public DateTime? CreateDate { get; set; }
/// <summary>
/// 修改人ID
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联到用户表的用户ID记录最后修改该货架的用户</remarks>
public long? ModifiedBy { get; set; }
/// <summary>
/// 修改时间
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>货架记录的最后修改时间,为空表示未修改过</remarks>
public DateTime? ModifiedDate { get; set; }
}
}

@ -1,23 +1,23 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
[SugarTable(tableName: "wms_supplier")]
{
public class Wms_supplier
{
public Wms_supplier()
{
this.IsDel = 1;
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
}
/// <summary>
/// Desc:供应商id
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
[SugarColumn(IsPrimaryKey = true)]
public long SupplierId { get; set; }
/// <summary>
@ -111,4 +111,4 @@ namespace YL.Core.Entity
/// </summary>
public DateTime? ModifiedDate { get; set; }
}
}
}

@ -1,77 +1,81 @@
using SqlSugar;
using System;
using System;
using SqlSugar;
namespace YL.Core.Entity
{
/// <summary>
/// 仓库实体类,映射数据库中的"wms_warehouse"表
/// 用于存储仓库的基本信息,如编号、名称、状态等
/// </summary>
[SugarTable(tableName: "wms_warehouse")] // 指定数据库表名
///<summary>
///
///</summary>
public partial class Wms_warehouse
{
/// <summary>
/// 构造函数,初始化默认值
/// </summary>
public Wms_warehouse()
{
this.IsDel = 1; // 默认未删除1未删除0已删除
this.CreateDate = DateTime.Now; // 默认创建时间为当前时间
this.IsDel = Convert.ToByte("1");
this.CreateDate = DateTime.Now;
}
/// <summary>
/// 仓库ID主键
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>自增主键或雪花ID唯一标识仓库记录</remarks>
[SugarColumn(IsPrimaryKey = true)] // 标记为主键
[SugarColumn(IsPrimaryKey = true)]
public long WarehouseId { get; set; }
/// <summary>
/// 仓库编号
/// Desc:仓库编号
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>仓库的唯一编号,用于系统内识别</remarks>
public string WarehouseNo { get; set; }
/// <summary>
/// 仓库名称
/// Desc:仓库名称
/// Default:
/// Nullable:False
/// </summary>
/// <remarks>仓库的显示名称,用于界面展示</remarks>
public string WarehouseName { get; set; }
/// <summary>
/// 是否删除标识
/// Desc:是否删除 1未删除 0删除
/// Default:1
/// Nullable:True
/// </summary>
/// <remarks>1未删除0已删除逻辑删除</remarks>
public byte? IsDel { get; set; }
/// <summary>
/// 备注信息
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>存储仓库的额外说明或备注内容</remarks>
public string Remark { get; set; }
/// <summary>
/// 创建人ID
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联到用户表的用户ID记录创建该仓库的用户</remarks>
public long? CreateBy { get; set; }
/// <summary>
/// 创建时间
/// Desc:创建时间
/// Default:DateTime.Now
/// Nullable:True
/// </summary>
/// <remarks>仓库记录的创建时间,默认值为当前时间</remarks>
public DateTime? CreateDate { get; set; }
/// <summary>
/// 修改人ID
/// Desc:修改人
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>关联到用户表的用户ID记录最后修改该仓库的用户</remarks>
public long? ModifiedBy { get; set; }
/// <summary>
/// 修改时间
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
/// <remarks>仓库记录的最后修改时间,为空表示未修改过</remarks>
public DateTime? ModifiedDate { get; set; }
}
}

@ -10,389 +10,129 @@ using YL.Utils.Table;
namespace IRepository
{
/// <summary>
/// 基础仓储接口,定义通用数据访问操作
/// 继承 IDependency 接口,标记为可注入服务(依赖注入支持)
/// 泛型约束T 必须是类且具有无参构造函数(对应数据库实体类)
/// </summary>
/// <typeparam name="T">实体类型(与数据库表映射)</typeparam>
public interface IBaseRepository<T> : IDependency where T : class, new()
{
#region 新增操作Add
#region add
/// <summary>
/// 插入单条实体
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="IgnoreNullColumn">是否忽略空值列默认true仅插入非空字段</param>
/// <returns>是否插入成功</returns>
bool Insert(T t, bool IgnoreNullColumn = true);
/// <summary>
/// 异步插入单条实体
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="IgnoreNullColumn">是否忽略空值列</param>
/// <returns>是否插入成功Task包装</returns>
Task<bool> InsertAsync(T t, bool IgnoreNullColumn = true);
/// <summary>
/// 插入单条实体(强制忽略空值列)
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(T t);
/// <summary>
/// 插入单条实体(指定列忽略空值)
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="columns">指定需处理的列名数组</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(T t, params string[] columns);
/// <summary>
/// 使用外部SqlSugar客户端插入单条实体
/// (用于事务共享连接或多库操作场景)
/// </summary>
/// <param name="client">外部SqlSugar客户端实例</param>
/// <param name="t">实体对象</param>
/// <returns>是否插入成功</returns>
bool Insert(SqlSugarClient client, T t);
/// <summary>
/// 插入单条实体并返回大整数类型的自增主键
/// 适用于主键为bigint类型的表
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>自增主键值</returns>
long InsertBigIdentity(T t);
/// <summary>
/// 批量插入实体列表
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>是否插入成功</returns>
bool Insert(List<T> t);
/// <summary>
/// 批量插入实体列表(忽略空值列)
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(List<T> t);
/// <summary>
/// 批量插入实体列表(指定列忽略空值)
/// </summary>
/// <param name="t">实体列表</param>
/// <param name="columns">指定需处理的列名数组</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(List<T> t, params string[] columns);
/// <summary>
/// 事务中插入单条实体
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>事务执行结果(包含是否成功、影响行数等)</returns>
DbResult<bool> InsertTran(T t);
/// <summary>
/// 事务中批量插入实体列表
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>事务执行结果</returns>
DbResult<bool> InsertTran(List<T> t);
/// <summary>
/// 插入实体并返回插入后的实体(包含自增主键)
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>插入后的实体</returns>
T InsertReturnEntity(T t);
/// <summary>
/// 插入实体并返回插入后的实体(带锁机制)
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="sqlWith">锁类型如SqlWith.UpdLock表示更新锁</param>
/// <returns>插入后的实体</returns>
T InsertReturnEntity(T t, string sqlWith = SqlWith.UpdLock);
/// <summary>
/// 执行SQL命令带参数化查询防止注入
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">参数对象(匿名类或实体)</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, object parameters);
/// <summary>
/// 执行SQL命令使用SugarParameter参数
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">SugarParameter参数数组</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, params SugarParameter[] parameters);
/// <summary>
/// 执行SQL命令使用SugarParameter参数列表
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">SugarParameter参数列表</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, List<SugarParameter> parameters);
#endregion 新增操作
#endregion add
#region 更新操作Update
#region update
/// <summary>
/// 更新实体(根据主键)
/// </summary>
/// <param name="entity">实体对象(需包含主键值)</param>
/// <returns>是否更新成功</returns>
bool UpdateEntity(T entity);
/// <summary>
/// 根据条件更新实体
/// </summary>
/// <param name="entity">实体对象(包含要更新的字段值)</param>
/// <param name="expression">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, Expression<Func<T, bool>> expression);
/// <summary>
/// 只更新指定表达式中的字段
/// 只更新表达式的值
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="expression">指定要更新的字段表达式</param>
/// <returns>是否更新成功</returns>
/// <param name="entity"></param>
/// <param name="expression"></param>
/// <returns></returns>
bool Update(T entity, Expression<Func<T, object>> expression);
/// <summary>
/// 根据条件更新指定字段
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="expression">要更新的字段表达式</param>
/// <param name="where">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, Expression<Func<T, object>> expression, Expression<Func<T, bool>> where);
/// <summary>
/// 使用外部SqlSugar客户端更新指定字段事务共享场景
/// </summary>
/// <param name="client">外部SqlSugar客户端实例</param>
/// <param name="entity">实体对象</param>
/// <param name="expression">要更新的字段表达式</param>
/// <param name="where">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(SqlSugarClient client, T entity, Expression<Func<T, object>> expression, Expression<Func<T, bool>> where);
/// <summary>
/// 更新实体(可指定忽略字段和空值处理)
///
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="list">需要忽略更新的字段名列表</param>
/// <param name="isNull">是否忽略空值字段true不更新null值字段</param>
/// <returns>是否更新成功</returns>
/// <param name="entity">T</param>
/// <param name="list">忽略更新</param>
/// <param name="isNull">Null不更新</param>
/// <returns></returns>
bool Update(T entity, List<string> list = null, bool isNull = true);
/// <summary>
/// 批量更新实体列表(根据主键)
/// </summary>
/// <param name="entity">实体列表(需包含主键值)</param>
/// <returns>是否更新成功</returns>
bool Update(List<T> entity);
#endregion 更新操作
#endregion update
/// <summary>
/// 执行事务封装Action中的操作
/// </summary>
/// <param name="action">事务内要执行的操作</param>
/// <returns>事务执行结果</returns>
DbResult<bool> UseTran(Action action);
/// <summary>
/// 使用外部SqlSugar客户端执行事务
/// </summary>
/// <param name="client">外部SqlSugar客户端实例</param>
/// <param name="action">事务内要执行的操作</param>
/// <returns>事务执行结果</returns>
DbResult<bool> UseTran(SqlSugarClient client, Action action);
/// <summary>
/// 执行事务(无返回结果包装)
/// </summary>
/// <param name="action">事务内要执行的操作</param>
/// <returns>是否执行成功</returns>
bool UseTran2(Action action);
#region 删除操作Delete
#region delete
/// <summary>
/// 根据条件删除数据
/// </summary>
/// <param name="expression">删除条件表达式</param>
/// <returns>是否删除成功</returns>
bool Delete(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据主键数组删除数据
/// </summary>
/// <typeparam name="PkType">主键类型</typeparam>
/// <param name="primaryKeyValues">主键值数组</param>
/// <returns>是否删除成功</returns>
bool Delete<PkType>(PkType[] primaryKeyValues);
/// <summary>
/// 根据实体对象删除数据(根据主键)
/// </summary>
/// <param name="obj">实体对象(需包含主键值)</param>
/// <returns>是否删除成功</returns>
bool Delete(object obj);
#endregion 删除操作
#endregion delete
#region 查询操作Query
#region query
/// <summary>
/// 判断是否存在符合条件的记录
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>是否存在</returns>
bool IsAny(Expression<Func<T, bool>> expression);
/// <summary>
/// 获取查询器(用于构建复杂查询)
/// </summary>
/// <returns>SqlSugar查询器</returns>
ISugarQueryable<T> Queryable();
/// <summary>
/// 获取动态对象查询器(指定表名和别名)
/// (适用于查询动态表或多表关联场景)
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="shortName">表别名</param>
/// <returns>动态对象查询器</returns>
ISugarQueryable<ExpandoObject> Queryable(string tableName, string shortName);
// 注释:多表关联查询示例(泛型参数为关联表实体)
// ISugarQueryable<T, T1, T2> Queryable<T1, T2>() where T1 : class where T2 : new();
//ISugarQueryable<T, T1, T2> Queryable<T1, T2>() where T1 : class where T2 : new();
/// <summary>
/// 根据条件查询并返回实体列表
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体列表</returns>
List<T> QueryableToList(Expression<Func<T, bool>> expression);
/// <summary>
/// 异步根据条件查询并返回实体列表
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体列表Task包装</returns>
Task<List<T>> QueryableToListAsync(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据条件查询并返回JSON字符串
/// </summary>
/// <param name="select">要查询的字段(逗号分隔)</param>
/// <param name="expressionWhere">查询条件表达式</param>
/// <returns>JSON字符串</returns>
string QueryableToJson(string select, Expression<Func<T, bool>> expressionWhere);
/// <summary>
/// 根据表名查询并返回实体列表
/// (适用于动态表名场景)
/// </summary>
/// <param name="tableName">表名</param>
/// <returns>实体列表</returns>
List<T> QueryableToList(string tableName);
/// <summary>
/// 根据条件查询并返回单个实体(第一条)
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体对象无结果则为null</returns>
T QueryableToEntity(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据表名和条件查询并返回实体列表
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体列表</returns>
List<T> QueryableToList(string tableName, Expression<Func<T, bool>> expression);
/// <summary>
/// 分页查询(基础版)
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="pageIndex">页码从0开始</param>
/// <param name="pageSize">每页条数</param>
/// <returns>元组:(当前页数据列表, 总记录数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 分页查询(带排序字符串)
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="order">排序字符串(如"Id DESC, Name ASC"</param>
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">每页条数</param>
/// <returns>元组:(当前页数据列表, 总记录数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, string order, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 分页查询(带排序字段和排序方向)
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="orderFiled">排序字段表达式</param>
/// <param name="orderBy">排序方向("ASC"或"DESC"</param>
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">每页条数</param>
/// <returns>元组:(当前页数据列表, 总记录数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, Expression<Func<T, object>> orderFiled, string orderBy, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 分页查询基于Bootstrap分页参数
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="bootstrap">Bootstrap分页参数对象包含页码、页大小、排序等</param>
/// <returns>元组:(当前页数据列表, 总记录数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, Bootstrap.BootstrapParams bootstrap);
/// <summary>
/// 执行SQL查询并返回实体列表
/// </summary>
/// <param name="sql">SQL查询语句</param>
/// <param name="obj">参数对象(可选)</param>
/// <returns>实体列表</returns>
List<T> SqlQueryToList(string sql, object obj = null);
#endregion 查询操作
#endregion query
#region 存储过程(Procedure
#region Procedure
/// <summary>
/// 执行存储过程并返回DataTable
/// </summary>
/// <param name="procedureName">存储过程名称</param>
/// <param name="parameters">存储过程参数列表</param>
/// <returns>查询结果DataTable</returns>
DataTable UseStoredProcedureToDataTable(string procedureName, List<SugarParameter> parameters);
/// <summary>
/// 执行存储过程并返回结果集和输出参数
/// </summary>
/// <param name="procedureName">存储过程名称</param>
/// <param name="parameters">存储过程参数列表(包含输入/输出参数)</param>
/// <returns>元组:(查询结果DataTable, 输出参数列表)</returns>
(DataTable, List<SugarParameter>) UseStoredProcedureToTuple(string procedureName, List<SugarParameter> parameters);
#endregion 存储过程
#endregion Procedure
}
}

@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(LatestDevTFM)</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="sqlSugarCore" Version="5.1.4.199" />
<PackageReference Include="sqlSugarCore" Version="5.0.0.13" />
</ItemGroup>
<ItemGroup>

@ -5,4 +5,4 @@ namespace IRepository
public interface IWms_CarrierRepository : IBaseRepository<Wms_Carrier>
{
}
}
}

@ -5,4 +5,4 @@ namespace IRepository
public interface IWms_CustomerRepository : IBaseRepository<Wms_Customer>
{
}
}
}

@ -1,8 +1,11 @@
using YL.Core.Entity;
using System;
using System.Collections.Generic;
using System.Text;
namespace IRepository
{
public interface IWms_stockoutRepository : IBaseRepository<Wms_stockout>
{
public interface IWms_stockoutRepository : IBaseRepository<Wms_stockout>
{
}
}

@ -1,8 +1,11 @@
using YL.Core.Entity;
using System;
using System.Collections.Generic;
using System.Text;
namespace IRepository
{
public interface IWms_stockoutdetailRepository : IBaseRepository<Wms_stockoutdetail>
{
public interface IWms_stockoutdetailRepository : IBaseRepository<Wms_stockoutdetail>
{
}
}

@ -5,4 +5,4 @@ namespace IRepository
public interface IWms_supplierRepository : IBaseRepository<Wms_supplier>
{
}
}
}

@ -10,370 +10,112 @@ using YL.Utils.Table;
namespace IServices
{
/// <summary>
/// 基础服务接口,定义了通用的数据访问操作方法
/// 泛型T表示实体类型约束为类且具有无参构造函数
/// 继承IDependency接口表明该接口需要依赖注入容器管理
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
public interface IBaseServices<T> : IDependency where T : class, new()
{
#region 新增操作
/// <summary>
/// 插入单个实体
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="IgnoreNullColumn">是否忽略空值列默认true</param>
/// <returns>是否插入成功</returns>
#region add
bool Insert(T t, bool IgnoreNullColumn = true);
/// <summary>
/// 插入单个实体(忽略空值列)
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(T t);
/// <summary>
/// 插入单个实体(忽略空值列,并指定特定列)
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="columns">指定要插入的列</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(T t, params string[] columns);
/// <summary>
/// 使用指定的SqlSugar客户端插入单个实体
/// </summary>
/// <param name="client">SqlSugar客户端实例</param>
/// <param name="t">实体对象</param>
/// <returns>是否插入成功</returns>
bool Insert(SqlSugarClient client, T t);
/// <summary>
/// 插入单个实体并返回大整数类型的自增ID
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>自增ID</returns>
long InsertBigIdentity(T t);
/// <summary>
/// 批量插入实体列表
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>是否插入成功</returns>
bool Insert(List<T> t);
/// <summary>
/// 批量插入实体列表(忽略空值列)
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(List<T> t);
/// <summary>
/// 批量插入实体列表(忽略空值列,并指定特定列)
/// </summary>
/// <param name="t">实体列表</param>
/// <param name="columns">指定要插入的列</param>
/// <returns>是否插入成功</returns>
bool InsertIgnoreNullColumn(List<T> t, params string[] columns);
/// <summary>
/// 事务中插入单个实体
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>包含执行结果的DbResult对象</returns>
DbResult<bool> InsertTran(T t);
/// <summary>
/// 事务中批量插入实体列表
/// </summary>
/// <param name="t">实体列表</param>
/// <returns>包含执行结果的DbResult对象</returns>
DbResult<bool> InsertTran(List<T> t);
/// <summary>
/// 插入实体并返回插入后的实体包含自增ID等数据库生成的值
/// </summary>
/// <param name="t">实体对象</param>
/// <returns>插入后的实体</returns>
T InsertReturnEntity(T t);
/// <summary>
/// 插入实体并返回插入后的实体支持指定SQL锁
/// </summary>
/// <param name="t">实体对象</param>
/// <param name="sqlWith">SQL锁类型默认更新锁</param>
/// <returns>插入后的实体</returns>
T InsertReturnEntity(T t, string sqlWith = SqlWith.UpdLock);
/// <summary>
/// 执行SQL命令带参数对象
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">参数对象</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, object parameters);
/// <summary>
/// 执行SQL命令带SugarParameter参数数组
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">SugarParameter参数数组</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, params SugarParameter[] parameters);
/// <summary>
/// 执行SQL命令带SugarParameter参数列表
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">SugarParameter参数列表</param>
/// <returns>是否执行成功</returns>
bool ExecuteCommand(string sql, List<SugarParameter> parameters);
#endregion 新增操作
#endregion add
#region 更新操作
#region update
/// <summary>
/// 更新实体(根据主键)
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns>是否更新成功</returns>
bool UpdateEntity(T entity);
/// <summary>
/// 根据条件更新实体
/// </summary>
/// <param name="entity">实体对象(含更新值)</param>
/// <param name="expression">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, Expression<Func<T, bool>> expression);
/// <summary>
/// 更新实体的指定列(全表更新)
/// </summary>
/// <param name="entity">实体对象(含更新值)</param>
/// <param name="expression">指定要更新的列</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, Expression<Func<T, object>> expression);
/// <summary>
/// 根据条件更新实体的指定列
/// </summary>
/// <param name="entity">实体对象(含更新值)</param>
/// <param name="expression">指定要更新的列</param>
/// <param name="where">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, Expression<Func<T, object>> expression, Expression<Func<T, bool>> where);
/// <summary>
/// 使用指定的SqlSugar客户端根据条件更新实体的指定列
/// </summary>
/// <param name="client">SqlSugar客户端实例</param>
/// <param name="entity">实体对象(含更新值)</param>
/// <param name="expression">指定要更新的列</param>
/// <param name="where">更新条件表达式</param>
/// <returns>是否更新成功</returns>
bool Update(SqlSugarClient client, T entity, Expression<Func<T, object>> expression, Expression<Func<T, bool>> where);
/// <summary>
/// 更新实体(可指定列和空值处理)
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="list">指定要更新的列null则更新所有列</param>
/// <param name="isNull">是否忽略空值true不更新空值列</param>
/// <returns>是否更新成功</returns>
bool Update(T entity, List<string> list = null, bool isNull = true);
/// <summary>
/// 批量更新实体列表
/// </summary>
/// <param name="entity">实体列表</param>
/// <returns>是否更新成功</returns>
bool Update(List<T> entity);
#endregion 更新操作
#endregion update
/// <summary>
/// 在事务中执行操作
/// </summary>
/// <param name="action">要执行的操作</param>
/// <returns>包含事务执行结果的DbResult对象</returns>
DbResult<bool> UseTran(Action action);
/// <summary>
/// 使用指定的SqlSugar客户端在事务中执行操作
/// </summary>
/// <param name="client">SqlSugar客户端实例</param>
/// <param name="action">要执行的操作</param>
/// <returns>包含事务执行结果的DbResult对象</returns>
DbResult<bool> UseTran(SqlSugarClient client, Action action);
/// <summary>
/// 另一种事务执行方式(可能是自定义实现)
/// </summary>
/// <param name="action">要执行的操作</param>
/// <returns>是否执行成功</returns>
bool UseTran2(Action action);
#region 删除操作
#region delete
/// <summary>
/// 根据条件删除数据
/// </summary>
/// <param name="expression">删除条件表达式</param>
/// <returns>是否删除成功</returns>
bool Delete(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据主键数组删除数据
/// </summary>
/// <typeparam name="PkType">主键类型</typeparam>
/// <param name="primaryKeyValues">主键值数组</param>
/// <returns>是否删除成功</returns>
bool Delete<PkType>(PkType[] primaryKeyValues);
/// <summary>
/// 根据实体对象删除数据(根据主键)
/// </summary>
/// <param name="obj">实体对象(含主键)</param>
/// <returns>是否删除成功</returns>
bool Delete(object obj);
#endregion 删除操作
#endregion delete
#region 查询操作
#region query
/// <summary>
/// 判断是否存在符合条件的数据
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>是否存在</returns>
bool IsAny(Expression<Func<T, bool>> expression);
/// <summary>
/// 获取查询对象(用于链式查询)
/// </summary>
/// <returns>ISugarQueryable查询对象</returns>
ISugarQueryable<T> Queryable();
/// <summary>
/// 根据表名获取动态查询对象返回ExpandoObject
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="shortName">表别名</param>
/// <returns>动态查询对象</returns>
ISugarQueryable<ExpandoObject> Queryable(string tableName, string shortName);
/// <summary>
/// 根据条件查询并返回实体列表
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体列表</returns>
//ISugarQueryable<T, T1, T2> Queryable<T1, T2>() where T1 : class where T2 : new();
List<T> QueryableToList(Expression<Func<T, bool>> expression);
/// <summary>
/// 异步根据条件查询并返回实体列表
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>包含实体列表的Task</returns>
Task<List<T>> QueryableToListAsync(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据条件查询并返回JSON字符串
/// </summary>
/// <param name="select">要查询的列</param>
/// <param name="expressionWhere">查询条件表达式</param>
/// <returns>JSON字符串</returns>
string QueryableToJson(string select, Expression<Func<T, bool>> expressionWhere);
/// <summary>
/// 根据表名查询并返回实体列表
/// </summary>
/// <param name="tableName">表名</param>
/// <returns>实体列表</returns>
List<T> QueryableToList(string tableName);
/// <summary>
/// 根据条件查询并返回单个实体(第一条)
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体对象</returns>
T QueryableToEntity(Expression<Func<T, bool>> expression);
/// <summary>
/// 根据表名和条件查询并返回实体列表
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="expression">查询条件表达式</param>
/// <returns>实体列表</returns>
List<T> QueryableToList(string tableName, Expression<Func<T, bool>> expression);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="pageIndex">页码默认0</param>
/// <param name="pageSize">页大小默认10</param>
/// <returns>元组(当前页数据列表,总条数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 带排序的分页查询
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="order">排序字符串(如"Id DESC"</param>
/// <param name="pageIndex">页码默认0</param>
/// <param name="pageSize">页大小默认10</param>
/// <returns>元组(当前页数据列表,总条数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, string order, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 带排序字段和排序方式的分页查询
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="orderFiled">排序字段表达式</param>
/// <param name="orderBy">排序方式(如"ASC"或"DESC"</param>
/// <param name="pageIndex">页码默认0</param>
/// <param name="pageSize">页大小默认10</param>
/// <returns>元组(当前页数据列表,总条数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, Expression<Func<T, object>> orderFiled, string orderBy, int pageIndex = 0, int pageSize = 10);
/// <summary>
/// 根据Bootstrap参数进行分页查询适配前端分页组件
/// </summary>
/// <param name="expression">查询条件表达式</param>
/// <param name="bootstrap">Bootstrap分页参数对象</param>
/// <returns>元组(当前页数据列表,总条数)</returns>
(List<T>, int) QueryableToPage(Expression<Func<T, bool>> expression, Bootstrap.BootstrapParams bootstrap);
/// <summary>
/// 执行SQL查询并返回实体列表
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="obj">参数对象(可选)</param>
/// <returns>实体列表</returns>
List<T> SqlQueryToList(string sql, object obj = null);
#endregion 查询操作
#endregion query
/// <summary>
/// 执行存储过程并返回DataTable
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <param name="parameters">存储过程参数列表</param>
/// <returns>查询结果DataTable</returns>
DataTable UseStoredProcedureToDataTable(string procedureName, List<SugarParameter> parameters);
/// <summary>
/// 执行存储过程并返回DataTable和输出参数
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <param name="parameters">存储过程参数列表(含输出参数)</param>
/// <returns>元组查询结果DataTable包含输出值的参数列表</returns>
(DataTable, List<SugarParameter>) UseStoredProcedureToTuple(string procedureName, List<SugarParameter> parameters);
}
}
}

@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(LatestDevTFM)</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="sqlSugarCore" Version="5.1.4.199" />
<PackageReference Include="sqlSugarCore" Version="5.0.0.13" />
</ItemGroup>
<ItemGroup>

@ -1,5 +1,5 @@
using YL.Core.Dto;
using YL.Core.Entity;
using YL.Core.Dto;
namespace IServices
{

@ -1,5 +1,7 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
using YL.Core.Dto;
using YL.Core.Entity;
using YL.Utils.Table;

@ -1,3 +1,4 @@
using System.Collections.Generic;
using YL.Core.Dto;
using YL.Core.Entity;
using YL.Utils.Table;

@ -3,8 +3,8 @@ using YL.Utils.Table;
namespace IServices
{
public interface IWms_CarrierServices : IBaseServices<Wms_Carrier>
public interface IWms_CarrierServices: IBaseServices<Wms_Carrier>
{
string PageList(Bootstrap.BootstrapParams bootstrap);
}
}
}

@ -1,5 +1,5 @@
using YL.Core.Dto;
using YL.Core.Entity;
using YL.Core.Dto;
namespace IServices
{

@ -1,4 +1,5 @@
using YL.Core.Entity;
using YL.Utils.Pub;
using YL.Utils.Table;
namespace IServices

@ -1,3 +1,5 @@
using System;
using SqlSugar;
using YL.Core.Dto;
using YL.Core.Entity;

@ -1,3 +1,5 @@
using System;
using System.Linq.Expressions;
using YL.Core.Entity;
using YL.Utils.Table;

@ -7,4 +7,4 @@ namespace IServices
{
string PageList(Bootstrap.BootstrapParams bootstrap);
}
}
}

@ -1,124 +1,124 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33205.214
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "kopSoftWMS", "KopSoftWms\kopSoftWMS.csproj", "{AB10278E-541F-43A6-BB31-360B8F43AE92}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Core", "YL.Core", "{0C5095D0-6E22-4148-89A3-B44D6DFC29E3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dto", "Dto\Dto.csproj", "{34D767FD-4446-401D-9F1C-98081D88B615}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orm", "Orm\Orm.csproj", "{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Entity", "Entity\Entity.csproj", "{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Services", "YL.Services", "{8FA3375D-7742-471C-8012-99F882F13CE0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Repository", "YL.Repository", "{06B1CF6E-C674-476C-8CD5-D10C0FB0B319}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Util", "YL.Util", "{BC25B864-6322-4879-BD44-B12C9ADD29F4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Repository", "Repository\Repository.csproj", "{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRepository", "IRepository\IRepository.csproj", "{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IServices", "IServices\IServices.csproj", "{9D3314A5-67C9-4AD4-AC50-881B4510DA19}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.Utils", "YL.Utils\YL.Utils.csproj", "{489B84BB-ED00-4DB7-8D1E-117A6F774968}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.NetCore", "YL.NetCore", "{37A7799B-1F85-4746-A9EA-B0F219831CDA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.NetCore", "NetCore\YL.NetCore.csproj", "{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.NetCoreApp", "NetCoreApp\YL.NetCoreApp.csproj", "{FCA45070-6064-40DB-A5E8-4778E0C99E2D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{34B22F89-6684-4AD7-B92A-8C452BA1AFB9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{113E9737-A3EA-493C-9C39-2F044C12C41C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XUnitTestKopSoftWms", "..\test\XUnitTestKopSoftWms\XUnitTestKopSoftWms.csproj", "{27CB3914-2BBB-4E13-84B6-14B5E397A28C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Services", "Services\Services.csproj", "{5ECAA16F-5715-4310-B2C9-68C4BA72B432}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Release|Any CPU.Build.0 = Release|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Release|Any CPU.Build.0 = Release|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Release|Any CPU.Build.0 = Release|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Release|Any CPU.Build.0 = Release|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Release|Any CPU.Build.0 = Release|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Release|Any CPU.Build.0 = Release|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Release|Any CPU.Build.0 = Release|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Debug|Any CPU.Build.0 = Debug|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Release|Any CPU.ActiveCfg = Release|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Release|Any CPU.Build.0 = Release|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Release|Any CPU.Build.0 = Release|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Release|Any CPU.Build.0 = Release|Any CPU
{27CB3914-2BBB-4E13-84B6-14B5E397A28C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27CB3914-2BBB-4E13-84B6-14B5E397A28C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{27CB3914-2BBB-4E13-84B6-14B5E397A28C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27CB3914-2BBB-4E13-84B6-14B5E397A28C}.Release|Any CPU.Build.0 = Release|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AB10278E-541F-43A6-BB31-360B8F43AE92} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{0C5095D0-6E22-4148-89A3-B44D6DFC29E3} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{34D767FD-4446-401D-9F1C-98081D88B615} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{8FA3375D-7742-471C-8012-99F882F13CE0} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{06B1CF6E-C674-476C-8CD5-D10C0FB0B319} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{BC25B864-6322-4879-BD44-B12C9ADD29F4} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650} = {06B1CF6E-C674-476C-8CD5-D10C0FB0B319}
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59} = {06B1CF6E-C674-476C-8CD5-D10C0FB0B319}
{9D3314A5-67C9-4AD4-AC50-881B4510DA19} = {8FA3375D-7742-471C-8012-99F882F13CE0}
{489B84BB-ED00-4DB7-8D1E-117A6F774968} = {BC25B864-6322-4879-BD44-B12C9ADD29F4}
{37A7799B-1F85-4746-A9EA-B0F219831CDA} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7} = {37A7799B-1F85-4746-A9EA-B0F219831CDA}
{FCA45070-6064-40DB-A5E8-4778E0C99E2D} = {37A7799B-1F85-4746-A9EA-B0F219831CDA}
{27CB3914-2BBB-4E13-84B6-14B5E397A28C} = {113E9737-A3EA-493C-9C39-2F044C12C41C}
{5ECAA16F-5715-4310-B2C9-68C4BA72B432} = {8FA3375D-7742-471C-8012-99F882F13CE0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D493867C-D775-4AEC-9F0A-298A298D9FFE}
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.572
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KopSoftWms", "KopSoftWms\KopSoftWms.csproj", "{AB10278E-541F-43A6-BB31-360B8F43AE92}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Core", "YL.Core", "{0C5095D0-6E22-4148-89A3-B44D6DFC29E3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dto", "Dto\Dto.csproj", "{34D767FD-4446-401D-9F1C-98081D88B615}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orm", "Orm\Orm.csproj", "{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Entity", "Entity\Entity.csproj", "{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Services", "YL.Services", "{8FA3375D-7742-471C-8012-99F882F13CE0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Repository", "YL.Repository", "{06B1CF6E-C674-476C-8CD5-D10C0FB0B319}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.Util", "YL.Util", "{BC25B864-6322-4879-BD44-B12C9ADD29F4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Repository", "Repository\Repository.csproj", "{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRepository", "IRepository\IRepository.csproj", "{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IServices", "IServices\IServices.csproj", "{9D3314A5-67C9-4AD4-AC50-881B4510DA19}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.Utils", "YL.Utils\YL.Utils.csproj", "{489B84BB-ED00-4DB7-8D1E-117A6F774968}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "YL.NetCore", "YL.NetCore", "{37A7799B-1F85-4746-A9EA-B0F219831CDA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.NetCore", "NetCore\YL.NetCore.csproj", "{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YL.NetCoreApp", "NetCoreApp\YL.NetCoreApp.csproj", "{FCA45070-6064-40DB-A5E8-4778E0C99E2D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{34B22F89-6684-4AD7-B92A-8C452BA1AFB9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{113E9737-A3EA-493C-9C39-2F044C12C41C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Services", "Services\Services.csproj", "{5ECAA16F-5715-4310-B2C9-68C4BA72B432}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XUnitTestKopSoftWms", "..\test\XUnitTestKopSoftWms\XUnitTestKopSoftWms.csproj", "{B3B2E6B4-3457-449F-9144-6030A795D2AD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB10278E-541F-43A6-BB31-360B8F43AE92}.Release|Any CPU.Build.0 = Release|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34D767FD-4446-401D-9F1C-98081D88B615}.Release|Any CPU.Build.0 = Release|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B}.Release|Any CPU.Build.0 = Release|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79}.Release|Any CPU.Build.0 = Release|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650}.Release|Any CPU.Build.0 = Release|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59}.Release|Any CPU.Build.0 = Release|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D3314A5-67C9-4AD4-AC50-881B4510DA19}.Release|Any CPU.Build.0 = Release|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Debug|Any CPU.Build.0 = Debug|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Release|Any CPU.ActiveCfg = Release|Any CPU
{489B84BB-ED00-4DB7-8D1E-117A6F774968}.Release|Any CPU.Build.0 = Release|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7}.Release|Any CPU.Build.0 = Release|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FCA45070-6064-40DB-A5E8-4778E0C99E2D}.Release|Any CPU.Build.0 = Release|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5ECAA16F-5715-4310-B2C9-68C4BA72B432}.Release|Any CPU.Build.0 = Release|Any CPU
{B3B2E6B4-3457-449F-9144-6030A795D2AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B3B2E6B4-3457-449F-9144-6030A795D2AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B3B2E6B4-3457-449F-9144-6030A795D2AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B3B2E6B4-3457-449F-9144-6030A795D2AD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AB10278E-541F-43A6-BB31-360B8F43AE92} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{0C5095D0-6E22-4148-89A3-B44D6DFC29E3} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{34D767FD-4446-401D-9F1C-98081D88B615} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{8F99EFFD-A2A3-413A-9EC4-4ADDFA1A978B} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{0FA88DA9-FA21-4F08-AF7F-5D9DE772DD79} = {0C5095D0-6E22-4148-89A3-B44D6DFC29E3}
{8FA3375D-7742-471C-8012-99F882F13CE0} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{06B1CF6E-C674-476C-8CD5-D10C0FB0B319} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{BC25B864-6322-4879-BD44-B12C9ADD29F4} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{FD70BC30-5AEB-4EA0-A701-D3293BAC4650} = {06B1CF6E-C674-476C-8CD5-D10C0FB0B319}
{D566D03B-E6E0-4BEE-9544-6B1A37E4DD59} = {06B1CF6E-C674-476C-8CD5-D10C0FB0B319}
{9D3314A5-67C9-4AD4-AC50-881B4510DA19} = {8FA3375D-7742-471C-8012-99F882F13CE0}
{489B84BB-ED00-4DB7-8D1E-117A6F774968} = {BC25B864-6322-4879-BD44-B12C9ADD29F4}
{37A7799B-1F85-4746-A9EA-B0F219831CDA} = {34B22F89-6684-4AD7-B92A-8C452BA1AFB9}
{5B9D28EC-6ACE-464E-AF09-141ED6E451F7} = {37A7799B-1F85-4746-A9EA-B0F219831CDA}
{FCA45070-6064-40DB-A5E8-4778E0C99E2D} = {37A7799B-1F85-4746-A9EA-B0F219831CDA}
{5ECAA16F-5715-4310-B2C9-68C4BA72B432} = {8FA3375D-7742-471C-8012-99F882F13CE0}
{B3B2E6B4-3457-449F-9144-6030A795D2AD} = {113E9737-A3EA-493C-9C39-2F044C12C41C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D493867C-D775-4AEC-9F0A-298A298D9FFE}
EndGlobalSection
EndGlobal

@ -3,78 +3,46 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Linq;
using System.Security.Claims;
using YL.Utils.Extensions;
using YL.Utils.Pub;
namespace YL.NetCore.Attributes
{
/// <summary>
/// 菜单检查与数据注入过滤器
/// 作用在控制器动作执行前加载用户权限菜单、页面元信息等传递到ViewData/ViewBag供视图使用
/// </summary>
public class CheckMenuAttribute : ActionFilterAttribute
{
/// <summary>
/// 构造函数(无参,使用默认配置)
/// </summary>
public CheckMenuAttribute()
{
}
/// <summary>
/// 动作执行前触发(核心方法)
/// 执行时机:控制器动作方法执行前,模型绑定完成后
/// </summary>
/// <param name="context">动作执行上下文(包含请求、控制器、动作描述等信息)</param>
public override void OnActionExecuting(ActionExecutingContext context)
{
// 获取控制器的ViewData用于向视图传递数据
var viewData = (context.Controller as Controller)?.ViewData;
// 获取控制器的ViewBag动态向视图传递数据
var viewBag = (context.Controller as Controller)?.ViewBag;
// 获取依赖注入服务提供器(用于获取缓存、业务服务等)
var services = context.HttpContext.RequestServices;
// 获取当前动作的属性集合存储在Startup中配置的页面元信息如keywords、description等
var properties = context.ActionDescriptor.Properties;
// 获取当前登录用户的Claims身份信息包含用户ID、角色、昵称等认证数据
var claims = context.HttpContext.User?.Claims;
// 从服务提供器获取内存缓存服务(用于缓存用户菜单,减少数据库查询)
var cache = services.GetService(typeof(IMemoryCache)) as IMemoryCache;
// 从服务提供器获取角色相关业务服务(用于查询用户权限菜单)
var roleServices = services.GetService(typeof(ISys_roleServices)) as ISys_roleServices;
// 向ViewData注入用户权限菜单
if (viewData != null)
{
// 验证当前用户是否已登录User不为空
if (context.HttpContext.User != null)
{
// 从Claims中获取用户IDClaimTypes.Sid对应存储的用户唯一标识
var UserId = claims.SingleOrDefault(c => c.Type == ClaimTypes.Sid)?.Value;
// 从缓存获取用户菜单:缓存存在则直接使用,不存在则通过角色服务查询并缓存
// 缓存键格式menu_+用户ID确保不同用户菜单隔离
viewData["menu"] = cache.Get("menu_" + UserId)
?? roleServices?.GetMenu(claims.SingleOrDefault(c => c.Type == ClaimTypes.Role).Value.ToInt64());
var UserId = claims.SingleOrDefault(c => c.Type == ClaimTypes.Sid).Value;
viewData["menu"] = cache.Get("menu_" + UserId) ?? roleServices?.GetMenu(claims.SingleOrDefault(c => c.Type == ClaimTypes.Role).Value.ToInt64());
}
// ReSharper disable once PossibleNullReferenceException
}
// 向ViewBag注入页面元信息和用户信息
if (viewBag != null)
{
// 注入页面关键词从动作属性中获取Startup中通过ApplicationDescription配置
viewBag.keywords = properties["keywords"].ToString();
// 注入页面描述(同上)
viewBag.description = properties["description"].ToString();
// 注入公司名称(同上)
viewBag.company = properties["company"].ToString();
// 从Claims中获取用户昵称ClaimTypes.Name对应存储的用户昵称
viewBag.nickname = claims.SingleOrDefault(c => c.Type == ClaimTypes.Name)?.Value;
// 从Claims中获取用户头像地址ClaimTypes.Uri对应存储的头像URL
viewBag.headimg = claims.SingleOrDefault(c => c.Type == ClaimTypes.Uri)?.Value;
viewBag.nickname = claims.SingleOrDefault(c => c.Type == ClaimTypes.Name).Value;
viewBag.headimg = claims.SingleOrDefault(c => c.Type == ClaimTypes.Uri).Value;
}
// 调用基类方法,确保过滤器链正常执行
base.OnActionExecuting(context);
}
}

@ -5,147 +5,90 @@ using Microsoft.Extensions.Configuration;
using System;
using System.Linq;
using System.Security.Claims;
using YL.Core.Entity.Fluent.Validation; // 日志实体验证规则
using YL.Utils.Env; // 环境与全局工具类
using YL.Utils.Extensions; // 扩展方法
using YL.Utils.Http; // HTTP相关工具
using YL.Utils.Pub; // 公共常量与工具
using YL.Core.Entity.Fluent.Validation;
using YL.Utils.Env;
using YL.Utils.Extensions;
using YL.Utils.Http;
using YL.Utils.Pub;
namespace YL.NetCore.Attributes
{
/// <summary>
/// 操作日志记录过滤器
/// 作用:在动作执行结果返回后,自动记录用户操作日志(如添加、修改、查询等)
/// 特性:密封类,防止被继承重写
/// </summary>
public sealed class OperationLogAttribute : ResultFilterAttribute
{
/// <summary>
/// 是否忽略日志记录默认true不忽略即记录日志
/// </summary>
public bool Ignore { get; set; } = true;
/// <summary>
/// 日志类型(如添加、修改、查询等,通过枚举定义)
/// </summary>
public LogType LogType { get; set; }
/// <summary>
/// 无参构造函数(使用默认配置)
/// </summary>
public OperationLogAttribute()
{
}
/// <summary>
/// 构造函数:指定是否忽略日志记录
/// </summary>
/// <param name="ignore">是否忽略</param>
public OperationLogAttribute(bool ignore)
{
Ignore = ignore;
}
/// <summary>
/// 构造函数:指定日志类型
/// </summary>
/// <param name="logType">日志类型</param>
public OperationLogAttribute(LogType logType)
{
LogType = logType;
}
/// <summary>
/// 构造函数:同时指定是否忽略和日志类型
/// </summary>
/// <param name="ignore">是否忽略</param>
/// <param name="logType">日志类型</param>
public OperationLogAttribute(bool ignore, LogType logType)
{
Ignore = ignore;
LogType = logType;
}
/// <summary>
/// 结果执行前触发(核心方法)
/// 执行时机:控制器动作执行完成,结果返回给客户端前
/// </summary>
/// <param name="context">结果执行上下文(包含动作结果、请求信息等)</param>
public override void OnResultExecuting(ResultExecutingContext context)
{
// 获取依赖注入服务提供器(用于获取配置、日志服务等)
var services = context.HttpContext.RequestServices;
// 获取配置服务读取appsettings.json中的日志开关配置
var config = services.GetService(typeof(IConfiguration)) as IConfiguration;
// 获取当前登录用户的Claims身份信息包含用户ID等
var claims = context.HttpContext.User.Claims;
// 从配置中读取操作日志开关Log:operationlog节点默认关闭
string flag = config["Log:operationlog"];
if (string.IsNullOrWhiteSpace(flag))
{
flag = "false"; // 配置未设置时默认关闭
flag = "false";
}
// 仅当开关开启("true")且不忽略记录时,执行日志记录逻辑
if (flag.Equals("true", StringComparison.OrdinalIgnoreCase))
{
if (Ignore)
{
// 1. 读取请求参数和上下文信息(通过扩展方法获取)
{//传入参数
var parameters = context.ReadResultExecutingContext();
// parameters.Item1请求参数表单/JSON数据
// parameters.Item2请求URL
// parameters.Item3请求方法GET/POST等
// 2. 解析动作执行结果(根据不同结果类型提取关键信息)
//result
var result = context.Result;
object res = null; // 存储结果信息
object res = null;
if (result is ObjectResult objectResult)
{
// 对象结果如API返回的JSON对象
res = objectResult.Value;
}
else if (result is ContentResult contentResult)
{
// 文本结果(如纯文本响应)
res = contentResult.Content;
}
else if (result is EmptyResult emptyResult)
{
// 空结果
res = emptyResult;
}
else if (result is StatusCodeResult statusCodeResult)
{
// 状态码结果如404、500等
res = statusCodeResult;
}
else if (result is JsonResult jsonResult)
{
// JSON结果
res = jsonResult.Value.ToString();
}
else if (result is FileResult fileResult)
{
// 文件结果(记录文件名或内容类型)
res = fileResult.FileDownloadName.IsEmpty() ? fileResult.ContentType : fileResult.FileDownloadName;
}
else if (result is ViewResult viewResult)
{
// 视图结果(记录模型数据)
res = viewResult.Model;
}
else if (result is RedirectResult redirectResult)
{
// 重定向结果记录目标URL
res = redirectResult.Url;
}
// 3. 获取日志服务(用于将日志写入数据库)
var log = services.GetService(typeof(ISys_logServices)) as ISys_logServices;
// 4. 动态修正日志类型(如果是"新增或修改"类型,根据结果内容判断具体类型)
if (LogType == LogType.addOrUpdate)
{
if (res.ToString().Contains("修改"))
@ -157,46 +100,34 @@ namespace YL.NetCore.Attributes
LogType = LogType.add;
}
}
// 5. 构建日志描述信息(根据日志类型拼接不同内容)
string des = "";
if (LogType == LogType.select)
{
// 查询类型日志:记录参数和请求方法
des = parameters.Item1 + ";" + parameters.Item3;
}
else
{
// 其他类型(增删改等):记录结果、参数和请求方法
des = res.ToString() + ";" + parameters.Item1 + ";" + parameters.Item3;
}
// 6. 构建日志实体对象
var model = new Core.Entity.Sys_log
{
Browser = GlobalCore.GetBrowser(), // 获取客户端浏览器信息
CreateBy = claims.SingleOrDefault(c => c.Type == ClaimTypes.Sid).Value.ToInt64(), // 操作人ID从Claims获取
CreateDate = DateTimeExt.DateTime, // 操作时间(当前时间)
Description = des, // 操作描述
LogId = PubId.SnowflakeId, // 日志ID雪花算法生成唯一ID
LogIp = GlobalCore.GetIp(), // 操作IP地址
LogType = LogType.EnumToString(), // 日志类型(枚举转字符串)
Url = parameters.Item2 // 操作URL
Browser = GlobalCore.GetBrowser(),
CreateBy = claims.SingleOrDefault(c => c.Type == ClaimTypes.Sid).Value.ToInt64(),
CreateDate = DateTimeExt.DateTime,
Description = des,
LogId = PubId.SnowflakeId,
LogIp = GlobalCore.GetIp(),
LogType = LogType.EnumToString(),
Url = parameters.Item2
};
// 7. 验证日志实体使用FluentValidation验证规则
SysLogFluent rules = new SysLogFluent();
var validationResult = rules.Validate(model);
// 8. 验证通过则插入日志
if (validationResult.IsValid)
{
log.Insert(model);
}
}
}
// 调用基类方法,确保过滤器链正常执行
base.OnResultExecuting(context);
}
}

@ -1,6 +1,10 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace KopSoftWms.Attributes
{
@ -29,7 +33,6 @@ namespace KopSoftWms.Attributes
{
viewBag.title = properties["title"].ToString();
viewBag.company = properties["company"].ToString();
viewBag.customer = properties["customer"].ToString();
}
base.OnActionExecuting(context);
}

@ -1,126 +1,84 @@
// 引入IServices命名空间包含服务接口定义
using IServices;
// 引入ASP.NET Core MVC核心命名空间用于控制器、视图等功能
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar命名空间用于ORM数据库操作
using SqlSugar;
// 引入LINQ相关命名空间用于集合查询操作
using System.Linq;
// 引入YL.Core.Entity命名空间包含核心实体类定义
using YL.Core.Entity;
// 引入YL.Core.Entity.Fluent.Validation命名空间包含实体验证相关类
using YL.Core.Entity.Fluent.Validation;
// 引入YL.NetCore.Attributes命名空间包含自定义特性
using YL.NetCore.Attributes;
// 引入YL.NetCore.NetCoreApp命名空间包含.NET Core应用相关功能
using YL.NetCore.NetCoreApp;
// 引入YL.Utils.Extensions命名空间包含工具类扩展方法
using YL.Utils.Extensions;
// 引入YL.Utils.Pub命名空间包含公共常量、枚举等定义
using YL.Utils.Pub;
// 引入YL.Utils.Table命名空间包含表格相关工具类
using YL.Utils.Table;
// 定义控制器所在的命名空间
namespace KopSoftWms.Controllers
{
// 定义承运商控制器继承自BaseController基础控制器可能包含通用功能
public class CarrierController : BaseController
{
// 声明承运商服务接口的私有字段,用于依赖注入
private readonly IWms_CarrierServices _carrierServices;
// 构造函数,通过依赖注入获取承运商服务实例
public CarrierController(IWms_CarrierServices carrierServices)
{
_carrierServices = carrierServices;
}
// 定义HTTP GET请求的Index方法用于显示承运商列表页面
[HttpGet]
[CheckMenu] // 自定义特性,可能用于检查用户是否有权限访问该菜单
[CheckMenu]
public IActionResult Index()
{
// 返回Index视图
return View();
}
// 定义HTTP POST请求的List方法用于获取承运商列表数据支持分页、排序等
[HttpPost]
[OperationLog(LogType = LogType.select)] // 记录操作日志,类型为查询
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType = LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用服务层的分页列表方法,获取符合条件的承运商数据
var sd = _carrierServices.PageList(bootstrap);
// 将结果以ContentResult形式返回通常为JSON字符串
return Content(sd);
}
// 定义HTTP GET请求的Add方法用于显示添加或编辑承运商的表单页面
[HttpGet]
public IActionResult Add(string id)
{
// 实例化一个新的承运商对象
var model = new Wms_Carrier();
// 如果id为空说明是添加操作直接返回空模型的视图
if (id.IsEmpty())
{
return View(model);
}
else
{
// 如果id不为空说明是编辑操作查询对应的承运商实体
model = _carrierServices.QueryableToEntity(c => c.CarrierId == SqlFunc.ToInt64(id));
// 返回包含该实体数据的视图
return View(model);
}
}
// 定义HTTP POST请求的AddOrUpdate方法用于处理添加或更新承运商的表单提交
[HttpPost]
[FilterXss] // 自定义特性用于过滤XSS攻击脚本
[OperationLog(LogType = LogType.addOrUpdate)] // 记录操作日志,类型为添加或更新
public IActionResult AddOrUpdate([FromForm] Wms_Carrier model, [FromForm] string id)
[FilterXss]
[OperationLog(LogType = LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_Carrier model, [FromForm]string id)
{
// 实例化承运商验证器
var validator = new CarrierFluent();
// 对模型进行验证
var results = validator.Validate(model);
// 获取验证是否成功的标志
var success = results.IsValid;
// 如果验证失败
if (!success)
{
// 拼接所有验证错误信息
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 返回包含错误信息的JSON结果失败状态
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// 如果id为空或为0说明是添加操作
if (id.IsEmptyZero())
{
// 检查是否存在相同的承运商编号或名称
if (_carrierServices.IsAny(c => c.CarrierNo == model.CarrierNo || c.CarrierName == model.CarrierName))
{
// 返回已存在的提示信息
return BootJsonH((false, PubConst.Carrier1));
}
// 生成雪花算法ID作为承运商ID
model.CarrierId = PubId.SnowflakeId;
// 设置创建人ID从缓存中获取当前用户ID
model.CreateBy = UserDtoCache.UserId;
// 调用服务层插入方法
bool flag = _carrierServices.Insert(model);
// 根据操作结果返回对应的提示信息
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
else
{
// 如果id不为空说明是更新操作设置承运商ID
model.CarrierId = id.ToInt64();
// 设置修改人ID从缓存中获取当前用户ID
model.ModifiedBy = UserDtoCache.UserId;
// 设置修改时间(当前时间)
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _carrierServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
@ -128,18 +86,10 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[OperationLog(LogType = LogType.delete)] // 记录操作日志,类型为删除
[OperationLog(LogType = LogType.delete)]
public IActionResult Delete(string id)
{
var flag = _carrierServices.Update(
new Wms_Carrier {
CarrierId = SqlFunc.ToInt64(id),
IsDel = 0, // 这里可能是逻辑删除标志0表示已删除具体需看业务定义
ModifiedBy = UserDtoCache.UserId,
ModifiedDate = DateTimeExt.DateTime
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }
);
var flag = _carrierServices.Update(new Wms_Carrier { CarrierId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}

@ -1,215 +1,142 @@
// 引入服务接口命名空间
using IServices;
// 引入ASP.NET Core HTTP相关命名空间处理文件上传等
using IServices;
using Microsoft.AspNetCore.Http;
// 引入ASP.NET Core MVC核心命名空间
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间
using SqlSugar;
// 引入IO操作相关命名空间
using System.IO;
// 引入LINQ查询相关命名空间
using System.Linq;
// 引入核心实体类命名空间
using YL.Core.Entity;
// 引入实体类验证相关命名空间
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间
using YL.NetCore.Attributes;
// 引入.NET Core应用相关命名空间
using YL.NetCore.NetCoreApp;
// 引入委托工具类命名空间
using YL.Utils.Delegate;
// 引入Excel操作工具类命名空间
using YL.Utils.Excel;
// 引入扩展方法命名空间
using YL.Utils.Extensions;
// 引入文件操作工具类命名空间
using YL.Utils.Files;
// 引入JSON操作工具类命名空间
using YL.Utils.Json;
// 引入公共常量/枚举命名空间
using YL.Utils.Pub;
// 引入表格工具类命名空间
using YL.Utils.Table;
// 定义控制器所在命名空间
namespace KopSoftWms.Controllers
{
// 客户控制器,继承自基础控制器(包含通用功能)
public class CustomerController : BaseController
{
// 客户服务接口私有字段(依赖注入)
private readonly IWms_CustomerServices _customerServices;
// 构造函数:通过依赖注入初始化客户服务
public CustomerController(IWms_CustomerServices customerServices)
{
_customerServices = customerServices;
}
// HTTP GET请求显示客户列表页面
[HttpGet]
[CheckMenu] // 检查菜单访问权限的自定义特性
[CheckMenu]
public IActionResult Index()
{
return View(); // 返回Index视图
return View();
}
// HTTP POST请求获取客户分页列表数据
[HttpPost]
[OperationLog(LogType.select)] // 记录查询操作日志
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用服务层获取分页数据
var sd = _customerServices.PageList(bootstrap);
return Content(sd); // 以ContentResult形式返回数据通常为JSON
return Content(sd);
}
// HTTP GET请求显示添加/编辑客户表单
[HttpGet]
public IActionResult Add(string id)
{
// 初始化客户实体
var model = new Wms_Customer();
// 如果id为空返回空模型添加操作
if (id.IsEmpty())
{
return View(model);
}
else
{
// 如果id不为空查询对应客户数据编辑操作
model = _customerServices.QueryableToEntity(c => c.CustomerId == SqlFunc.ToInt64(id));
return View(model); // 返回带数据的视图
return View(model);
}
}
// HTTP POST请求处理添加/编辑客户提交
[HttpPost]
[FilterXss] // 过滤XSS攻击脚本的特性
[OperationLog(LogType.addOrUpdate)] // 记录添加/更新操作日志
public IActionResult AddOrUpdate([FromForm] Wms_Customer model, [FromForm] string id)
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_Customer model, [FromForm]string id)
{
// 初始化客户验证器
var validator = new CustomerFluent();
// 执行模型验证
var results = validator.Validate(model);
var success = results.IsValid;
// 如果验证失败,返回错误信息
if (!success)
{
// 拼接所有验证错误信息
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// 如果id为空或0执行添加操作
if (id.IsEmptyZero())
{
// 检查客户编号或名称是否已存在
if (_customerServices.IsAny(c => c.CustomerNo == model.CustomerNo || c.CustomerName == model.CustomerName))
{
return BootJsonH((false, PubConst.Customer1)); // 返回已存在提示
return BootJsonH((false, PubConst.Customer1));
}
// 设置新增客户的基础信息
model.CustomerId = PubId.SnowflakeId; // 生成雪花算法ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID
bool flag = _customerServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.CustomerId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _customerServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
else
{
// 执行更新操作设置客户ID和修改信息
model.CustomerId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间
var flag = _customerServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _customerServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
// HTTP GET请求删除客户逻辑删除
[HttpGet]
[OperationLog(LogType.delete)] // 记录删除操作日志
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 执行逻辑删除:更新删除标志、修改人、修改时间
var flag = _customerServices.Update(
new Wms_Customer {
CustomerId = SqlFunc.ToInt64(id),
IsDel = 0, // 逻辑删除标志0表示已删除具体看业务定义
ModifiedBy = UserDtoCache.UserId,
ModifiedDate = DateTimeExt.DateTime
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 指定更新的字段
);
// 根据操作结果返回对应提示
var flag = _customerServices.Update(new Wms_Customer { CustomerId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
// HTTP GET请求下载客户模板Excel
[HttpGet]
public IActionResult Download()
{
// 打开模板文件流路径wwwroot/excel/customer.xlsx
var stream = System.IO.File.OpenRead(Path.Combine(WebRoot, "excel", "customer.xlsx"));
// 返回文件流指定MIME类型为Excel下载文件名为customer.xlsx
return File(stream, ContentType.ContentTypeExcel, "customer.xlsx");
}
// HTTP GET请求显示导入客户页面
[HttpGet]
public IActionResult Import()
{
return View(); // 返回导入视图
return View();
}
// HTTP POST请求处理Excel导入客户数据
[HttpPost]
public IActionResult ImportExcel(IFormFile file)
{
// 检查文件是否为空
if (file == null || file.Length <= 0)
{
return BootJsonH((false, PubConst.File1)); // 返回文件为空提示
return BootJsonH((false, PubConst.File1));
}
// 获取文件扩展名并转为小写
string fileExt = Path.GetExtension(file.FileName).ToLower();
// 检查是否为Excel文件.xls或.xlsx
if (!NpoiUtil.excel.Contains(fileExt))
{
return BootJsonH((false, PubConst.File2)); // 返回文件类型错误提示
return BootJsonH((false, PubConst.File2));
}
// 生成服务器端保存路径wwwroot/upload/UUID+扩展名)
string filepath = Path.Combine(WebRoot, "upload", PubId.GetUuid()) + fileExt;
// 使用委托工具类执行导入逻辑(包含异常处理)
var filepath = Path.Combine(WebRoot, "upload", PubId.GetUuid()) + fileExt;
//1 直接通过流
return DelegateUtil.TryExecute<IActionResult>(() =>
{
// 通过内存流处理文件(不落地保存)
using (var st = new MemoryStream())
{
file.CopyTo(st); // 将上传文件复制到内存流
var dt = NpoiUtil.Import(st, fileExt); // 解析Excel为DataTable
// 调用服务层导入方法并将结果转为JSON
var json = _customerServices.Import(dt, UserDtoCache.UserId).JilToJson();
return Content(json); // 返回处理结果
}
}, BootJsonH((false, PubConst.File3))); // 异常时返回文件处理失败提示
// 以下为注释掉的备选实现:
// 1. 直接通过流处理(与上面委托内逻辑相同)
{
using (var st = new MemoryStream())
{
file.CopyTo(st);
var dt = NpoiUtil.Import(st, fileExt);
var json = _customerServices.Import(dt, UserDtoCache.UserId).JilToJson();
return Content(json);
}
}, BootJsonH((false, PubConst.File3))
);
//using (var st = new MemoryStream())
//{
// file.CopyTo(st);
@ -217,35 +144,30 @@ namespace KopSoftWms.Controllers
// var json = _customerServices.Import(dt, UserDtoCache.UserId).JilToJson();
// return Content(json);
//}
// 2. 先保存文件到服务器,再读取解析(落地处理)
//2 先上传到服务器,然后在读取
//using (var stream = new FileStream(filepath, FileMode.CreateNew))
//{
// file.CopyTo(stream);
//}
//var dt = NpoiUtil.Import(filepath);
//FileUtil.Delete(filepath); // 解析后删除临时文件
//FileUtil.Delete(filepath);
//var json = _customerServices.Import(dt, UserDtoCache.UserId).JilToJson();
//return Content(json);
}
// HTTP GET请求搜索客户用于下拉选择等场景
[HttpGet]
public IActionResult Search(string text)
{
// 初始化分页参数查询前100条按创建时间降序
var bootstrap = new Bootstrap.BootstrapParams
{
limit = 100,
offset = 0,
sort = "CreateDate",
search = text, // 搜索关键词
search = text,
order = "desc"
};
// 调用服务层获取搜索结果
var json = _customerServices.PageList(bootstrap);
return Content(json); // 返回搜索结果
return Content(json);
}
}
}
}

@ -1,200 +1,102 @@
// 引入服务接口命名空间,包含发货单服务的接口定义
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与操作
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入核心实体类命名空间包含Wms_delivery发货单实体
using YL.Core.Entity;
// 引入实体验证相关命名空间包含发货单的FluentValidation验证类
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础功能命名空间提供项目通用基础能力
using YL.NetCore.NetCoreApp;
// 引入工具类扩展方法命名空间,提供字符串、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含项目通用的常量和枚举定义
using YL.Utils.Pub;
// 引入表格工具命名空间包含Bootstrap表格相关参数模型
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 发货单控制器专门处理发货单相关的HTTP请求列表查询、添加、编辑、删除等
/// 继承自BaseController复用基础控制器的通用功能如用户缓存、统一返回格式等
/// </summary>
public class DeliveryController : BaseController
{
// 声明发货单服务接口的私有只读字段,用于后续调用服务层业务逻辑
private readonly IWms_deliveryServices _deliveryServices;
/// <summary>
/// 控制器构造函数,通过依赖注入获取发货单服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建服务对象
/// </summary>
/// <param name="deliveryServices">发货单服务接口实例,提供发货单相关业务逻辑</param>
public DeliveryController(
IWms_deliveryServices deliveryServices
)
{
// 给私有字段赋值,初始化服务实例
_deliveryServices = deliveryServices;
}
/// <summary>
/// 发货单列表页面的HTTP GET请求处理方法
/// 用于返回发货单列表的视图页面
/// </summary>
/// <returns>返回发货单列表对应的Razor视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,检查当前用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
// 返回Index视图默认对应Views/Delivery/Index.cshtml
return View();
}
/// <summary>
/// 分页查询发货单列表数据的HTTP POST请求处理方法
/// 接收Bootstrap表格的分页、排序、查询参数返回对应的数据结果
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含页码、页大小、排序字段、查询关键词等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用服务层的分页列表方法传入表格参数获取分页数据JSON格式字符串
var sd = _deliveryServices.PageList(bootstrap);
// 以ContentResult形式返回数据供前端Bootstrap表格渲染
return Content(sd);
}
/// <summary>
/// 发货单添加/编辑页面的HTTP GET请求处理方法
/// 根据是否传入ID区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">发货单ID为空时表示添加操作不为空时表示编辑操作</param>
/// <param name="stockOutId">出库单ID添加发货单时用于关联对应的出库单</param>
/// <returns>返回添加/编辑视图及对应的发货单模型数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id, string stockOutId)
{
// 初始化发货单实体模型
var model = new Wms_delivery();
// 判断ID是否为空为空表示添加操作
if (id.IsEmpty())
{
// 给新发货单模型赋值关联的出库单ID将字符串转为长整型
model.StockOutId = stockOutId.ToInt64();
// 返回添加视图及空模型仅携带出库单ID
return View(model);
}
// ID不为空表示编辑操作
else
{
// 调用服务层方法根据发货单ID查询对应的实体数据SqlFunc.ToInt64将字符串ID转为长整型
model = _deliveryServices.QueryableToEntity(c => c.DeliveryId == SqlFunc.ToInt64(id));
// 返回编辑视图及查询到的发货单模型数据
return View(model);
}
}
/// <summary>
/// 处理发货单添加或更新操作的HTTP POST请求方法
/// 接收表单提交的发货单数据,完成数据验证、业务逻辑处理并返回结果
/// </summary>
/// <param name="model">表单提交的发货单实体模型,包含发货单相关字段数据</param>
/// <param name="id">发货单ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_delivery model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_delivery model, [FromForm]string id)
{
// 初始化发货单数据验证器FluentValidation实现
var validator = new DeliveryFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
// 判断验证是否通过
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误换行显示)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一的JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 判断物流单号是否不为空(不为空时需检查唯一性)
if (!model.TrackingNo.IsEmpty())
{
// 调用服务层方法,检查该物流单号是否已存在
if (_deliveryServices.IsAny(c => c.TrackingNo == model.TrackingNo))
{
// 物流单号已存在返回失败提示PubConst.Delivery3为预定义常量
return BootJsonH((false, PubConst.Delivery3));
}
}
// 给新增发货单赋值必要字段
model.DeliveryId = PubId.SnowflakeId; // 生成雪花算法ID全局唯一作为发货单ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID从当前登录用户缓存中获取
// 调用服务层的发货方法(可能包含出库单状态更新等业务逻辑)
model.DeliveryId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _deliveryServices.Delivery(model);
// 根据操作结果返回对应提示(成功返回添加成功,失败返回添加失败)
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 给更新的发货单赋值必要字段
model.DeliveryId = id.ToInt64(); // 设置发货单ID确保更新的是指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间,通过工具类获取)
// 调用服务层的更新方法,更新发货单数据
model.DeliveryId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _deliveryServices.Update(model);
// 根据操作结果返回对应提示(成功返回更新成功,失败返回更新失败)
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 处理发货单删除操作的HTTP GET请求方法逻辑删除
/// 不物理删除数据,仅更新删除标识、修改人、修改时间
/// </summary>
/// <param name="id">要删除的发货单ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 调用服务层的更新方法,执行逻辑删除
var flag = _deliveryServices.Update(
new Wms_delivery
{
DeliveryId = SqlFunc.ToInt64(id), // 要删除的发货单ID字符串转长整型
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常具体以业务定义为准
ModifiedBy = UserDtoCache.UserId, // 删除操作人ID当前登录用户
ModifiedDate = DateTimeExt.DateTime // 删除操作时间(当前时间)
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 指定仅更新这三个字段,提高性能
);
// 根据操作结果返回对应提示(成功返回删除成功,失败返回删除失败)
var flag = _deliveryServices.Update(new Wms_delivery { DeliveryId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc;
using IServices;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Linq;
using YL.Core.Entity;
@ -8,28 +9,33 @@ using YL.NetCore.NetCoreApp;
using YL.Utils.Extensions;
using YL.Utils.Pub;
using YL.Utils.Table;
namespace KopSoftWms.Controllers
{
public class DeptController : BaseController
{
private readonly ISys_deptServices _deptServices;
public DeptController(ISys_deptServices deptServices)
{
_deptServices = deptServices;
}
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
[OperationLog(LogType = LogType.select)]
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
var sd = _deptServices.PageList(bootstrap);
return Content(sd);
}
[HttpGet]
public IActionResult Add(string id)
{
@ -44,10 +50,11 @@ namespace KopSoftWms.Controllers
return View(dept);
}
}
[HttpPost]
[FilterXss]
[OperationLog(LogType = LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm] Sys_dept dept, [FromForm] string id)
public IActionResult AddOrUpdate([FromForm]Sys_dept dept, [FromForm]string id)
{
var validator = new SysDeptFluent();
var results = validator.Validate(dept);
@ -55,7 +62,10 @@ namespace KopSoftWms.Controllers
if (!success)
{
string msg = results.Errors.Aggregate("", (current, item) => (item.ErrorMessage + "</br>"));
//foreach (var item in results.Errors)
//{
// msg += item.ErrorMessage + "</br>";
//}
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
if (id.IsEmptyZero())
@ -78,6 +88,7 @@ namespace KopSoftWms.Controllers
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)

@ -1,52 +1,24 @@
// 引入服务接口命名空间,包含设备、部门、字典相关服务的接口定义
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与类型转换
using SqlSugar;
// 引入系统基础命名空间,提供日期、转换等基础功能
using System;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入数据传输对象命名空间,包含设备分页查询专用参数类
using YL.Core.Dto;
// 引入核心实体类命名空间包含Wms_device设备实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含设备实体的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含字典类型、操作提示等公共定义
using YL.Utils.Pub;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 设备管理控制器
/// 负责处理设备相关的HTTP请求包括列表展示、添加、编辑、删除等核心操作
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class DeviceController : BaseController
{
// 设备服务接口实例,用于调用设备相关业务逻辑(注入方式初始化)
private readonly IWms_deviceServices _deviceServices;
// 部门服务接口实例,用于查询部门相关数据(注入方式初始化)
private readonly ISys_deptServices _deptServices;
// 字典服务接口实例,用于查询数据字典相关数据(注入方式初始化)
private readonly ISys_dictServices _dictServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化三个服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建服务对象
/// </summary>
/// <param name="dictServices">字典服务接口,提供数据字典查询功能</param>
/// <param name="deptServices">部门服务接口,提供部门数据查询功能</param>
/// <param name="deviceServices">设备服务接口,提供设备相关业务逻辑处理</param>
public DeviceController(ISys_dictServices dictServices, ISys_deptServices deptServices, IWms_deviceServices deviceServices)
{
_dictServices = dictServices;
@ -54,62 +26,32 @@ namespace KopSoftWms.Controllers
_deptServices = deptServices;
}
/// <summary>
/// 设备管理首页的HTTP GET请求处理方法
/// 向视图传递部门列表、设备类型字典、设备属性字典等下拉选择数据
/// </summary>
/// <returns>返回设备管理首页视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
// 查询所有未删除的部门IsDel=1表示未删除传递给视图ViewBag.Dept
ViewBag.Dept = _deptServices.QueryableToList(c => c.IsDel == 1);
// 查询设备类型字典未删除且字典类型为设备类型PubDictType.device枚举转整型再转字符串
ViewBag.Device = _dictServices.Queryable()
.Where(c => c.IsDel == 1 && c.DictType == SqlFunc.ToString(Convert.ToInt32(PubDictType.device)))
.ToList();
// 查询设备属性字典未删除且字典类型为设备属性PubDictType.property枚举转整型再转字符串
ViewBag.Property = _dictServices.Queryable()
.Where(c => c.IsDel == 1 && c.DictType == SqlFunc.ToString(Convert.ToInt32(PubDictType.property)))
.ToList();
// 返回Index视图对应Views/Device/Index.cshtml
ViewBag.Device = _dictServices.Queryable().Where(c => c.IsDel == 1 && c.DictType == SqlFunc.ToString(Convert.ToInt32(PubDictType.device))).ToList();
ViewBag.Property = _dictServices.Queryable().Where(c => c.IsDel == 1 && c.DictType == SqlFunc.ToString(Convert.ToInt32(PubDictType.property))).ToList(); ;
return View();
}
/// <summary>
/// 设备列表分页查询的HTTP POST请求处理方法
/// 接收分页、排序、查询条件参数返回JSON格式的分页数据
/// </summary>
/// <param name="bootstrap">设备分页查询专用参数对象,包含页码、页大小、查询条件等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] PubParams.DeviceBootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.DeviceBootstrapParams bootstrap)
{
// 调用设备服务的分页列表方法传入查询参数获取JSON格式的分页数据
var sd = _deviceServices.PageList(bootstrap);
// 以ContentResult形式返回数据供前端表格组件渲染
return Content(sd);
}
/// <summary>
/// 设备添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">设备ID为空表示添加操作不为空表示编辑操作</param>
/// <returns>返回添加/编辑视图及对应的设备模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化设备实体模型
var model = new Wms_device();
// ID为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询对应设备的实体数据编辑操作视图加载已有数据
else
{
model = _deviceServices.QueryableToEntity(c => c.DeviceId == SqlFunc.ToInt64(id));
@ -117,90 +59,45 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 设备添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的设备数据,完成数据验证、业务逻辑处理并返回结果
/// </summary>
/// <param name="device">表单提交的设备实体数据</param>
/// <param name="id">设备ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_device device, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_device device, [FromForm]string id)
{
// 初始化设备数据验证器FluentValidation实现
var validator = new DeviceFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(device);
var success = results.IsValid;
// 验证失败(数据不符合预设规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误用换行符分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 检查设备序列号是否已存在(序列号唯一约束)
if (_deviceServices.IsAny(c => c.SerialNo == device.SerialNo))
{
// 序列号已存在返回失败提示PubConst.Device1为预定义常量
return BootJsonH((false, PubConst.Device1));
}
// 给新增设备赋值必要字段
device.DeviceId = PubId.SnowflakeId; // 生成雪花算法唯一ID
device.CreateBy = UserDtoCache.UserId; // 设置创建人ID从当前登录用户缓存获取
// 调用设备服务执行插入操作
device.DeviceId = PubId.SnowflakeId;
device.CreateBy = UserDtoCache.UserId;
bool flag = _deviceServices.Insert(device);
// 根据操作结果返回对应提示(成功返回添加成功,失败返回添加失败)
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 给更新的设备赋值必要字段
device.DeviceId = id.ToInt64(); // 设置设备ID确保更新指定记录
device.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
device.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间,工具类获取)
// 调用设备服务执行更新操作
device.DeviceId = id.ToInt64();
device.ModifiedBy = UserDtoCache.UserId;
device.ModifiedDate = DateTimeExt.DateTime;
var flag = _deviceServices.Update(device);
// 根据操作结果返回对应提示(成功返回更新成功,失败返回更新失败)
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 设备删除操作的HTTP GET请求处理方法逻辑删除
/// 不物理删除数据库记录,仅更新删除标识、修改人、修改时间
/// </summary>
/// <param name="id">要删除的设备ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 调用设备服务执行逻辑删除:仅更新指定字段
var flag = _deviceServices.Update(
new Wms_device
{
DeviceId = SqlFunc.ToInt64(id), // 目标设备ID字符串转长整型
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常按业务定义
ModifiedBy = UserDtoCache.UserId, // 删除操作人ID当前登录用户
ModifiedDate = DateTimeExt.DateTime // 删除操作时间(当前时间)
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 仅更新这三个字段,提升性能
);
// 根据操作结果返回对应提示(成功返回删除成功,失败返回删除失败)
var flag = _deviceServices.Update(new Wms_device { DeviceId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}

@ -22,21 +22,21 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm] PubParams.DictBootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.DictBootstrapParams bootstrap)
{
var sd = _dictServices.PageList(bootstrap);
return Content(sd);
}
[HttpGet]
[HttpGet]
public IActionResult Add(string id)
{
var model = new Sys_dict();
@ -53,8 +53,8 @@ namespace KopSoftWms.Controllers
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm] Sys_dict dict, [FromForm] string id)
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Sys_dict dict, [FromForm]string id)
{
var validator = new SysDictFluent();
var results = validator.Validate(dict);
@ -87,7 +87,7 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[OperationLog(LogType.delete)]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
var flag = _dictServices.Update(new Sys_dict { DictId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });

@ -1,16 +1,19 @@
using IServices;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Diagnostics;
using System.Text;
using YL.Core.Dto;
using YL.Core.Entity;
using YL.Models;
using YL.NetCore.Attributes;
using YL.NetCore.NetCoreApp;
using YL.Utils.Pub;
using YL.Utils.Extensions;
using MediatR;
using SqlSugar;
//6
namespace KopSoftWms.Controllers
{
public class HomeController : BaseController
@ -61,7 +64,6 @@ namespace KopSoftWms.Controllers
return View();
}
//[AllowAnonymous]
[AddHeader("Content-Type", YL.Utils.Files.ContentType.ContentTypeSSE)]
[AddHeader("Cache-Control", YL.Utils.Files.ContentType.CacheControl)]
[AddHeader("Connection", YL.Utils.Files.ContentType.Connection)]
@ -72,7 +74,7 @@ namespace KopSoftWms.Controllers
Data = DateTime.Now.ToString(),
Event = "message",
Id = Guid.NewGuid().ToString(),
Retry = "1000",
Retry = "3000",
};
StringBuilder sb = new StringBuilder();
sb.Append($"id:{a.Id}\n");

@ -1,28 +1,17 @@
using IServices;
using Microsoft.AspNetCore.Mvc;
using YL.Core.Dto;
using YL.NetCore.Attributes;
using YL.NetCore.NetCoreApp;
using YL.NetCore.Attributes;
using YL.Utils.Pub;
namespace KopSoftWms.Controllers
{
/// <summary>
/// 库存控制器处理库存相关的HTTP请求
/// 继承自BaseController具备基础控制器功能
/// </summary>
public class InventoryController : BaseController
{
// 库存服务接口实例,用于库存相关业务逻辑处理
private readonly IWms_inventoryServices _inventoryServices;
// 货架服务接口实例,用于获取货架相关数据
private readonly IWms_storagerackServices _storagerackServices;
/// <summary>
/// 构造函数,通过依赖注入获取服务实例
/// </summary>
/// <param name="storagerackServices">货架服务接口</param>
/// <param name="inventoryServices">库存服务接口</param>
public InventoryController(
IWms_storagerackServices storagerackServices,
IWms_inventoryServices inventoryServices
@ -32,29 +21,18 @@ namespace KopSoftWms.Controllers
_inventoryServices = inventoryServices;
}
/// <summary>
/// 库存列表页面
/// </summary>
/// <returns>返回库存列表视图,并传递可用货架数据到视图</returns>
[HttpGet]
[CheckMenu] // 检查菜单权限的特性
[CheckMenu]
public IActionResult Index()
{
// 获取所有未删除的货架数据,用于页面筛选条件
ViewBag.StorageRack = _storagerackServices.QueryableToList(c => c.IsDel == 1);
return View();
}
/// <summary>
/// 分页查询库存列表数据
/// </summary>
/// <param name="bootstrap">库存分页查询参数对象,包含分页、排序、查询条件等</param>
/// <returns>返回JSON格式的分页数据</returns>
[HttpPost]
[OperationLog(LogType.select)] // 记录查询操作日志
public ContentResult List([FromForm] PubParams.InventoryBootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.InventoryBootstrapParams bootstrap)
{
// 调用库存服务获取分页数据
var sd = _inventoryServices.PageList(bootstrap);
return Content(sd);
}

@ -1,66 +1,30 @@
// 引入服务接口命名空间,包含库存调拨、明细、序列号等相关服务接口
using Microsoft.AspNetCore.Mvc;
using YL.NetCore.Attributes;
using YL.NetCore.NetCoreApp;
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询、事务及类型转换
using SqlSugar;
// 引入集合相关命名空间支持List等集合类型操作
using System.Collections.Generic;
// 引入LINQ相关命名空间支持集合的查询与转换操作
using System.Linq;
// 引入数据传输对象命名空间包含调拨单分页参数、明细DTO等
using YL.Utils.Table;
using YL.Utils.Pub;
using YL.Utils.Extensions;
using YL.Core.Dto;
// 引入核心实体类命名空间,包含库存调拨单、明细等实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含库存调拨单、明细的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、枚举转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含操作提示、状态枚举等公共定义
using YL.Utils.Pub;
// 引入安全工具命名空间包含XSS过滤工具类
using System.Linq;
using SqlSugar;
using System.Collections.Generic;
using YL.Utils.Security;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 库存调拨控制器
/// 负责处理库存调拨单主表、明细的全流程操作(列表、添加、编辑、审核、删除、打印等)
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class InventoryMoveController : BaseController
{
// 库存调拨单服务接口实例,处理调拨单主表业务逻辑
private readonly IWms_inventorymoveServices _inventorymoveServices;
// 库存调拨明细服务接口实例,处理调拨单明细业务逻辑
private readonly IWms_invmovedetailServices _invmovedetailServices;
// 序列号服务接口实例,用于生成唯一调拨单号
private readonly ISys_serialnumServices _serialnumServices;
// XSS过滤工具实例用于过滤用户输入的恶意脚本
private readonly Xss _xss;
// SqlSugar数据库客户端实例用于手动控制事务如级联删除
private readonly SqlSugarClient _client;
// 物料服务接口实例,用于查询物料相关数据(编号、名称等)
private readonly IWms_materialServices _materialServices;
// 库存服务接口实例,用于查询物料库存数据
private readonly IWms_inventoryServices _inventoryServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务与工具实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="inventorymoveServices">库存调拨单服务接口</param>
/// <param name="invmovedetailServices">库存调拨明细服务接口</param>
/// <param name="serialnumServices">序列号服务接口</param>
/// <param name="xss">XSS过滤工具</param>
/// <param name="client">SqlSugar数据库客户端</param>
/// <param name="materialServices">物料服务接口</param>
/// <param name="inventoryServices">库存服务接口</param>
public InventoryMoveController(
IWms_inventorymoveServices inventorymoveServices,
IWms_invmovedetailServices invmovedetailServices,
@ -80,68 +44,49 @@ namespace KopSoftWms.Controllers
_inventoryServices = inventoryServices;
}
/// <summary>
/// 库存调拨单列表页面的HTTP GET请求处理方法
/// 向视图传递调拨单状态下拉选择数据
/// </summary>
/// <returns>返回库存调拨单列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
// 将StockInStatus枚举转换为键值对列表复用入库单状态枚举统一状态定义
var status = EnumExt.ToKVListLinq<StockInStatus>();
ViewBag.Status = status; // 传递状态数据到视图,用于下拉筛选
return View(); // 返回Index视图对应Views/InventoryMove/Index.cshtml
ViewBag.Status = status;
return View();
}
/// <summary>
/// 分页查询库存调拨单主表数据的HTTP POST请求处理方法
/// 接收分页、状态筛选等参数返回JSON格式分页数据
/// 主表
/// </summary>
/// <param name="bootstrap">调拨单分页查询参数对象,包含页码、页大小、状态等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] PubParams.StatusBootstrapParams bootstrap)
/// <param name="bootstrap">参数</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.StatusBootstrapParams bootstrap)
{
// 调用调拨单服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _inventorymoveServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 分页查询库存调拨单明细数据的HTTP POST请求处理方法
/// 根据调拨单主表ID查询关联的明细数据
/// 明细
/// </summary>
/// <param name="pid">调拨单主表ID</param>
/// <returns>返回JSON格式的明细分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult ListDetail(string pid)
{
// 调用明细服务的分页列表方法传入主表ID获取明细数据
var sd = _invmovedetailServices.PageList(pid);
return Content(sd); // 返回明细数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 库存调拨单添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">调拨单ID为空表示添加不为空表示编辑</param>
/// <returns>返回添加/编辑视图及对应的调拨单模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化调拨单实体模型
var model = new Wms_inventorymove();
// ID为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询未删除的调拨单实体编辑操作视图加载已有数据
else
{
model = _inventorymoveServices.QueryableToEntity(c => c.InventorymoveId == SqlFunc.ToInt64(id) && c.IsDel == 1);
@ -149,36 +94,22 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 库存调拨明细添加/编辑页面的HTTP GET请求处理方法
/// 根据明细ID是否为空区分添加和编辑关联调拨单主表ID
/// </summary>
/// <param name="id">明细ID为空表示添加</param>
/// <param name="pid">调拨单主表ID用于关联明细与主表</param>
/// <returns>返回添加/编辑视图及对应的明细DTO模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Detail(string id, string pid)
{
// 初始化明细DTO模型用于前端展示包含主表关联信息和明细列表
var model = new Wms_invmovedetailDto();
// 查询调拨单主表信息未删除获取源货架和目标货架ID
var head = _inventorymoveServices.QueryableToEntity(c => c.InventorymoveId == SqlFunc.ToInt64(pid) && c.IsDel == 1);
model.AimStoragerackId = head.AimStoragerackId; // 赋值目标货架ID到DTO
model.SourceStoragerackId = head.SourceStoragerackId; // 赋值源货架ID到DTO
// 明细ID为空或0添加操作
model.AimStoragerackId = head.AimStoragerackId;
model.SourceStoragerackId = head.SourceStoragerackId;
if (id.IsEmptyZero())
{
model.Pid = pid; // 关联调拨单主表ID
return View(model); // 返回空明细列表的DTO视图
model.Pid = pid;
return View(model);
}
// 明细ID不为空编辑操作
else
{
// 查询该调拨单下未删除的所有明细
var detail = _invmovedetailServices.QueryableToList(c => c.InventorymoveId == SqlFunc.ToInt64(pid) && c.IsDel == 1);
model.Pid = pid; // 关联调拨单主表ID
// 将明细实体转换为前端展示用的子DTO补充物料编号、名称、源货架库存等信息
model.Pid = pid;
model.Detail = detail.Select(c => new Wmsinvmovedetail
{
MaterialId = c.MaterialId.ToString(),
@ -197,76 +128,48 @@ namespace KopSoftWms.Controllers
ModifiedDate = c.ModifiedDate,
PlanQty = c.PlanQty,
Remark = c.Remark,
Status = c.Status
Status = c.Status,
}).ToList();
return View(model); // 返回带明细列表的DTO视图
return View(model);
}
}
/// <summary>
/// 库存调拨单添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的调拨单数据,完成验证并执行对应操作
/// </summary>
/// <param name="model">表单提交的调拨单实体模型</param>
/// <param name="id">调拨单ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_inventorymove model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_inventorymove model, [FromForm]string id)
{
// 初始化调拨单验证器FluentValidation实现
var validator = new InventoryMoveFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(换行分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 返回失败结果
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0添加操作
if (id.IsEmptyZero())
{
// 调用序列号服务生成唯一调拨单号
model.InventorymoveNo = _serialnumServices.GetSerialnum(UserDtoCache.UserId, "Wms_inventorymove");
model.InventorymoveId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.Status = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID当前登录用户
bool flag = _inventorymoveServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.InventorymoveId = PubId.SnowflakeId;
model.Status = StockInStatus.initial.ToByte();
model.CreateBy = UserDtoCache.UserId;
bool flag = _inventorymoveServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空更新操作
else
{
model.InventorymoveId = id.ToInt64(); // 设置调拨单ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间)
var flag = _inventorymoveServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.InventorymoveId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _inventorymoveServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 库存调拨明细批量添加或更新操作的HTTP POST请求处理方法
/// 支持批量提交明细,自动判断新增或更新(更新逻辑为"删旧加新"
/// </summary>
/// <param name="list">批量提交的明细实体列表</param>
/// <param name="id">调拨单主表ID用于关联明细</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdateD([FromForm] List<Wms_invmovedetail> list, [FromForm] string id)
[HttpPost]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdateD([FromForm]List<Wms_invmovedetail> list, [FromForm]string id)
{
// 批量验证明细数据(逐个验证每个明细)
var validator = new InvmovedetailFluent();
foreach (var c in list)
{
@ -275,45 +178,104 @@ namespace KopSoftWms.Controllers
if (!success)
{
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 单个明细验证失败则返回
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
}
// 查询该调拨单下已存在的未删除明细
var exist = _invmovedetailServices.QueryableToList(c => c.InventorymoveId == SqlFunc.ToInt64(id));
var modelList = new List<Wms_invmovedetail>(); // 存储待操作的明细列表
// 无已存在明细(执行批量新增)
var modelList = new List<Wms_invmovedetail>();
if (exist.IsNullT())
{
// 遍历明细列表补充基础字段并过滤XSS
list.ForEach((c) =>
{
c.Remark = _xss.Filter(c.Remark); // XSS过滤备注信息
c.MoveDetailId = PubId.SnowflakeId; // 生成明细唯一ID
c.Status = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
c.IsDel = 1; // 标记为未删除
c.CreateBy = UserDtoCache.UserId; // 设置创建人ID
c.CreateDate = DateTimeExt.DateTime; // 设置创建时间
c.Remark = _xss.Filter(c.Remark);
c.MoveDetailId = PubId.SnowflakeId;
c.Status = StockInStatus.initial.ToByte();
c.IsDel = 1;
c.CreateBy = UserDtoCache.UserId;
c.CreateDate = DateTimeExt.DateTime;
modelList.Add(c);
});
bool flag = _invmovedetailServices.Insert(modelList); // 批量插入
bool flag = _invmovedetailServices.Insert(modelList);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// 有已存在明细(执行更新:先逻辑删除旧明细,再批量新增新明细)
else
{
// 逻辑删除该调拨单下所有未删除的旧明细
_invmovedetailServices.Update(
new Wms_invmovedetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime },
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate },
c => c.InventorymoveId == SqlFunc.ToInt64(id) && c.IsDel == 1
);
// 处理新明细列表补充基础字段并过滤XSS
_invmovedetailServices.Update(new Wms_invmovedetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }, c => c.InventorymoveId == SqlFunc.ToInt64(id) && c.IsDel == 1);
list.ForEach((c) =>
{
c.Remark = _xss.Filter(c.Remark); // XSS过滤
c.Status = StockInStatus.initial.ToByte(); // 初始状态
c.MoveDetailId = PubId.SnowflakeId; // 新明细唯一ID
c.IsDel = 1; // 未
c.Remark = _xss.Filter(c.Remark);
c.Status = StockInStatus.initial.ToByte();
c.MoveDetailId = PubId.SnowflakeId;
c.IsDel = 1;
c.CreateBy = UserDtoCache.UserId;
c.CreateDate = DateTimeExt.DateTime;
modelList.Add(c);
});
var flag = _invmovedetailServices.Insert(modelList);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 审核
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.update)]
public IActionResult Auditin(string id)
{
var list = _invmovedetailServices.QueryableToList(c => c.IsDel == 1 && c.InventorymoveId == SqlFunc.ToInt64(id));
if (!list.Any())
{
return BootJsonH((false, PubConst.StockIn4));
}
var flag = _inventorymoveServices.Auditin(UserDtoCache.UserId, SqlFunc.ToInt64(id));
return BootJsonH(flag ? (flag, PubConst.StockIn2) : (flag, PubConst.StockIn3));
}
/// <summary>
/// 删除
/// </summary>
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
var flag = _client.Ado.UseTran(() =>
{
_client.Updateable(new Wms_invmovedetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime })
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }).Where(c => c.InventorymoveId == SqlFunc.ToInt64(id) && c.IsDel == 1).ExecuteCommand();
_client.Updateable(new Wms_inventorymove { InventorymoveId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }).UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }).ExecuteCommand();
}).IsSuccess;
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
/// <summary>
/// 删除明细
/// </summary>
/// <param name="id">明细id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult DeleteDetail(string id)
{
var flag = _invmovedetailServices.Update(
new Wms_invmovedetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime },
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate },
c => c.MoveDetailId == SqlFunc.ToInt64(id)
);
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
[HttpGet]
public IActionResult PreviewJson(string id)
{
var str = _inventorymoveServices.PrintList(id);
return Content(str);
}
}
}

@ -19,15 +19,15 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm] PubParams.InventoryBootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.InventoryBootstrapParams bootstrap)
{
var sd = _inventoryrecordServices.PageList(bootstrap);
return Content(sd);

@ -21,14 +21,14 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
var sd = _logServices.PageList(bootstrap);
return Content(sd);
@ -36,23 +36,23 @@ namespace KopSoftWms.Controllers
//[HttpDelete] axios
//'Content-Type': 'application/json; charset=UTF-8' FromBody 修饰的每个操作,最多可以有一个参数
[HttpPost]
public IActionResult Delete([FromBody] long[] Id)
[HttpPost]
public IActionResult Delete([FromBody]long[] Id)
{
var flag = _logServices.Delete(Id.ToArray());
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Bar()
{
return View();
}
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult Bar([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult Bar([FromForm]Bootstrap.BootstrapParams bootstrap)
{
var str = _logServices.EChart(bootstrap);
return Content(str);

@ -1,76 +1,36 @@
// 引入服务接口命名空间,包含用户、日志等相关服务接口
using IServices;
// 引入MediatR命名空间用于实现领域事件发布/订阅
using MediatR;
// 引入ASP.NET Core认证相关命名空间处理Cookie认证
using IServices;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
// 引入ASP.NET Core授权相关命名空间控制匿名访问
using Microsoft.AspNetCore.Authorization;
// 引入HTTP上下文相关命名空间获取请求上下文信息
using Microsoft.AspNetCore.Http;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等
using Microsoft.AspNetCore.Mvc;
// 引入内存缓存命名空间,用于缓存用户信息
using Microsoft.Extensions.Caching.Memory;
// 引入配置相关命名空间,读取应用配置
using Microsoft.Extensions.Configuration;
// 引入系统基础命名空间,提供日期、字符串等基础功能
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.IO;
// 引入身份声明相关命名空间用于Cookie认证的用户身份信息
using System.Security.Claims;
// 引入异步编程相关命名空间支持async/await
using System.Threading.Tasks;
// 引入数据传输对象命名空间包含用户登录DTO
using YL.Core.Dto;
// 引入核心实体类命名空间,包含用户、日志等实体
using YL.Core.Entity;
// 引入.NET Core应用基础命名空间提供基础控制器功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、枚举转换等扩展方法
using YL.Utils.Extensions;
// 引入JSON工具命名空间提供JSON序列化功能
using YL.Utils.Json;
// 引入公共常量与枚举命名空间,包含日志类型、缓存键等定义
using YL.Utils.Pub;
// 引入安全工具命名空间包含XSS过滤工具
using YL.Utils.Security;
using YL.Utils.Json;
using MediatR;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 登录控制器
/// 负责处理用户登录、退出登录等认证相关操作
/// 继承自BaseController复用缓存、请求信息获取等基础功能
/// </summary>
public class LoginController : BaseController
{
// 用户服务接口实例,处理用户登录验证、登录状态更新等业务
private readonly ISys_userServices _userServices;
// HTTP上下文访问器实例用于获取当前请求上下文
private readonly IHttpContextAccessor _httpContext;
// 日志服务接口实例,处理系统操作日志记录
private readonly ISys_logServices _logServices;
// 配置实例,用于读取应用配置项(如系统描述、关键词等)
private readonly IConfiguration _configuration;
// XSS过滤工具实例用于过滤用户输入的恶意脚本
private readonly Xss _xss;
// MediatR实例用于发布领域事件如登录日志事件
private readonly IMediator _mediator;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务与工具实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="xss">XSS过滤工具</param>
/// <param name="logServices">日志服务接口</param>
/// <param name="httpContext">HTTP上下文访问器</param>
/// <param name="configuration">应用配置</param>
/// <param name="sys_User">用户服务接口</param>
/// <param name="mediator">MediatR实例</param>
public LoginController(Xss xss, ISys_logServices logServices, IHttpContextAccessor httpContext, IConfiguration configuration, ISys_userServices sys_User, IMediator mediator)
{
_httpContext = httpContext;
@ -81,139 +41,88 @@ namespace KopSoftWms.Controllers
_mediator = mediator;
}
/// <summary>
/// 登录页面的HTTP GET请求处理方法
/// 允许匿名访问,向视图传递系统配置的关键词、描述、公司名称等信息
/// </summary>
/// <returns>返回登录视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[AllowAnonymous] // 允许匿名访问(无需登录即可访问该页面)
[Route("Login/Index")] // 配置路由路径,固定访问地址为/Login/Index
//string returnUrl = null
[HttpGet]
[AllowAnonymous]
public IActionResult Index()
{
// 从配置中获取"keywords"配置项传递到视图用于页面SEO关键词
//TempData["returnUrl"] = returnUrl;
ViewBag.keywords = GetDescriptor("keywords");
// 从配置中获取"description"配置项传递到视图用于页面SEO描述
ViewBag.description = GetDescriptor("description");
// 从配置中获取"company"配置项,传递到视图(用于页面显示公司名称)
ViewBag.company = GetDescriptor("company");
return View(); // 返回登录视图对应Views/Login/Index.cshtml
return View();
}
/// <summary>
/// 登录验证的HTTP POST异步处理方法
/// 接收前端传递的登录信息验证身份并创建Cookie认证记录登录日志
/// </summary>
/// <param name="sys">登录请求DTO包含用户名、密码等登录信息</param>
/// <returns>返回登录结果的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[AllowAnonymous] // 允许匿名访问(登录接口本身无需登录)
[Route("Login/CheckLoginAsync")] // 配置路由路径,固定访问地址为/Login/CheckLoginAsync
public async Task<IActionResult> CheckLoginAsync([FromBody] SysUserDto sys)
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> CheckLoginAsync([FromBody]SysUserDto sys)
{
// 清除菜单缓存和用户缓存(避免旧数据干扰新登录用户)
ClearCache(MenuKey);
ClearCache(UserKey);
// 调用用户服务的登录验证方法返回验证结果Item1是否成功Item2提示信息Item3用户实体
var item = _userServices.CheckLogin(sys);
// 登录验证成功
if (item.Item1)
{
// 先退出当前已有的Cookie认证避免多账号登录冲突
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// 构建用户身份声明Claims存储用户核心信息用于Cookie认证
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, item.Item3.UserName), // 用户名
new Claim(ClaimTypes.Sid, item.Item3.UserId.ToString()), // 用户ID
new Claim(ClaimTypes.Surname, item.Item3.UserNickname), // 用户昵称
new Claim(ClaimTypes.Role, item.Item3.RoleId?.ToString()), // 角色ID
// 用户头像(为空时使用默认头像路径,否则使用用户自定义头像)
new Claim(ClaimTypes.Uri,string.IsNullOrWhiteSpace(item.Item3.HeadImg)?Path.Combine("upload","head","4523c812eb2047c39ad91f8c5de3fb31.jpg"):item.Item3.HeadImg)
};
// 创建基于声明的身份标识指定认证方案为Cookie认证
{
new Claim(ClaimTypes.Name, item.Item3.UserName),
new Claim(ClaimTypes.Sid,item.Item3.UserId.ToString()),
new Claim(ClaimTypes.Surname,item.Item3.UserNickname),
new Claim(ClaimTypes.Role,item.Item3.RoleId?.ToString()),
new Claim(ClaimTypes.Uri,string.IsNullOrWhiteSpace(item.Item3.HeadImg)?Path.Combine("upload","head","4523c812eb2047c39ad91f8c5de3fb31.jpg"):item.Item3.HeadImg)
};
var claimsIdentitys = new ClaimsIdentity(
claims,
CookieAuthenticationDefaults.AuthenticationScheme);
// 创建ClaimsPrincipal用户身份主体用于后续登录认证
var claimsPrincipal = new ClaimsPrincipal(claimsIdentitys);
// 执行Cookie登录认证创建认证Cookie
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme, // 认证方案
claimsPrincipal, // 用户身份主体
new AuthenticationProperties // 认证属性配置
{
IssuedUtc = DateTime.Now, // Cookie颁发时间
IsPersistent = true, // 是否持久化Cookie关闭浏览器后仍有效
ExpiresUtc = DateTime.Now.AddDays(1) // Cookie过期时间1天后过期
});
// 给登录DTO补充用户核心信息用于缓存和日志
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsPrincipal, new AuthenticationProperties
{
IssuedUtc = DateTime.Now,
IsPersistent = true,
ExpiresUtc = DateTime.Now.AddDays(1),
});
sys.UserId = item.Item3.UserId;
sys.UserName = item.Item3.UserName;
sys.UserNickname = item.Item3.UserNickname;
sys.RoleId = item.Item3.RoleId;
sys.HeadImg = item.Item3.HeadImg;
// 将用户信息存入内存缓存(键为"user_+用户ID",方便后续快速获取)
GetMemoryCache.Set("user_" + item.Item3.UserId, sys);
// 调用用户服务更新用户登录状态如最后登录时间、登录IP等
_userServices.Login(item.Item3.UserId, GetIp());
// 发布登录成功日志事件通过MediatR异步处理日志记录解耦业务与日志
await _mediator.Publish(new Sys_log
{
LogId = PubId.SnowflakeId, // 生成日志唯一ID雪花算法
Browser = GetBrowser(), // 获取客户端浏览器信息
CreateBy = sys.UserId, // 操作人ID当前登录用户ID
Description = $"{sys.UserNickname}登录成功", // 日志描述
LogIp = GetIp(), // 获取客户端IP地址
Url = GetUrl(), // 获取当前请求URL
LogType = LogType.login.EnumToString(), // 日志类型(登录)
LogId = PubId.SnowflakeId,
Browser = GetBrowser(),
CreateBy = sys.UserId,
Description = $"{sys.UserNickname}登录成功",
LogIp = GetIp(),
Url = GetUrl(),
LogType = LogType.login.EnumToString(),
});
}
// 登录验证失败
else
{
// 发布登录失败日志事件过滤用户输入的昵称防止XSS攻击
await _mediator.Publish(new Sys_log
{
LogId = PubId.SnowflakeId, // 日志唯一ID
Browser = GetBrowser(), // 客户端浏览器信息
Description = $"{_xss.Filter(sys.UserNickname)}登录失败", // 日志描述XSS过滤
LogIp = GetIp(), // 客户端IP地址
Url = GetUrl(), // 请求URL
LogType = LogType.login.EnumToString() // 日志类型(登录)
LogId = PubId.SnowflakeId,
Browser = GetBrowser(),
Description = $"{_xss.Filter(sys.UserNickname)}登录失败",
LogIp = GetIp(),
Url = GetUrl(),
LogType = LogType.login.EnumToString()
});
}
// 清空用户实体(避免敏感信息返回前端)
item.Item3 = null;
// 将登录结果序列化为JSON字符串返回给前端
//return Json(item);
return Content(item.ToJsonL());
}
/// <summary>
/// 退出登录的HTTP GET异步处理方法
/// 清除缓存、注销Cookie认证并重定向到登录页面
/// </summary>
/// <returns>重定向到登录页面</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public async Task<IActionResult> Logout()
{
// 清除菜单缓存和用户缓存(销毁当前用户的缓存数据)
ClearCache(MenuKey);
ClearCache(UserKey);
// 注销Cookie认证清除登录状态
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// 重定向到登录页面
return RedirectToAction("Index", "Login");
}
}

@ -1,51 +1,24 @@
// 引入服务接口命名空间,包含物料和库存相关服务接口
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入核心实体类命名空间,包含物料实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含物料实体的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入文件操作工具命名空间,提供文件处理相关功能
using YL.Utils.Files;
// 引入公共常量与枚举命名空间,包含操作提示、日志类型等公共定义
using YL.Utils.Pub;
// 引入安全工具命名空间,包含编码转换等安全相关功能
using YL.Utils.Security;
// 引入表格工具命名空间包含Bootstrap表格相关参数模型
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 物料控制器
/// 负责处理物料的列表展示、添加、编辑、删除、搜索、导出等操作
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class MaterialController : BaseController
{
// 物料服务接口实例,处理物料相关业务逻辑
private readonly IWms_materialServices _materialServices;
// 库存服务接口实例,用于查询物料库存相关数据(如删除前检查库存)
private readonly IWms_inventoryServices _inventoryServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="materialServices">物料服务接口,提供物料相关业务逻辑</param>
/// <param name="inventoryServices">库存服务接口,提供库存相关查询功能</param>
public MaterialController(IWms_materialServices materialServices,
IWms_inventoryServices inventoryServices
)
@ -54,50 +27,29 @@ namespace KopSoftWms.Controllers
_inventoryServices = inventoryServices;
}
/// <summary>
/// 物料列表页面的HTTP GET请求处理方法
/// 用于返回物料列表的视图页面
/// </summary>
/// <returns>返回物料列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
return View(); // 返回Index视图对应Views/Material/Index.cshtml
return View();
}
/// <summary>
/// 分页查询物料列表数据的HTTP POST请求处理方法
/// 接收Bootstrap表格的分页、排序、查询参数返回对应的数据结果
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含页码、页大小、排序字段、查询关键词等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用物料服务的分页列表方法传入表格参数获取分页数据JSON格式字符串
var sd = _materialServices.PageList(bootstrap);
return Content(sd); // 以ContentResult形式返回数据供前端Bootstrap表格渲染
return Content(sd);
}
/// <summary>
/// 物料添加/编辑页面的HTTP GET请求处理方法
/// 根据是否传入ID区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">物料ID为空时表示添加操作不为空时表示编辑操作</param>
/// <returns>返回添加/编辑视图及对应的物料模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化物料实体模型
var model = new Wms_material();
// 如果id为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// 如果id不为空查询对应物料的实体数据编辑操作视图加载已有数据
else
{
model = _materialServices.QueryableToEntity(c => c.MaterialId == SqlFunc.ToInt64(id));
@ -105,150 +57,87 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 物料添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的物料数据,完成数据验证、业务逻辑处理并返回结果
/// </summary>
/// <param name="model">表单提交的物料实体模型</param>
/// <param name="id">物料ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_material model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_material model, [FromForm]string id)
{
// 初始化物料数据验证器FluentValidation实现
var validator = new MaterialFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合预设规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误用换行符分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 检查物料编号或名称是否已存在(唯一性校验)
if (_materialServices.IsAny(c => c.MaterialNo == model.MaterialNo || c.MaterialName == model.MaterialName))
{
// 物料编号或名称已存在返回失败提示PubConst.Material1为预定义常量
return BootJsonH((false, PubConst.Material1));
}
// 给新增物料赋值必要字段
model.MaterialId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID从当前登录用户缓存获取
bool flag = _materialServices.Insert(model); // 调用物料服务执行插入操作
// 根据操作结果返回对应提示(成功返回添加成功,失败返回添加失败)
model.MaterialId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _materialServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 给更新的物料赋值必要字段
model.MaterialId = id.ToInt64(); // 设置物料ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间,工具类获取)
var flag = _materialServices.Update(model); // 调用物料服务执行更新操作
// 根据操作结果返回对应提示(成功返回更新成功,失败返回更新失败)
model.MaterialId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _materialServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 物料删除操作的HTTP GET请求处理方法逻辑删除
/// 删除前检查物料是否有库存,有库存则不允许删除
/// </summary>
/// <param name="id">要删除的物料ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 检查该物料是否存在库存记录(有库存则不允许删除)
//判断库存数量库存数量小于等于0才能删除
var isExist = _inventoryServices.IsAny(c => c.MaterialId == SqlFunc.ToInt64(id));
if (isExist)
{
// 物料存在库存返回删除失败提示PubConst.Material2为预定义常量
return BootJsonH((false, PubConst.Material2));
}
else
{
// 执行逻辑删除:更新删除标识、修改人、修改时间
var flag = _materialServices.Update(
new Wms_material
{
MaterialId = SqlFunc.ToInt64(id),
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常按业务定义
ModifiedBy = UserDtoCache.UserId,
ModifiedDate = DateTimeExt.DateTime
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 指定仅更新这三个字段
);
// 根据操作结果返回对应提示(成功返回删除成功,失败返回删除失败)
var flag = _materialServices.Update(new Wms_material { MaterialId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}
/// <summary>
/// 物料搜索接口(用于入库等场景的物料选择)
/// 默认返回前100条数据支持按关键词搜索
/// 入库选择物料默认显示100条数据如果没有在从服务端取数据
/// </summary>
/// <param name="text">搜索关键词</param>
/// <returns>返回JSON格式的搜索结果数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
/// <param name="text"></param>
/// <returns></returns>
[HttpGet]
public IActionResult Search(string text)
{
// 初始化分页参数查询前100条按创建时间降序
var bootstrap = new Bootstrap.BootstrapParams
{
limit = 100,
offset = 0,
sort = "CreateDate",
search = text, // 搜索关键词
search = text,
order = "desc"
};
// 调用物料服务的分页列表方法,获取搜索结果
var json = _materialServices.PageList(bootstrap);
return Content(json); // 返回搜索结果供前端选择
return Content(json);
}
/// <summary>
/// 物料数据导出接口
/// 根据分页参数筛选数据并导出为Excel文件
/// </summary>
/// <param name="bootstrap">分页参数对象,包含筛选条件</param>
/// <returns>返回Excel文件流或导出失败的JSON提示</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.export)] // 操作日志记录特性,标记该操作类型为"导出"
public IActionResult Export([FromQuery] Bootstrap.BootstrapParams bootstrap)
[HttpGet]
[OperationLog(LogType.export)]
public IActionResult Export([FromQuery]Bootstrap.BootstrapParams bootstrap)
{
// 调用物料服务的导出方法获取Excel文件的字节数组
var buffer = _materialServices.ExportList(bootstrap);
// 如果字节数组为空(导出失败)
if (buffer.IsNull())
{
// 返回导出失败的JSON提示ContentResult包装字节数组
return File(JsonL((false, PubConst.File8)).ToBytes(), ContentType.ContentTypeJson);
}
// 导出成功返回Excel文件流
// 文件名格式:当前时间戳-物料.xlsx包含URL编码处理
return File(
buffer,
ContentType.ContentTypeFile,
$"{DateTimeExt.GetDateTimeS(DateTimeExt.DateTimeFormatString)}-{EncoderUtil.UrlHttpUtilityEncoder("")}.xlsx"
);
return File(buffer, ContentType.ContentTypeFile, DateTimeExt.GetDateTimeS(DateTimeExt.DateTimeFormatString) + "-" + EncoderUtil.UrlHttpUtilityEncoder("物料") + ".xlsx");
}
}
}

@ -1,47 +1,23 @@
// 引入服务接口命名空间,包含储位区、货架相关服务接口定义
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入核心实体类命名空间,包含储位区实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含储位区的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含操作提示、公共常量等定义
using YL.Utils.Pub;
// 引入表格工具命名空间包含Bootstrap表格相关参数模型
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 储位区控制器
/// 负责处理储位区相关的HTTP请求包括列表展示、添加、编辑、删除等核心操作
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class ReservoirareaController : BaseController
{
// 储位区服务接口实例,用于调用储位区相关业务逻辑(注入方式初始化)
private readonly IWms_reservoirareaServices _reservoirareaServices;
// 货架服务接口实例,用于查询储位区是否关联货架(删除时校验用)
private readonly IWms_storagerackServices _storagerackServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化两个服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建服务对象
/// </summary>
/// <param name="storagerackServices">货架服务接口,提供货架相关查询功能</param>
/// <param name="reservoirareaServices">储位区服务接口,提供储位区相关业务逻辑</param>
public ReservoirareaController(IWms_storagerackServices storagerackServices,
IWms_reservoirareaServices reservoirareaServices)
{
@ -49,50 +25,29 @@ namespace KopSoftWms.Controllers
_reservoirareaServices = reservoirareaServices;
}
/// <summary>
/// 储位区列表页面的HTTP GET请求处理方法
/// 用于返回储位区列表的视图页面
/// </summary>
/// <returns>返回储位区列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
return View(); // 返回Index视图对应Views/Reservoirarea/Index.cshtml
return View();
}
/// <summary>
/// 分页查询储位区列表数据的HTTP POST请求处理方法
/// 接收Bootstrap表格的分页、排序、查询参数返回JSON格式分页数据
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含页码、页大小、排序字段、查询关键词等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用储位区服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _reservoirareaServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 储位区添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">储位区ID为空表示添加操作不为空表示编辑操作</param>
/// <returns>返回添加/编辑视图及对应的储位区模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化储位区实体模型
var model = new Wms_reservoirarea();
// ID为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询对应储位区的实体数据编辑操作视图加载已有数据
else
{
model = _reservoirareaServices.QueryableToEntity(c => c.ReservoirAreaId == SqlFunc.ToInt64(id));
@ -100,98 +55,52 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 储位区添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的储位区数据,完成数据验证、业务逻辑处理并返回结果
/// </summary>
/// <param name="model">表单提交的储位区实体模型</param>
/// <param name="id">储位区ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_reservoirarea model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_reservoirarea model, [FromForm]string id)
{
// 初始化储位区验证器FluentValidation实现
var validator = new ReservoirareaFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合预设规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误用换行符分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 检查储位区编号或名称是否已存在(唯一性校验)
if (_reservoirareaServices.IsAny(c => c.ReservoirAreaNo == model.ReservoirAreaNo || c.ReservoirAreaName == model.ReservoirAreaName))
{
// 编号或名称已存在返回失败提示PubConst.Warehouse4为预定义常量
return BootJsonH((false, PubConst.Warehouse4));
}
// 给新增储位区赋值必要字段
model.ReservoirAreaId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID从当前登录用户缓存获取
bool flag = _reservoirareaServices.Insert(model); // 调用储位区服务执行插入操作
// 根据操作结果返回对应提示(成功返回添加成功,失败返回添加失败)
model.ReservoirAreaId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _reservoirareaServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 给更新的储位区赋值必要字段
model.ReservoirAreaId = id.ToInt64(); // 设置储位区ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间,工具类获取)
var flag = _reservoirareaServices.Update(model); // 调用储位区服务执行更新操作
// 根据操作结果返回对应提示(成功返回更新成功,失败返回更新失败)
model.ReservoirAreaId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _reservoirareaServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 储位区删除操作的HTTP GET请求处理方法逻辑删除
/// 删除前检查储位区是否关联货架,关联则不允许删除
/// </summary>
/// <param name="id">要删除的储位区ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 检查该储位区是否关联货架(存在关联则不允许删除)
var isExist = _storagerackServices.IsAny(c => c.ReservoirAreaId == SqlFunc.ToInt64(id));
if (isExist)
{
// 存在关联货架返回删除失败提示PubConst.Warehouse3为预定义常量
return BootJsonH((false, PubConst.Warehouse3));
}
// 无关联货架,执行逻辑删除
else
{
// 调用储位区服务执行逻辑删除:仅更新指定字段
var flag = _reservoirareaServices.Update(
new Wms_reservoirarea
{
ReservoirAreaId = SqlFunc.ToInt64(id), // 目标储位区ID字符串转长整型
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常按业务定义
ModifiedBy = UserDtoCache.UserId, // 删除操作人ID当前登录用户
ModifiedDate = DateTimeExt.DateTime // 删除操作时间(当前时间)
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 仅更新这三个字段,提升性能
);
// 根据操作结果返回对应提示(成功返回删除成功,失败返回删除失败)
var flag = _reservoirareaServices.Update(new Wms_reservoirarea { ReservoirAreaId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}

@ -1,57 +1,27 @@
// 引入FluentValidation验证结果命名空间用于接收实体验证反馈
using FluentValidation.Results;
// 引入服务接口命名空间,包含角色、菜单、用户等相关服务接口
using FluentValidation.Results;
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System;
using System.Linq;
// 引入数据传输对象命名空间包含角色菜单关联DTO
using YL.Core.Dto;
// 引入核心实体类命名空间,包含角色、角色菜单关联等实体
using YL.Core.Entity;
// 引入实体验证命名空间包含角色实体的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含操作提示、角色相关常量等定义
using YL.Utils.Pub;
// 引入表格工具命名空间包含Bootstrap表格相关参数模型
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 角色控制器
/// 负责处理角色的列表展示、添加、编辑、删除,以及角色与菜单的关联配置
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class RoleController : BaseController
{
// 菜单服务接口实例,用于查询菜单数据(角色关联菜单时使用)
private readonly ISys_menuServices _menuServices;
// 角色服务接口实例,处理角色相关业务逻辑
private readonly ISys_roleServices _roleServices;
// 角色菜单关联服务接口实例,处理角色与菜单的关联关系
private readonly ISys_rolemenuServices _rolemenuServices;
// 用户服务接口实例,用于查询角色是否关联用户(删除角色时校验)
private readonly ISys_userServices _userServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="userServices">用户服务接口</param>
/// <param name="rolemenuServices">角色菜单关联服务接口</param>
/// <param name="roleServices">角色服务接口</param>
/// <param name="menuServices">菜单服务接口</param>
public RoleController(ISys_userServices userServices, ISys_rolemenuServices rolemenuServices, ISys_roleServices roleServices, ISys_menuServices menuServices)
{
_userServices = userServices;
@ -60,41 +30,23 @@ namespace KopSoftWms.Controllers
_rolemenuServices = rolemenuServices;
}
/// <summary>
/// 角色列表页面的HTTP GET请求处理方法默认GET请求未显式标注
/// 需验证菜单访问权限
/// </summary>
/// <returns>返回角色列表视图</returns>
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[CheckMenu]
public IActionResult Index()
{
return View(); // 返回Index视图对应Views/Role/Index.cshtml
return View();
}
/// <summary>
/// 分页查询角色列表数据的HTTP POST请求处理方法
/// 接收Bootstrap表格的分页、排序、查询参数返回JSON格式分页数据
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含页码、页大小、排序字段、查询关键词等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用角色服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _roleServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 获取菜单列表用于角色关联菜单的树形展示的HTTP GET请求处理方法
/// 返回可用于权限配置的菜单数据结构
/// </summary>
/// <returns>返回菜单列表的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult GetMenuList()
{
// 注释代码:手动构建菜单树形结构(父菜单+子菜单)
//var permissionMenus = _menuServices.QueryableToList(c => c.IsDel == 1 && c.MenuType == "menu" && c.Status == 1);
//var parentPermissions = permissionMenus.Where(a => a.MenuParent == -1).ToList();
//var ret = new List<PermissionMenu>();
@ -113,35 +65,21 @@ namespace KopSoftWms.Controllers
// }).ToList();
// ret.Add(permissionMenu);
//});
// 调用角色服务的GetMenu方法获取预处理后的菜单数据树形结构
return BootJsonH(_roleServices.GetMenu());
}
/// <summary>
/// 角色添加/编辑页面的HTTP GET请求处理方法
/// 关联角色菜单数据,用于配置角色的菜单权限
/// </summary>
/// <param name="id">角色ID为空表示添加不为空表示编辑</param>
/// <returns>返回添加/编辑视图及对应的角色菜单DTO模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化角色菜单DTO包含角色信息和关联的菜单列表
var roles = new RoleMenuDto();
// ID为空返回空DTO添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(roles);
}
// ID不为空查询角色信息及关联的菜单列表编辑操作
else
{
// 查询指定ID的角色实体
var role = _roleServices.QueryableToEntity(c => c.RoleId == SqlFunc.ToInt64(id));
// 查询该角色关联的所有菜单
var list = _rolemenuServices.QueryableToList(c => c.RoleId == SqlFunc.ToInt64(id));
// 构建角色菜单DTO封装角色信息和关联菜单
roles = new RoleMenuDto()
{
RoleId = role?.RoleId.ToString(),
@ -150,17 +88,11 @@ namespace KopSoftWms.Controllers
Remark = role?.Remark,
Children = list
};
return View(roles); // 返回带数据的DTO视图
return View(roles);
}
}
/// <summary>
/// 角色查询页面的HTTP GET请求处理方法
/// 功能与Add方法类似用于查看角色详情及关联的菜单权限
/// </summary>
/// <param name="id">角色ID为空返回空模型不为空返回角色详情</param>
/// <returns>返回查询视图及对应的角色菜单DTO模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Query(string id)
{
var roles = new RoleMenuDto();
@ -184,119 +116,69 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 角色添加或更新操作的HTTP POST请求处理方法
/// 同时处理角色与菜单的关联关系(新增/更新角色时同步配置菜单权限)
/// </summary>
/// <param name="role">角色实体模型</param>
/// <param name="id">角色ID为空表示添加不为空表示更新</param>
/// <param name="menuId">角色关联的菜单ID数组</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Sys_role role, [FromForm] string id, [FromForm] string[] menuId)
[HttpPost]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Sys_role role, [FromForm]string id, [FromForm]string[] menuId)
{
// 注释代码菜单ID数组排序处理当前未启用
//int[] menuIds = Array.ConvertAll(menuId, new Converter<string, int>(c => c.ToInt32()));
//Array.Sort(menuIds);
//var arrs = (from d in menuId orderby d.ToInt32() ascending select d.ToInt32()).ToArray();
//var arrs2 = (from d in arrs select d).ToArray();
// 初始化角色验证器FluentValidation实现
var validator = new SysRoleFluent();
// 执行角色实体数据验证,获取验证结果
ValidationResult results = validator.Validate(role);
bool success = results.IsValid;
// 验证失败(数据不符合预设规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误用换行符分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 检查角色名称是否已存在(唯一性校验)
if (_roleServices.IsAny(c => c.RoleName == role.RoleName))
{
// 角色名称已存在返回失败提示PubConst.Role2为预定义常量
return BootJsonH((false, PubConst.Role2));
}
// 调用角色服务执行添加操作同时关联菜单权限传入当前用户ID和菜单ID数组
var flag = _roleServices.Insert(role, UserDtoCache.UserId, menuId);
// 根据操作结果返回对应提示
return BootJsonH(flag.IsSuccess ? (flag.IsSuccess, PubConst.Add1) : (flag.IsSuccess, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 注释代码:限制管理员角色不可编辑(当前未启用)
//admin
//var model = _roleServices.QueryableToEntity(c => c.RoleId == SqlFunc.ToInt64(id));
//if (model.RoleType == "admin")
//{
// return BootJsonH((false, PubConst.Role1));
//}
// 设置角色ID确保更新指定记录
role.RoleId = id.ToInt64();
// 调用角色服务执行更新操作,同时更新菜单权限关联
var flag = _roleServices.Update(role, UserDtoCache.UserId, menuId);
// 根据操作结果返回对应提示
return BootJsonH(flag.IsSuccess ? (flag.IsSuccess, PubConst.Update1) : (flag.IsSuccess, PubConst.Update2));
}
}
/// <summary>
/// 角色删除操作的HTTP GET请求处理方法逻辑删除
/// 包含管理员角色保护、角色关联用户校验,删除角色时同步删除关联的菜单权限
/// </summary>
/// <param name="id">要删除的角色ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 查询要删除的角色实体
var model = _roleServices.QueryableToEntity(c => c.RoleId == SqlFunc.ToInt64(id));
// 管理员角色不允许删除(保护系统核心角色)
if (model.RoleType == "admin")
{
return BootJsonH((false, PubConst.Role1)); // 返回管理员角色不可删除的提示
return BootJsonH((false, PubConst.Role1));
}
// 检查该角色是否关联用户(关联用户则不允许删除)
var user = _userServices.IsAny(c => c.RoleId == SqlFunc.ToInt64(id));
if (user)
{
return BootJsonH((false, PubConst.Role3)); // 返回角色关联用户的提示
return BootJsonH((false, PubConst.Role3));
}
// 执行角色逻辑删除:更新删除标识、修改人、修改时间
var flag = _roleServices.Update(
new Sys_role
{
RoleId = SqlFunc.ToInt64(id),
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常
ModifiedBy = UserDtoCache.UserId,
ModifiedDate = DateTimeExt.DateTime
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 指定仅更新这三个字段
);
// 角色删除成功后,同步删除角色与菜单的关联关系
var flag = _roleServices.Update(new Sys_role { RoleId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
if (flag)
{
_rolemenuServices.Delete(c => c.RoleId == SqlFunc.ToInt64(id));
return BootJsonH((flag, PubConst.Delete1)); // 返回删除成功提示
return BootJsonH((flag, PubConst.Delete1));
}
else
{
return BootJsonH((flag, PubConst.Delete2)); // 返回删除失败提示
return BootJsonH((flag, PubConst.Delete2));
}
}
}

@ -2,21 +2,10 @@
namespace KopSoftWms.Controllers
{
/// <summary>
/// 路由管理控制器
/// 负责处理与路由相关的页面请求和业务逻辑
/// 命名规范:以"Controller"为后缀,对应路由管理功能模块
/// </summary>
public class RoutingController : Controller
{
/// <summary>
/// 路由管理首页
/// 处理GET请求返回路由管理的主视图
/// </summary>
/// <returns>视图对象IActionResult默认对应Views/Routing/Index.cshtml视图文件</returns>
public IActionResult Index()
{
// 返回Index视图该视图通常包含路由管理的页面布局、表格、表单等UI元素
return View();
}
}

@ -1,59 +1,27 @@
// 引入服务接口命名空间,包含入库单、明细、供应商等相关服务接口
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询、事务及类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入数据传输对象命名空间,包含入库单分页查询专用参数
using YL.Core.Dto;
// 引入核心实体类命名空间,包含入库单、明细等实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含入库单、明细的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、枚举转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含操作提示、字典类型、状态枚举等定义
using YL.Utils.Pub;
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 入库单控制器
/// 负责处理入库单主表、明细的全流程操作(列表、添加、编辑、审核、删除、打印等)
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class StockInController : BaseController
{
// 入库单服务接口实例,处理入库单主表业务逻辑
private readonly IWms_stockinServices _stockinServices;
// 供应商服务接口实例,用于查询供应商相关数据(如入库单关联供应商)
private readonly IWms_supplierServices _supplierServices;
// 字典服务接口实例,用于查询入库类型等字典数据
private readonly ISys_dictServices _dictServices;
// 序列号服务接口实例,用于生成唯一入库单号
private readonly ISys_serialnumServices _serialnumServices;
// 入库单明细服务接口实例,处理入库单明细业务逻辑
private readonly IWms_stockindetailServices _stockindetailServices;
// SqlSugar数据库客户端实例用于手动控制事务如级联删除主表和明细
private readonly SqlSugarClient _client;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务与工具实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="stockindetailServices">入库单明细服务接口</param>
/// <param name="serialnumServices">序列号服务接口</param>
/// <param name="dictServices">字典服务接口</param>
/// <param name="supplierServices">供应商服务接口</param>
/// <param name="stockinServices">入库单服务接口</param>
/// <param name="client">SqlSugar数据库客户端</param>
public StockInController(
IWms_stockindetailServices stockindetailServices,
ISys_serialnumServices serialnumServices,
@ -71,75 +39,51 @@ namespace KopSoftWms.Controllers
_client = client;
}
/// <summary>
/// 入库单列表页面的HTTP GET请求处理方法
/// 向视图传递入库类型字典、入库状态枚举数据(用于下拉筛选)
/// </summary>
/// <returns>返回入库单列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
// 查询入库类型字典未删除且字典类型为入库类型PubDictType.stockin转整型字符串
var list = _dictServices.Queryable()
.Where(c => c.IsDel == 1 && c.DictType == PubDictType.stockin.ToInt32().ToString())
.ToList();
// 将StockInStatus枚举转换为键值对列表用于状态下拉筛选
var list = _dictServices.Queryable().Where(c => c.IsDel == 1 && c.DictType == PubDictType.stockin.ToInt32().ToString()).ToList();
var stockInStatus = EnumExt.ToKVListLinq<StockInStatus>();
// 传递数据到视图
ViewBag.StockInType = list; // 入库类型下拉数据
ViewBag.StockInStatus = stockInStatus; // 入库状态下拉数据
return View(); // 返回Index视图对应Views/StockIn/Index.cshtml
ViewBag.StockInType = list;
ViewBag.StockInStatus = stockInStatus;
return View();
}
/// <summary>
/// 分页查询入库单主表数据的HTTP POST请求处理方法
/// 接收入库单专用分页参数返回JSON格式分页数据
/// 主表
/// </summary>
/// <param name="bootstrap">入库单分页查询参数对象,包含页码、状态、入库类型等筛选条件</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] PubParams.StockInBootstrapParams bootstrap)
/// <param name="bootstrap">参数</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.StockInBootstrapParams bootstrap)
{
// 调用入库单服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _stockinServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 分页查询入库单明细数据的HTTP POST请求处理方法
/// 根据入库单主表ID查询关联的明细数据
/// 明细
/// </summary>
/// <param name="pid">入库单主表ID</param>
/// <returns>返回JSON格式的明细分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult ListDetail(string pid)
{
// 调用明细服务的分页列表方法传入主表ID获取明细数据
var sd = _stockindetailServices.PageList(pid);
return Content(sd); // 返回明细数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 入库单添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">入库单ID为空表示添加不为空表示编辑</param>
/// <returns>返回添加/编辑视图及对应的入库单模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化入库单实体模型
var model = new Wms_stockin();
// ID为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询未删除的入库单实体编辑操作视图加载已有数据
else
{
model = _stockinServices.QueryableToEntity(c => c.StockInId == SqlFunc.ToInt64(id) && c.IsDel == 1);
@ -147,180 +91,153 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 入库单明细添加/编辑页面的HTTP GET请求处理方法
/// 根据明细ID是否为空区分添加和编辑关联入库单主表ID
/// </summary>
/// <param name="id">明细ID为空表示添加</param>
/// <param name="pid">入库单主表ID用于关联明细与主表</param>
/// <returns>返回添加/编辑视图及对应的明细模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Detail(string id, string pid)
{
// 初始化明细实体模型
var model = new Wms_stockindetail();
// 明细ID为空或0添加操作
if (id.IsEmptyZero())
{
model.StockInId = pid.ToInt64(); // 关联入库单主表ID
return View(model); // 返回空明细模型视图
model.StockInId = pid.ToInt64();
return View(model);
}
// 明细ID不为空编辑操作
else
{
// 查询未删除的明细实体
model = _stockindetailServices.QueryableToEntity(c => c.StockInDetailId == SqlFunc.ToInt64(id) && c.IsDel == 1);
return View(model); // 返回带明细数据的视图
return View(model);
}
}
/// <summary>
/// 入库单添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的入库单数据,完成验证并执行对应操作
/// </summary>
/// <param name="model">表单提交的入库单实体模型</param>
/// <param name="id">入库单ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_stockin model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_stockin model, [FromForm]string id)
{
// 初始化入库单验证器FluentValidation实现
var validator = new StockInFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(换行分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 返回失败结果
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0添加操作
if (id.IsEmptyZero())
{
// 若订单号不为空,检查是否已存在(唯一性校验)
if (!model.OrderNo.IsEmpty())
{
if (_stockinServices.IsAny(c => c.OrderNo == model.OrderNo))
{
return BootJsonH((false, PubConst.StockIn1)); // 返回订单号已存在提示
return BootJsonH((false, PubConst.StockIn1));
}
}
// 给新增入库单赋值必要字段
model.StockInNo = _serialnumServices.GetSerialnum(UserDtoCache.UserId, "Wms_stockin"); // 生成唯一入库单号
model.StockInId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.StockInStatus = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID当前登录用户
bool flag = _stockinServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.StockInNo = _serialnumServices.GetSerialnum(UserDtoCache.UserId, "Wms_stockin");
model.StockInId = PubId.SnowflakeId;
model.StockInStatus = StockInStatus.initial.ToByte();
model.CreateBy = UserDtoCache.UserId;
bool flag = _stockinServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空更新操作
else
{
model.StockInId = id.ToInt64(); // 设置入库单ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间)
var flag = _stockinServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.StockInId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _stockinServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 入库单明细添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的明细数据,完成验证并执行对应操作
/// </summary>
/// <param name="model">表单提交的明细实体模型</param>
/// <param name="id">明细ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdateD([FromForm] Wms_stockindetail model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdateD([FromForm]Wms_stockindetail model, [FromForm]string id)
{
// 初始化明细验证器FluentValidation实现
var validator = new StockInDetailFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(换行分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 返回失败结果
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0添加操作
if (id.IsEmptyZero())
{
model.StockInDetailId = PubId.SnowflakeId; // 生成明细唯一ID
model.Status = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID
bool flag = _stockindetailServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.StockInDetailId = PubId.SnowflakeId;
model.Status = StockInStatus.initial.ToByte();
model.CreateBy = UserDtoCache.UserId;
bool flag = _stockindetailServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空更新操作
else
{
model.StockInDetailId = id.ToInt64(); // 设置明细ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间
var flag = _stockindetailServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.StockInDetailId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _stockindetailServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 入库单审核操作的HTTP GET请求处理方法
/// 审核前检查是否有明细数据,审核后更新入库单状态及库存
/// 审核
/// </summary>
/// <param name="id">入库单ID</param>
/// <returns>返回审核结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.update)] // 操作日志记录特性,标记该操作类型为"更新"
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.update)]
public IActionResult Auditin(string id)
{
// 检查该入库单下是否存在未删除的明细(无明细则无法审核)
var list = _stockindetailServices.QueryableToList(c => c.IsDel == 1 && c.StockInId == SqlFunc.ToInt64(id));
if (!list.Any())
{
return BootJsonH((false, PubConst.StockIn4)); // 返回无明细提示
return BootJsonH((false, PubConst.StockIn4));
}
// 调用入库单服务的审核方法传入审核人ID和入库单ID
var flag = _stockinServices.Auditin(UserDtoCache.UserId, SqlFunc.ToInt64(id));
// 根据审核结果返回对应提示(成功/失败)
return BootJsonH(flag ? (flag, PubConst.StockIn2) : (flag, PubConst.StockIn3));
}
/// <summary>
/// 入库单删除操作的HTTP GET请求处理方法逻辑删除级联删除明细
/// 使用事务保证主表和明细删除操作的原子性
/// 删除
/// </summary>
/// <param name="id">入库单主表ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 使用SqlSugar事务执行级联删除主表+明细)
var flag = _client.Ado.UseTran(() =>
{
// 逻辑删除该入库单下所有未删除的明细
_client.Updateable(new Wms_stockindetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime })
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }) // 仅更新指定字段
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate })
.Where(c => c.StockInId == SqlFunc.ToInt64(id) && c.IsDel == 1).ExecuteCommand();
_client.Updateable(new Wms_stockin { StockInId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime })
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate })
.ExecuteCommand();
}).IsSuccess;
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
/// <summary>
/// 删除明细
/// </summary>
/// <param name="id">明细id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult DeleteDetail(string id)
{
var flag = _stockindetailServices.Update(
new Wms_stockindetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime },
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate },
c => c.StockInDetailId == SqlFunc.ToInt64(id)
);
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
[HttpGet]
public IActionResult PreviewJson(string id)
{
var str = _stockinServices.PrintList(id);
return Content(str);
}
}
}

@ -1,326 +1,275 @@
// 引入服务接口命名空间,包含入库单、明细、供应商等相关服务接口
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询、事务及类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入数据传输对象命名空间,包含入库单分页查询专用参数
using YL.Core.Dto;
// 引入核心实体类命名空间,包含入库单、明细等实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含入库单、明细的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、枚举转换等扩展方法
using YL.Utils.Extensions;
// 引入公共常量与枚举命名空间,包含操作提示、字典类型、状态枚举等定义
using YL.Utils.Pub;
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 入库单控制器
/// 负责处理入库单主表、明细的全流程操作(列表、添加、编辑、审核、删除、打印等)
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class StockInController : BaseController
public class StockOutController : BaseController
{
// 入库单服务接口实例,处理入库单主表业务逻辑
private readonly IWms_stockinServices _stockinServices;
// 供应商服务接口实例,用于查询供应商相关数据(如入库单关联供应商)
private readonly IWms_supplierServices _supplierServices;
// 字典服务接口实例,用于查询入库类型等字典数据
private readonly ISys_dictServices _dictServices;
// 序列号服务接口实例,用于生成唯一入库单号
private readonly IWms_CustomerServices _customerServices;
private readonly IWms_stockoutServices _stockoutServices;
private readonly ISys_serialnumServices _serialnumServices;
// 入库单明细服务接口实例,处理入库单明细业务逻辑
private readonly IWms_stockindetailServices _stockindetailServices;
// SqlSugar数据库客户端实例用于手动控制事务如级联删除主表和明细
private readonly IWms_stockoutdetailServices _stockoutdetailServices;
private readonly IWms_inventoryServices _inventoryServices;
private readonly SqlSugarClient _client;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务与工具实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="stockindetailServices">入库单明细服务接口</param>
/// <param name="serialnumServices">序列号服务接口</param>
/// <param name="dictServices">字典服务接口</param>
/// <param name="supplierServices">供应商服务接口</param>
/// <param name="stockinServices">入库单服务接口</param>
/// <param name="client">SqlSugar数据库客户端</param>
public StockInController(
IWms_stockindetailServices stockindetailServices,
ISys_serialnumServices serialnumServices,
public StockOutController(
ISys_dictServices dictServices,
IWms_supplierServices supplierServices,
IWms_stockinServices stockinServices,
IWms_CustomerServices customerServices,
IWms_stockoutServices stockoutServices,
ISys_serialnumServices serialnumServices,
IWms_stockoutdetailServices stockoutdetailServices,
IWms_inventoryServices inventoryServices,
SqlSugarClient client
)
{
_stockindetailServices = stockindetailServices;
_serialnumServices = serialnumServices;
_dictServices = dictServices;
_supplierServices = supplierServices;
_stockinServices = stockinServices;
_customerServices = customerServices;
_stockoutServices = stockoutServices;
_serialnumServices = serialnumServices;
_stockoutdetailServices = stockoutdetailServices;
_inventoryServices = inventoryServices;
_client = client;
}
/// <summary>
/// 入库单列表页面的HTTP GET请求处理方法
/// 向视图传递入库类型字典、入库状态枚举数据(用于下拉筛选)
/// </summary>
/// <returns>返回入库单列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
// 查询入库类型字典未删除且字典类型为入库类型PubDictType.stockin转整型字符串
var list = _dictServices.Queryable()
.Where(c => c.IsDel == 1 && c.DictType == PubDictType.stockin.ToInt32().ToString())
.ToList();
// 将StockInStatus枚举转换为键值对列表用于状态下拉筛选
var list = _dictServices.Queryable().Where(c => c.IsDel == 1 && c.DictType == PubDictType.stockout.ToInt32().ToString()).ToList();
var stockInStatus = EnumExt.ToKVListLinq<StockInStatus>();
// 传递数据到视图
ViewBag.StockInType = list; // 入库类型下拉数据
ViewBag.StockInStatus = stockInStatus; // 入库状态下拉数据
return View(); // 返回Index视图对应Views/StockIn/Index.cshtml
ViewBag.StockInType = list;
ViewBag.StockInStatus = stockInStatus;
return View();
}
/// <summary>
/// 分页查询入库单主表数据的HTTP POST请求处理方法
/// 接收入库单专用分页参数返回JSON格式分页数据
/// </summary>
/// <param name="bootstrap">入库单分页查询参数对象,包含页码、状态、入库类型等筛选条件</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] PubParams.StockInBootstrapParams bootstrap)
[HttpGet]
public IActionResult Search(string text)
{
// 调用入库单服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _stockinServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
var bootstrap = new Bootstrap.BootstrapParams
{
limit = 100,
offset = 0,
sort = "CreateDate",
search = text,
order = "desc"
};
var json = _customerServices.PageList(bootstrap);
return Content(json);
}
/// <summary>
/// 分页查询入库单明细数据的HTTP POST请求处理方法
/// 根据入库单主表ID查询关联的明细数据
/// </summary>
/// <param name="pid">入库单主表ID</param>
/// <returns>返回JSON格式的明细分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult ListDetail(string pid)
[HttpGet]
public IActionResult SearchInventory(string id, string storagerackId)
{
// 调用明细服务的分页列表方法传入主表ID获取明细数据
var sd = _stockindetailServices.PageList(pid);
return Content(sd); // 返回明细数据供前端表格渲染
var bootstrap = new PubParams.InventoryBootstrapParams
{
limit = 100,
offset = 0,
sort = "CreateDate",
search = id,
order = "desc",
StorageRackId = storagerackId,
};
var json = _inventoryServices.SearchInventory(bootstrap);
return Content(json);
}
/// <summary>
/// 入库单添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">入库单ID为空表示添加不为空表示编辑</param>
/// <returns>返回添加/编辑视图及对应的入库单模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化入库单实体模型
var model = new Wms_stockin();
// ID为空返回空模型添加操作视图显示空白表单
var model = new Wms_stockout();
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询未删除的入库单实体编辑操作视图加载已有数据
else
{
model = _stockinServices.QueryableToEntity(c => c.StockInId == SqlFunc.ToInt64(id) && c.IsDel == 1);
model = _stockoutServices.QueryableToEntity(c => c.StockOutId == SqlFunc.ToInt64(id) && c.IsDel == 1);
return View(model);
}
}
/// <summary>
/// 入库单明细添加/编辑页面的HTTP GET请求处理方法
/// 根据明细ID是否为空区分添加和编辑关联入库单主表ID
/// </summary>
/// <param name="id">明细ID为空表示添加</param>
/// <param name="pid">入库单主表ID用于关联明细与主表</param>
/// <returns>返回添加/编辑视图及对应的明细模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Detail(string id, string pid)
{
// 初始化明细实体模型
var model = new Wms_stockindetail();
// 明细ID为空或0添加操作
var model = new Wms_stockoutdetail();
if (id.IsEmptyZero())
{
model.StockInId = pid.ToInt64(); // 关联入库单主表ID
return View(model); // 返回空明细模型视图
model.StockOutId = pid.ToInt64();
return View(model);
}
// 明细ID不为空编辑操作
else
{
// 查询未删除的明细实体
model = _stockindetailServices.QueryableToEntity(c => c.StockInDetailId == SqlFunc.ToInt64(id) && c.IsDel == 1);
return View(model); // 返回带明细数据的视图
model = _stockoutdetailServices.QueryableToEntity(c => c.StockOutDetailId == SqlFunc.ToInt64(id) && c.IsDel == 1);
return View(model);
}
}
/// <summary>
/// 入库单添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的入库单数据,完成验证并执行对应操作
/// 主表
/// </summary>
/// <param name="bootstrap">参数</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]PubParams.StockOutBootstrapParams bootstrap)
{
var sd = _stockoutServices.PageList(bootstrap);
return Content(sd);
}
/// <summary>
/// 明细
/// </summary>
/// <param name="model">表单提交的入库单实体模型</param>
/// <param name="id">入库单ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_stockin model, [FromForm] string id)
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult ListDetail(string pid)
{
var sd = _stockoutdetailServices.PageList(pid);
return Content(sd);
}
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_stockout model, [FromForm]string id)
{
// 初始化入库单验证器FluentValidation实现
var validator = new StockInFluent();
// 执行模型数据验证,获取验证结果
var validator = new StockOutFluent();
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(换行分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 返回失败结果
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0添加操作
if (id.IsEmptyZero())
{
// 若订单号不为空,检查是否已存在(唯一性校验)
if (!model.OrderNo.IsEmpty())
{
if (_stockinServices.IsAny(c => c.OrderNo == model.OrderNo))
if (_stockoutServices.IsAny(c => c.OrderNo == model.OrderNo))
{
return BootJsonH((false, PubConst.StockIn1)); // 返回订单号已存在提示
return BootJsonH((false, PubConst.StockIn1));
}
}
// 给新增入库单赋值必要字段
model.StockInNo = _serialnumServices.GetSerialnum(UserDtoCache.UserId, "Wms_stockin"); // 生成唯一入库单号
model.StockInId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.StockInStatus = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID当前登录用户
bool flag = _stockinServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.StockOutNo = _serialnumServices.GetSerialnum(UserDtoCache.UserId, "Wms_stockout");
model.StockOutId = PubId.SnowflakeId;
model.StockOutStatus = StockInStatus.initial.ToByte();
model.CreateBy = UserDtoCache.UserId;
bool flag = _stockoutServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空更新操作
else
{
model.StockInId = id.ToInt64(); // 设置入库单ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间)
var flag = _stockinServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.StockOutId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _stockoutServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 入库单明细添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的明细数据,完成验证并执行对应操作
/// </summary>
/// <param name="model">表单提交的明细实体模型</param>
/// <param name="id">明细ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdateD([FromForm] Wms_stockindetail model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdateD([FromForm]Wms_stockoutdetail model, [FromForm]string id)
{
// 初始化明细验证器FluentValidation实现
var validator = new StockInDetailFluent();
// 执行模型数据验证,获取验证结果
var validator = new StockOutDetailFluent();
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合规则)
if (!success)
{
// 拼接所有验证错误信息(换行分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg)); // 返回失败结果
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0添加操作
if (id.IsEmptyZero())
{
model.StockInDetailId = PubId.SnowflakeId; // 生成明细唯一ID
model.Status = StockInStatus.initial.ToByte(); // 初始状态设为"初始"
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID
bool flag = _stockindetailServices.Insert(model); // 执行插入操作
// 根据操作结果返回对应提示
model.StockOutDetailId = PubId.SnowflakeId;
model.Status = StockInStatus.initial.ToByte();
model.CreateBy = UserDtoCache.UserId;
bool flag = _stockoutdetailServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空更新操作
else
{
model.StockInDetailId = id.ToInt64(); // 设置明细ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间
var flag = _stockindetailServices.Update(model); // 执行更新操作
// 根据操作结果返回对应提示
model.StockOutDetailId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _stockoutdetailServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 入库单审核操作的HTTP GET请求处理方法
/// 审核前检查是否有明细数据,审核后更新入库单状态及库存
/// 审核
/// </summary>
/// <param name="id">入库单ID</param>
/// <returns>返回审核结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.update)] // 操作日志记录特性,标记该操作类型为"更新"
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.update)]
public IActionResult Auditin(string id)
{
// 检查该入库单下是否存在未删除的明细(无明细则无法审核)
var list = _stockindetailServices.QueryableToList(c => c.IsDel == 1 && c.StockInId == SqlFunc.ToInt64(id));
var list = _stockoutdetailServices.QueryableToList(c => c.IsDel == 1 && c.StockOutId == SqlFunc.ToInt64(id));
if (!list.Any())
{
return BootJsonH((false, PubConst.StockIn4)); // 返回无明细提示
return BootJsonH((false, PubConst.StockIn4));
}
// 调用入库单服务的审核方法传入审核人ID和入库单ID
var flag = _stockinServices.Auditin(UserDtoCache.UserId, SqlFunc.ToInt64(id));
// 根据审核结果返回对应提示(成功/失败)
return BootJsonH(flag ? (flag, PubConst.StockIn2) : (flag, PubConst.StockIn3));
var flag = _stockoutServices.Auditin(UserDtoCache.UserId, SqlFunc.ToInt64(id));
return BootJsonH(flag.IsSuccess ? (flag.IsSuccess, PubConst.StockIn2) : (flag.IsSuccess, flag.ErrorMessage));
}
/// <summary>
/// 入库单删除操作的HTTP GET请求处理方法逻辑删除级联删除明细
/// 使用事务保证主表和明细删除操作的原子性
/// 删除
/// </summary>
/// <param name="id">入库单主表ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
/// <param name="id">主表id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 使用SqlSugar事务执行级联删除主表+明细)
var flag = _client.Ado.UseTran(() =>
{
// 逻辑删除该入库单下所有未删除的明细
_client.Updateable(new Wms_stockindetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime })
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }) // 仅更新指定
{
_client.Updateable(new Wms_stockoutdetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime })
.UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }).Where(c => c.StockOutId == SqlFunc.ToInt64(id) && c.IsDel == 1).ExecuteCommand();
_client.Updateable(new Wms_stockout { StockOutId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }).UpdateColumns(c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate }).ExecuteCommand();
}).IsSuccess;
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
/// <summary>
/// 删除明细
/// </summary>
/// <param name="id">明细id</param>
/// <returns></returns>
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult DeleteDetail(string id)
{
var flag = _stockoutdetailServices.Update(
new Wms_stockoutdetail { IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime },
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate },
c => c.StockOutDetailId == SqlFunc.ToInt64(id)
);
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
[HttpGet]
public IActionResult PreviewJson(string id)
{
var str = _stockoutServices.PrintList(id);
return Content(str);
}
}
}

@ -1,55 +1,25 @@
// 引入服务接口命名空间,包含仓库、储位区、货架、物料等相关服务接口
using IServices;
// 引入ASP.NET Core MVC核心命名空间提供控制器、ActionResult等核心类型
using IServices;
using Microsoft.AspNetCore.Mvc;
// 引入SqlSugar ORM框架命名空间用于数据库查询与类型转换
using SqlSugar;
// 引入LINQ相关命名空间支持集合的查询操作
using System.Linq;
// 引入核心实体类命名空间,包含货架(货架)等实体定义
using YL.Core.Entity;
// 引入实体验证命名空间包含货架的FluentValidation验证规则
using YL.Core.Entity.Fluent.Validation;
// 引入自定义特性命名空间,包含权限检查、操作日志记录等特性
using YL.NetCore.Attributes;
// 引入.NET Core应用基础命名空间提供基础控制器、响应格式化等功能
using YL.NetCore.NetCoreApp;
// 引入工具类扩展命名空间,提供字符串判空、类型转换等扩展方法
using YL.Utils.Extensions;
// 引入JSON工具命名空间提供对象转JSON的功能
using YL.Utils.Json;
// 引入公共常量与枚举命名空间,包含操作提示、仓库相关常量等定义
using YL.Utils.Pub;
// 引入表格工具命名空间包含Bootstrap表格相关参数模型
using YL.Utils.Table;
// 定义控制器所在命名空间,遵循项目控制器统一存放规范
namespace KopSoftWms.Controllers
{
/// <summary>
/// 货架控制器
/// 负责处理货架相关的HTTP请求包括列表展示、添加、编辑、删除、关联查询等操作
/// 继承自BaseController复用用户缓存、统一响应格式等基础功能
/// </summary>
public class StorageRackController : BaseController
{
// 仓库服务接口实例,用于查询仓库相关数据(如货架所属仓库)
private readonly IWms_warehouseServices _warehouseServices;
// 储位区服务接口实例,用于查询储位区相关数据(如货架所属储位区)
private readonly IWms_reservoirareaServices _reservoirareaServices;
// 货架服务接口实例,处理货架相关业务逻辑
private readonly IWms_storagerackServices _storagerackServices;
// 物料服务接口实例,用于检查货架是否关联物料(删除时校验)
private readonly IWms_materialServices _materialServices;
/// <summary>
/// 控制器构造函数,通过依赖注入初始化所有服务实例
/// 依赖注入由ASP.NET Core框架自动管理无需手动创建对象
/// </summary>
/// <param name="warehouseServices">仓库服务接口</param>
/// <param name="storagerackServices">货架服务接口</param>
/// <param name="reservoirareaServices">储位区服务接口</param>
/// <param name="materialServices">物料服务接口</param>
public StorageRackController(
IWms_warehouseServices warehouseServices,
IWms_storagerackServices storagerackServices,
@ -63,101 +33,61 @@ namespace KopSoftWms.Controllers
_materialServices = materialServices;
}
/// <summary>
/// 货架列表页面的HTTP GET请求处理方法
/// 需验证菜单访问权限
/// </summary>
/// <returns>返回货架列表视图</returns>
[HttpGet] // 标记为处理HTTP GET请求
[CheckMenu] // 自定义权限校验特性,验证用户是否有权限访问该菜单
[HttpGet]
[CheckMenu]
public IActionResult Index()
{
return View(); // 返回Index视图对应Views/StorageRack/Index.cshtml
return View();
}
/// <summary>
/// 获取指定仓库下所有未删除储位区的HTTP GET请求处理方法
/// 用于前端根据仓库动态加载储位区数据
/// 获取仓库下的所有未删除的库区
/// </summary>
/// <param name="id">仓库ID</param>
/// <returns>返回包含储位区ID和名称的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public ContentResult GetReservoirarea(string id)
{
// 查询未删除且属于指定仓库的储位区只返回ID和名称字段
var json = _reservoirareaServices.Queryable()
.Where(c => c.IsDel == 1 && c.WarehouseId == SqlFunc.ToInt64(id))
var json = _reservoirareaServices.Queryable().Where(c => c.IsDel == 1 && c.WarehouseId == SqlFunc.ToInt64(id))
.Select(c => new { ReservoirAreaId = c.ReservoirAreaId.ToString(), c.ReservoirAreaName })
.ToList();
return Content(json.JilToJson()); // 转换为JSON格式并返回
return Content(json.JilToJson());
}
/// <summary>
/// 获取指定仓库下所有未删除储位区的HTTP GET请求处理方法下拉框专用
/// 返回value-name键值对格式适合前端下拉框组件绑定
/// </summary>
/// <param name="id">仓库ID</param>
/// <returns>返回value和name格式的储位区JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public ContentResult GetReservoirarea2(string id)
{
// 查询未删除且属于指定仓库的储位区返回下拉框专用格式value为IDname为显示文本
var json = _reservoirareaServices.Queryable()
.Where(c => c.IsDel == 1 && c.WarehouseId == SqlFunc.ToInt64(id))
var json = _reservoirareaServices.Queryable().Where(c => c.IsDel == 1 && c.WarehouseId == SqlFunc.ToInt64(id))
.Select(c => new { value = c.ReservoirAreaId.ToString(), name = c.ReservoirAreaName })
.ToList();
return Content(json.JilToJson()); // 转换为JSON格式并返回
return Content(json.JilToJson());
}
/// <summary>
/// 获取指定储位区下所有未删除货架的HTTP GET请求处理方法下拉框专用
/// 返回value-name键值对格式适合前端下拉框组件绑定
/// </summary>
/// <param name="id">储位区ID</param>
/// <returns>返回value和name格式的货架JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public ContentResult GetStoragerack(string id)
{
// 查询未删除且属于指定储位区的货架,返回下拉框专用格式
var json = _storagerackServices.Queryable()
.Where(c => c.IsDel == 1 && c.ReservoirAreaId == SqlFunc.ToInt64(id))
var json = _storagerackServices.Queryable().Where(c => c.IsDel == 1 && c.ReservoirAreaId == SqlFunc.ToInt64(id))
.Select(c => new { value = c.StorageRackId.ToString(), name = c.StorageRackName })
.ToList();
return Content(json.JilToJson()); // 转换为JSON格式并返回
return Content(json.JilToJson());
}
/// <summary>
/// 分页查询货架列表数据的HTTP POST请求处理方法
/// 接收Bootstrap表格的分页、排序、查询参数返回JSON格式分页数据
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含页码、页大小、排序字段、查询关键词等</param>
/// <returns>返回JSON格式的分页数据ContentResult包装</returns>
[HttpPost] // 标记为处理HTTP POST请求
[OperationLog(LogType.select)] // 操作日志记录特性,标记该操作类型为"查询"
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用货架服务的分页列表方法传入查询参数获取JSON格式数据
var sd = _storagerackServices.PageList(bootstrap);
return Content(sd); // 返回数据供前端表格渲染
return Content(sd);
}
/// <summary>
/// 货架添加/编辑页面的HTTP GET请求处理方法
/// 根据ID是否为空区分添加无ID和编辑有ID操作
/// </summary>
/// <param name="id">货架ID为空表示添加不为空表示编辑</param>
/// <returns>返回添加/编辑视图及对应的货架模型</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Add(string id)
{
// 初始化货架实体模型
var model = new Wms_storagerack();
// ID为空返回空模型添加操作视图显示空白表单
if (id.IsEmpty())
{
return View(model);
}
// ID不为空查询对应货架的实体数据编辑操作视图加载已有数据
else
{
model = _storagerackServices.QueryableToEntity(c => c.StorageRackId == SqlFunc.ToInt64(id));
@ -165,112 +95,60 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 货架添加或更新操作的HTTP POST请求处理方法
/// 接收表单提交的货架数据,完成数据验证、业务逻辑处理并返回结果
/// </summary>
/// <param name="model">表单提交的货架实体模型</param>
/// <param name="id">货架ID为空表示添加不为空表示更新</param>
/// <returns>返回操作结果(成功/失败及提示信息的JSON数据</returns>
[HttpPost] // 标记为处理HTTP POST请求
[FilterXss] // 防XSS攻击特性过滤表单数据中的恶意脚本
[OperationLog(LogType.addOrUpdate)] // 操作日志记录特性,标记该操作类型为"添加或更新"
public IActionResult AddOrUpdate([FromForm] Wms_storagerack model, [FromForm] string id)
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_storagerack model, [FromForm]string id)
{
// 初始化货架验证器FluentValidation实现
var validator = new StorageRackFluent();
// 执行模型数据验证,获取验证结果
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败(数据不符合预设规则)
if (!success)
{
// 拼接所有验证错误信息(每个错误用换行符分隔)
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
// 以统一JSON格式返回失败结果及错误信息
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空或0表示添加操作
if (id.IsEmptyZero())
{
// 检查货架编号或名称是否已存在(唯一性校验)
if (_storagerackServices.IsAny(c => c.StorageRackNo == model.StorageRackNo || c.StorageRackName == model.StorageRackNo))
{
// 编号或名称已存在返回失败提示PubConst.Warehouse5为预定义常量
return BootJsonH((false, PubConst.Warehouse5));
}
// 给新增货架赋值必要字段
model.StorageRackId = PubId.SnowflakeId; // 生成雪花算法唯一ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID从当前登录用户缓存获取
bool flag = _storagerackServices.Insert(model); // 调用货架服务执行插入操作
// 根据操作结果返回对应提示(成功返回添加成功,失败返回添加失败)
model.StorageRackId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _storagerackServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空表示更新操作
else
{
// 给更新的货架赋值必要字段
model.StorageRackId = id.ToInt64(); // 设置货架ID确保更新指定记录
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID当前登录用户
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间(当前时间,工具类获取)
var flag = _storagerackServices.Update(model); // 调用货架服务执行更新操作
// 根据操作结果返回对应提示(成功返回更新成功,失败返回更新失败)
model.StorageRackId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _storagerackServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 货架删除操作的HTTP GET请求处理方法逻辑删除
/// 删除前检查货架是否关联物料,关联则不允许删除
/// </summary>
/// <param name="id">要删除的货架ID</param>
/// <returns>返回删除结果(成功/失败及提示信息的JSON数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[OperationLog(LogType.delete)] // 操作日志记录特性,标记该操作类型为"删除"
[HttpGet]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 检查该货架是否关联物料(存在关联则不允许删除)
//判断有没有物料
var isExist = _materialServices.IsAny(c => c.StoragerackId == SqlFunc.ToInt64(id));
if (isExist)
{
// 存在关联物料返回删除失败提示PubConst.Warehouse6为预定义常量
return BootJsonH((false, PubConst.Warehouse6));
}
// 无关联物料,执行逻辑删除
else
{
// 调用货架服务执行逻辑删除:仅更新指定字段
var flag = _storagerackServices.Update(
new Wms_storagerack
{
StorageRackId = SqlFunc.ToInt64(id), // 目标货架ID字符串转长整型
IsDel = 0, // 逻辑删除标识0表示已删除1表示正常按业务定义
ModifiedBy = UserDtoCache.UserId, // 删除操作人ID当前登录用户
ModifiedDate = DateTimeExt.DateTime // 删除操作时间(当前时间)
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 仅更新这三个字段,提升性能
);
// 根据操作结果返回对应提示(成功返回删除成功,失败返回删除失败)
var flag = _storagerackServices.Update(new Wms_storagerack { StorageRackId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}
/// <summary>
/// 货架搜索功能的HTTP GET请求处理方法带简易分页
/// 用于快速查询符合条件的货架数据
/// </summary>
/// <param name="text">搜索文本(可匹配货架编号、名称等)</param>
/// <returns>返回符合条件的货架分页数据</returns>
[HttpGet] // 标记为处理HTTP GET请求
[HttpGet]
public IActionResult Search(string text)
{
// 构建分页查询参数固定每页100条按创建时间降序
var bootstrap = new Bootstrap.BootstrapParams
{
limit = 100,
@ -279,9 +157,8 @@ namespace KopSoftWms.Controllers
search = text,
order = "desc"
};
// 调用货架服务的分页列表方法,传入搜索参数
var json = _storagerackServices.PageList(bootstrap);
return Content(json); // 返回搜索结果数据
return Content(json);
}
}
}

@ -26,21 +26,21 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
var sd = _supplierServices.PageList(bootstrap);
return Content(sd);
}
[HttpGet]
[HttpGet]
public IActionResult Add(string id)
{
var model = new Wms_supplier();
@ -57,8 +57,8 @@ namespace KopSoftWms.Controllers
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm] Wms_supplier model, [FromForm] string id)
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_supplier model, [FromForm]string id)
{
var validator = new SupplierFluent();
var results = validator.Validate(model);
@ -90,7 +90,7 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[OperationLog(LogType.delete)]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
var isDel = _stockinServices.QueryableToEntity(c => c.SupplierId == SqlFunc.ToInt64(id));
@ -102,7 +102,7 @@ namespace KopSoftWms.Controllers
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
[HttpGet]
[HttpGet]
public IActionResult Search(string text)
{
var bootstrap = new Bootstrap.BootstrapParams

@ -31,15 +31,15 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[CheckMenu]
[CheckMenu]
public IActionResult Index()
{
return View();
}
[HttpPost]
[OperationLog(LogType.select)]
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
//单表
//var express = ExpressionExt.Init<Sys_user>();
@ -110,8 +110,8 @@ namespace KopSoftWms.Controllers
}
[HttpPost]
[OperationLog(LogType.update)]
public IActionResult UpdatePwd([FromForm] Sys_user sys_User, [FromForm] string id)
[OperationLog(LogType.update)]
public IActionResult UpdatePwd([FromForm]Sys_user sys_User, [FromForm]string id)
{
//用Sys_user中的Sort接收旧密码
if (id.IsEmptyZero())
@ -135,8 +135,8 @@ namespace KopSoftWms.Controllers
[HttpPost]
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm] Sys_user sys_User, [FromForm] string id)
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Sys_user sys_User, [FromForm]string id)
{
var validator = new SysUserFluent();
ValidationResult results = validator.Validate(sys_User);
@ -171,7 +171,7 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[OperationLog(LogType.delete)]
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
var flag = _userServices.Update(new Sys_user { UserId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
@ -179,7 +179,7 @@ namespace KopSoftWms.Controllers
}
[HttpGet]
[OperationLog(LogType.update)]
[OperationLog(LogType.update)]
public IActionResult Enable(string id, string type)
{
if (type == "1")

@ -12,68 +12,40 @@ using YL.Utils.Table;
namespace KopSoftWms.Controllers
{
/// <summary>
/// 仓库控制器处理仓库相关的HTTP请求
/// 继承自BaseController具备基础控制器功能
/// </summary>
public class WarehouseController : BaseController
{
// 仓库服务接口实例,用于仓库相关业务逻辑处理
private readonly IWms_warehouseServices _warehouseServices;
// 储位区服务接口实例,用于储位区相关业务逻辑处理
private readonly IWms_reservoirareaServices _reservoirareaServices;
/// <summary>
/// 构造函数,通过依赖注入获取服务实例
/// </summary>
/// <param name="reservoirareaServices">储位区服务接口</param>
/// <param name="warehouseServices">仓库服务接口</param>
public WarehouseController(IWms_reservoirareaServices reservoirareaServices, IWms_warehouseServices warehouseServices)
{
_reservoirareaServices = reservoirareaServices;
_warehouseServices = warehouseServices;
}
/// <summary>
/// 仓库列表页面
/// </summary>
/// <returns>返回仓库列表视图</returns>
[HttpGet]
[CheckMenu] // 检查菜单权限的特性
[CheckMenu]
public IActionResult Index()
{
return View();
}
/// <summary>
/// 分页查询仓库列表数据
/// </summary>
/// <param name="bootstrap">Bootstrap表格参数对象包含分页、排序、查询条件等</param>
/// <returns>返回JSON格式的分页数据</returns>
[HttpPost]
[OperationLog(LogType.select)] // 记录查询操作日志
public ContentResult List([FromForm] Bootstrap.BootstrapParams bootstrap)
[OperationLog(LogType.select)]
public ContentResult List([FromForm]Bootstrap.BootstrapParams bootstrap)
{
// 调用仓库服务获取分页数据
var sd = _warehouseServices.PageList(bootstrap);
return Content(sd);
}
/// <summary>
/// 仓库添加/编辑页面
/// </summary>
/// <param name="id">仓库ID为空时表示添加不为空时表示编辑</param>
/// <returns>返回添加/编辑视图及对应的仓库模型</returns>
[HttpGet]
public IActionResult Add(string id)
{
var model = new Wms_warehouse();
// 若ID为空返回空模型添加操作
if (id.IsEmpty())
{
return View(model);
}
// 若ID不为空查询对应仓库信息编辑操作
else
{
model = _warehouseServices.QueryableToEntity(c => c.WarehouseId == SqlFunc.ToInt64(id));
@ -81,90 +53,52 @@ namespace KopSoftWms.Controllers
}
}
/// <summary>
/// 处理仓库添加或更新操作
/// </summary>
/// <param name="model">仓库实体模型</param>
/// <param name="id">仓库ID为空时表示添加不为空时表示更新</param>
/// <returns>返回操作结果的JSON数据</returns>
[HttpPost]
[FilterXss] // 过滤XSS攻击的特性
[OperationLog(LogType.addOrUpdate)] // 记录添加或更新操作日志
public IActionResult AddOrUpdate([FromForm] Wms_warehouse model, [FromForm] string id)
[FilterXss]
[OperationLog(LogType.addOrUpdate)]
public IActionResult AddOrUpdate([FromForm]Wms_warehouse model, [FromForm]string id)
{
// 使用FluentValidation进行数据验证
var validator = new WarehouseFluent();
var results = validator.Validate(model);
var success = results.IsValid;
// 验证失败,返回错误信息
if (!success)
{
string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>"));
return BootJsonH((PubEnum.Failed.ToInt32(), msg));
}
// ID为空执行添加操作
if (id.IsEmptyZero())
{
// 检查仓库编号或名称是否已存在
if (_warehouseServices.IsAny(c => c.WarehouseNo == model.WarehouseNo || c.WarehouseName == model.WarehouseName))
{
return BootJsonH((false, PubConst.Warehouse1)); // 返回已存在的提示信息
return BootJsonH((false, PubConst.Warehouse1));
}
// 填充新增仓库的必要字段
model.WarehouseId = PubId.SnowflakeId; // 生成雪花ID作为仓库ID
model.CreateBy = UserDtoCache.UserId; // 设置创建人ID
bool flag = _warehouseServices.Insert(model); // 执行插入操作
// 返回添加结果
model.WarehouseId = PubId.SnowflakeId;
model.CreateBy = UserDtoCache.UserId;
bool flag = _warehouseServices.Insert(model);
return BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2));
}
// ID不为空执行更新操作
else
{
// 填充更新仓库的必要字段
model.WarehouseId = id.ToInt64(); // 设置仓库ID
model.ModifiedBy = UserDtoCache.UserId; // 设置修改人ID
model.ModifiedDate = DateTimeExt.DateTime; // 设置修改时间
var flag = _warehouseServices.Update(model); // 执行更新操作
// 返回更新结果
model.WarehouseId = id.ToInt64();
model.ModifiedBy = UserDtoCache.UserId;
model.ModifiedDate = DateTimeExt.DateTime;
var flag = _warehouseServices.Update(model);
return BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2));
}
}
/// <summary>
/// 处理仓库删除操作(逻辑删除)
/// </summary>
/// <param name="id">仓库ID</param>
/// <returns>返回删除结果的JSON数据</returns>
[HttpGet]
[OperationLog(LogType.delete)] // 记录删除操作日志
[OperationLog(LogType.delete)]
public IActionResult Delete(string id)
{
// 检查该仓库下是否存在储位区(存在则不允许删除)
var isExist = _reservoirareaServices.IsAny(c => c.WarehouseId == SqlFunc.ToInt64(id));
if (isExist)
{
return BootJsonH((false, PubConst.Warehouse2)); // 返回存在关联数据的提示信息
return BootJsonH((false, PubConst.Warehouse2));
}
// 执行逻辑删除更新IsDel字段为0表示已删除
else
{
var flag = _warehouseServices.Update(
new Wms_warehouse
{
WarehouseId = SqlFunc.ToInt64(id),
IsDel = 0, // 逻辑删除标识
ModifiedBy = UserDtoCache.UserId, // 修改人ID
ModifiedDate = DateTimeExt.DateTime // 修改时间
},
c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate } // 指定更新的字段
);
// 返回删除结果
var flag = _warehouseServices.Update(new Wms_warehouse { WarehouseId = SqlFunc.ToInt64(id), IsDel = 0, ModifiedBy = UserDtoCache.UserId, ModifiedDate = DateTimeExt.DateTime }, c => new { c.IsDel, c.ModifiedBy, c.ModifiedDate });
return BootJsonH(flag ? (flag, PubConst.Delete1) : (flag, PubConst.Delete2));
}
}

@ -1,6 +1,6 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://+5000
COPY . .
ENTRYPOINT ["dotnet", "KopSoftWms.dll"]

@ -1,14 +1,12 @@
using SqlSugar;
using System;
using Pomelo.AspNetCore.TimedJob;
using YL.NetCore.DI;
using YL.Utils.Log;
using SqlSugar;
using System;
namespace KopSoftWms
{
/// <summary>
/// 废弃过时TimeJob 后面使用YL.Scheduler替换
/// </summary>
public class SqlJob
public class SqlJob : Job
{
private readonly SqlSugarClient _client;
@ -17,6 +15,7 @@ namespace KopSoftWms
_client = client;
}
[Invoke(IsEnabled = false, Begin = "2018-12-19 10:30", Interval = 1000 * 3, SkipWhileExecuting = true)]
public void Run()
{
var _nlog = ServiceResolve.Resolve<ILogUtil>();

@ -1,121 +1,91 @@
<!-- 项目根节点:指定 SDK 为 Microsoft.NET.Sdk.WebASP.NET Core Web 项目专用) -->
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<!-- 项目属性组:配置项目编译、运行相关的全局属性 -->
<PropertyGroup>
<!-- 目标框架:使用最新开发版 TFMTarget Framework Moniker如 .NET 9.0 -->
<TargetFramework>$(LatestDevTFM)</TargetFramework>
<!-- Docker 默认目标操作系统Linux用于容器化部署 -->
<TargetFramework>netcoreapp2.2</TargetFramework>
<TypeScriptToolsVersion>3.0</TypeScriptToolsVersion>
<LangVersion>7.1</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<!-- 构建时禁用 Razor 视图编译(开发环境用,支持视图热更新) -->
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<!-- 发布时禁用 Razor 视图编译(可选,根据部署需求调整) -->
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
<!-- 生成开发环境运行时配置文件(用于调试和依赖解析) -->
<GenerateRuntimeConfigDevFile>true</GenerateRuntimeConfigDevFile>
</PropertyGroup>
<!-- ItemGroup移除指定文件的 Content 类型(避免被当作资源文件处理) -->
<ItemGroup>
<Content Remove="bundleconfig.json" />
</ItemGroup>
<!-- ItemGroup将指定文件标记为 None 类型(仅跟踪文件,不参与编译/资源嵌入) -->
<ItemGroup>
<None Include="bundleconfig.json" /> <!-- 前端资源打包配置文件 -->
<!-- 承运商模块视图文件 -->
<None Include="Views\Carrier\Add.cshtml" /> <!-- 承运商添加/编辑视图 -->
<None Include="Views\Carrier\Index.cshtml" /> <!-- 承运商列表视图 -->
<!-- 客户模块视图文件 -->
<None Include="Views\Customer\Add.cshtml" /> <!-- 客户添加/编辑视图 -->
<None Include="Views\Customer\Index.cshtml" /> <!-- 客户列表视图 -->
<!-- Font Awesome 字体文件 -->
<None Include="bundleconfig.json" />
<None Include="Views\Carrier\Add.cshtml" />
<None Include="Views\Carrier\Index.cshtml" />
<None Include="Views\Customer\Add.cshtml" />
<None Include="Views\Customer\Index.cshtml" />
<None Include="wwwroot\fonts\fontawesome-webfont.svg" />
<None Include="wwwroot\fonts\fontawesome-webfont.woff2" />
<!-- 日期选择器中文语言包(简体/繁体) -->
<None Include="wwwroot\js\locales\bootstrap-datetimepicker.zh-CN.js" />
<None Include="wwwroot\js\locales\bootstrap-datetimepicker.zh-TW.js" />
</ItemGroup>
<!-- ItemGroup引用 NuGet 包(项目依赖的第三方库) -->
<ItemGroup>
<!-- Razor 运行时编译包(支持开发时修改视图无需重启项目) -->
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.8" />
<!-- Azure 容器工具包(用于 Docker 容器化部署到 Azure -->
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
<!-- ASP.NET Core 代码生成工具(用于 Scaffold 控制器、视图等) -->
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.10" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
<PackageReference Include="Pomelo.AspNetCore.TimedJob" Version="2.0.0-rtm-10046" />
</ItemGroup>
<!-- ItemGroup引用解决方案内的其他项目项目间依赖 -->
<ItemGroup>
<ProjectReference Include="..\IServices\IServices.csproj" /> <!-- 服务接口项目 -->
<ProjectReference Include="..\NetCoreApp\YL.NetCoreApp.csproj" /> <!-- 核心应用项目(可能包含全局配置、工具类) -->
<ProjectReference Include="..\NetCore\YL.NetCore.csproj" /> <!-- .NET Core 基础项目(可能包含扩展方法、公共模型) -->
<ProjectReference Include="..\Orm\Orm.csproj" /> <!-- ORM 数据访问项目(如 EF Core 配置) -->
<ProjectReference Include="..\Repository\Repository.csproj" /> <!-- 仓储层项目(数据访问实现) -->
<ProjectReference Include="..\Services\Services.csproj" /> <!-- 服务层项目(业务逻辑实现) -->
<ProjectReference Include="..\IServices\IServices.csproj" />
<ProjectReference Include="..\NetCoreApp\YL.NetCoreApp.csproj" />
<ProjectReference Include="..\NetCore\YL.NetCore.csproj" />
<ProjectReference Include="..\Orm\Orm.csproj" />
<ProjectReference Include="..\Repository\Repository.csproj" />
<ProjectReference Include="..\Services\Services.csproj" />
</ItemGroup>
<!-- ItemGroup更新文件属性配置文件复制规则、打包规则 -->
<ItemGroup>
<!-- 应用配置文件:始终复制到输出目录(确保部署时使用最新配置) -->
<Content Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<!-- NLog 日志配置文件:始终复制到输出目录(日志框架配置) -->
<Content Update="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<!-- 以下为视图文件打包配置:指定打包时是否包含这些 Razor 视图 -->
<!-- 配送单模块视图 -->
<Content Update="Views\Delivery\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack> <!-- 使用全局变量控制是否打包 -->
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 部门模块视图 -->
<Content Update="Views\Dept\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Dept\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 字典模块视图 -->
<Content Update="Views\Dict\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Dict\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 库存移动模块视图 -->
<Content Update="Views\InventoryMove\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\InventoryMove\Detail.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 日志模块视图 -->
<Content Update="Views\Log\Bar.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Log\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 物料模块视图 -->
<Content Update="Views\Material\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Material\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 库区模块视图 -->
<Content Update="Views\Reservoirarea\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Reservoirarea\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 角色模块视图 -->
<Content Update="Views\Role\Query.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
@ -125,7 +95,6 @@
<Content Update="Views\Role\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 共享视图(布局、公共组件) -->
<Content Update="Views\Shared\_CssAdd.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
@ -147,75 +116,66 @@
<Content Update="Views\Shared\_Js.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Shared\_LayoutH.cshtml"> <!-- 后台管理系统布局母版页 -->
<Content Update="Views\Shared\_LayoutH.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 入库单模块视图 -->
<Content Update="Views\StockIn\Detail.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\StockIn\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 出库单模块视图 -->
<Content Update="Views\StockOut\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\StockOut\Detail.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 货架模块视图 -->
<Content Update="Views\StorageRack\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\StorageRack\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 用户模块视图 -->
<Content Update="Views\User\UpdatePwd.cshtml"> <!-- 密码修改视图 -->
<Content Update="Views\User\UpdatePwd.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\User\Info.cshtml"> <!-- 用户信息视图 -->
<Content Update="Views\User\Info.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 仓库模块视图 -->
<Content Update="Views\Warehouse\Add.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Update="Views\Warehouse\Index.cshtml">
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<!-- 静态资源文件:始终复制到输出目录(确保部署后可访问) -->
<Content Update="wwwroot\favicon.ico"> <!-- 网站图标 -->
<Content Update="wwwroot\favicon.ico">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\image\background.jpg"> <!-- 背景图片 -->
<Content Update="wwwroot\image\background.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\image\snow.png"> <!-- 图片资源 -->
<Content Update="wwwroot\image\snow.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\upload\head\35e882f2f048444da77a1a8f3e6692be.jpg"> <!-- 用户头像 -->
<Content Update="wwwroot\upload\head\35e882f2f048444da77a1a8f3e6692be.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\upload\InvMove.html"> <!-- 库存移动相关HTML文件 -->
<Content Update="wwwroot\upload\InvMove.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\upload\StockIn.html"> <!-- 入库单相关HTML文件 -->
<Content Update="wwwroot\upload\StockIn.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\upload\StockOut.html"> <!-- 出库单相关HTML文件 -->
<Content Update="wwwroot\upload\StockOut.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<!-- ItemGroup创建指定文件夹确保编译时文件夹存在避免文件路径错误 -->
<ItemGroup>
<Folder Include="wwwroot\upload\head\" /> <!-- 用户头像上传目录 -->
<Folder Include="wwwroot\upload\head\" />
</ItemGroup>
<!-- 项目扩展配置Visual Studio 相关用户属性(无特殊配置,默认空) -->
<ProjectExtensions>
<VisualStudio>
<UserProperties />

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

Loading…
Cancel
Save