医院药品管理系统开源项目-04 【药品销售管理】

一、销售记录

1.1 创建pojo实体类

Saleinfo

package com.dh.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 销售记录
 */
@Data
@TableName(value = "saleinfo")
public class Saleinfo implements Serializable {
    /*主键*/
    @TableField(value = "id")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    /*药品名称*/
    private String dname;

    /*药品编号*/
    private String dnumber;

    /*数量*/
    private Integer count;

    /*金额*/
    private Float total;

    /*操作人*/
    private String operator;

    /*操作时间*/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date operatetime;
}

1.2 创建mapper持久层

package com.dh.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dh.pojo.Saleinfo;

/**
 * 药品销售记录的增删改查Mapper
 */
public interface SaleinfoMapper extends BaseMapper<Saleinfo> {
}

1.3 创建Service业务层

package com.dh.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dh.pojo.Saleinfo;

/**
 * 销售记录的service接口
 */
public interface SaleinfoService extends IService<Saleinfo> {
    /**
     * 分页查询销售记录数据
     * @param pageNum 第几页
     * @param pageSize 每页多少条数据
     * @param param 查询参数-销售记录名称
     * @return
     */
    public IPage<Saleinfo> selectSaleinfoPage(int pageNum, int pageSize, String param);

    /**
     * 新增一条销售记录信息
     * @param saleinfo
     */
    public int addSaleinfo(Saleinfo saleinfo);

    /**
     * 修改一条销售记录信息
     * @param saleinfo
     */
    public int editSaleinfo(Saleinfo saleinfo);

    /**
     * 根据主键id查询一个销售记录对象
     * @param id
     * @return
     */
    public Saleinfo querySaleinfoById(Integer id);

    /**
     * 根据主键id删除一个销售记录对象
     * @param id
     * @return
     */
    public int delSaleinfoById(Integer id);

}

Impl实现类

package com.dh.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dh.mapper.SaleinfoMapper;
import com.dh.pojo.Saleinfo;
import com.dh.service.SaleinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 销售记录service实现类
 */
@Service
public class SaleinfoServiceImpl extends ServiceImpl<SaleinfoMapper, Saleinfo> implements SaleinfoService {

    @Autowired
    private SaleinfoMapper saleinfoMapper;

    /**
     * 分页查询销售记录数据
     *
     * @param pageNum  第几页
     * @param pageSize 每页多少条数据
     * @param param    查询参数-销售记录名称
     * @return
     */
    @Override
    public IPage<Saleinfo> selectSaleinfoPage(int pageNum, int pageSize, String param) {
        QueryWrapper<Saleinfo> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(param)){
            queryWrapper.like("dname",param);
        }
        Page<Saleinfo> page = new Page<>(pageNum,pageSize);
        return saleinfoMapper.selectPage(page,queryWrapper);
    }

    /**
     * 新增一条销售记录信息
     *
     * @param saleinfo
     */
    @Override
    public int addSaleinfo(Saleinfo saleinfo) {
        return saleinfoMapper.insert(saleinfo);
    }

    /**
     * 修改一条销售记录信息
     *
     * @param saleinfo
     */
    @Override
    public int editSaleinfo(Saleinfo saleinfo) {
        return saleinfoMapper.updateById(saleinfo);
    }

    /**
     * 根据主键id查询一个销售记录对象
     *
     * @param id
     * @return
     */
    @Override
    public Saleinfo querySaleinfoById(Integer id) {
        return saleinfoMapper.selectById(id);
    }

    /**
     * 根据主键id删除一个销售记录对象
     *
     * @param id
     * @return
     */
    @Override
    public int delSaleinfoById(Integer id) {
        return saleinfoMapper.deleteById(id);
    }
}

1.4 创建controller控制层

package com.dh.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dh.common.ResultMapUtil;
import com.dh.pojo.Saleinfo;
import com.dh.service.SaleinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 销售记录相关的controller
 */
@Controller
@RequestMapping(value = "/saleinfo")
public class SaleinfoController {

    @Autowired
    private SaleinfoService saleinfoService;

    /**
     * 转向销售记录页面
     */
    @RequestMapping
    public String saleinfo(){
        return "/saleinfo";
    }

    /**
     * 分页查询销售记录列表
     * @param param 查询参数
     * @param pageNum 起始页数
     * @param pageSize 每页多少条数据
     * @return
     */
    @RequestMapping(value = "/saleinfoQueryPage")
    @ResponseBody
    public Object saleinfoQueryPage(String param, @RequestParam(defaultValue = "1")int pageNum,@RequestParam(defaultValue = "10")int pageSize){
        try{
            //查询对应的数据
            IPage<Saleinfo> iPage = saleinfoService.selectSaleinfoPage(pageNum,pageSize,param);
            //获取mysql的分页查询结果
            return ResultMapUtil.getHashMapMysqlPage(iPage);
        } catch (Exception e){
            //如果出错,把异常信息返回给前端
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向销售记录新增页面
     */
    @RequestMapping(value = "/saleinfoPage")
    public String saleinfoPage(){
        return "/saleinfoPage";
    }

    /**
     * 添加一个销售记录
     */
    @RequestMapping(value = "/saleinfoAdd")
    @ResponseBody
    public Object saleinfoAdd(Saleinfo saleinfo){
        try{
            //获取创建时间
            int i = saleinfoService.addSaleinfo(saleinfo);
            //新增一条出入库信息
            return ResultMapUtil.getHashMapSave(i);
            //保存,并统一格式返回
        } catch (Exception e){
            //如果出错,把异常信息返回给前端
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向销售记录编辑页面
     */
    @RequestMapping(value = "/saleinfoQueryById")
    public String saleinfoQueryById(@RequestParam(name = "id",required = true)Integer id, Model model){
        //根据id查询药品
        Saleinfo saleinfo = saleinfoService.querySaleinfoById(id);
        //model调用逻辑处理
        model.addAttribute("obj",saleinfo);
        //跳转页saleinfoPage.html
        return "/saleinfoPage";
    }

    /**
     * 修改一个销售记录
     */
    @RequestMapping(value = "/saleinfoEdit")
    @ResponseBody
    public Object saleinfoEdit(Saleinfo saleinfo){
        try{
            //修改一条药品出入库信息
            int i = saleinfoService.editSaleinfo(saleinfo);
            //保存,并统一格式返回
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            //如果出错,把异常信息返回给前端
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 删除一个销售记录
     * @param id 根据id删除
     * @return 返回删除的数据
     */
    @RequestMapping(value = "/saleinfoDelById")
    @ResponseBody
    public Object saleinfoDelById(Integer id){
        try{
            //根据id删除数据
            int i = saleinfoService.delSaleinfoById(id);
            //保存,并统一格式返回
            return ResultMapUtil.getHashMapDel(i);
        } catch (Exception e){
            //如果出错,把异常信息返回给前端
            return ResultMapUtil.getHashMapException(e);
        }
    }
}

1.5 修改日期格式

Saleinfo

    /*操作时间转换成年月日*/
    public String getOperatetimeStr(){
        return DateUtil.dateConvert(operatetime);
    }

二、销售记录管理页面

2.1 编写销售记录页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>销售记录管理</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
    <script type="text/html" id="indexTpl">
        {{d.LAY_TABLE_INDEX+1}}
    </script>
</head>
<body class="layui-layout-body">
<div class="layui-fluid">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-header">销售记录列表</div>
                <div class="layui-card-body">
                    <table class="layui-hide" id="main-table" lay-filter="main-table"></table>
                    <script type="text/html" id="toolbarDemo">
                        <span class="layui-inline" lay-event="add"><i class="layui-icon">&#xe654;</i> </span>
                        <span class="layui-inline" style="width: 240px;">
                                <input class="layui-input" name="param" id="param" placeholder="根据药品名称查询" autocomplete="off">
                            </span>
                        <span class="layui-btn layui-btn-sm layui-bg-red" lay-event="querySearch">
                                <i class="layui-icon">&#xe615;</i>查询
                            </span>
                    </script>
                    <script type="text/html" id="barDemo">
                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                    </script>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['table','form'],function () {
        var $ = layui.$;
        var table = layui.table;
        table.render({
            elem: '#main-table',
            height: 650,
            url: '/saleinfo/saleinfoQueryPage',
            method: 'POST',
            page: true,
            id: 'table-load',
            toolbar: '#toolbarDemo',
            cols: [
                [
                    {title: '序号',templet: '#indexTpl',width: 60,align:'center'},
                    {field:'dname',title:'药品名称',algin:'center'},
                    {field:'dnumber',title:'药品编号',algin:'center'},
                    {field:'count',title:'数量',algin:'center'},
                    {field:'total',title:'金额',algin:'center'},
                    {field:'operator',title:'操作人',algin:'center'},
                    {field:'operatetime',title:'操作时间',algin:'center',
                        templet:"<div>{{layui.util.toDateString(d.operatetime,'yyyy-MM-dd HH:mm:ss')}}</div>"},
                    {title:'操作',align:'center',toolbar:'#barDemo',fixed:'right'}
                ]
            ]
        });

        //监听头工具栏事件
        table.on('toolbar(main-table)',function (obj) {
            switch (obj.event) {
                case 'add':
                    layer.open({
                        type: 2,
                        title: '新增销售记录',
                        content: '/saleinfo/saleinfoPage',
                        shade:[0.8,'#393d49'],
                        area:['600px','530px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/saleinfo/saleinfoAdd',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'querySearch':
                    var param = $('#param').val();
                    table.reload('table-load',{
                        where: {
                            param: param
                        }
                    });
                    $('#param').val(param);
                    break;
            }
        });

        //监听编辑、删除
        table.on('tool(main-table)',function (obj) {
            var data = obj.data;
            switch (obj.event) {
                case 'edit':
                    layer.open({
                        type: 2,
                        title: '编辑销售记录',
                        content: '/saleinfo/saleinfoQueryById?id=' +data.id,
                        shade:[0.8,'#393d49'],
                        area:['600px','500px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/saleinfo/saleinfoEdit',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'del':
                    layer.confirm('确认要删除吗?',function (index) {
                        $.ajax({
                            url: '/saleinfo/saleinfoDelById?id=' +data.id,
                            data: null,
                            async: false,
                            cache: false,
                            success: function (str) {
                                table.reload('table-load');
                                layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                            }
                        });
                    })
                    break;
            }
        });
    });
</script>
</body>
</html>

2.2 编写销售记录编辑页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>销售记录</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body" style="padding: 15px;">
            <form class="layui-form layui-form-pane" action="">
                <input name="id" th:value="${obj?.id}" class="layui-input layui-hide"/>
                <div class="layui-form-item">
                    <label class="layui-form-label">药品名称</label>
                    <div class="layui-input-block">
                        <select name="dname" id="dname"></select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">药品编码</label>
                    <div class="layui-input-block">
                        <input type="text" name="dnumber" th:value="${obj?.dnumber}" lay-verify="required" placeholder="请输入药品编码" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">数量</label>
                    <div class="layui-input-block">
                        <input type="text" name="count" th:value="${obj?.count}" lay-verify="required" placeholder="请输入数量" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">金额</label>
                    <div class="layui-input-block">
                        <input type="text" name="total" th:value="${obj?.total}" lay-verify="required" placeholder="请输入金额" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">操作人</label>
                    <div class="layui-input-block">
                        <input type="text" name="operator" th:value="${obj?.operator}" lay-verify="required" placeholder="请输入操作人" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">操作时间</label>
                    <div class="layui-input-block">
                        <input type="text" readonly name="operatetime" id="operatetime" th:value="${obj?.operatetimeStr}" lay-verify="required" placeholder="请输入操作时间" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item layui-hide">
                    <input type="button" lay-submit lay-filter="LAY-front-submit" id="LAY-front-submit" value="确认">
                </div>
            </form>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['form','laydate'],function () {
        var $ = layui.$;
        var laydate = layui.laydate;
        var form = layui.form;

        //支持日期控件
        laydate.render({
            elem: '#operatetime',
            trigger: 'click'
        });

        //当前药品的值
        var currentDname = '[[${obj?.dname}]]';
        //获取供应商列表
        $.ajax({
            url: '/druginfo/druginfoList',
            dataType:'json',
            type:'post',
            cache:false,
            success:function (data) {
                $('#dname').prepend("<option value=''>请选择</option>");
                for(var i=0;i<data.data.length;i++){
                    if(data.data[i].name==currentDname){
                        $('#dname').append("<option selected value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }else{
                        $('#dname').append("<option value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }
                }
                form.render();          //下拉列表渲染,把内容加载进去
            }
        });
    });
</script>
</body>
</html>

2.2 运行测试

在这里插入图片描述

三、商品退货

数据库添加一个字段 operatetime
在这里插入图片描述

3.1 创建pojo实体类

Returngoods

package com.dh.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dh.common.DateUtil;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 收到退货
 */
@Data
@TableName(value = "returngoods")
public class Returngoods implements Serializable {
    /*主键*/
    @TableField(value = "id")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    /*药品名称*/
    private String dname;

    /*数量*/
    private Integer count;

    /*退货原因*/
    private String reason;

    /*总金额*/
    private Float total;

    /*操作时间*/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date operatetime;
}

3.2 创建mapper持久层

package com.dh.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dh.pojo.Returngoods;

/**
 * 收到退货的增删改查Mapper
 */
public interface ReturngoodsMapper extends BaseMapper<Returngoods> {
}

3.3 创建Service业务层

package com.dh.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dh.pojo.Returngoods;

/**
 * 收到退货的service接口
 */
public interface ReturngoodsService extends IService<Returngoods> {
    /**
     * 分页查询收到退货数据
     * @param pageNum 第几页
     * @param pageSize 每页多少条数据
     * @param param 查询参数-收到退货名称
     * @return
     */
    public IPage<Returngoods> selectReturngoodsPage(int pageNum, int pageSize, String param);

    /**
     * 新增一条收到退货信息
     * @param returngoods
     */
    public int addReturngoods(Returngoods returngoods);

    /**
     * 修改一条收到退货信息
     * @param returngoods
     */
    public int editReturngoods(Returngoods returngoods);

    /**
     * 根据主键id查询一个收到退货对象
     * @param id
     * @return
     */
    public Returngoods queryReturngoodsById(Integer id);

    /**
     * 根据主键id删除一个收到退货对象
     * @param id
     * @return
     */
    public int delReturngoodsById(Integer id);

}

Impl实现类

package com.dh.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dh.mapper.ReturngoodsMapper;
import com.dh.pojo.Returngoods;
import com.dh.service.ReturngoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 收到退货service实现类
 */
@Service
public class ReturngoodsServiceImpl extends ServiceImpl<ReturngoodsMapper, Returngoods> implements ReturngoodsService {

    @Autowired
    private ReturngoodsMapper returngoodsMapper;

    /**
     * 分页查询收到退货数据
     *
     * @param pageNum  第几页
     * @param pageSize 每页多少条数据
     * @param param    查询参数-收到退货名称
     * @return
     */
    @Override
    public IPage<Returngoods> selectReturngoodsPage(int pageNum, int pageSize, String param) {
        QueryWrapper<Returngoods> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(param)){
            queryWrapper.like("dname",param);
        }
        Page<Returngoods> page = new Page<>(pageNum,pageSize);
        return returngoodsMapper.selectPage(page,queryWrapper);
    }

    /**
     * 新增一条收到退货信息
     *
     * @param returngoods
     */
    @Override
    public int addReturngoods(Returngoods returngoods) {
        return returngoodsMapper.insert(returngoods);
    }

    /**
     * 修改一条收到退货信息
     *
     * @param returngoods
     */
    @Override
    public int editReturngoods(Returngoods returngoods) {
        return returngoodsMapper.updateById(returngoods);
    }

    /**
     * 根据主键id查询一个收到退货对象
     *
     * @param id
     * @return
     */
    @Override
    public Returngoods queryReturngoodsById(Integer id) {
        return returngoodsMapper.selectById(id);
    }

    /**
     * 根据主键id删除一个收到退货对象
     *
     * @param id
     * @return
     */
    @Override
    public int delReturngoodsById(Integer id) {
        return returngoodsMapper.deleteById(id);
    }
}

3.4 创建controller控制层

ReturngoodsController

package com.dh.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dh.common.ResultMapUtil;
import com.dh.pojo.Returngoods;
import com.dh.service.ReturngoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 收到退货相关的controller
 */
@Controller
@RequestMapping(value = "/returngoods")
public class ReturngoodsController {

    @Autowired
    private ReturngoodsService returngoodsService;

    /**
     * 转向收到退货页面
     */
    @RequestMapping
    public String returngoods(){
        return "/returngoods";
    }

    /**
     * 分页查询收到退货列表
     */
    @RequestMapping(value = "/returngoodsQueryPage")
    @ResponseBody
    public Object returngoodsQueryPage(String param, @RequestParam(defaultValue = "1")int pageNum,@RequestParam(defaultValue = "10")int pageSize){
        try{
            IPage<Returngoods> iPage = returngoodsService.selectReturngoodsPage(pageNum,pageSize,param);
            return ResultMapUtil.getHashMapMysqlPage(iPage);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向收到退货新增页面
     */
    @RequestMapping(value = "/returngoodsPage")
    public String returngoodsPage(){
        return "/returngoodsPage";
    }

    /**
     * 添加一个收到退货
     */
    @RequestMapping(value = "/returngoodsAdd")
    @ResponseBody
    public Object returngoodsAdd(Returngoods returngoods){
        try{
            int i = returngoodsService.addReturngoods(returngoods);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向收到退货编辑页面
     */
    @RequestMapping(value = "/returngoodsQueryById")
    public String returngoodsQueryById(@RequestParam(name = "id",required = true)Integer id, Model model){
        Returngoods returngoods = returngoodsService.queryReturngoodsById(id);
        model.addAttribute("obj",returngoods);
        return "/returngoodsPage";
    }

    /**
     * 修改一个收到退货
     */
    @RequestMapping(value = "/returngoodsEdit")
    @ResponseBody
    public Object returngoodsEdit(Returngoods returngoods){
        try{
            int i = returngoodsService.editReturngoods(returngoods);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 删除一个收到退货
     */
    @RequestMapping(value = "/returngoodsDelById")
    @ResponseBody
    public Object returngoodsDelById(Integer id){
        try{
            int i = returngoodsService.delReturngoodsById(id);
            return ResultMapUtil.getHashMapDel(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }
}

3.5 修改日期格式

在pojo包Returngoods中添加

    /*操作时间转换成年月日*/
    public String getOperatetimeStr(){
        return DateUtil.dateConvert(operatetime);
    }

四、商品退货页面

4.1 商品退货页面

returngoods.html

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>收到退货管理</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
    <script type="text/html" id="indexTpl">
        {{d.LAY_TABLE_INDEX+1}}
    </script>
</head>
<body class="layui-layout-body">
<div class="layui-fluid">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-header">收到退货列表</div>
                <div class="layui-card-body">
                    <table class="layui-hide" id="main-table" lay-filter="main-table"></table>
                    <script type="text/html" id="toolbarDemo">
                        <span class="layui-inline" lay-event="add"><i class="layui-icon">&#xe654;</i> </span>
                        <span class="layui-inline" style="width: 240px;">
                                <input class="layui-input" name="param" id="param" placeholder="根据药品名称查询" autocomplete="off">
                            </span>
                        <span class="layui-btn layui-btn-sm layui-bg-red" lay-event="querySearch">
                                <i class="layui-icon">&#xe615;</i>查询
                            </span>
                    </script>
                    <script type="text/html" id="barDemo">
                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                    </script>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['table','form'],function () {
        var $ = layui.$;
        var table = layui.table;
        table.render({
            elem: '#main-table',
            height: 650,
            url: '/returngoods/returngoodsQueryPage',
            method: 'POST',
            page: true,
            id: 'table-load',
            toolbar: '#toolbarDemo',
            cols: [
                [
                    {title: '序号',templet: '#indexTpl',width: 60,align:'center'},
                    {field:'dname',title:'药品名称',algin:'center'},
                    {field:'count',title:'数量',algin:'center'},
                    {field:'total',title:'金额',algin:'center'},
                    {field:'reason',title:'退货原因',algin:'center'},
                    {field:'operatetime',title:'操作时间',algin:'center',
                        templet:"<div>{{layui.util.toDateString(d.operatetime,'yyyy-MM-dd HH:mm:ss')}}</div>"},
                    {title:'操作',align:'center',toolbar:'#barDemo',fixed:'right'}
                ]
            ]
        });

        //监听头工具栏事件
        table.on('toolbar(main-table)',function (obj) {
            switch (obj.event) {
                case 'add':
                    layer.open({
                        type: 2,
                        title: '新增收到退货',
                        content: '/returngoods/returngoodsPage',
                        shade:[0.8,'#393d49'],
                        area:['600px','530px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/returngoods/returngoodsAdd',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'querySearch':
                    var param = $('#param').val();
                    table.reload('table-load',{
                        where: {
                            param: param
                        }
                    });
                    $('#param').val(param);
                    break;
            }
        });

        //监听编辑、删除
        table.on('tool(main-table)',function (obj) {
            var data = obj.data;
            switch (obj.event) {
                case 'edit':
                    layer.open({
                        type: 2,
                        title: '编辑收到退货',
                        content: '/returngoods/returngoodsQueryById?id=' +data.id,
                        shade:[0.8,'#393d49'],
                        area:['600px','500px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/returngoods/returngoodsEdit',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'del':
                    layer.confirm('确认要删除吗?',function (index) {
                        $.ajax({
                            url: '/returngoods/returngoodsDelById?id=' +data.id,
                            data: null,
                            async: false,
                            cache: false,
                            success: function (str) {
                                table.reload('table-load');
                                layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                            }
                        });
                    })
                    break;
            }
        });
    });
</script>
</body>
</html>

4.2 商品退货编辑页面

returngoodsPage.html

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>收到退货</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body" style="padding: 15px;">
            <form class="layui-form layui-form-pane" action="">
                <input name="id" th:value="${obj?.id}" class="layui-input layui-hide"/>
                <div class="layui-form-item">
                    <label class="layui-form-label">药品名称</label>
                    <div class="layui-input-block">
                        <select name="dname" id="dname"></select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">数量</label>
                    <div class="layui-input-block">
                        <input type="text" name="count" th:value="${obj?.count}" lay-verify="required" placeholder="请输入数量" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">总金额</label>
                    <div class="layui-input-block">
                        <input type="text" name="total" th:value="${obj?.total}" lay-verify="required" placeholder="请输入总金额" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">退货原因</label>
                    <div class="layui-input-block">
                        <textarea name="reason" th:text="${obj?.reason}" lay-verify="required" placeholder="请输入退货原因" autocomplete="off" class="layui-textarea"></textarea>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">操作时间</label>
                    <div class="layui-input-block">
                        <input type="text" readonly name="operatetime" id="operatetime" th:value="${obj?.operatetimeStr}" lay-verify="required" placeholder="请输入操作时间" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item layui-hide">
                    <input type="button" lay-submit lay-filter="LAY-front-submit" id="LAY-front-submit" value="确认">
                </div>
            </form>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['form','laydate'],function () {
        var $ = layui.$;
        var laydate = layui.laydate;
        var form = layui.form;

        //支持日期控件
        laydate.render({
            elem: '#operatetime',
            trigger: 'click'
        });

        //当前药品的值
        var currentDname = '[[${obj?.dname}]]';
        //获取药品列表
        $.ajax({
            url: '/druginfo/druginfoList',
            dataType:'json',
            type:'post',
            cache:false,
            success:function (data) {
                $('#dname').prepend("<option value=''>请选择</option>");
                for(var i=0;i<data.data.length;i++){
                    if(data.data[i].name==currentDname){
                        $('#dname').append("<option selected value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }else{
                        $('#dname').append("<option value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }
                }
                form.render();          //下拉列表渲染,把内容加载进去
            }
        });
    });
</script>
</body>
</html>

4.3 运行测试

在这里插入图片描述
在这里插入图片描述

五、退货给供应商

修改表字段buytime
在这里插入图片描述

5.1 创建pojo实体类

package com.dh.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dh.common.DateUtil;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 退货给供应商
 */
@Data
@TableName(value = "returnsupplier")
public class Returnsupplier implements Serializable {
    /*主键*/
    @TableField(value = "id")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    /*药品名称*/
    private String dname;

    /*数量*/
    private Integer dcount;

    /*供应商名称*/
    private String sname;

    /*进货时间*/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date buytime;

    /*退货原因*/
    private String reason;

    /*退货时间*/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date createtime;

    /*进货时间转换成年月日*/
    public String getBuytimeStr(){
        return DateUtil.dateConvert(buytime);
    }

    /*退货时间转换成年月日*/
    public String getCreatetimeStr(){
        return DateUtil.dateConvert(createtime);
    }
}

5.2 创建mapper持久层

package com.dh.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dh.pojo.Returnsupplier;
import org.apache.ibatis.annotations.Mapper;

/**
 * 退货给供应商的增删改查Mapper
 */
@Mapper
public interface ReturnsupplierMapper extends BaseMapper<Returnsupplier> {
}

5.3 创建Service业务层

package com.dh.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dh.pojo.Returnsupplier;

/**
 * 退货给供应商的service接口
 */
public interface ReturnsupplierService extends IService<Returnsupplier> {
    /**
     * 分页查询退货给供应商数据
     * @param pageNum 第几页
     * @param pageSize 每页多少条数据
     * @param param 查询参数-退货给供应商名称
     * @return
     */
    public IPage<Returnsupplier> selectReturnsupplierPage(int pageNum, int pageSize, String param);

    /**
     * 新增一条退货给供应商信息
     * @param returnsupplier
     */
    public int addReturnsupplier(Returnsupplier returnsupplier);

    /**
     * 修改一条退货给供应商信息
     * @param returnsupplier
     */
    public int editReturnsupplier(Returnsupplier returnsupplier);

    /**
     * 根据主键id查询一个退货给供应商对象
     * @param id
     * @return
     */
    public Returnsupplier queryReturnsupplierById(Integer id);

    /**
     * 根据主键id删除一个退货给供应商对象
     * @param id
     * @return
     */
    public int delReturnsupplierById(Integer id);

}

Impl实现类

package com.dh.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dh.mapper.ReturnsupplierMapper;
import com.dh.pojo.Returnsupplier;
import com.dh.service.ReturnsupplierService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 退货给供应商service实现类
 */
@Service
public class ReturnsupplierServiceImpl extends ServiceImpl<ReturnsupplierMapper, Returnsupplier> implements ReturnsupplierService {

    @Autowired
    private ReturnsupplierMapper returnsupplierMapper;

    /**
     * 分页查询退货给供应商数据
     *
     * @param pageNum  第几页
     * @param pageSize 每页多少条数据
     * @param param    查询参数-退货给供应商名称
     * @return
     */
    @Override
    public IPage<Returnsupplier> selectReturnsupplierPage(int pageNum, int pageSize, String param) {
        QueryWrapper<Returnsupplier> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(param)){
            queryWrapper.like("dname",param);
        }
        Page<Returnsupplier> page = new Page<>(pageNum,pageSize);
        return returnsupplierMapper.selectPage(page,queryWrapper);
    }

    /**
     * 新增一条退货给供应商信息
     *
     * @param returnsupplier
     */
    @Override
    public int addReturnsupplier(Returnsupplier returnsupplier) {
        return returnsupplierMapper.insert(returnsupplier);
    }

    /**
     * 修改一条退货给供应商信息
     *
     * @param returnsupplier
     */
    @Override
    public int editReturnsupplier(Returnsupplier returnsupplier) {
        return returnsupplierMapper.updateById(returnsupplier);
    }

    /**
     * 根据主键id查询一个退货给供应商对象
     *
     * @param id
     * @return
     */
    @Override
    public Returnsupplier queryReturnsupplierById(Integer id) {
        return returnsupplierMapper.selectById(id);
    }

    /**
     * 根据主键id删除一个退货给供应商对象
     *
     * @param id
     * @return
     */
    @Override
    public int delReturnsupplierById(Integer id) {
        return returnsupplierMapper.deleteById(id);
    }

}

5.4 创建controller控制层

package com.dh.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dh.common.ResultMapUtil;
import com.dh.pojo.Returnsupplier;
import com.dh.service.ReturnsupplierService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 退货给供应商相关的controller
 */
@Controller
@RequestMapping(value = "/returnsupplier")
public class ReturnsupplierController {

    @Autowired
    private ReturnsupplierService returnsupplierService;

    /**
     * 转向退货给供应商页面
     */
    @RequestMapping
    public String returnsupplier(){
        return "/returnsupplier";
    }

    /**
     * 分页查询退货给供应商列表
     */
    @RequestMapping(value = "/returnsupplierQueryPage")
    @ResponseBody
    public Object returnsupplierQueryPage(String param, @RequestParam(defaultValue = "1")int pageNum,@RequestParam(defaultValue = "10")int pageSize){
        try{
            IPage<Returnsupplier> iPage = returnsupplierService.selectReturnsupplierPage(pageNum,pageSize,param);
            return ResultMapUtil.getHashMapMysqlPage(iPage);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向退货给供应商新增页面
     */
    @RequestMapping(value = "/returnsupplierPage")
    public String returnsupplierPage(){
        return "/returnsupplierPage";
    }

    /**
     * 添加一个退货给供应商
     */
    @RequestMapping(value = "/returnsupplierAdd")
    @ResponseBody
    public Object returnsupplierAdd(Returnsupplier returnsupplier){
        try{
            int i = returnsupplierService.addReturnsupplier(returnsupplier);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向退货给供应商编辑页面
     */
    @RequestMapping(value = "/returnsupplierQueryById")
    public String returnsupplierQueryById(@RequestParam(name = "id",required = true)Integer id, Model model){
        Returnsupplier returnsupplier = returnsupplierService.queryReturnsupplierById(id);
        model.addAttribute("obj",returnsupplier);
        return "/returnsupplierPage";
    }

    /**
     * 修改一个退货给供应商
     */
    @RequestMapping(value = "/returnsupplierEdit")
    @ResponseBody
    public Object returnsupplierEdit(Returnsupplier returnsupplier){
        try{
            int i = returnsupplierService.editReturnsupplier(returnsupplier);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 删除一个退货给供应商
     */
    @RequestMapping(value = "/returnsupplierDelById")
    @ResponseBody
    public Object returnsupplierDelById(Integer id){
        try{
            int i = returnsupplierService.delReturnsupplierById(id);
            return ResultMapUtil.getHashMapDel(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }
}

六、编写供应商退货页面

6.1 供应商退货页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>退货给供应商管理</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
    <script type="text/html" id="indexTpl">
        {{d.LAY_TABLE_INDEX+1}}
    </script>
</head>
<body class="layui-layout-body">
<div class="layui-fluid">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-header">退货给供应商列表</div>
                <div class="layui-card-body">
                    <table class="layui-hide" id="main-table" lay-filter="main-table"></table>
                    <script type="text/html" id="toolbarDemo">
                        <span class="layui-inline" lay-event="add"><i class="layui-icon">&#xe654;</i> </span>
                        <span class="layui-inline" style="width: 240px;">
                                <input class="layui-input" name="param" id="param" placeholder="根据药品名称查询" autocomplete="off">
                            </span>
                        <span class="layui-btn layui-btn-sm layui-bg-red" lay-event="querySearch">
                                <i class="layui-icon">&#xe615;</i>查询
                            </span>
                    </script>
                    <script type="text/html" id="barDemo">
                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                    </script>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['table','form'],function () {
        var $ = layui.$;
        var table = layui.table;
        table.render({
            elem: '#main-table',
            height: 650,
            url: '/returnsupplier/returnsupplierQueryPage',
            method: 'POST',
            page: true,
            id: 'table-load',
            toolbar: '#toolbarDemo',
            cols: [
                [
                    {title: '序号',templet: '#indexTpl',width: 60,align:'center'},
                    {field:'dname',title:'药品名称',algin:'center'},
                    {field:'dcount',title:'数量',algin:'center'},
                    {field:'sname',title:'供应商',algin:'center'},
                    {field:'buytime',title:'进货时间',algin:'center',
                        templet:"<div>{{layui.util.toDateString(d.buytime,'yyyy-MM-dd')}}</div>"},
                    {field:'reason',title:'退货原因',algin:'center'},
                    {field:'createtime',title:'操作时间',algin:'center',
                        templet:"<div>{{layui.util.toDateString(d.createtime,'yyyy-MM-dd')}}</div>"},
                    {title:'操作',align:'center',toolbar:'#barDemo',fixed:'right'}
                ]
            ]
        });

        //监听头工具栏事件
        table.on('toolbar(main-table)',function (obj) {
            switch (obj.event) {
                case 'add':
                    layer.open({
                        type: 2,
                        title: '新增退货给供应商',
                        content: '/returnsupplier/returnsupplierPage',
                        shade:[0.8,'#393d49'],
                        area:['600px','530px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/returnsupplier/returnsupplierAdd',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'querySearch':
                    var param = $('#param').val();
                    table.reload('table-load',{
                        where: {
                            param: param
                        }
                    });
                    $('#param').val(param);
                    break;
            }
        });

        //监听编辑、删除
        table.on('tool(main-table)',function (obj) {
            var data = obj.data;
            switch (obj.event) {
                case 'edit':
                    layer.open({
                        type: 2,
                        title: '编辑退货给供应商',
                        content: '/returnsupplier/returnsupplierQueryById?id=' +data.id,
                        shade:[0.8,'#393d49'],
                        area:['600px','500px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/returnsupplier/returnsupplierEdit',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'del':
                    layer.confirm('确认要删除吗?',function (index) {
                        $.ajax({
                            url: '/returnsupplier/returnsupplierDelById?id=' +data.id,
                            data: null,
                            async: false,
                            cache: false,
                            success: function (str) {
                                table.reload('table-load');
                                layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                            }
                        });
                    })
                    break;
            }
        });
    });
</script>
</body>
</html>

6.2 供应商退货编辑页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>退货给供应商</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body" style="padding: 15px;">
            <form class="layui-form layui-form-pane" action="">
                <input name="id" th:value="${obj?.id}" class="layui-input layui-hide"/>
                <div class="layui-form-item">
                    <label class="layui-form-label">药品名称</label>
                    <div class="layui-input-block">
                        <select name="dname" id="dname"></select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">数量</label>
                    <div class="layui-input-block">
                        <input type="text" name="dcount" th:value="${obj?.dcount}" lay-verify="required" placeholder="请输入数量" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">供应商</label>
                    <div class="layui-input-block">
                        <input type="text" name="sname" th:value="${obj?.sname}" lay-verify="required" placeholder="请输入供应商" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">进货时间</label>
                    <div class="layui-input-block">
                        <input type="text" readonly name="buytime" id="buytime" th:value="${obj?.buytimeStr}" lay-verify="required" placeholder="请输入进货时间" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">退货原因</label>
                    <div class="layui-input-block">
                        <textarea name="reason" th:text="${obj?.reason}" lay-verify="required" placeholder="请输入退货原因" autocomplete="off" class="layui-textarea"></textarea>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">退货时间</label>
                    <div class="layui-input-block">
                        <input type="text" readonly name="createtime" id="createtime" th:value="${obj?.createtimeStr}" lay-verify="required" placeholder="请输入退货时间" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item layui-hide">
                    <input type="button" lay-submit lay-filter="LAY-front-submit" id="LAY-front-submit" value="确认">
                </div>
            </form>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['form','laydate'],function () {
        var $ = layui.$;
        var laydate = layui.laydate;
        var form = layui.form;

        //支持日期控件
        laydate.render({
            elem: '#buytime',
            trigger: 'click'
        });
        laydate.render({
            elem: '#createtime',
            trigger: 'click'
        });

        //当前药品的值
        var currentDname = '[[${obj?.dname}]]';
        //获取供应商列表
        $.ajax({
            url: '/druginfo/druginfoList',
            dataType:'json',
            type:'post',
            cache:false,
            success:function (data) {
                $('#dname').prepend("<option value=''>请选择</option>");
                for(var i=0;i<data.data.length;i++){
                    if(data.data[i].name==currentDname){
                        $('#dname').append("<option selected value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }else{
                        $('#dname').append("<option value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }
                }
                form.render();          //下拉列表渲染,把内容加载进去
            }
        });
    });
</script>
</body>
</html>

6.3 运行测试

在这里插入图片描述

七、供应商账单信息

修改表字段buytime
在这里插入图片描述

7.1 创建pojo实体类

package com.dh.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dh.common.DateUtil;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 账单信息
 */
@Data
@TableName(value = "billinfo")
public class Billinfo implements Serializable {
    /*主键*/
    @TableField(value = "id")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    /*供应商名称*/
    private String sname;

    /*药品名称*/
    private String dname;

    /*数量*/
    private Integer count;

    /*总金额*/
    private Float total;

    /*进货时间*/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date buytime;

    /*操作时间转换成年月日*/
    public String getBuytimeStr(){
        return DateUtil.dateConvert(buytime);
    }
}

7.2 创建mapper持久层

package com.dh.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dh.pojo.Billinfo;
import org.apache.ibatis.annotations.Mapper;

/**
 * 账单信息的增删改查Mapper
 */
@Mapper
public interface BillinfoMapper extends BaseMapper<Billinfo> {
}

7.3 创建Service业务层

package com.dh.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dh.pojo.Billinfo;

/**
 * 账单信息的service接口
 */
public interface BillinfoService extends IService<Billinfo> {
    /**
     * 分页查询账单信息数据
     * @param pageNum 第几页
     * @param pageSize 每页多少条数据
     * @param param 查询参数-账单信息名称
     * @return
     */
    public IPage<Billinfo> selectBillinfoPage(int pageNum, int pageSize, String param);

    /**
     * 新增一条账单信息信息
     * @param billinfo
     */
    public int addBillinfo(Billinfo billinfo);

    /**
     * 修改一条账单信息信息
     * @param billinfo
     */
    public int editBillinfo(Billinfo billinfo);

    /**
     * 根据主键id查询一个账单信息对象
     * @param id
     * @return
     */
    public Billinfo queryBillinfoById(Integer id);

    /**
     * 根据主键id删除一个账单信息对象
     * @param id
     * @return
     */
    public int delBillinfoById(Integer id);

}

实现类

package com.dh.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dh.mapper.BillinfoMapper;
import com.dh.pojo.Billinfo;
import com.dh.service.BillinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 账单信息service实现类
 */
@Service
public class BillinfoServiceImpl extends ServiceImpl<BillinfoMapper, Billinfo> implements BillinfoService {

    @Autowired
    private BillinfoMapper billinfoMapper;

    /**
     * 分页查询账单信息数据
     *
     * @param pageNum  第几页
     * @param pageSize 每页多少条数据
     * @param param    查询参数-账单信息名称
     * @return
     */
    @Override
    public IPage<Billinfo> selectBillinfoPage(int pageNum, int pageSize, String param) {
        QueryWrapper<Billinfo> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(param)){
            //根据供应商名称精确查询
            queryWrapper.eq("sname",param);
        }
        Page<Billinfo> page = new Page<>(pageNum,pageSize);
        return billinfoMapper.selectPage(page,queryWrapper);
    }

    /**
     * 新增一条账单信息信息
     *
     * @param billinfo
     */
    @Override
    public int addBillinfo(Billinfo billinfo) {
        return billinfoMapper.insert(billinfo);
    }

    /**
     * 修改一条账单信息信息
     *
     * @param billinfo
     */
    @Override
    public int editBillinfo(Billinfo billinfo) {
        return billinfoMapper.updateById(billinfo);
    }

    /**
     * 根据主键id查询一个账单信息对象
     *
     * @param id
     * @return
     */
    @Override
    public Billinfo queryBillinfoById(Integer id) {
        return billinfoMapper.selectById(id);
    }

    /**
     * 根据主键id删除一个账单信息对象
     *
     * @param id
     * @return
     */
    @Override
    public int delBillinfoById(Integer id) {
        return billinfoMapper.deleteById(id);
    }

}

7.4 创建controller控制层

package com.dh.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dh.common.ResultMapUtil;
import com.dh.pojo.Billinfo;
import com.dh.service.BillinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 账单信息相关的controller
 */
@Controller
@RequestMapping(value = "/billinfo")
public class BillinfoController {

    @Autowired
    private BillinfoService billinfoService;

    /**
     * 转向账单信息页面
     */
    @RequestMapping
    public String billinfo(){
        return "/billinfo";
    }

    /**
     * 分页查询账单信息列表
     */
    @RequestMapping(value = "/billinfoQueryPage")
    @ResponseBody
    public Object billinfoQueryPage(String param, @RequestParam(defaultValue = "1")int pageNum,@RequestParam(defaultValue = "10")int pageSize){
        try{
            IPage<Billinfo> iPage = billinfoService.selectBillinfoPage(pageNum,pageSize,param);
            return ResultMapUtil.getHashMapMysqlPage(iPage);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向账单信息新增页面
     */
    @RequestMapping(value = "/billinfoPage")
    public String billinfoPage(){
        return "/billinfoPage";
    }

    /**
     * 添加一个账单信息
     */
    @RequestMapping(value = "/billinfoAdd")
    @ResponseBody
    public Object billinfoAdd(Billinfo billinfo){
        try{
            int i = billinfoService.addBillinfo(billinfo);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 转向账单信息编辑页面
     */
    @RequestMapping(value = "/billinfoQueryById")
    public String billinfoQueryById(@RequestParam(name = "id",required = true)Integer id, Model model){
        Billinfo billinfo = billinfoService.queryBillinfoById(id);
        model.addAttribute("obj",billinfo);
        return "/billinfoPage";
    }

    /**
     * 修改一个账单信息
     */
    @RequestMapping(value = "/billinfoEdit")
    @ResponseBody
    public Object billinfoEdit(Billinfo billinfo){
        try{
            int i = billinfoService.editBillinfo(billinfo);
            return ResultMapUtil.getHashMapSave(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }

    /**
     * 删除一个账单信息
     */
    @RequestMapping(value = "/billinfoDelById")
    @ResponseBody
    public Object billinfoDelById(Integer id){
        try{
            int i = billinfoService.delBillinfoById(id);
            return ResultMapUtil.getHashMapDel(i);
        } catch (Exception e){
            return ResultMapUtil.getHashMapException(e);
        }
    }
}

八、供应商账单页面

8.1 编写供应商账单信息页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>账单信息管理</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
    <script type="text/html" id="indexTpl">
        {{d.LAY_TABLE_INDEX+1}}
    </script>
</head>
<body class="layui-layout-body">
<div class="layui-fluid">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-header">账单信息列表</div>
                <div class="layui-card-body">
                    <table class="layui-hide" id="main-table" lay-filter="main-table"></table>
                    <script type="text/html" id="toolbarDemo">
                        <span class="layui-inline" lay-event="add"><i class="layui-icon">&#xe654;</i> </span>
                        <span class="layui-inline" style="width: 240px;">
                                <input class="layui-input" name="param" id="param" placeholder="根据供应商名称查询" autocomplete="off">
                            </span>
                        <span class="layui-btn layui-btn-sm layui-bg-red" lay-event="querySearch">
                                <i class="layui-icon">&#xe615;</i>查询
                            </span>
                    </script>
                    <script type="text/html" id="barDemo">
                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                    </script>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['table','form'],function () {
        var $ = layui.$;
        var table = layui.table;
        table.render({
            elem: '#main-table',
            height: 650,
            url: '/billinfo/billinfoQueryPage',
            method: 'POST',
            page: true,
            id: 'table-load',
            toolbar: '#toolbarDemo',
            cols: [
                [
                    {title: '序号',templet: '#indexTpl',width: 60,align:'center'},
                    {field:'sname',title:'供应商',algin:'center'},
                    {field:'dname',title:'药品名称',algin:'center'},
                    {field:'count',title:'数量',algin:'center'},
                    {field:'total',title:'金额',algin:'center'},
                    {field:'buytime',title:'进货时间',algin:'center',
                        templet:"<div>{{layui.util.toDateString(d.buytime,'yyyy-MM-dd')}}</div>"},
                    {title:'操作',align:'center',toolbar:'#barDemo',fixed:'right'}
                ]
            ]
        });

        //监听头工具栏事件
        table.on('toolbar(main-table)',function (obj) {
            switch (obj.event) {
                case 'add':
                    layer.open({
                        type: 2,
                        title: '新增账单信息',
                        content: '/billinfo/billinfoPage',
                        shade:[0.8,'#393d49'],
                        area:['600px','530px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/billinfo/billinfoAdd',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'querySearch':
                    var param = $('#param').val();
                    table.reload('table-load',{
                        where: {
                            param: param
                        }
                    });
                    $('#param').val(param);
                    break;
            }
        });

        //监听编辑、删除
        table.on('tool(main-table)',function (obj) {
            var data = obj.data;
            switch (obj.event) {
                case 'edit':
                    layer.open({
                        type: 2,
                        title: '编辑账单信息',
                        content: '/billinfo/billinfoQueryById?id=' +data.id,
                        shade:[0.8,'#393d49'],
                        area:['600px','500px'],
                        btn:['确定','取消'],
                        yes:function (index,layero) {
                            var iframeWindow = window['layui-layer-iframe'+index];
                            var submit = layero.find('iframe').contents().find("#LAY-front-submit");
                            //监听提交
                            iframeWindow.layui.form.on('submit(LAY-front-submit)',function (data) {
                                var field = data.field;
                                $.ajax({
                                    url: '/billinfo/billinfoEdit',
                                    data: field,
                                    async: false,
                                    cache: false,
                                    success: function (str) {
                                        if(str.code === 0){
                                            table.reload('table-load');
                                        }
                                        layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                                    }
                                });
                                layer.close(index);     //关闭弹层
                            });
                            submit.trigger('click');
                        },
                        success:function (layero,index) {

                        }
                    });
                    break;
                case 'del':
                    layer.confirm('确认要删除吗?',function (index) {
                        $.ajax({
                            url: '/billinfo/billinfoDelById?id=' +data.id,
                            data: null,
                            async: false,
                            cache: false,
                            success: function (str) {
                                table.reload('table-load');
                                layer.msg(str.msg,{icon:str.icon,anim:str.anim});
                            }
                        });
                    })
                    break;
            }
        });
    });
</script>
</body>
</html>

8.2 编写账单的编辑页面

<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>账单信息</title>
    <link rel="stylesheet" th:href="@{/static/layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/static/admin/style.css}" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body" style="padding: 15px;">
            <form class="layui-form layui-form-pane" action="">
                <input name="id" th:value="${obj?.id}" class="layui-input layui-hide"/>
                <div class="layui-form-item">
                    <label class="layui-form-label">供应商</label>
                    <div class="layui-input-block">
                        <select name="sname" id="sname"></select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">药品名称</label>
                    <div class="layui-input-block">
                        <select name="dname" id="dname"></select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">数量</label>
                    <div class="layui-input-block">
                        <input type="text" name="count" th:value="${obj?.count}" lay-verify="required" placeholder="请输入数量" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">总金额</label>
                    <div class="layui-input-block">
                        <input type="text" name="total" th:value="${obj?.total}" lay-verify="required" placeholder="请输入总金额" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">进货时间</label>
                    <div class="layui-input-block">
                        <input type="text" readonly name="buytime" id="buytime" th:value="${obj?.buytimeStr}" lay-verify="required" placeholder="请输入进货时间" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item layui-hide">
                    <input type="button" lay-submit lay-filter="LAY-front-submit" id="LAY-front-submit" value="确认">
                </div>
            </form>
        </div>
    </div>
</div>
<script th:src="@{/static/layui/layui.js}"></script>
<script>
    layui.use(['form','laydate'],function () {
        var $ = layui.$;
        var laydate = layui.laydate;
        var form = layui.form;

        //支持日期控件
        laydate.render({
            elem: '#buytime',
            trigger: 'click'
        });

        //当前供应商的值
        var currentSname = '[[${obj?.sname}]]';
        //获取供应商列表
        $.ajax({
            url: '/supplier/supplierList',
            dataType:'json',
            type:'post',
            cache:false,
            success:function (data) {
                $('#sname').prepend("<option value=''>请选择</option>");
                for(var i=0;i<data.data.length;i++){
                    if(data.data[i].name==currentSname){
                        $('#sname').append("<option selected value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }else{
                        $('#sname').append("<option value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }
                }
                form.render();          //下拉列表渲染,把内容加载进去
            }
        });

        //当前药品的值
        var currentDname = '[[${obj?.dname}]]';
        //获取药品列表
        $.ajax({
            url: '/druginfo/druginfoList',
            dataType:'json',
            type:'post',
            cache:false,
            success:function (data) {
                $('#dname').prepend("<option value=''>请选择</option>");
                for(var i=0;i<data.data.length;i++){
                    if(data.data[i].name==currentDname){
                        $('#dname').append("<option selected value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }else{
                        $('#dname').append("<option value='"+data.data[i].name+"'>"+data.data[i].name+"</option>");
                    }
                }
                form.render();          //下拉列表渲染,把内容加载进去
            }
        });
    });
</script>
</body>
</html>

8.3 运行测试

在这里插入图片描述


所有功能以完成,后续可以自行扩展修改!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值