亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

數據庫設計——醫藥銷售管理系統

2024-07-21 02:51:52
字體:
來源:轉載
供稿:網友

開發環境和開發工具

操作系統: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 CASCADEON 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 CASCADEON 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 CASCADEON 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 CASCADEON UPDATE CASCADE,INDEX `員工編號_idx` (`員工編號` ASC),CONSTRAINT `負責員工編號`FOREIGN KEY (`員工編號`)REFERENCES `醫藥銷售管理系統`.`員工` (`員工編號`)ON DELETE CASCADEON 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 CASCADEON UPDATE CASCADE,CONSTRAINT `入庫收支編號`FOREIGN KEY (`收支編號`)REFERENCES `醫藥銷售管理系統`.`財政收支` (`收支編號`)ON DELETE CASCADEON 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 CASCADEON UPDATE CASCADE,CONSTRAINT `銷售收支編號`FOREIGN KEY (`收支編號`)REFERENCES `醫藥銷售管理系統`.`財政收支` (`收支編號`)ON DELETE CASCADEON 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 CASCADEON UPDATE CASCADE,CONSTRAINT `退貨收支編號`FOREIGN KEY (`收支編號`)REFERENCES `醫藥銷售管理系統`.`財政收支` (`收支編號`)ON DELETE CASCADEON UPDATE CASCADE);

創建視圖方便查詢

/*倉庫*/drop view if exists warehouse; create view warehouse asselect 藥品編號,藥品名稱,供應商名稱,生產批號,產地,所屬類別,進價,單價,會員折扣,庫存,包裝規格,生產日期,有效期from 藥品,供應商 where 藥品.供應商編號=供應商.供應商編號; /*入庫記錄*/drop view if exists InDrug_records; create view InDrug_records asselect 入庫記錄編號,藥品名稱,供應商名稱,員工姓名,數量,日期,總額 from 入庫記錄,供應商,財政收支,員工,藥品where 入庫記錄.供應商編號=供應商.供應商編號 and 入庫記錄.收支編號=財政收支.收支編號 and財政收支.員工編號=員工.員工編號 and 財政收支.藥品編號=藥品.藥品編號;/*銷售記錄*/drop view if exists sales_records; create view sales_records asselect 銷售編號,藥品.藥品編號,藥品名稱,單價,會員折扣,庫存,客戶姓名,員工姓名,數量,日期,總額from 銷售管理,會員,財政收支,員工,藥品where 銷售管理.客戶編號=會員.客戶編號 and 銷售管理.收支編號=財政收支.收支編號and 財政收支.員工編號=員工.員工編號 and 財政收支.藥品編號=藥品.藥品編號;/*退貨記錄*/drop view if exists reject_records;create view reject_records asselect 退貨編號,退貨管理.銷售編號,藥品名稱,客戶姓名,員工姓名,數量,日期,總額from 退貨管理,銷售管理,會員,財政收支,員工,藥品where 退貨管理.銷售編號=銷售管理.銷售編號 and 銷售管理.客戶編號=會員.客戶編號 and 退貨管理.收支編號=財政收支.收支編號 and 財政收支.員工編號=員工.員工編號 and 財政收支.藥品編號=藥品.藥品編號;/*員工信息*/drop view if exists employee_info;create view employee_info asselect 員工編號,員工姓名,聯系電話,員工.用戶編號,用戶名 from `員工` natural join `登錄用戶`;/*收支記錄*/drop view if exists financial_records;create view financial_records asselect 類型,藥品名稱,數量,日期,總額 from `財政收支` left join `藥品` on `財政收支`.藥品編號=`藥品`.`藥品編號`;

使用過程實現“帶參數的視圖“

drop procedure if exists payments_statistics;delimiter //create procedure payments_statistics(in date_limit varchar(20))begin select 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 rowbegin if 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 rowbegin if new.庫存 < 0 or new.單價 < 0 or new.進價 < 0 or new.會員折扣 > 1 or new.會員折扣 < 0 then delete from 藥品 where 藥品編號=new.藥品編號; end if;end ///*退貨數量不應比售出的多*/drop trigger if exists refunds_insert;delimiter //create trigger refunds_insert after insert on 退貨管理for each rowbegin if (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)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久成人精品| 国产精品久久久久久av下载红粉| 亚洲欧美激情另类校园| 国产精品视频久久久| 欧美三级xxx| 26uuu日韩精品一区二区| 欧美日韩国产一区在线| 亚洲欧美激情在线视频| 亚洲人午夜精品| 亚洲精品国产品国语在线| 日韩在线不卡视频| 欧美猛少妇色xxxxx| 韩国日本不卡在线| 久久夜色精品国产| 午夜精品视频在线| 色综合色综合网色综合| 欧洲美女7788成人免费视频| 中文字幕最新精品| 日韩成人网免费视频| 亚洲精品成人免费| 欧美日韩国产丝袜另类| 国产欧美日韩中文字幕| 日韩电影免费观看在线观看| 亚洲视频在线播放| 国产精品com| 国产99久久久欧美黑人| 久久国产精品久久国产精品| 亚洲激情电影中文字幕| 国产成人亚洲综合91精品| 色偷偷噜噜噜亚洲男人| 久久久久国产一区二区三区| 午夜精品久久久久久久99热浪潮| 亚洲精品国产拍免费91在线| 欧美黄色小视频| 欧美性高潮在线| 78m国产成人精品视频| 亚洲精品一区二区久| 欧美亚洲国产日韩2020| 亚洲大胆人体视频| 成人黄色在线观看| 亚洲女在线观看| 久久久久日韩精品久久久男男| 一区二区成人av| 日韩在线观看免费网站| 国产精品精品一区二区三区午夜版| 日本91av在线播放| 成人www视频在线观看| 国产亚洲精品综合一区91| 亚洲aa在线观看| 91免费版网站入口| 国产精品自产拍在线观| 自拍偷拍亚洲在线| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美国产一区二区三区| 97国产在线观看| 国产亚洲欧美日韩美女| 成人国产精品一区| 日韩激情视频在线| 日韩视频精品在线| 精品国产一区二区三区久久狼黑人| 精品国产一区二区三区在线观看| 久久久久北条麻妃免费看| 日韩av最新在线| 国产精品夜间视频香蕉| 精品国产成人在线| 欧美日韩国产色| 欧美性猛交xxxxx免费看| 欧美日韩在线视频观看| 色一区av在线| 在线性视频日韩欧美| 最好看的2019年中文视频| 视频直播国产精品| 国产精品99久久久久久久久| 亚洲精品永久免费精品| 69久久夜色精品国产69| 亚洲国产精品yw在线观看| 日韩的一区二区| 青草青草久热精品视频在线观看| 欧美精品久久一区二区| 国产福利视频一区| 亚洲精品狠狠操| 一本色道久久88精品综合| 日韩在线中文字幕| 成人激情视频在线播放| 国产精品成av人在线视午夜片| 亚洲字幕一区二区| 亚洲精品国产精品国自产在线| 国产成人在线视频| 综合av色偷偷网| 一区二区三区久久精品| 精品亚洲精品福利线在观看| 欧美日本高清一区| 国内精品视频一区| 精品亚洲一区二区三区| 欧美激情一二三| 欧美日韩亚洲天堂| 性色av一区二区三区在线观看| 国产精品国产亚洲伊人久久| 色多多国产成人永久免费网站| 久热在线中文字幕色999舞| 成人a级免费视频| 成人免费午夜电影| 国内精品小视频在线观看| 久久精视频免费在线久久完整在线看| 亚洲精品日韩欧美| 欧美夜福利tv在线| 欧美精品在线看| 精品一区二区三区三区| 国产精品国产三级国产aⅴ9色| 日韩精品久久久久| 久久国产加勒比精品无码| 中文字幕免费国产精品| 欧美日韩亚洲一区二区| 91中文字幕一区| 欧美裸体男粗大视频在线观看| 久久精品99久久久香蕉| 欧美高清电影在线看| 国产亚洲欧美一区| 亚洲a级在线观看| 欧美精品成人91久久久久久久| 精品国产一区二区三区久久久| 免费av在线一区| 51ⅴ精品国产91久久久久久| 亚洲午夜激情免费视频| 欧美成人午夜视频| 欧美日韩成人黄色| 国产精品丝袜一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品成人久久久久| 国产成人精品一区| 亚洲欧美日韩中文在线制服| 欧美亚洲午夜视频在线观看| 亚洲精品美女久久| 九九精品在线观看| 97婷婷大伊香蕉精品视频| 欧美天天综合色影久久精品| 国产区精品在线观看| 成人激情视频免费在线| 91国内产香蕉| 亚洲最新在线视频| 色中色综合影院手机版在线观看| 91国内揄拍国内精品对白| 91精品久久久久| 日韩视频免费看| 国产欧美一区二区三区久久人妖| 91chinesevideo永久地址| 亚洲精品网站在线播放gif| 日韩欧美精品免费在线| 欧美日韩国产精品一区二区三区四区| 日韩美女福利视频| 国产精品久久久久久网站| 久久久久久久爱| 疯狂做受xxxx欧美肥白少妇| 亚洲欧美日韩精品久久亚洲区| 日韩精品极品视频免费观看| 欧美日韩一区二区免费在线观看| 色综合色综合网色综合| 在线日韩av观看| 一区二区欧美亚洲| 久久99亚洲精品| 在线观看国产欧美| 亚洲a在线观看| 岛国av午夜精品| 精品中文视频在线|