开发环境和开发工具

操作系统:win8.1
开发环境:Mysql、Web
开发工具:Workbench、Eclipse、JDBC

功能需求分析

  • 员工有权查看、添加会员,查看、添加供应商,查询药品(输入药品编号或名称、类别等查询该药品或该类药品库存),添加药品采购记录,销售药品,处理退货,盘点仓库,查看销售、退货、入库记录,修改个人信息
  • 经理有权查看、添加、删除会员,查看、添加、删除供应商,查看、添加、删除员工,盘点仓库,查看销售、退货、入库记录,修改个人信息,无权进行销售和退货业务
  • 供应商和顾客对此系统没有使用权限 系统设计

系统设计

  • 数据流
  • E-R图
  • 数据库关系模式设计

    登录用户(用户编号,用户名,密码,类别)
    员工(员工编号,员工姓名,联系电话,用户编号)
    经理(经理编号,用户编号)
    财政收支(收支编号,药品编号,员工编号,数量,日期,总额,类型)
    供应商(供应商编号,供应商名称,联系人,联系方式,所在城市)
    会员(客户编号,客户姓名,联系方式)
    入库记录(入库记录编号,供应商编号,收支编号)
    退货管理(退货编号,销售编号,收支编号)
    销售管理(销售编号,客户编号,收支编号)
    药品(药品编号,药品名称,供应商编号,生产批号,产地,所属类别,进价,单价,会员折扣,库存,包装规格,生产日期,有效期)

  • 数据库物理结构设计

    本次项目使用的引擎是InnoDB,MySQL的数据库引擎之一。InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。

    此外还使用了数据库索引,索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。各表索引如下:
    会员:primary key(客户编号)
    药品:primary key(药品编号),
    INDEX 供应商编号_idx (供应商编号 ASC),
    供应商:primary key(供应商编号)
    登录用户:primary key(用户编号)
    用户名 unique,
    经理:primary key(经理编号),
    INDEX 经理编号_idx (用户编号 ASC),
    员工:primary key(员工编号),
    INDEX 员工编号_idx (用户编号 ASC),
    财政收支:PRIMARY KEY (收支编号),
    INDEX 药品编号_idx (药品编号 ASC),
    INDEX 员工编号_idx (员工编号 ASC),
    入库记录:primary key(入库记录编号),
    INDEX 供应商编号_idx (供应商编号 ASC),
    INDEX 收支编号_idx (收支编号 ASC),
    销售管理:PRIMARY KEY (销售编号),
    INDEX 客户编号_idx (客户编号 ASC),
    INDEX 收支编号_idx (收支编号 ASC),
    退货管理:PRIMARY KEY (退货编号),
    INDEX 销售编号_idx (销售编号 ASC),
    INDEX 收支编号_idx (收支编号 ASC),

系统功能的实现

  • 建表

    drop database if exists 医药销售管理系统;
    create database 医药销售管理系统;
    use 医药销售管理系统;
    //建立表 会员
    create table `会员`(客户编号      int auto_increment,客户姓名      varchar(50),联系方式      varchar(100),
    primary key(客户编号));
    //建立表 供应商
    create table `供应商`(供应商编号     int auto_increment,供应商名称     varchar(50),联系人         varchar(50),联系方式       varchar(50),所在城市       varchar(50),
    primary key(供应商编号));
    //建立表 药品
    create table `药品`(药品编号    int auto_increment,药品名称    varchar(50) not null,供应商编号  int not null,生产批号    varchar(100),产地        varchar(50),所属类别    varchar(50),进价        decimal(10,2) not null,单价        decimal(10,2) not null,会员折扣    decimal(3,2),库存        int not null,包装规格    varchar(50),生产日期    varchar(50),有效期      varchar(50),
    primary key(药品编号),
    INDEX `供应商编号_idx` (`供应商编号` ASC),
    CONSTRAINT `供应商编号`
    FOREIGN KEY (`供应商编号`)
    REFERENCES `医药销售管理系统`.`供应商` (`供应商编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表登录用户,可以登录医药销售管理系统,类别为1代表员工,2代表经理
    create table `登录用户`(用户编号         int auto_increment,用户名          varchar(40) not null unique,密码           varchar(40) not null,类别             int not null,
    primary key(用户编号));
    //建立表经理,具有登录用户编号,可登录系统
    create table `经理`(经理编号      int auto_increment,用户编号      int not null,
    primary key(经理编号),
    INDEX `经理编号_idx` (`用户编号` ASC),
    CONSTRAINT `经理登陆编号`
    FOREIGN KEY (`用户编号`)
    REFERENCES `医药销售管理系统`.`登录用户` (`用户编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表员工,具有登录用户编号,可登录系统
    create table `员工`(员工编号      int auto_increment,员工姓名      varchar(50),联系电话      varchar(100),用户编号      int not null,
    primary key(员工编号),
    INDEX `员工编号_idx` (`用户编号` ASC),
    CONSTRAINT `员工登陆编号`
    FOREIGN KEY (`用户编号`)
    REFERENCES `医药销售管理系统`.`登录用户` (`用户编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表财政开支,涉及药品编号、负责员工、数量、金额等信息,类型有入库、销售、退货等
    CREATE TABLE `财政收支` (
    `收支编号` int auto_increment,
    `药品编号` int,
    `员工编号` int not null,
    `数量` int,
    `日期` datetime NOT NULL,
    `总额` decimal(10,2) NOT NULL,
    `类型` VARCHAR(20)  NOT NULL,
    PRIMARY KEY (`收支编号`),
    INDEX `药品编号_idx` (`药品编号` ASC),
    CONSTRAINT `药品编号`
    FOREIGN KEY (`药品编号`)
    REFERENCES `医药销售管理系统`.`药品` (`药品编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    INDEX `员工编号_idx` (`员工编号` ASC),
    CONSTRAINT `负责员工编号`
    FOREIGN KEY (`员工编号`)
    REFERENCES `医药销售管理系统`.`员工` (`员工编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表入库记录,包含供应商、收支编号
    create table `入库记录`(入库记录编号   int auto_increment,供应商编号     int not null,收支编号       int not null,
    primary key(入库记录编号),
    INDEX `供应商编号_idx` (`供应商编号` ASC),
    INDEX `收支编号_idx` (`收支编号` ASC),
    CONSTRAINT `入货供应商编号`
    FOREIGN KEY (`供应商编号`)
    REFERENCES `医药销售管理系统`.`供应商` (`供应商编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    CONSTRAINT `入库收支编号`
    FOREIGN KEY (`收支编号`)
    REFERENCES `医药销售管理系统`.`财政收支` (`收支编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表销售管理,包含客户、收支编号
    CREATE TABLE `销售管理`(
    `销售编号` int auto_increment,
    `客户编号` int,
    `收支编号` int not null,
    PRIMARY KEY (`销售编号`),
    INDEX `客户编号_idx` (`客户编号` ASC),
    INDEX `收支编号_idx` (`收支编号` ASC),
    CONSTRAINT `销售客户编号`
    FOREIGN KEY (`客户编号`)
    REFERENCES `医药销售管理系统`.`会员` (`客户编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    CONSTRAINT `销售收支编号`
    FOREIGN KEY (`收支编号`)
    REFERENCES `医药销售管理系统`.`财政收支` (`收支编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
    //建立表退货管理,包含销售、收支编号
    CREATE TABLE `退货管理` (
    `退货编号` int auto_increment,
    `销售编号` int NOT NULL,
    `收支编号` int NOT NULL,
    PRIMARY KEY (`退货编号`),
    INDEX `销售编号_idx` (`销售编号` ASC),
    INDEX `收支编号_idx` (`收支编号` ASC),
    CONSTRAINT `退货销售编号`
    FOREIGN KEY (`销售编号`)
    REFERENCES `医药销售管理系统`.`销售管理` (`销售编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    CONSTRAINT `退货收支编号`
    FOREIGN KEY (`收支编号`)
    REFERENCES `医药销售管理系统`.`财政收支` (`收支编号`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
  • 创建视图方便查询

    
    /*仓库*/
    drop view if exists warehouse;
    create view warehouse as
    select 药品编号,药品名称,供应商名称,生产批号,产地,所属类别,进价,单价,会员折扣,库存,包装规格,生产日期,有效期
    from 药品,供应商 where 药品.供应商编号=供应商.供应商编号;
    /*入库记录*/
    drop view if exists InDrug_records;
    create view InDrug_records as
    select 入库记录编号,药品名称,供应商名称,员工姓名,数量,日期,总额
    from 入库记录,供应商,财政收支,员工,药品
    where 入库记录.供应商编号=供应商.供应商编号 and 入库记录.收支编号=财政收支.收支编号 and
    财政收支.员工编号=员工.员工编号 and 财政收支.药品编号=药品.药品编号;
    /*销售记录*/
    drop view if exists sales_records;
    create view sales_records as
    select 销售编号,药品.药品编号,药品名称,单价,会员折扣,库存,客户姓名,员工姓名,数量,日期,总额
    from 销售管理,会员,财政收支,员工,药品
    where 销售管理.客户编号=会员.客户编号 and 销售管理.收支编号=财政收支.收支编号
    and 财政收支.员工编号=员工.员工编号 and 财政收支.药品编号=药品.药品编号;
    /*退货记录*/
    drop view if exists reject_records;
    create view reject_records as
    select 退货编号,退货管理.销售编号,药品名称,客户姓名,员工姓名,数量,日期,总额
    from 退货管理,销售管理,会员,财政收支,员工,药品
    where 退货管理.销售编号=销售管理.销售编号 and 销售管理.客户编号=会员.客户编号
    and 退货管理.收支编号=财政收支.收支编号 and 财政收支.员工编号=员工.员工编号
    and 财政收支.药品编号=药品.药品编号;
    /*员工信息*/
    drop view if exists employee_info;
    create view employee_info as
    select 员工编号,员工姓名,联系电话,员工.用户编号,用户名 from `员工` natural join `登录用户`;
    /*收支记录*/
    drop view if exists financial_records;
    create view financial_records as
    select 类型,药品名称,数量,日期,总额
    from `财政收支` left join `药品` on `财政收支`.药品编号=`药品`.`药品编号`;
  • 使用过程实现“带参数的视图“

    drop procedure if exists payments_statistics;
    delimiter //
    create procedure payments_statistics(in date_limit varchar(20))
    beginselect count(*) as 数目,sum(`总额`) as 盈亏, (select sum(`总额`) from `财政收支` where `总额` < 0 and `日期` like date_limit) as '支出', (select sum(`总额`) from `财政收支` where `总额` >= 0 and `日期` like date_limit) as '收入' from `财政收支` where `日期` like date_limit;
    end//

    JDBC调用方法如下

                //调用过程  -- 统计盈亏、收入、支出CallableStatement cStmt = con.prepareCall("{call payments_statistics(?)}");cStmt.setString(1,"%"+date+"%");cStmt.execute();rs = cStmt.getResultSet();if(rs.next()){count = rs.getInt(1);all = rs.getString(2);allOut = rs.getString(3);allIn = rs.getString(4);}rs.close();
  • 建立触发器保证逻辑正确

    
    drop trigger if exists stock_update;
    delimiter //
    create trigger stock_update before update on 药品
    for each row
    beginif new.库存 < 0/* MySQL不支持直接使用rollback回滚事务,可以利用delete当前表造成异常使事务回滚 */then delete from 药品 where 药品编号=new.药品编号;  end if;
    end //
    update 药品 set 库存=-2 where 药品编号=1;drop trigger if exists drugs_insert;
    delimiter //
    create trigger drugs_insert before insert on 药品
    for each row
    beginif new.库存 < 0 or new.单价 < 0 or new.进价 < 0 or new.会员折扣 > 1 or new.会员折扣 < 0then delete from 药品 where 药品编号=new.药品编号;end if;
    end //
    /*退货数量不应比售出的多*/
    drop trigger if exists refunds_insert;
    delimiter //
    create trigger refunds_insert after insert on 退货管理
    for each row
    beginif (select 数量 from sales_records where 销售编号 = new.销售编号) < (select 数量 from reject_records where 退货编号 = new.退货编号)then delete from 退货管理 where 退货编号=new.退货编号;end if;
    end //
  • 将业务逻辑封装为事务,如销售事务

    PreparedStatement ps=null;Connection con = DriverManager.getConnection(connectString,"root", "2333");...con.setAutoCommit(false);//设置自动提交为false...//销售事务 //更新库存String fmt1="update 药品  set `库存`='%d' where `药品编号`='%s'";String sql1 = String.format(fmt1,drug_rest-pcount,drug_id); ps = con.prepareStatement(sql1);ps.executeUpdate();//插入财政收支记录String fmt2="INSERT INTO `财政收支` (`药品编号`,`员工编号`,`数量`,`日期`,`总额`,`类型`) VALUES ('%s','%d','%d','%s','%s','销售')";String sql2 = String.format(fmt2,drug_id,employee_id,pcount,today,money); ps = con.prepareStatement(sql2);ps.executeUpdate(); //获取插入的财政收支编号ps = con.prepareStatement("select @@identity;");rs = ps.executeQuery();if(rs.next()){financial_id=rs.getInt(1);}rs.close();//插入销售记录String fmt3="insert into 销售管理(客户编号,收支编号) values(%s,'%d')";String sql3 = String.format(fmt3,customer_id,financial_id); ps = con.prepareStatement(sql3);ps.executeUpdate();//提交事务con.commit();}catch(Exception e){try {con.rollback();} catch (Exception e1) {e1.printStackTrace();}

界面效果

登陆

主页

仓库

点击新增进行药品入库

入库/销售/退货记录

员工可查看/增加客户,供应商

经理可增删员工、客户、供应商

销售药品


退货

财务统计

(项目见https://github.com/14353350/Drug_Sales_Management)

数据库设计——医药销售管理系统相关推荐

  1. java医药销售管理系统_JAVAGUI界面+SQLSEVER2008医药销售管理系统(代码+文档)

    [实例简介] 系统目标与要求 调查从事医药产品零售.批发等工作的企业,根据其具体情况设计医药销售管理系统.主要功能如下: (1) 基础信息管理:药品信息.客户信息.供应商信息等. (2) 进货管理:入 ...

  2. 计算机数据库课程设计,药品销售管理系统

    计算机数据库课程设计,药品销售管理系统 https://x-x.fun/i/Lb0b58c73eUr9

  3. (附源码)ssm医药销售管理系统 毕业设计 042322

    SSM医药销售管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采 ...

  4. SSM医药销售管理系统毕业设计源码042322

    SSM医药销售管理系统 摘要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采S ...

  5. 基于SSM开发医药销售管理系统

    基于SSM开发医药销售管理系统:(毕业设计/课程设计) 开发环境: Windows操作系统 开发工具: MyEclipse(Eclipse)+Jdk+Tomcat+MYSQL数据库 运行效果图: 基于 ...

  6. 基于opengauss数据库的酒水销售管理系统【python+SQL】

    基于opengauss数据库的酒水销售管理系统 摘要 1 系统概述 1.1 开发目的 1.2 开发任务 1.3 开发环境 2 需求分析 2.1 系统需求 2.2 实现目标 2.3 功能设计 2.4 数 ...

  7. javaweb JAVA JSP医院药品管理系统 JSP药品进销存系统 JSP医药进销存系统 JSP医药销售管理系统

    javaweb JAVA JSP医院药品管理系统 JSP药品进销存系统 JSP医药进销存系统 JSP医药销售管理系统 protected void doGet(HttpServletRequest r ...

  8. javaweb JAVA JSP药品销售管理系统JSP医药销售管理系统JSP购物商城系统JSP电子商务系统JSP购物系统

    javaweb JAVA JSP药品销售管理系统JSP医药销售管理系统JSP购物商城系统JSP电子商务系统JSP购物系统 protected void doGet(HttpServletRequest ...

  9. HTML5期末大作业:管理系统后台网站设计——代理商销售管理系统后台(8页) HTML+CSS+JavaScript web前端设计与开发期末作品/期末大作业

    HTML5期末大作业:管理系统后台网站设计--代理商销售管理系统后台(8页) HTML+CSS+JavaScript web前端设计与开发期末作品/期末大作业 常见网页设计作业题材有 个人. 美食. ...

最新文章

  1. php跟web前端的区别,php与javascript的区别是什么?
  2. js、jquery实用小技巧集合
  3. Java基础篇:泛型与类型擦除
  4. 目标检测第2步:如何在Windows 10下安装Anaconda?
  5. python 月报_python实践--月报分析之获取jira缺陷数据
  6. 以太坊开发入门,完整入门篇
  7. 记一次成功的sql注入入侵检测附带sql性能优化
  8. Android N-ify使用教程,Xposed新模块 无需升级也能使用Android N新功能
  9. unity, 判断可见性
  10. jsp java 登陆界面代码_jsp登陆界面源代码
  11. python二维插值_SciPy二元样条插值
  12. am大学计算机科学,美国大学本科计算机科学专业排名一览
  13. outlook连接谷歌企业邮箱(转)
  14. element ui的upload上传视频内容
  15. 一周小结(七)——从零开始配置VINS-Mono运行环境
  16. GNU 编译C++程序
  17. 藏不住啦~SOA竟在我身边? 浅谈CANoe实现SOA仿真测试
  18. 自己写的uvc驱动支持IP2977/ip2970
  19. 【buildroot】buildroot的相关make命令
  20. DIAC-WOZ数据集(二)---Visual signals

热门文章

  1. New Concept book two words
  2. 如何在 Raspberry Pi 上使用 Brother 打印机
  3. 迪文触摸串口屏 实例应用(4)——同步数据返回(单次按压、持续按压、松开按压)
  4. 激光SLAM导航系列(二)SLAM与导航系统框架
  5. 常见图片格式--电子书格式
  6. Google搜索的10个小技巧,部分适用于百度
  7. ElasticSearch实战(二十一)-任务管理
  8. 计算机控制的节能路灯系统,LED路灯节能控制系统的设计与应用
  9. java变量保存经纬度,java-将存储在SQLite数据库中的经度和纬度数...
  10. 缓冲区溢出漏洞原理及Linux下利用