# That.You.Right.N01.CacheAside.View **Repository Path**: tingsliao/That.You.Right.N01.CacheAside.View ## Basic Information - **Project Name**: That.You.Right.N01.CacheAside.View - **Description**: 档案管理初步架构(类别档案管理);C# WebApi Swagger NLog SqlSugar MySql ; 类别信息表(自增长ID,类别编号,名称,上级类别编号,备注,创建时间,修改时间,删除时间,是否删除,是否有效); 其他:连接时需要判断是否存在库,不存在则创建库,自动同步表结构; WebApi 返回的模型和创建模型、修改模型分开,实体和模型分开不同项目; - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-02-17 - **Last Updated**: 2026-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 档案管理系统 (That.You.Right.N01) ## 项目介绍 档案管理系统是一个基于 .NET 9.0 的 Web API 项目,采用分层架构设计,实现了类别、品牌、材料、单位、商品、组织机构、供应商档案管理以及价格管理的核心功能。系统支持自动建库、表结构同步、完整的错误处理和日志记录等特性。 ### 技术栈 - **框架**: .NET 9.0 - **Web 框架**: ASP.NET Core Web API - **ORM**: SqlSugar - **数据库**: MySQL - **日志**: NLog - **API 文档**: Swagger (Swashbuckle.AspNetCore) - **依赖注入**: Microsoft.Extensions.DependencyInjection (IOC) - **JSON 处理**: System.Text.Json, Newtonsoft.Json - **MySQL 驱动**: MySqlConnector, MySql.Data ### 架构设计 项目采用分层架构,包含以下项目: - **That.You.Right.N01.Core**: 核心工具层 - `GlobalVariables`: 静态类,管理所有目录(以DLL所在目录为根目录) - `ILogHelper`: 日志助手接口 - `IJsonHelper`: JSON序列化助手接口 - `IDbQueryHelper`: 数据库查询助手接口 - `LogHelper`: 日志助手实现 - `JsonHelper`: JSON序列化助手实现 - **That.You.Right.N01.Entities**: 实体层(按业务分组) - **Base/**: 基础实体 - `BaseEntity`: 基础实体类(包含公共字段:id、create_time、update_time、delete_time、is_deleted、is_active、remark) - **Documents/**: 基础档案实体 - `CategoryInfo`: 类别信息实体 - `BrandInfo`: 品牌信息实体 - `MaterialInfo`: 材料信息实体 - `UnitInfo`: 单位信息实体 - `ProductInfo`: 商品信息实体 - `OrganizationInfo`: 组织机构信息实体 - `SupplierInfo`: 供应商信息实体 - **Prices/**: 价格信息实体 - `ProductPriceInfo`: 商品档案价格信息实体(按机构) - `ProductUnitPriceInfo`: 商品单位价格信息实体(按单位) - `SupplierProductPriceInfo`: 供应商商品价格信息实体(按供应商) - **That.You.Right.N01.Models**: 模型层(按业务分组) - **Base/**: 基础模型 - `BaseModel`: 基础模型类 - `CreateModel`: 创建模型基类(包含remark字段) - `UpdateModel`: 更新模型基类(包含remark字段) - `DeleteModel`: 删除模型基类 - `QueryModel`: 查询模型基类 - `ResponseModel`: 统一响应模型 - **Documents/**: 基础档案模型 - `CategoryModels`: 类别相关模型(Create、Update、Query、Response) - `BrandModels`: 品牌相关模型(Create、Update、Query、Response) - `MaterialModels`: 材料相关模型(Create、Update、Query、Response) - `UnitModels`: 单位相关模型(Create、Update、Query、Response) - `ProductModels`: 商品相关模型(Create、Update、Query、Response) - `OrganizationModels`: 组织机构相关模型(Create、Update、Query、Response) - `SupplierModels`: 供应商相关模型(Create、Update、Query、Response) - **Prices/**: 价格信息模型 - `ProductPriceModels`: 商品档案价格相关模型(Create、Update、Query、Response) - `ProductUnitPriceModels`: 商品单位价格相关模型(Create、Update、Query、Response) - `SupplierProductPriceModels`: 供应商商品价格相关模型(Create、Update、Query、Response) - **That.You.Right.N01.Repository**: 数据访问层 - `DatabaseConfig`: 数据库配置 - `DbQueryHelper`: 数据库查询助手实现 - **Interfaces/**: 仓储接口 - `ICategoryRepository`: 类别仓储接口 - `IBrandRepository`: 品牌仓储接口 - `IMaterialRepository`: 材料仓储接口 - `IUnitRepository`: 单位仓储接口 - `IProductRepository`: 商品仓储接口 - `IOrganizationRepository`: 组织机构仓储接口 - `ISupplierRepository`: 供应商仓储接口 - `IProductPriceRepository`: 商品档案价格仓储接口 - `IProductUnitPriceRepository`: 商品单位价格仓储接口 - `ISupplierProductPriceRepository`: 供应商商品价格仓储接口 - **Repositories/**: 仓储实现 - `BaseRepository`: 基础仓储实现(统一CRUD操作) - `CategoryRepository`: 类别仓储实现 - `BrandRepository`: 品牌仓储实现 - `MaterialRepository`: 材料仓储实现 - `UnitRepository`: 单位仓储实现 - `ProductRepository`: 商品仓储实现 - `OrganizationRepository`: 组织机构仓储实现 - `SupplierRepository`: 供应商仓储实现 - `ProductPriceRepository`: 商品档案价格仓储实现 - `ProductUnitPriceRepository`: 商品单位价格仓储实现 - `SupplierProductPriceRepository`: 供应商商品价格仓储实现 - **That.You.Right.N01.Services**: 业务逻辑层 - **Interfaces/**: 服务接口 - `ICategoryService`: 类别服务接口 - `IBrandService`: 品牌服务接口 - `IMaterialService`: 材料服务接口 - `IUnitService`: 单位服务接口 - `IProductService`: 商品服务接口 - `IOrganizationService`: 组织机构服务接口 - `ISupplierService`: 供应商服务接口 - `IProductPriceService`: 商品档案价格服务接口 - `IProductUnitPriceService`: 商品单位价格服务接口 - `ISupplierProductPriceService`: 供应商商品价格服务接口 - **Services/**: 服务实现 - `BaseService`: 基础服务实现(统一业务逻辑) - `CategoryService`: 类别服务实现 - `BrandService`: 品牌服务实现 - `MaterialService`: 材料服务实现 - `UnitService`: 单位服务实现 - `ProductService`: 商品服务实现 - `OrganizationService`: 组织机构服务实现 - `SupplierService`: 供应商服务实现 - `ProductPriceService`: 商品档案价格服务实现 - `ProductUnitPriceService`: 商品单位价格服务实现 - `SupplierProductPriceService`: 供应商商品价格服务实现 - **That.You.Right.N01.WebApi**: Web API 层 - **Controllers/**: 控制器 - `Documents/`: 基础档案控制器 - `CategoryController`: 类别管理控制器 - `BrandController`: 品牌管理控制器 - `MaterialController`: 材料管理控制器 - `UnitController`: 单位管理控制器 - `ProductController`: 商品管理控制器 - `OrganizationController`: 组织机构管理控制器 - `SupplierController`: 供应商管理控制器 - `Prices/`: 价格管理控制器 - `ProductPriceController`: 商品档案价格管理控制器 - `ProductUnitPriceController`: 商品单位价格管理控制器 - `SupplierProductPriceController`: 供应商商品价格管理控制器 - **Converters/**: 转换器 - `DateTimeConverter`: 日期时间转换器 - **Extensions/**: 扩展 - `ServiceCollectionExtensions`: IOC注册扩展类 ## 数据库设计 ### 基础档案表 #### category_info 表结构(类别信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 类别ID | 是 | 是 | | category_code | varchar(50) | 类别编号 | 否 | 否 | | category_name | varchar(100) | 类别名称 | 否 | 否 | | parent_category_code | varchar(50) | 上级类别编号 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### brand_info 表结构(品牌信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 品牌ID | 是 | 是 | | brand_code | varchar(50) | 品牌编码 | 否 | 否 | | brand_name | varchar(100) | 品牌名称 | 否 | 否 | | brand_logo | varchar(500) | 品牌Logo | 否 | 否 | | brand_website | varchar(200) | 品牌官网 | 否 | 否 | | brand_description | varchar(500) | 品牌描述 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### material_info 表结构(材料信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 材料ID | 是 | 是 | | material_code | varchar(50) | 材料编码 | 否 | 否 | | material_name | varchar(100) | 材料名称 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### unit_info 表结构(单位信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 单位ID | 是 | 是 | | unit_code | varchar(50) | 单位编码 | 否 | 否 | | unit_name | varchar(100) | 单位名称 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### product_info 表结构(商品信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 商品ID | 是 | 是 | | product_code | varchar(50) | 商品编号 | 否 | 否 | | product_barcode | varchar(50) | 商品条码 | 否 | 否 | | category_code | varchar(50) | 类别编码 | 否 | 否 | | brand_code | varchar(50) | 品牌编码 | 否 | 否 | | product_name | varchar(200) | 商品名称 | 否 | 否 | | unit_code | varchar(50) | 单位编码 | 否 | 否 | | measure_type | int | 计重/计数类型(1=计重,2=计数) | 否 | 否 | | weight | decimal(10,3) | 重量 | 否 | 否 | | quantity | int | 数量 | 否 | 否 | | material_code | varchar(50) | 材料编码 | 否 | 否 | | length | decimal(10,2) | 长度 | 否 | 否 | | width | decimal(10,2) | 宽度 | 否 | 否 | | height | decimal(10,2) | 高度 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### organization_info 表结构(组织机构信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 组织机构ID | 是 | 是 | | organization_code | varchar(50) | 组织机构编码 | 否 | 否 | | organization_name | varchar(100) | 组织机构名称 | 否 | 否 | | parent_organization_code | varchar(50) | 上级组织机构编号 | 否 | 否 | | organization_type | varchar(50) | 组织机构类型 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### supplier_info 表结构(供应商信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 供应商ID | 是 | 是 | | supplier_code | varchar(50) | 供应商编码 | 否 | 否 | | supplier_name | varchar(100) | 供应商名称 | 否 | 否 | | contact_person | varchar(50) | 联系人 | 否 | 否 | | contact_phone | varchar(20) | 联系电话 | 否 | 否 | | contact_email | varchar(100) | 联系邮箱 | 否 | 否 | | address | varchar(500) | 地址 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | ### 价格信息表 #### product_price_info 表结构(商品档案价格信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 价格ID | 是 | 是 | | product_code | varchar(50) | 商品信息编号 | 否 | 否 | | organization_code | varchar(50) | 机构信息编号 | 否 | 否 | | purchase_price | decimal(18,4) | 进货价 | 否 | 否 | | wholesale_price | decimal(18,4) | 批发价 | 否 | 否 | | retail_price | decimal(18,4) | 零售价 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### product_unit_price_info 表结构(商品单位价格信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 价格ID | 是 | 是 | | product_code | varchar(50) | 商品信息编号 | 否 | 否 | | unit_code | varchar(50) | 单位编码 | 否 | 否 | | organization_code | varchar(50) | 机构信息编号 | 否 | 否 | | purchase_price | decimal(18,4) | 进货价 | 否 | 否 | | wholesale_price | decimal(18,4) | 批发价 | 否 | 否 | | retail_price | decimal(18,4) | 零售价 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | #### supplier_product_price_info 表结构(供应商商品价格信息) | 字段名 | 类型 | 说明 | 是否主键 | 是否自增 | |--------|------|------|----------|----------| | id | int | 价格ID | 是 | 是 | | supplier_code | varchar(50) | 供应商编码 | 否 | 否 | | product_code | varchar(50) | 商品信息编号 | 否 | 否 | | purchase_price | decimal(18,4) | 进货价 | 否 | 否 | | min_order_quantity | int | 最小订购数量 | 否 | 否 | | delivery_days | int | 交货天数 | 否 | 否 | | remark | varchar(500) | 备注 | 否 | 否 | | create_time | datetime | 创建时间 | 否 | 否 | | update_time | datetime | 更新时间 | 否 | 否 | | delete_time | datetime | 删除时间 | 否 | 否 | | is_deleted | tinyint(1) | 是否删除 | 否 | 否 | | is_active | tinyint(1) | 是否有效 | 否 | 否 | ## 安装教程 ### 1. 环境要求 - .NET 9.0 SDK - MySQL 5.7+ 或 MySQL 8.0+ - Visual Studio 2022 或 VS Code ### 2. 克隆项目 ```bash git clone [项目地址] cd That.You.Right.N01 ``` ### 3. 配置数据库 修改 `That.You.Right.N01.WebApi/appsettings.json` 文件中的数据库连接信息: ```json { "Database": { "Host": "localhost", "Port": 3306, "UserId": "root", "Password": "your_password", "Database": "ThatYouRightN01", "CharSet": "utf8mb4", "ConnectionTimeout": 30 } } ``` ### 4. 配置服务端口 修改 `That.You.Right.N01.WebApi/appsettings.json` 文件中的 `Urls` 配置: ```json { "Urls": "http://localhost:5251" } ``` ### 5. 还原依赖并运行 ```bash dotnet restore dotnet build dotnet run --project That.You.Right.N01.WebApi ``` 系统会自动创建数据库和表结构。 ## 使用说明 ### 访问 API 文档 启动项目后,访问以下地址查看 Swagger API 文档: ``` http://localhost:5251 ``` ### API 接口 #### 类别管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Category/{id} | 根据ID获取类别信息 | | GET | /api/Category/by-code/{categoryCode} | 根据类别编号获取类别信息 | | GET | /api/Category | 获取所有类别信息 | | GET | /api/Category/active | 获取所有有效类别信息 | | GET | /api/Category/by-parent/{parentCategoryCode} | 根据上级类别编号获取类别信息 | | POST | /api/Category | 创建类别 | | PUT | /api/Category/{id} | 更新类别 | | DELETE | /api/Category/{id} | 删除类别(软删除) | #### 品牌管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Brand/{id} | 根据ID获取品牌信息 | | GET | /api/Brand/by-code/{brandCode} | 根据品牌编码获取品牌信息 | | GET | /api/Brand | 获取所有品牌信息 | | GET | /api/Brand/active | 获取所有有效品牌信息 | | GET | /api/Brand/by-name/{brandName} | 根据品牌名称获取品牌信息 | | POST | /api/Brand | 创建品牌 | | PUT | /api/Brand/{id} | 更新品牌 | | DELETE | /api/Brand/{id} | 删除品牌(软删除) | #### 材料管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Material/{id} | 根据ID获取材料信息 | | GET | /api/Material/by-code/{materialCode} | 根据材料编码获取材料信息 | | GET | /api/Material | 获取所有材料信息 | | GET | /api/Material/active | 获取所有有效材料信息 | | GET | /api/Material/by-name/{materialName} | 根据材料名称获取材料信息 | | POST | /api/Material | 创建材料 | | PUT | /api/Material/{id} | 更新材料 | | DELETE | /api/Material/{id} | 删除材料(软删除) | #### 单位管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Unit/{id} | 根据ID获取单位信息 | | GET | /api/Unit/by-code/{unitCode} | 根据单位编码获取单位信息 | | GET | /api/Unit | 获取所有单位信息 | | GET | /api/Unit/active | 获取所有有效单位信息 | | GET | /api/Unit/by-name/{unitName} | 根据单位名称获取单位信息 | | POST | /api/Unit | 创建单位 | | PUT | /api/Unit/{id} | 更新单位 | | DELETE | /api/Unit/{id} | 删除单位(软删除) | #### 商品管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Product/{id} | 根据ID获取商品信息 | | GET | /api/Product/by-code/{productCode} | 根据商品编号获取商品信息 | | GET | /api/Product/by-barcode/{productBarcode} | 根据商品条码获取商品信息 | | GET | /api/Product | 获取所有商品信息 | | GET | /api/Product/active | 获取所有有效商品信息 | | GET | /api/Product/by-category/{categoryCode} | 根据类别编码获取商品信息 | | GET | /api/Product/by-brand/{brandCode} | 根据品牌编码获取商品信息 | | GET | /api/Product/by-unit/{unitCode} | 根据单位编码获取商品信息 | | POST | /api/Product | 创建商品 | | PUT | /api/Product/{id} | 更新商品 | | DELETE | /api/Product/{id} | 删除商品(软删除) | #### 组织机构管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Organization/{id} | 根据ID获取组织机构信息 | | GET | /api/Organization/by-code/{organizationCode} | 根据组织机构编码获取组织机构信息 | | GET | /api/Organization | 获取所有组织机构信息 | | GET | /api/Organization/active | 获取所有有效组织机构信息 | | GET | /api/Organization/by-name/{organizationName} | 根据组织机构名称获取组织机构信息 | | GET | /api/Organization/by-parent/{parentOrganizationCode} | 根据上级组织机构编号获取组织机构信息 | | POST | /api/Organization | 创建组织机构 | | PUT | /api/Organization/{id} | 更新组织机构 | | DELETE | /api/Organization/{id} | 删除组织机构(软删除) | #### 供应商管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/Supplier/{id} | 根据ID获取供应商信息 | | GET | /api/Supplier/by-code/{supplierCode} | 根据供应商编码获取供应商信息 | | GET | /api/Supplier | 获取所有供应商信息 | | GET | /api/Supplier/active | 获取所有有效供应商信息 | | GET | /api/Supplier/by-name/{supplierName} | 根据供应商名称获取供应商信息 | | POST | /api/Supplier | 创建供应商 | | PUT | /api/Supplier/{id} | 更新供应商 | | DELETE | /api/Supplier/{id} | 删除供应商(软删除) | #### 商品档案价格管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/ProductPrice/{id} | 根据ID获取商品档案价格信息 | | GET | /api/ProductPrice | 获取所有商品档案价格信息 | | GET | /api/ProductPrice/active | 获取所有有效商品档案价格信息 | | GET | /api/ProductPrice/by-product/{productCode} | 根据商品编号获取商品档案价格信息 | | GET | /api/ProductPrice/by-organization/{organizationCode} | 根据机构编号获取商品档案价格信息 | | POST | /api/ProductPrice | 创建商品档案价格 | | PUT | /api/ProductPrice/{id} | 更新商品档案价格 | | DELETE | /api/ProductPrice/{id} | 删除商品档案价格(软删除) | #### 商品单位价格管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/ProductUnitPrice/{id} | 根据ID获取商品单位价格信息 | | GET | /api/ProductUnitPrice | 获取所有商品单位价格信息 | | GET | /api/ProductUnitPrice/active | 获取所有有效商品单位价格信息 | | GET | /api/ProductUnitPrice/by-product/{productCode} | 根据商品编号获取商品单位价格信息 | | GET | /api/ProductUnitPrice/by-unit/{unitCode} | 根据单位编码获取商品单位价格信息 | | POST | /api/ProductUnitPrice | 创建商品单位价格 | | PUT | /api/ProductUnitPrice/{id} | 更新商品单位价格 | | DELETE | /api/ProductUnitPrice/{id} | 删除商品单位价格(软删除) | #### 供应商商品价格管理 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/SupplierProductPrice/{id} | 根据ID获取供应商商品价格信息 | | GET | /api/SupplierProductPrice | 获取所有供应商商品价格信息 | | GET | /api/SupplierProductPrice/active | 获取所有有效供应商商品价格信息 | | GET | /api/SupplierProductPrice/by-supplier/{supplierCode} | 根据供应商编码获取供应商商品价格信息 | | GET | /api/SupplierProductPrice/by-product/{productCode} | 根据商品编号获取供应商商品价格信息 | | POST | /api/SupplierProductPrice | 创建供应商商品价格 | | PUT | /api/SupplierProductPrice/{id} | 更新供应商商品价格 | | DELETE | /api/SupplierProductPrice/{id} | 删除供应商商品价格(软删除) | ### 请求示例 #### 1. 创建类别 ``` POST /api/Category Content-Type: application/json { "categoryCode": "CAT001", "categoryName": "类别名称", "parentCategoryCode": null, "remark": "备注信息" } ``` #### 2. 创建品牌 ``` POST /api/Brand Content-Type: application/json { "brandCode": "BRAND001", "brandName": "品牌名称", "brandLogo": "logo_url", "brandWebsite": "https://example.com", "brandDescription": "品牌描述", "remark": "备注信息" } ``` #### 3. 创建材料 ``` POST /api/Material Content-Type: application/json { "materialCode": "MAT001", "materialName": "材料名称", "remark": "备注信息" } ``` #### 4. 创建单位 ``` POST /api/Unit Content-Type: application/json { "unitCode": "UNIT001", "unitName": "单位名称", "remark": "备注信息" } ``` #### 5. 创建商品 ``` POST /api/Product Content-Type: application/json { "productCode": "PROD001", "productBarcode": "1234567890123", "categoryCode": "CAT001", "brandCode": "BRAND001", "productName": "商品名称", "unitCode": "UNIT001", "measureType": 1, "weight": 1.5, "quantity": null, "materialCode": "MAT001", "length": 10.5, "width": 5.2, "height": 2.8, "remark": "备注信息" } ``` #### 6. 创建组织机构 ``` POST /api/Organization Content-Type: application/json { "organizationCode": "ORG001", "organizationName": "组织机构名称", "parentOrganizationCode": null, "organizationType": "总部", "remark": "备注信息" } ``` #### 7. 创建供应商 ``` POST /api/Supplier Content-Type: application/json { "supplierCode": "SUP001", "supplierName": "供应商名称", "contactPerson": "联系人", "contactPhone": "13800138000", "contactEmail": "contact@example.com", "address": "供应商地址", "remark": "备注信息" } ``` #### 8. 创建商品档案价格 ``` POST /api/ProductPrice Content-Type: application/json { "productCode": "PROD001", "organizationCode": "ORG001", "purchasePrice": 100.00, "wholesalePrice": 120.00, "retailPrice": 150.00, "remark": "备注信息" } ``` #### 9. 创建商品单位价格 ``` POST /api/ProductUnitPrice Content-Type: application/json { "productCode": "PROD001", "unitCode": "UNIT001", "organizationCode": "ORG001", "purchasePrice": 95.00, "wholesalePrice": 115.00, "retailPrice": 145.00, "remark": "备注信息" } ``` #### 10. 创建供应商商品价格 ``` POST /api/SupplierProductPrice Content-Type: application/json { "supplierCode": "SUP001", "productCode": "PROD001", "purchasePrice": 90.00, "minOrderQuantity": 10, "deliveryDays": 3, "remark": "备注信息" } ``` ### 响应格式 所有接口返回统一的响应格式: ```json { "success": true, "message": "操作成功", "data": { ... }, "errorCode": null } ``` ### 日志文件 日志文件存储在以下目录: ``` [DLL所在目录]/Logs/ ``` 日志文件按日期分割: - `info-{日期}.log`: 信息日志 - `error-{日期}.log`: 错误日志 ### 静态文件 静态文件存储在以下目录: ``` [DLL所在目录]/wwwroot/ ``` ## 功能特性 ### ? 已实现功能 1. **自动建库建表** - 系统启动时自动检查并创建数据库 - 使用 SqlSugar 自动同步表结构 2. **完整的错误处理** - 所有方法都包含 try-catch 错误处理 - 所有错误都记录到日志文件 3. **依赖注入 (IOC)** - 使用 Microsoft.Extensions.DependencyInjection - 所有服务都通过 IOC 容器管理 - 使用 ServiceCollectionExtensions 统一管理IOC注册 4. **日志记录** - 使用 NLog 进行日志记录 - 支持多种日志级别(Info, Warn, Error, Debug, Fatal) - 日志文件按日期分割 5. **Swagger API 文档** - 自动生成 API 文档 - 支持在线测试接口 - 包含完整的 XML 注释 - 支持按业务分组(Documents、Prices) 6. **软删除功能** - 支持软删除操作 - 删除前检查是否包含子类别(类别) 7. **层级结构支持** - 支持父子类别关系 - 支持父子组织机构关系 - 可以根据上级编号查询子项 8. **统一响应格式** - 所有接口返回统一的响应模型 - 包含成功/失败状态、消息、数据和错误代码 9. **静态文件访问** - 支持 wwwroot 静态文件访问 10. **目录管理** - 使用 GlobalVariables 静态类管理所有目录 - 以 DLL 所在目录为根目录 11. **数据关联验证** - 创建和更新商品时验证关联数据是否存在 - 包括类别、品牌、单位、材料的关联验证 12. **数据唯一性验证** - 所有基础档案都支持编码唯一性验证 - 品牌、材料、单位还支持名称唯一性验证 - 商品支持编号和条码唯一性验证 - 组织机构、供应商支持编码和名称唯一性验证 13. **业务分组架构** - 实体、模型按业务领域分组(Documents、Prices、Base) - 命名空间清晰,便于维护和扩展 - 支持组织机构、供应商、价格管理等扩展功能 14. **价格管理** - 支持商品档案价格管理(按机构) - 支持商品单位价格管理(按单位) - 支持供应商商品价格管理(按供应商) 15. **代码重构优化** - BaseEntity 基类统一实体公共字段(减少实体类代码约37%) - BaseRepository 基类统一CRUD操作(减少仓储类代码约65%) - BaseService 基类统一业务逻辑(减少服务类代码约45%) - BaseModel/CreateModel/UpdateModel/DeleteModel/QueryModel 统一模型(减少模型类代码约24%) - 总计减少代码行数约45.5% 16. **WebAPI接口重构** - 所有Documents控制器继承BaseController,统一通用接口 - 所有Service类继承BaseService,统一业务逻辑 - 新增分页查询接口: GET api/{Controller}/paged?pageNumber=1&pageSize=10&activeOnly=false - 新增批量创建接口: POST api/{Controller}/batch - 新增批量更新接口: PUT api/{Controller}/batch - 新增批量删除接口: DELETE api/{Controller}/batch - 保留所有业务特定查询接口,确保向后兼容 - 统一的响应格式和错误处理 - Swagger文档自动分组显示(document和prices) - 支持PagedRequestModel和PagedResponseModel分页模型 ## 项目结构 ``` That.You.Right.N01/ ├── That.You.Right.N01.Core/ # 核心工具层 │ ├── Helpers/ │ │ ├── ILogHelper.cs # 日志助手接口 │ │ ├── IJsonHelper.cs # JSON助手接口 │ │ ├── IDbQueryHelper.cs # 数据库查询助手接口 │ │ ├── LogHelper.cs # 日志助手实现 │ │ └── JsonHelper.cs # JSON助手实现 │ └── GlobalVariables.cs # 全局变量管理 ├── That.You.Right.N01.Entities/ # 实体层 │ ├── Base/ # 基础实体 │ │ └── BaseEntity.cs # 基础实体类 │ ├── Documents/ # 基础档案实体 │ │ ├── BrandInfo.cs # 品牌信息实体 │ │ ├── CategoryInfo.cs # 类别信息实体 │ │ ├── MaterialInfo.cs # 材料信息实体 │ │ ├── OrganizationInfo.cs # 组织机构信息实体 │ │ ├── ProductInfo.cs # 商品信息实体 │ │ ├── SupplierInfo.cs # 供应商信息实体 │ │ └── UnitInfo.cs # 单位信息实体 │ └── Prices/ # 价格信息实体 │ ├── ProductPriceInfo.cs # 商品档案价格信息实体 │ ├── ProductUnitPriceInfo.cs # 商品单位价格信息实体 │ └── SupplierProductPriceInfo.cs # 供应商商品价格信息实体 ├── That.You.Right.N01.Models/ # 模型层 │ ├── Base/ # 基础模型 │ │ ├── BaseModel.cs # 基础模型类 │ │ ├── CreateModel.cs # 创建模型基类 │ │ ├── UpdateModel.cs # 更新模型基类 │ │ ├── DeleteModel.cs # 删除模型基类 │ │ ├── QueryModel.cs # 查询模型基类 │ │ └── ResponseModel.cs # 统一响应模型 │ ├── Documents/ # 基础档案模型 │ │ ├── BrandModels.cs # 品牌相关模型 │ │ ├── CategoryModels.cs # 类别相关模型 │ │ ├── MaterialModels.cs # 材料相关模型 │ │ ├── OrganizationModels.cs # 组织机构相关模型 │ │ ├── ProductModels.cs # 商品相关模型 │ │ ├── SupplierModels.cs # 供应商相关模型 │ │ └── UnitModels.cs # 单位相关模型 │ └── Prices/ # 价格信息模型 │ ├── ProductPriceModels.cs # 商品档案价格相关模型 │ ├── ProductUnitPriceModels.cs # 商品单位价格相关模型 │ └── SupplierProductPriceModels.cs # 供应商商品价格相关模型 ├── That.You.Right.N01.Repository/ # 数据访问层 │ ├── DatabaseConfig.cs # 数据库配置 │ ├── Helpers/ │ │ └── DbQueryHelper.cs # 数据库查询助手实现 │ ├── Interfaces/ │ │ ├── IBrandRepository.cs # 品牌仓储接口 │ │ ├── ICategoryRepository.cs # 类别仓储接口 │ │ ├── IMaterialRepository.cs # 材料仓储接口 │ │ ├── IOrganizationRepository.cs # 组织机构仓储接口 │ │ ├── IProductPriceRepository.cs # 商品档案价格仓储接口 │ │ ├── IProductRepository.cs # 商品仓储接口 │ │ ├── IProductUnitPriceRepository.cs # 商品单位价格仓储接口 │ │ ├── ISupplierProductPriceRepository.cs # 供应商商品价格仓储接口 │ │ ├── ISupplierRepository.cs # 供应商仓储接口 │ │ └── IUnitRepository.cs # 单位仓储接口 │ └── Repositories/ │ ├── BaseRepository.cs # 基础仓储实现 │ ├── BrandRepository.cs # 品牌仓储实现 │ ├── CategoryRepository.cs # 类别仓储实现 │ ├── MaterialRepository.cs # 材料仓储实现 │ ├── OrganizationRepository.cs # 组织机构仓储实现 │ ├── ProductPriceRepository.cs # 商品档案价格仓储实现 │ ├── ProductRepository.cs # 商品仓储实现 │ ├── ProductUnitPriceRepository.cs # 商品单位价格仓储实现 │ ├── SupplierProductPriceRepository.cs # 供应商商品价格仓储实现 │ ├── SupplierRepository.cs # 供应商仓储实现 │ └── UnitRepository.cs # 单位仓储实现 ├── That.You.Right.N01.Services/ # 业务逻辑层 │ ├── Interfaces/ │ │ ├── IBrandService.cs # 品牌服务接口 │ │ ├── ICategoryService.cs # 类别服务接口 │ │ ├── IMaterialService.cs # 材料服务接口 │ │ ├── IOrganizationService.cs # 组织机构服务接口 │ │ ├── IProductPriceService.cs # 商品档案价格服务接口 │ │ ├── IProductService.cs # 商品服务接口 │ │ ├── IProductUnitPriceService.cs # 商品单位价格服务接口 │ │ ├── ISupplierProductPriceService.cs # 供应商商品价格服务接口 │ │ ├── ISupplierService.cs # 供应商服务接口 │ │ └── IUnitService.cs # 单位服务接口 │ └── Services/ │ ├── BaseService.cs # 基础服务实现 │ ├── BrandService.cs # 品牌服务实现 │ ├── CategoryService.cs # 类别服务实现 │ ├── MaterialService.cs # 材料服务实现 │ ├── OrganizationService.cs # 组织机构服务实现 │ ├── ProductPriceService.cs # 商品档案价格服务实现 │ ├── ProductService.cs # 商品服务实现 │ ├── ProductUnitPriceService.cs # 商品单位价格服务实现 │ ├── SupplierProductPriceService.cs # 供应商商品价格服务实现 │ ├── SupplierService.cs # 供应商服务实现 │ └── UnitService.cs # 单位服务实现 ├── That.You.Right.N01.WebApi/ # Web API 层 │ ├── Controllers/ │ │ ├── Documents/ # 基础档案控制器 │ │ │ ├── BrandController.cs # 品牌管理控制器 │ │ │ ├── CategoryController.cs # 类别管理控制器 │ │ │ ├── MaterialController.cs # 材料管理控制器 │ │ │ ├── OrganizationController.cs # 组织机构管理控制器 │ │ │ ├── ProductController.cs # 商品管理控制器 │ │ │ ├── SupplierController.cs # 供应商管理控制器 │ │ │ └── UnitController.cs # 单位管理控制器 │ │ └── Prices/ # 价格管理控制器 │ │ ├── ProductPriceController.cs # 商品档案价格管理控制器 │ │ ├── ProductUnitPriceController.cs # 商品单位价格管理控制器 │ │ └── SupplierProductPriceController.cs # 供应商商品价格管理控制器 │ ├── Converters/ │ │ └── DateTimeConverter.cs # 日期时间转换器 │ ├── Extensions/ │ │ └── ServiceCollectionExtensions.cs # IOC注册扩展类 │ ├── appsettings.json # 应用配置 │ ├── nlog.config # NLog 配置 │ └── Program.cs # 程序入口 ├── docs/ # 文档目录 │ └── REFACTORING_SUMMARY.md # 代码重构优化总结 ├── scripts/ # 脚本目录 │ ├── reorganize-entities.ps1 # 实体文件移动脚本 │ └── update_namespaces.py # 命名空间更新脚本 └── README.md # 项目说明文档 ``` ## 开发说明 ### 代码规范 1. 所有公共方法和类都包含 XML 注释 2. 所有方法都进行错误处理 3. 所有错误都记录到日志 4. 使用 PascalCase 命名规范 5. 遵循 SOLID 原则 6. 实体和模型按业务领域分组管理 7. 使用基类抽象减少重复代码 ### 构建项目 ```bash dotnet build ``` ### 运行项目 ```bash dotnet run --project That.You.Right.N01.WebApi ``` ### 发布项目 ```bash dotnet publish -c Release -o ./publish ``` ## 常见问题 ### 1. 数据库连接失败 检查 `appsettings.json` 中的数据库连接配置是否正确。 ### 2. 端口被占用 修改 `appsettings.json` 中的 `Urls` 配置,更换其他端口。 ### 3. 依赖包还原失败 检查网络连接,或使用 NuGet 镜像源。 ### 4. 命名空间引用错误 确保已运行 `update_namespaces.py` 脚本更新所有命名空间和using引用。 ## 参与贡献 欢迎提交 Issue 和 Pull Request! ## 许可证 MIT License