基于javaweb+mysql的springboot医药进销存管理系统(java+springboot+html+echarts+jquery+maven+mysql)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SpringBoot医药进销存管理系统(java+springboot+html+echarts+jquery+maven+mysql)
功能介绍
医药进销存系统,主要分两种角色:员工、客户。本系统具有进销存系统的通用性,可以修改为其它进销存系统,如家电进销存、手机进销存等;
员工登录后主要功能模块有: 我的面板:个人信息、修改信息、修改密码; 员工管理:员工添加、员工查询; 药品管理:药品类别添加、药品类别查询、药品添加、药品查询; 客户管理:客户查询; 供货商管理:供货商添加、供货商查询; 账单管理:进货添加、进货查询、退货账单、销售账单查询; 客户登录后主要功能模块有: 我的面板:个人信息、修改信息、修改密码;
购买药品:药品展示、已购药品;
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目
6.数据库:MySql 5.7版本;
系统框架
1.后端:SpringBoot
2.前端:HTML+Echarts+JQuery
使用说明
-
使用IDEA/Eclipse/MyEclipse导入后端项目源码,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,配置tomcat,然后运行;
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 3. 运行项目前,需要配置好MqSQL数据库,在application.properties中修改数据库对应的配置文件; 4. 配置Tomcat,在Tomcat中运行后端项目; 5. 运行成功后,在浏览器中访问:http://localhost:8888 6. 客户和员工对应数据库表t_customers和t_employees表,用户名是手机号,密码也是对应的手机号 客户账号:15133480838 密码:15133480838
员工账号:15133330551 密码:15133330551
/**
* 查询供货商表的uid,username
* @return
*/
private List<Supplier> findSupByUidUsername(){
//测试正常
List<Supplier> list = supplier.findByUidUsername();
return list;
}
/**
* 添加进货清单
* @param drugstock
* @return
*/
private Integer insertDrugStock(DrugStock drugStock){
Integer upd = drugstock.insertDrugStock(drugStock);
if(upd == 0){
throw new InsertException("插入数据错误!!");
}
return upd;
}
/**
* 根据入库单号查询是否有重复数据
* @param documentNo 单号
* @return 返回受影响的条数
*/
private Integer findBydocumentNo(String documentNo){
return drugstock.findBydocumentNo(documentNo);
}
/**
* 查询所有进货数据
* @return 返回查询到的数据
*/
private List<DrugStockFindAll> findAll(Integer pageNoStr,Integer pageSizeStr,String documentNo){
return drugstock.findAll(pageNoStr,pageSizeStr,documentNo);
}
/**
* 删除某条数据(设置isDelete为1)
* @param id 需要删除的数据的id
* @return 返回受影响的行数
*/
private Integer updateIsDelete(Integer id,String modifiedUser,Date modifiedTime){
Integer upd = drugstock.updateIsDelete(id,modifiedUser,modifiedTime);
return upd;
/**
* 查询所有退货信息
* @param pageNoStr 分页查询
* @param pageSizeStr 分页查询
* @param documentNo 查询条件
* @return 返回查询结果(经过处理:处理里面的时间让用户看的更明白)
*/
@GetMapping("/findstockreturn")
public ResponseResult<JSONArray> findStockReturn(Integer pageNoStr,Integer pageSizeStr,String documentNo){
List<StockReturn> allStockReturn = stockReturnService.findAll((pageNoStr-1)*pageSizeStr,pageSizeStr,documentNo);
//解决前后端json遍历的时间问题(把vo换成jsonObj)
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONArray jsonArr = JSONArray.fromObject(allStockReturn, jsonConfig);
return new ResponseResult<JSONArray>(SUCCESS,jsonArr);
}
/**
* 添加退货信息
* @param stockReturn 退货信息
* @param session 获取登录的用户名
* @return 返回成功与否
*/
@PostMapping("/addstockreturn")
public ResponseResult<Void> addStockReturn(StockReturn stockReturn,HttpSession session){
System.err.println(stockReturn);
stockReturnService.addStockReturn(stockReturn, session.getAttribute("username").toString());
return new ResponseResult<>(SUCCESS);
}
}
/**
* 进货业务层接口
private List<Drug> findDrgByUidUsername(){
List<Drug> list = drugDao.findUidName();
return list;
}
/**
* 查询供货商表的uid,username
* @return
*/
private List<Supplier> findSupByUidUsername(){
//测试正常
List<Supplier> list = supplier.findByUidUsername();
return list;
}
/**
* 添加进货清单
* @param drugstock
* @return
*/
private Integer insertDrugStock(DrugStock drugStock){
Integer upd = drugstock.insertDrugStock(drugStock);
if(upd == 0){
throw new InsertException("插入数据错误!!");
}
return upd;
}
/**
* 根据入库单号查询是否有重复数据
* @param documentNo 单号
* @return 返回受影响的条数
*/
private Integer findBydocumentNo(String documentNo){
return drugstock.findBydocumentNo(documentNo);
}
/**
* 查询所有进货数据
* @return 返回查询到的数据
*/
private List<DrugStockFindAll> findAll(Integer pageNoStr,Integer pageSizeStr,String documentNo){
return drugstock.findAll(pageNoStr,pageSizeStr,documentNo);
}
@RequestMapping("/drugSales")
public class DrugSalesController extends BaseController{
@Autowired //自动装配
private IDrugSalesService drugSalesService;
/**
* 添加销售数据
* @return
*/
@RequestMapping("/insertDrugSales")
public ResponseResult<Void> addDrugSales(String ids,String number,HttpSession session){
DrugSales drugSales = new DrugSales();
drugSales.setInventoryQuantity(Integer.parseInt(number)); //添加销售数量
drugSales.setCustomerId( getUidFromSession(session) ); //添加客户id
String[] id = ids.split(",");
String username = session.getAttribute("username").toString();
drugSalesService.addDrugSales(id, drugSales, username);
return new ResponseResult<Void>(SUCCESS);
}
/**
* 查询数据,多条件查询
* @param drugCategory
* @return
* @throws JsonProcessingException
*/
@RequestMapping("/selectDrugSales")
public ResponseResult<JSONObject> selectDrugSales
(String drugName,String storageTime,String pageNoStr,String pageSizeStr,HttpSession session)
throws JsonProcessingException {
//获取参数
long pageNo = 1; //如果没有传数据,默认为第一页
if( pageNoStr != null && pageNoStr.trim().length()>0 ){
pageNo = Long.parseLong(pageNoStr);
}
int pageSize = 1; //如果没有传数据,默认为10条数据
if( pageSizeStr != null && pageSizeStr.trim().length()>0 ){
pageSize = Integer.parseInt(pageSizeStr);
}
long beginNo = (pageNo-1)*pageSize;
@RestController
@RequestMapping("/excel")
public class ExcelDrugController extends BaseController {
@Autowired //自动装配
private IDrugService drugService;
@RequestMapping("/excelDrug")
public ResponseResult<Void> ExcelDrug(
String drugName,String unit,String origin,Integer categoryId) {
System.err.println(drugName+","+unit+","+origin+","+categoryId);
String title="药品表";
String[] rowName = new String[]{"药品名","药品类别","条形码","简称","规格","单位","产地","批准文号","进货价","销售价","库存","销售总量","药品备注"};
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("drugName", drugName);
map.put("unit", unit);
map.put("origin", origin);
map.put("categoryId", categoryId);
List<DrugANDDrugCategory> drugs = drugService.findselectIsdelete(map);
List<Object[]> list = new ArrayList<Object[]>();
String url="D:/药品数据表.xls";
Object[] objs = null;
for (DrugANDDrugCategory drug : drugs) {
System.err.println(drug);
objs = new Object[rowName.length];
objs[0] = drug.getDrugName();
objs[1] = drug.getCategoryName();
objs[2] = drug.getBarCode();
objs[3] = drug.getReferred();
objs[4] = drug.getSpecifications();
objs[5] = drug.getUnit();
objs[6] = drug.getOrigin();
objs[7] = drug.getApprovalNumber();
objs[8] = drug.getPleasedTo();
* stockReturn(退货)控制器
*
*/
@RestController
@RequestMapping("/stockreturn")
public class StockReturnController extends BaseController{
@Autowired
IStockReturnService stockReturnService;
/**
* 查询所有退货信息
* @param pageNoStr 分页查询
* @param pageSizeStr 分页查询
* @param documentNo 查询条件
* @return 返回查询结果(经过处理:处理里面的时间让用户看的更明白)
*/
@GetMapping("/findstockreturn")
public ResponseResult<JSONArray> findStockReturn(Integer pageNoStr,Integer pageSizeStr,String documentNo){
List<StockReturn> allStockReturn = stockReturnService.findAll((pageNoStr-1)*pageSizeStr,pageSizeStr,documentNo);
//解决前后端json遍历的时间问题(把vo换成jsonObj)
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONArray jsonArr = JSONArray.fromObject(allStockReturn, jsonConfig);
return new ResponseResult<JSONArray>(SUCCESS,jsonArr);
}
/**
* 添加退货信息
* @param stockReturn 退货信息
* @param session 获取登录的用户名
* @return 返回成功与否
*/
@PostMapping("/addstockreturn")
public ResponseResult<Void> addStockReturn(StockReturn stockReturn,HttpSession session){
System.err.println(stockReturn);
stockReturnService.addStockReturn(stockReturn, session.getAttribute("username").toString());
return new ResponseResult<>(SUCCESS);
}
}
drugStockService.addDrugStock(drugStock,session);
return new ResponseResult<Void>(SUCCESS);
}
/**
* 查询员工与客户中所有已存在的id
* @return 返回list集合封装的id
*/
@GetMapping("/findid")
public ResponseResult<List<List<Map<Integer, String>>>> findEmpSupId(){
List<List<Map<Integer, String>>> id = drugStockService.findDrgEmpSupId();
return new ResponseResult<List<List<Map<Integer, String>>>>(SUCCESS, id);
}
/**
* 查询所有的drugStock
* @return 返回结果
*/
@GetMapping("/findall")
public ResponseResult<JSONArray> findAllDrugStock(Integer pageNoStr,Integer pageSizeStr,String documentNo){
List<DrugStockFindAll> drugStocks = drugStockService.findDrugStock((pageNoStr-1)*pageSizeStr,pageSizeStr,documentNo);
//解决前后端json遍历的时间问题(把vo换成jsonObj)
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONArray jsonArr = JSONArray.fromObject(drugStocks, jsonConfig);
return new ResponseResult<JSONArray>(SUCCESS,jsonArr);
}
/**
* 删除数据
* @param Id 需要删除的id
* @param session 获取绑定数据
* @return 返回结果
*/
@PostMapping("/deletebyid")
public ResponseResult<Void> deleteDrugStock(String Id,HttpSession session){
drugStockService.deleteDrugStock(Id,session);
return new ResponseResult<Void>(SUCCESS);
}
}
if( pageSizeStr != null && pageSizeStr.trim().length()>0 ){
pageSize = Integer.parseInt(pageSizeStr);
}
long beginNo = (pageNo-1)*pageSize;
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("beginNo", beginNo);
map.put("pageSize", pageSize);
map.put("storageTime", storageTime);
map.put("drugName", drugName);
map.put("username", username);
PaginationVO<DrugSalesANDCustomer> vo = drugSalesService.getfindDrugSales(map);
//解决前后端json遍历的时间问题(把vo换成jsonObj)
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONObject jsonObj = JSONObject.fromObject(vo, jsonConfig);
return new ResponseResult<JSONObject>(SUCCESS,jsonObj);
}
/**
* 查询供货商的数量
*/
@RequestMapping("/selectIdCount")
public ResponseResult<Long> selectIdCount(){
Long count = drugSalesService.getselectIdCount();
return new ResponseResult<Long>(SUCCESS,count);
}
}
@RequestMapping("/changePassword")
public ResponseResult<Void> changePassword(Integer uid,String oldPassword,String newPassword,HttpSession session){
empService.changePassword(oldPassword, newPassword, uid);
return new ResponseResult<Void>(SUCCESS);
}
/**
* 查询员工数据,后期改为多条件查询
* @param drugCategory
* @return
*/
@RequestMapping("/selectEmployees")
public ResponseResult<List<Employees>> selectEmp() {
List<Employees> list = empService.getSelectEmployees();
return new ResponseResult<List<Employees>>(SUCCESS,list);
}
/**
* 根据uid查询emp信息
* @param session
* @return
*/
@RequestMapping("/show_EmpInfo")
public ResponseResult<Employees> showEmpInfo(Integer uid){
Employees emp = empService.findEmpInfo(uid);
return new ResponseResult<Employees>(SUCCESS,emp);
}
//************************修改头像***********************************
/**
* 上传员工头像
* @param request
* @param file
* @return MultipartFile file
*/
@RequestMapping("/change_avatar")
public ResponseResult<String> changeAvatar(HttpServletRequest request,@RequestParam("file") MultipartFile file){
if(file.isEmpty()) {
throw new FileEmptyException("上传头像错误!上传文件不能为空!");
}
if(!UPLOAD_CONTENT_TYPE.contains(file.getContentType())) {
throw new FileContentTypeException("上传头像错误!不支持所选的文件类型!");
}
if(file.getSize()>UPLOAD_MAX_SIZE) {
throw new FileSizeException("上传文件过大!请选择小于"+UPLOAD_MAX_SIZE+"的文件!");
}
String parentPath = request.getServletContext().getRealPath(UPLOAD_DIR);
File parent = new File(parentPath);
if(!parent.exists()) {
throw new InsertException("删除数据时出现未知错误!!");
}
}
}
/**
* 在员工表和供货商表药品表中查询所有存在的id,名字,并且返回出去
*/
@Override
public List<List<Map<Integer, String>>> findDrgEmpSupId() {
List<List<Map<Integer, String>>> UAN = new ArrayList<List<Map<Integer, String>>>();
List<Map<Integer, String>> drgId = new ArrayList<Map<Integer, String>>();
List<Map<Integer, String>> supId = new ArrayList<Map<Integer, String>>();
List<Map<Integer, String>> empId = new ArrayList<Map<Integer, String>>();
Integer count = 1;
List<Drug> drg = findDrgByUidUsername();
for(Drug d : drg){
if(!count.equals(d.getIsDelete())){
Map<Integer, String> drgmap = new HashMap<Integer, String>();
drgmap.put(d.getId(), d.getDrugName());
drgId.add(drgmap);
}
}
UAN.add(drgId);
List<Supplier> sup = findSupByUidUsername();
for(Supplier s : sup){
if(!count.equals(s.getIsDelete())){
Map<Integer, String> supmap = new HashMap<Integer, String>();
supmap.put(s.getUid(), s.getUsername());
supId.add(supmap);
}
}
UAN.add(supId);
List<Employees> emp = findEmpByUidUsername();
for(Employees e : emp){
if(!count.equals(e.getIsDelete())){
Map<Integer, String> empmap = new HashMap<Integer, String>();
empmap.put(e.getUid(), e.getUsername());
empId.add(empmap);
}
}
UAN.add(empId);
return UAN;
}
/**
* 查询员工表uid,username
* @return
*/
private List<Employees> findEmpByUidUsername(){
List<Employees> list = employees.findByUidUsername();
String suffix = "";
if(beginIndex > 0) {
suffix = originalFilename.substring(beginIndex);
}
String filename = prefic+suffix;
File dest = new File(parent,filename);
try {
file.transferTo(dest);
} catch (IllegalStateException e) {
e.printStackTrace();
throw new FileIllegalStateException("上传头像错误!存储头像文件时状态异常!");
} catch (IOException e) {
e.printStackTrace();
throw new FileIOException("上传头像错误!读写文件时出现错误!");
}
Integer uid = getUidFromSession(session);
String avatar = "/"+UPLOAD_DIR+"/"+filename;
empService.changeAvatar(avatar,uid);
return new ResponseResult<String>(SUCCESS,avatar);
}
@RequestMapping("/change_EmpInfo")
public ResponseResult<Void> changeEmpInfo(Employees emp){
empService.changeEmpInfo(emp);
return new ResponseResult<Void>(SUCCESS);
}
@RequestMapping("/delete_Employees")
public ResponseResult<Void> deleteEmployess(Integer uid){
empService.deleteEmployeesByUid(uid);
return new ResponseResult<Void>(SUCCESS);
}
@RequestMapping("/getOutEmp")
public ResponseResult<Void> getOutEmp(Integer uid){
empService.getOutEmp(uid);
return new ResponseResult<Void>(SUCCESS);
}
@RequestMapping("/getByUsername")
public ResponseResult<List<Employees>> getByUsername(String username){
List<Employees> data = empService.getByUsername(username);
return new ResponseResult<List<Employees>>(SUCCESS,data);
}
/**
* 查询员工与客户中所有已存在的id
* @return 返回list集合封装的id
*/
@GetMapping("/findid")
public ResponseResult<List<List<Map<Integer, String>>>> findEmpSupId(){
List<List<Map<Integer, String>>> id = drugStockService.findDrgEmpSupId();
return new ResponseResult<List<List<Map<Integer, String>>>>(SUCCESS, id);
}
/**
* 查询所有的drugStock
* @return 返回结果
*/
@GetMapping("/findall")
public ResponseResult<JSONArray> findAllDrugStock(Integer pageNoStr,Integer pageSizeStr,String documentNo){
List<DrugStockFindAll> drugStocks = drugStockService.findDrugStock((pageNoStr-1)*pageSizeStr,pageSizeStr,documentNo);
//解决前后端json遍历的时间问题(把vo换成jsonObj)
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONArray jsonArr = JSONArray.fromObject(drugStocks, jsonConfig);
return new ResponseResult<JSONArray>(SUCCESS,jsonArr);
}
/**
* 删除数据
* @param Id 需要删除的id
* @param session 获取绑定数据
* @return 返回结果
*/
@PostMapping("/deletebyid")
public ResponseResult<Void> deleteDrugStock(String Id,HttpSession session){
drugStockService.deleteDrugStock(Id,session);
return new ResponseResult<Void>(SUCCESS);
}
}
drugService.addDrug(drug, username);
return new ResponseResult<Void>(SUCCESS);
}
/**
* 为添加药品时,药品类别选择所设计
* @return
*/
@RequestMapping("/selectDrugCategory")
public ResponseResult<List<DrugCategory>> selectDrugCategory(){
List<DrugCategory> list = drugCategoryService.getfindByCategoryIdCategoryName();
return new ResponseResult<List<DrugCategory>>(SUCCESS,list);
}
/**
* 查询药品数据(关联查询)药品类别表,后期改为多条件查询
* @param drugCategory
* @return
* @throws JsonProcessingException
*/
@RequestMapping("/selectDrug")
public ResponseResult<PaginationVO<DrugANDDrugCategory>> selectDrug(String drugName,String unit,String origin,Integer categoryId,String pageNoStr,String pageSizeStr) throws JsonProcessingException {
//获取参数
long pageNo = 1; //如果没有传数据,默认为第一页
if( pageNoStr != null && pageNoStr.trim().length()>0 ){
pageNo = Long.parseLong(pageNoStr);
}
int pageSize = 1; //如果没有传数据,默认为10条数据
if( pageSizeStr != null && pageSizeStr.trim().length()>0 ){
pageSize = Integer.parseInt(pageSizeStr);
}
long beginNo = (pageNo-1)*pageSize;
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("drugName", drugName);
map.put("unit", unit);
map.put("origin", origin);
map.put("beginNo", beginNo);
map.put("categoryId", categoryId);
map.put("pageSize", pageSize);
PaginationVO<DrugANDDrugCategory> vo = drugService.getselectDrug(map);
return new ResponseResult<PaginationVO<DrugANDDrugCategory>>(SUCCESS,vo);
}
/**
* 根据uid查询药品全部数据
* @param uid
* @return
*/
@RequestMapping("/findId")
@RestController
@RequestMapping("/employees")
public class EmployeesController extends BaseController{
@Autowired
private IEmployeesService empService;
/**
* 添加员工信息
* @param emp
* @param session
* @return
*/
@RequestMapping("/addEmp")
public ResponseResult<Void> addEmp(Employees emp,HttpSession session) {
String username = session.getAttribute("username").toString();
empService.addEmp(emp, username );
return new ResponseResult<Void>(SUCCESS);
}
/**
* 员工手机号登录
* @param phone
* @param password
* @param permissions
* @return
*/
@RequestMapping("/login")
public ResponseResult<Employees> loginEmp(String phone,String password,HttpSession session){
Employees emp = empService.loginEmp(phone,password);
session.setAttribute( "uid", emp.getUid());
session.setAttribute( "user", emp );
session.setAttribute( "username", emp.getUsername() );
return new ResponseResult<Employees>(SUCCESS,emp);
}
@RequestMapping("/changePassword")
public ResponseResult<Void> changePassword(Integer uid,String oldPassword,String newPassword,HttpSession session){
empService.changePassword(oldPassword, newPassword, uid);
return new ResponseResult<Void>(SUCCESS);
}
/**
* 查询员工数据,后期改为多条件查询
* @param drugCategory
* @return
*/
@RequestMapping("/selectEmployees")
}
return rr;
}
}
@RestController
@RequestMapping("/drug")
public class DrugController extends BaseController{
@Autowired //自动装配
private IDrugService drugService;
@Autowired //自动装配
private IDrugCategoryService drugCategoryService;
/**
* 添加数据。药品类别信息
* @param user
* @return 返回成功
*/
@RequestMapping("/addDrug")
public ResponseResult<Void> addDrug(Drug drug,HttpSession session) {
String username = (String) session.getAttribute("username");
drugService.addDrug(drug, username);
return new ResponseResult<Void>(SUCCESS);
}
}
/**
* 控制器类的基类
*
*/
public abstract class BaseController {
/**
public ResponseResult<List<Employees>> getByUsername(String username){
List<Employees> data = empService.getByUsername(username);
return new ResponseResult<List<Employees>>(SUCCESS,data);
}
}
@RestController
@RequestMapping("/drugSales")
public class DrugSalesController extends BaseController{
@Autowired //自动装配
private IDrugSalesService drugSalesService;
/**
* 添加销售数据
* @return