本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息、供应商管理和客户管理3个菜单页面。供应商和客户字段相同,因此可共用一个页面组件类。

1. 配置模块

运行项目,在【系统管理-模块管理】中添加商品信息、供应商管理、客户管理3个模块菜单,模块基本信息、模型、页面、表单设置之前有视频教程,这里不再细说了。

2. 实体类

JxcLite项目Entities文件夹下面添加JxGoods.csJxPartner.cs两个实体类文件,实体类代码可以直接复制模块管理中由模型设置生成的代码。文章中只简单描述一下实体类的定义,具体代码参见开源,代码定义如下:

namespace JxcLite.Entities;

/// <summary>
/// 商品信息类。
/// </summary>
public class JxGoods : EntityBase { } /// <summary>
/// 商业伙伴信息类。
/// </summary>
public class JxPartner : EntityBase { }

3. 建表脚本

最理想的情况是:在系统安装时,通过实体类和数据库类型自动生成建表脚本创建实体数据库表。这里还是用传统手动方式执行建表脚本,在JxcLite.Web项目Resources文件夹下添加Tables.sql资源文件,复制粘贴由【模块管理-模型设置】中生成的建表脚本。文章中只简单描述一下建表脚本,具体脚本参见开源,内容如下:

CREATE TABLE [JxGoods] (
[Id] varchar(50) NOT NULL PRIMARY KEY,
...
[Files] nvarchar(500) NULL
); CREATE TABLE [JxPartner] (
[Id] varchar(50) NOT NULL PRIMARY KEY,
...
[Note] ntext NULL,
[Files] nvarchar(500) NULL
);

4. 服务接口

JxcLite项目Services文件夹下面添加基础数据模块服务接口类,文件名定义为IBaseDataService.cs,该接口定义前后端交互的Api访问方法,包括分页查询、批量删除实体、保存实体。具体方法定义如下:

namespace JxcLite.Services;

public interface IBaseDataService : IService
{
//分页查询商品信息
Task<PagingResult<JxGoods>> QueryGoodsesAsync(PagingCriteria criteria);
//批量删除商品信息
Task<Result> DeleteGoodsesAsync(List<JxGoods> models);
//保存商品信息
Task<Result> SaveGoodsAsync(UploadInfo<JxGoods> info); //分页查询供应商和客户信息
Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria);
//批量删除供应商和客户信息
Task<Result> DeletePartnersAsync(List<JxPartner> models);
//保存供应商和客户信息
Task<Result> SavePartnerAsync(UploadInfo<JxPartner> info);
}

5. 服务实现

JxcLite.Web项目Services文件夹下面添加基础数据模块服务接口的实现类,文件名定义为BaseDataService.cs,文章中只简单描述一下实现类的定义和继承,具体实现参见开源,定义如下:

namespace JxcLite.Web.Services;

class BaseDataService(Context context) : ServiceBase(context), IBaseDataService
{
public Task<PagingResult<JxGoods>> QueryGoodsesAsync(PagingCriteria criteria) { }
public Task<Result> DeleteGoodsesAsync(List<JxGoods> models) { }
public Task<Result> SaveGoodsAsync(UploadInfo<JxGoods> info) { } public Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria) { }
public Task<Result> DeletePartnersAsync(List<JxPartner> models) { }
public Task<Result> SavePartnerAsync(UploadInfo<JxPartner> info) { }
}

双击打开JxcLite.Web项目中的AppWeb.cs文件,在AddJxcLiteCore方法中注册服务类,前端组件可以通过依赖注入工厂创建服务的实例。代码如下:

public static class AppWeb
{
public static void AddJxcLiteCore(this IServiceCollection services)
{
services.AddScoped<IBaseDataService, BaseDataService>();
}
}

6. 数据依赖

JxcLite.Web项目Repositories文件夹下面添加基础数据模块数据依赖类,文件名定义为BaseDataRepository.cs,文章中只简单描述一下依赖类的定义,具体实现参见开源,定义如下:

namespace JxcLite.Web.Repositories;

class BaseDataRepository
{
internal static Task<PagingResult<JxGoods>> QueryGoodsesAsync(Database db, PagingCriteria criteria) { } internal static async Task<bool> ExistsGoodsCodeAsync(Database db, JxGoods model) { } internal static Task<PagingResult<JxPartner>> QueryPartnersAsync(Database db, PagingCriteria criteria) { } internal static async Task<bool> ExistsPartnerNameAsync(Database db, JxPartner model) { }
}

7. 数据导入类

JxcLite.Web项目Imports文件夹下面添加商品信息、供应商和客户的导入类,文件名定义为JxGoodsImport.csJxPartnerImport.cs导入类名称命名规范是:实体类名+Import,导入框架自动根据名称识别,文章中只简单描述一下导入类的定义,具体实现参见开源,定义如下:

namespace JxcLite.Web.Imports;

class JxGoodsImport(ImportContext context) : ImportBase<JxGoods>(context)
{
//初始化导入字段,自动生成导入规范Excel文件
public override void InitColumns() { }
//执行导入文件
public override async Task<Result> ExecuteAsync(SysFile file) { }
} class JxPartnerImport(ImportContext context) : ImportBase<JxPartner>(context)
{
public override void InitColumns() { }
public override async Task<Result> ExecuteAsync(SysFile file) { }
}

8. 前端页面

JxcLite.Client项目Pages\BaseData文件夹下面添加商品信息和商业伙伴页面类,文件名定义为GoodsList.csPartnerList.cs,这3个模块的功能和页面非常简单,只有单表的增删改查导功能,表单页面直接通过在线表单进行配置。列表页面继承BaseTablePage类,由于该框架类封装了列表页面常用的增删改查导功能,因此具体的功能列表页面代码显得格外简单,只需要定义各操作的服务调用方法即可,具体的完整代码如下:

  • 商品信息页面
namespace JxcLite.Client.Pages.BaseData;

[StreamRendering]
[Route("/bds/goods")]
public class GoodsList : BaseTablePage<JxGoods>
{
private IBaseDataService Service; protected override async Task OnPageInitAsync()
{
await base.OnPageInitAsync();
Service = await CreateServiceAsync<IBaseDataService>();
Table.OnQuery = Service.QueryGoodsesAsync;
} public void New() => Table.NewForm(Service.SaveGoodsAsync, new JxGoods());
public void DeleteM() => Table.DeleteM(Service.DeleteGoodsesAsync);
public void Edit(JxGoods row) => Table.EditForm(Service.SaveGoodsAsync, row);
public void Delete(JxGoods row) => Table.Delete(Service.DeleteGoodsesAsync, row);
public void Import() => ShowImportForm();
public async void Export() => await ExportDataAsync();
}
  • 供应商和客户页面
[StreamRendering]
[Route("/bds/suppliers")]
public class SupplierList : PartnerList
{
protected override string Type => PartnerType.Supplier;
} [StreamRendering]
[Route("/bds/customers")]
public class CustomerList : PartnerList
{
protected override string Type => PartnerType.Customer;
} public class PartnerList : BaseTablePage<JxPartner>
{
private IBaseDataService Service; //商业伙伴类型虚拟属性,供应商和客户页面覆写。
protected virtual string Type { get; } protected override async Task OnPageInitAsync()
{
await base.OnPageInitAsync();
Service = await CreateServiceAsync<IBaseDataService>();
Table.OnQuery = QueryPartnersAsync;
} public void New() => Table.NewForm(Service.SavePartnerAsync, new JxPartner { Type = Type });
public void DeleteM() => Table.DeleteM(Service.DeletePartnersAsync);
public void Edit(JxPartner row) => Table.EditForm(Service.SavePartnerAsync, row);
public void Delete(JxPartner row) => Table.Delete(Service.DeletePartnersAsync, row);
public void Import() => ShowImportForm();
public async void Export() => await ExportDataAsync(); private Task<PagingResult<JxPartner>> QueryPartnersAsync(PagingCriteria criteria)
{
criteria.SetQuery(nameof(JxPartner.Type), QueryType.Equal, Type);
return Service.QueryPartnersAsync(criteria);
}
}

Known框架实战演练——进销存基础数据的更多相关文章

  1. 文献综述十八:基于SSH框架的进销存管理系统设计与实现

    一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度 ...

  2. Odoo进销存(采购、销售、仓库)入门教程 - 上

    转载地址:http://blog.csdn.net/wangnan537/article/details/46434373 运行环境: Ubuntu14.04+Odoo8.0 作者:苏州-微尘 0. ...

  3. spring boot的一个小项目小型进销存系统

    项目所需的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  4. C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)

    互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...

  5. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  6. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  7. Net通用进销存管理系统 + 开发文档+ 使用说明

    通用进销存管理系统 + 开发文档+ 使用说明Net源码下载 包括下面的模块基础资料模块采购管理模块库存管理模块商务管理模块营业管理模块维修管理模块会员管理模块财务管理模块 Net通用进销存管理系统 + ...

  8. 什么是智能扫描开单打印进销存POS?安卓工业手持PDA设备上的POS销售开单,现场打印打票,用扫描枪太方便了

    安卓PDA版POS销售开单如果和扫描枪配合使用,和超市的POS销售一样的操作 什么是智能扫描开单打印进销存POS? 互联网特性,让它在数据统计分析.客户关系管理等方面表现出众.智能POS,不仅是一个收 ...

  9. 浩瀚技术助力批发零售商户实现PDA移动POS打印扫描进销存信息化管理

    批发零售商户其各门店销售品种多,销售量大,在市场上占据巨大的份额,随着各门店的不断扩展,基层的销售管理并不尽如意,传统的进销存管理软件安装在PC端,无法满足有现有的业务支撑,面对当前现状,移动进销存管 ...

  10. 改变传统的开单模式------手持POS终端移动销售开单 移动进销存的利器

    手持POS终端高清彩屏,清晰.美观.大方,适用于仓库.超市.服装.食品.批发零售.手机电脑等企业管理.可与管理软件灵活对接.1:员工记不住价格,产品名称,只要有PDA扫描,价格,库存,直接开销售单,打 ...

随机推荐

  1. 使用SQL语句完成数据表的去重工作

    引入问题 可能大家都遇到过这样一种情况,一张表存在若干行数据,只是主键值相同,但是其它字段都是相同的,这就是我们通常所说的数据库重复数据,那我们是如何将这些数据删除呢?现在我们就介绍一种方法来实现数据 ...

  2. Android Media Framework - 开篇

    前言 Android Media是一块非常庞大的内容,上到APP的书写,中到播放器的实现.封装格式的了解,下到编解码组件的封装.VPU API的了解,每块内容的学习都需要我们下很大的功夫.此外,我们还 ...

  3. 构建X264 .a 静态库 For iOS

    一.构建X264准备 1.下载X264源代码到本地,并解压.修改文件夹名称为x264 ftp://ftp.videolan.org/pub/x264/snapshots/ 2.下载gas-prepro ...

  4. react 过渡动画组件

    在项目中可能会有一些动画效果展示或是页面切换效果,css动画的方式,比较局限,涉及到一些js动画的时候没法处理了.react-transition-group是react的第三方模块,借住这个模块可以 ...

  5. golang + postgresql + Kubernetes 后端学习

    记录 链接 dbdiagram 基于 Golang + PostgreSQL + Kubernetes 后端开发大师班[中英字幕]

  6. Linux虚拟网卡TUN和TAP

    简介 在 Linux 网络管理中,虚拟网卡(Virtual Network Interface)是一个重要的概念,广泛应用于虚拟化.网络仿真和隧道技术中.本文将重点介绍 TUN(Network TUN ...

  7. Mysql int类型字段插入表达式,值为0或1

    CREATE TABLE `t_user` ( `uId` INT(11) DEFAULT NULL, `uName` VARCHAR(20) DEFAULT NULL, `uPwd` VARCHAR ...

  8. java rabbitmq模拟生产者,消费者demo

    1.exchange类型,rabbitmq交换机类型 exchange类型fanout 扇形交换机,它会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列中.direct 直连交换机,它会把消息 ...

  9. Service Mesh技术详解

    深入探讨Service Mesh的基本概念和核心技术,涵盖了服务发现.负载均衡.断路器与熔断机制,以及数据平面与控制平面的详细工作原理和实现方法. 关注作者,复旦博士,分享云服务领域全维度开发技术.拥 ...

  10. 用cvCvtColor转化RGB彩色图像为灰度图像时发生的小失误

    版本信息 MAC版本:10.10.5 Xcode版本:7.2 openCV版本:2.4.13 在运行程序的时候发现cvCvtColor的地方程序报错 error: (-215) src.depth() ...