概念
本文在供应商管理功能之后,继续讲解订单管理功能,该功能是由普通员工与供应商之间的订单进货,经理进行监管等等。
需求分析
订单管理: 1.如果系统管理员登录,操作订单管理没有权限 2.如果经理登录,允许查看所有员工所谈下来的所有订单,修改,删除 3.普通员工登录,员工添加订单,并只能查看自己谈下来的订单
功能实现
当用户登录系统后,点击订单管理功能时,进行判断当前用户的身份,根据不同用户发出不同的请求:
function ddgl() {
var input=document.getElementById("hidd");
var i=input.value;
switch (i) {
case "2":
//经理,只能查看所有订单,修改订单,删除订单,不能添加订单
location.href="GetBills.do";
break;
case "3":
//普通员工,添加订单和查询自己的订单
location.href="GetBillsByUserId.do";
break;
default:
//管理员身份不允许操作该功能
alert("当前登录的员工不具备该功能的操作权限");
break;
}
}
普通员工查询自身订单信息
?当普通员工进入系统后,操作订单管理功能,则想控制器发出GetBillsByUserId.do请求,因此,我们需要在控制层中建立操作订单表的控制器BillController类,并定义方法接收该请求:
package com.smbms.controller;
import com.smbms.service.IBillService;
import com.smbms.service.IProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class BillController {
@Autowired
IBillService bService;
//定义方法,用于普通员工操作订单管理功能,查看自己的订单信息
@RequestMapping("/GetBillsByUserId.do")
public ModelAndView GetBillsByUserId(HttpSession session){
//根据普通员工的主键id作为条件查询该普通员工自己的订单信息
Map<String,Object> map= (Map<String, Object>) session.getAttribute("userInfo");
long userId= (long) map.get("id");
List<Map<String, Object>> billsById = bService.getBillsById(userId);
ModelAndView mav=new ModelAndView();
mav.addObject("bills",billsById);
mav.setViewName("billList");
return mav;
}
}
在控制器中,通过登录保存的用户的个人信息中获得给普通员工的id作为查询订单表的条件,并将给用户id发送给service层中的IBillService接口中的方法:
package com.smbms.service;
import java.util.List;
import java.util.Map;
public interface IBillService {
//根据普通员工的id作为条件查询订单表
List<Map<String,Object>> getBillsById(long userId);
}
该接口将接收到的用户id发送给service的实现类BillServiceImp中实现该方法:
package com.smbms.service;
import com.smbms.dao.IBillDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service(value = "bService")
public class BillServiceImp implements IBillService {
@Autowired
IBillDao dao;
@Override
public List<Map<String, Object>> getBillsById(long userId) {
return dao.getBillById(userId);
}
}
实现类将用户id发送给dao层的IBillDao接口完成根据用户id查询订单信息的功能:
public interface IBillDao {
//根据普通员工的id作为条件查询订单表,将该员工自己的订单信息查询出来
@Select("select smbms_bill.id,smbms_bill.billCode," +
"smbms_bill.productName,smbms_bill.productDesc," +
"smbms_bill.productCount,smbms_bill.productUnit," +
"smbms_bill.totalPrice,smbms_bill.isPayment," +
"smbms_provider.proName,smbms_bill.creationDate " +
"from smbms_provider,smbms_bill " +
"where smbms_bill.providerId=smbms_provider.id " +
"and smbms_bill.createdBy=#{userId}")
List<Map<String,Object>> getBillById(@Param("userId")long userId);
}
根据需求的功能要求进行订单表和用户表的多表联查获得需要展示在页面的数据信息,并将查询的数据封装后返回给控制器,控制器将数据发送给billList.jsp页面显示:
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--订单列表</title>
<style type="text/css">
tr {
height: 40px;
}
</style>
</head>
<body>
<div style="width: 1800px;height: 1000px;margin: auto;">
<div style="width: 100%;height: 160px;background-color:skyblue;">
<div style="width: 100%;height: 20px;">
<div align="left" style="width: 20%;height: 100%;float: left;" >
<a href="home.do" style="text-decoration: none;">返回首页</a>
</div>
<div align="right" style="width: 80%;height: 100%;float: right;">
<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
<a href="index.do" style="text-decoration: none;">注销</a>
</div>
</div>
<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
</div>
<% List<Map<String,Object>> list=(List<Map<String,Object>>)request.getAttribute("bills"); %>
<div align="center" style="width: 100%;height: 840px;background-color: pink;overflow: scroll;">
<div align="left" style="height: 40px;" >
<a href="toAddBill.do" style="text-decoration: none;
text-align:center; width: 50px;
height: 20px;
color: white;font-weight: bold;
margin-top:20px;margin-left:10px;
border-radius: 5px;">添加订单</a>
</div>
<!-- 当前普通员工是否有谈下过订单信息,如果没有,显示暂无信息,如果有,展示该员工的所有订单 -->
<% if(list==null||list.size()==0){ %>
<div style="width: 98%;text-align: center;height: 800px;">
当前暂无订单信息
</div>
<%}else { %>
<table border="1" style="width: 98%;text-align: center;border-collapse: collapse;">
<tr>
<td>序号</td>
<td>账单编码</td>
<td>商品名称</td>
<td>商品描述</td>
<td>商品数量</td>
<td>商品单位</td>
<td>商品总额</td>
<td>是否支付</td>
<td>供应商名称</td>
<td>创建时间</td>
</tr>
<% for(int i=0;i<list.size();i++){ %>
<tr>
<td ><%=i+1 %></td>
<td><%=list.get(i).get("billCode") %></td>
<td><%=list.get(i).get("productName") %></td>
<td><%=list.get(i).get("productDesc") %></td>
<td><%=list.get(i).get("productCount") %></td>
<td><%=list.get(i).get("productUnit") %></td>
<td><%=list.get(i).get("totalPrice")%>元</td>
<% int type=(int)list.get(i).get("isPayment"); %>
<% if(type==1){ %>
<td ><a href="UpdatePayBill.do?id=<%=list.get(i).get("id") %>"><input type="button" value="未支付" style="color: white;border: none;background-color: red;border-radius: 5px;font-weight: bold;"></a></td>
<%}else if(type==2){ %>
<td style="color:green;">已支付</td>
<%} %>
<td><%=list.get(i).get("proName")%></td>
<td><%=list.get(i).get("creationDate")%></td>
</tr>
<%} %>
</table>
<%} %>
</div>
</div>
</body>
</html>
其界面效果如下:
普通员工完成支付功能?
当用户点击“未支付”按钮时,完成该订单的支付,修改支付状态,向控制器发送UpdatePayBill.do请求,并将该订单的主键id作为条件发送给控制器,控制器中定义方法接收该请求,
//定义方法,用于根据订单的主键id去修改支付的状态
@RequestMapping("/UpdatePayBill.do")
public String UpdatePayBill(@RequestParam long id){
int i = bService.updatePay(id);
String url="";
if (i>0)
//已修改支付状态,页面需要刷新
url="redirect:GetBillsByUserId.do";
return url;
}
?控制器接收到请求后获得主键id,并将其传输给service的接口:
int updatePay(long id);
service接口将该数据传输给service的实现类:
@Override
public int updatePay(long id) {
return dao.updatePay(id);
}
实现类将数据发送给dao层完成修改支付状态的sql语句操作,并将修改后的结果返回给控制器:
//根据订单的主键id修改支付状态
@Update("update smbms_bill set isPayment=2 where id=#{id}")
int updatePay(@Param("id")long id);
控制器根据返回值进行判断,并刷新订单列表页面,即可看到修改的状态变为“已支付”的字样,说明修改成功。
普通员工完成添加订单功能
当用户点击“添加订单”触发超链接时,向控制器发送toAddBill.do请求,控制器中定法方法接收该请求,并完成跳转至添加订单的页面:因添加订单需要选择对应的供应商,因此我们需要先获得供应商表中所有供应商的名称列表信息供用户进行选择:
@Autowired
IProviderService pService;
//定义方法,用于跳转至添加订单的页面
@RequestMapping("/toAddBill.do")
public ModelAndView toAddBill(){
//跳转至添加订单的页面之前,需要将所有供应商的名称查询出来
List<Map<String, Object>> providers = pService.getProviders();
ModelAndView mav=new ModelAndView();
mav.addObject("providers",providers);
mav.setViewName("addBill");
return mav;
}
并将供应商信息发送给addBill.jsp页面:
<%@page import="java.util.List"%>
<%@ page import="java.util.Map" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--添加订单</title>
</head>
<body>
<% List<Map<String, Object>> oList=(List<Map<String, Object>>)request.getAttribute("providers"); %>
<div style="width: 1200px;height: 800px;margin: auto;">
<div style="width: 100%;height: 160px;background-color:skyblue;">
<div style="width: 100%;height: 20px;">
<div align="left" style="width: 20%;height: 100%;float: left;" >
<a href="home.do" style="text-decoration: none;">返回首页</a>
</div>
<div align="right" style="width: 80%;height: 100%;float: right;">
<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
<a href="index.do" style="text-decoration: none;">注销</a>
</div>
</div>
<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
</div>
<div align="center" style="width: 100%;height: 640px;background-color: pink;">
<form action="AddBill.do" method="post">
<div style="padding: 5px 0px">
<label for="productName">商品名称:</label>
<input id="productName" name="productName" type="text" placeholder="请输入商品名称" />
</div>
<div style="padding: 5px 0px">
<label >商品描述:</label>
<input type="text" name="productDesc" placeholder="请输入商品描述信息"></input>
</div>
<div style="padding: 5px 0px">
<label >商品数量:</label>
<input type="number" name="productCount" placeholder="请输入商品数量" >
</div>
<div style="padding: 5px 0px">
<label >商品单位:</label>
<input type="text" name="productUnit" placeholder="请输入商品单位">
</div>
<div style="padding: 5px 0px">
<label >商品总额:</label>
<input type="number" name="totalPrice" placeholder="请输入商品总额" >
</div>
<div style="padding: 5px 0px">
<label >供应商名称:</label>
<!-- Html5 新增的表单的新用法 -->
<input type="search" name="proName" placeholder="请输入供应商名称" list="list">
<datalist id="list">
<%
for(int i=0;i<oList.size();i++){
%>
<option><%=oList.get(i).get("proName") %></option>
<%}%>
</datalist>
<%-- <select name="proName">
<%
for(int i=0;i<oList.size();i++){
%>
<option><%=oList.get(i).getProName() %></option>
<%} %>
</select> --%>
</div>
<div style="padding: 5px 0px">
<input type="submit"
value="添加"
style="width: 120px;background-color: green;
border: none;padding: 5px;border-radius: 5px;
color: white;"/>
</div>
</form>
</div>
</div>
</body>
</html>
?其效果如下:
那么当用户填写完订单信息之后,将数据通过AddBill.do发送请求给控制器,控制器中定义方法接收该请求发送过来的新订单的数据,并将数据封装成Map集合,便于传输:
//定义方法,用于接收添加订单的数据信息
@RequestMapping(value = "/AddBill.do",
params = {"productName","productDesc","productCount","productUnit","totalPrice","proName"})
public String AddBill(String productName,String productDesc,double productCount,String productUnit,
double totalPrice,String proName,HttpSession session ){
//定义Map集合,将数据封装,便于传输
Map<String,Object> map=new HashMap<>();
map.put("productName",productName);//商品名称
map.put("productDesc",productDesc);//商品描述
map.put("productCount",productCount);//商品数量
map.put("productUnit",productUnit);//商品单位
map.put("totalPrice",totalPrice);//总金额
map.put("proName",proName);//供应商名称
//缺少的数据需要在业务逻辑层中进行完成
//缺少账单编号billCode:根据当前的年份要自动生成账单编号
//缺少供应商的id: 用已知的供应商名称作为条件查询供应商表对应的供应商的id
//获得当前登录的普通员工的id
map.put("createdBy",((Map<String,Object>)session.getAttribute("userInfo")).get("id"));
//当前添加订单的实时时间
map.put("creationDate",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
int i = bService.addBill(map);
String url="";
if (i>0)
//添加订单成功,刷新列表页面
url="redirect:GetBillsByUserId.do";
return url;
}
?控制器将封装好的新订单的数据发送给service层接口:
//添加订单
int addBill(Map<String,Object> map);
service接口将实现给方法,并在实现方法中完善自定生成订单编号功能;
@Override
public int addBill(Map<String, Object> map) {
//缺少账单编号billCode:根据当前的年份要自动生成账单编号
map.put("billCode",getBillCode());
return dao.add(map);
}
完成根据当前的年份自动生成订单编号的代码如下:
/**
* 功能:自动生成账单编号
* 需求分析:
* 1.当订单表中不存在今年年份的订单时,那么当前添加订单的订单编号就应该为BILL今年的年份_001
* 2.当订单表中存在今年的订单时,从订单表中找出今年的订单的最近添加的订单,最后一个添加的订单
* 然后在该订单的尾号加一,获得的就是我们添加订单的订单编号
* 代码实现思路:
* 1.将订单表中所有订单按订单编号进行降序排列(从大到小排列),取第一条数据,得到的就是整个订单表中最新的订单编号
* select billCode from smbms_bill order by billCode desc LIMIT 0,1
* 2.使用java代码获得今年的年份 2022
* 3.将最新的订单编号进行按“_”进行分割 BILL2022_003 分割成两部分BILL2022 003
* 4.取分割后的第一部分进行截取出年份
* 5.然后将截取出来的年份与今年的年份进行比较,如果不相等,说明整个订单表中不存在今年的年份
* 那么我们添加的订单BILL今年的年份_001
* 6.如果相等,说明订单表中存在今年的年份,取分割后的第二部分,先进行将字符串格式转换成int格式
* 7.然后进行加一
* 8.将加一之后的数字进行判断,是否小于10,前面补两个零,是否小于100,前面补一个零,是否小于1000,不需要补零
* @return
*/
public String getBillCode(){
String billCode="";
//将订单表中所有订单按订单编号进行降序排列(从大到小排列),取第一条数据,得到的就是整个订单表中最新的订单编号
String order = dao.getOrder();
//使用java代码获得今年的年份
String year = new SimpleDateFormat("yyyy").format(new Date());
//将最新的订单编号进行按“_”进行分割
String[] s = order.split("_");
//取分割后的第一部分进行截取出年份
String substring = s[0].substring(4);
//将截取出来的年份与今年的年份进行比较
if (!substring.equals(year)){
//如果不相等,说明订单表中不存在今年的订单
billCode="BILL"+year+"_001";
}else {
//订单表中存在今年的年份,取分割后的第二部分,先进行将字符串格式转换成int格式
int number = Integer.parseInt(s[1]);
//然后进行加一
int newNumber=++number;
billCode="BILL"+year+"_"+zero(newNumber);
}
return billCode;
}
//数字进行判断,是否小于10,前面补两个零,是否小于100,前面补一个零,是否小于1000,不需要补零
public String zero(int newNumber){
String n="";
if (newNumber<10){
n="00"+newNumber;
}else if (newNumber<100){
n="0"+newNumber;
}else if (newNumber<1000){
n=""+newNumber;
}
return n;
}
接着service将新订单的数据发送给dao层,完成添加功能,但应该订单表中要求添加供应商id,而我们只能获得供应商名称,因此我们在完成添加的sql语句之前需要做子查询将供应商id获得出来:
//将整个订单表做降序排列
@Select("select billCode from smbms_bill order by billCode desc LIMIT 0,1")
String getOrder();
//添加订单
@Insert("insert into smbms_bill(smbms_bill.billCode,smbms_bill.productName," +
"smbms_bill.productDesc,smbms_bill.productCount,smbms_bill.productUnit," +
"smbms_bill.totalPrice,smbms_bill.createdBy,smbms_bill.creationDate," +
"smbms_bill.providerId) " +
"values(#{billCode},#{productName},#{productDesc},#{productCount}," +
"#{productUnit},#{totalPrice},#{createdBy},#{creationDate}," +
"(select smbms_provider.id " +
"from smbms_provider " +
"where smbms_provider.proName=#{proName} LIMIT 0,1)" +
")")
int add(Map<String,Object> map);
那么添加成功后将返回值会返回给控制器进行判断,并通过判断刷新订单类表页面。
经理操作订单管理查看所有员工的订单信息
当经理身份的用户点击”订单管理“功能时,发送GetBills.do请求给控制器,控制器需要定义方法接收该请求,并向业务逻辑层发出任务,获得所有订单列表信息的数据:
List<Map<String, Object>> bills=null;
//定义方法,用于经理查看所有订单信息
@RequestMapping("/GetBills.do")
public ModelAndView GetBills(){
bills = bService.getBills();
ModelAndView mav=new ModelAndView();
mav.addObject("bills",bills);
mav.setViewName("billList2");
return mav;
}
service从接收控制器的任务:
//获得所有订单信息
List<Map<String,Object>> getBills();
实现类中实现该方法:
@Override
public List<Map<String, Object>> getBills() {
return dao.getBills();
}
并将该任务发送给dao层中完成查询所有订单的功能,但因页面要求展示的数据涉及订单表,供应商表,用户表,因此我们的sql语句需要做三表联查:
//经理查询所有订单信息,完成三表联查
@Select("select smbms_bill.id,smbms_bill.billCode,smbms_bill.productName,smbms_bill.productDesc," +
"smbms_bill.productCount,smbms_bill.productUnit,smbms_bill.totalPrice,smbms_bill.isPayment," +
"smbms_user.userName,smbms_provider.proName,smbms_bill.creationDate,smbms_bill.modifyDate " +
"from smbms_bill,smbms_provider,smbms_user " +
"WHERE smbms_bill.createdBy=smbms_user.id and smbms_bill.providerId=smbms_provider.id")
List<Map<String,Object>> getBills();
最后将查询获得的数据返回给控制层,控制层将数据发送给billList2.jsp页面上进行显示:
<%@page import="com.github.pagehelper.PageInfo"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--订单列表</title>
<style type="text/css">
tr {
height: 40px;
}
</style>
</head>
<body>
<% //PageInfo pi=(PageInfo)request.getAttribute("bills"); %>
<div style="width: 1800px;height: 1000px;margin: auto;">
<div style="width: 100%;height: 160px;background-color:skyblue;">
<div style="width: 100%;height: 20px;">
<div align="left" style="width: 20%;height: 100%;float: left;" >
<a href="home.do" style="text-decoration: none;">返回首页</a>
</div>
<div align="right" style="width: 80%;height: 100%;float: right;">
<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
<a href="index.do" style="text-decoration: none;">注销</a>
</div>
</div>
<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
</div>
<% //List<Map<String,Object>> list=pi.getList(); %>
<% List<Map<String,Object>> list= (List<Map<String, Object>>) request.getAttribute("bills");%>
<div align="center" style="width: 100%;height: 840px;background-color: pink;overflow: scroll;">
<!-- 当前普通员工是否有谈下过订单信息,如果没有,显示暂无信息,如果有,展示该员工的所有订单 -->
<% if(list==null||list.size()==0){ %>
<div style="width: 98%;text-align: center;height: 800px;">
当前暂无订单信息
</div>
<%}else { %>
<table border="1" style="width: 98%;text-align: center;border-collapse: collapse;">
<tr>
<td>主键Id</td>
<td>账单编码</td>
<td>商品名称</td>
<td>商品描述</td>
<td>商品数量</td>
<td>商品单位</td>
<td>商品总额</td>
<td>是否支付</td>
<td>员工姓名</td>
<td>供应商名称</td>
<td>创建时间</td>
<td>修改时间</td>
<td>操作</td>
</tr>
<% for(int i=0;i<list.size();i++){ %>
<tr>
<td ><%=list.get(i).get("id") %></td>
<td><%=list.get(i).get("billCode") %></td>
<td><%=list.get(i).get("productName") %></td>
<td><%=list.get(i).get("productDesc") %></td>
<td><%=list.get(i).get("productCount") %></td>
<td><%=list.get(i).get("productUnit") %></td>
<td><%=list.get(i).get("totalPrice")%>元</td>
<% int type=(int)list.get(i).get("isPayment"); %>
<% if(type==1){ %>
<td style="color:red;">未支付</td>
<%}else if(type==2){ %>
<td style="color:green;">已支付</td>
<%} %>
<td><%=list.get(i).get("userName") %></td>
<td><%=list.get(i).get("proName")%></td>
<td><%=list.get(i).get("creationDate")%></td>
<%
String time="";
if(list.get(i).get("modifyDate")==null){
time="暂未修改";
}else if("null".equals(list.get(i).get("modifyDate"))){
time="暂未修改";
}else{
time=list.get(i).get("modifyDate").toString();
}
%>
<td><%=time %></td>
<td>
<a href="GetBillByIndex.do?index=<%=i%>"><input type="button" value="修改" style="background-color: green;border: none;border-radius: 5px;color: white;"></a>
<a href="DeleteBill.do?id=<%=list.get(i).get("id") %>"><input type="button" value="删除" style="background-color: red;border: none;border-radius: 5px;color: white;"></a>
</td>
</tr>
<%} %>
</table>
<!-- 分页页码导航栏 -->
<%--<br>
<div align="center">
<!-- 判断当前页是否存在上一页,不存在则不显示上一页的按钮 -->
<%if(pi.getPrePage()>0){ %>
<a href="GetBills.do?ym=<%=pi.getPrePage()%>"><input type="button" value="上一页"/></a>
<%} %>
<% for(int i:pi.getNavigatepageNums()){ %>
<a href="GetBills.do?ym=<%=i%>"><%=i %></a>
<%} %>
<!-- 判断当前页是否存在下一页,不存在则不显示下一页的按钮 -->
<% if(pi.getPageNum()<pi.getLastPage()){ %>
<a href="GetBills.do?ym=<%=pi.getNextPage()%>"><input type="button" value="下一页"/></a>
<%} %>
</div>--%>
<%} %>
</div>
</div>
</body>
</html>
其效果图如下:
经理修改订单信息
?当经理点击某一个修改按钮时,向控制器发出GetBillByIndex.do请求,并将该订单信息对应的下标发送给控制器,控制器根据下标从集合中获得要修改的订单信息以及供用户选择的供应商列表信息,
//定义方法,接收请求以及携带的下标
@RequestMapping("/GetBillByIndex.do")
public ModelAndView GetBillByIndex(@RequestParam int index){
Map<String, Object> map = bills.get(index);
//获得所有供应商的信息,供经理进行选择
List<Map<String, Object>> providers = pService.getProviders();
ModelAndView mav=new ModelAndView();
mav.addObject("bill",map);
mav.addObject("providers",providers);
mav.setViewName("updateBill");
return mav;
}
并发送给updateBill.jsp页面
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--修改订单</title>
</head>
<body>
<% List<Map<String,Object>> oList=(List<Map<String,Object>>)request.getAttribute("providers");
Map<String,Object> bill=(Map<String,Object>)request.getAttribute("bill");
%>
<div style="width: 1200px;height: 800px;margin: auto;">
<div style="width: 100%;height: 160px;background-color:skyblue;">
<div style="width: 100%;height: 20px;">
<div align="left" style="width: 20%;height: 100%;float: left;" >
<a href="home.do" style="text-decoration: none;">返回首页</a>
</div>
<div align="right" style="width: 80%;height: 100%;float: right;">
<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
<a href="index.do" style="text-decoration: none;">注销</a>
</div>
</div>
<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
</div>
<div align="center" style="width: 100%;height: 640px;background-color: pink;">
<form action="updateBill.do" method="post">
<input type="hidden" name="id" value="<%=bill.get("id") %>">
<div style="padding: 5px 0px">
<label for="productName">商品名称:</label>
<input id="productName" name="productName" value="<%=bill.get("productName") %>" type="text" placeholder="请输入商品名称" />
</div>
<div style="padding: 5px 0px">
<label >商品描述:</label>
<input type="text" name="productDesc" value="<%=bill.get("productDesc") %>" placeholder="请输入商品描述信息"></input>
</div>
<div style="padding: 5px 0px">
<label >商品数量:</label>
<input type="number" name="productCount" value="<%=bill.get("productCount") %>" placeholder="请输入商品数量" >
</div>
<div style="padding: 5px 0px">
<label >商品单位:</label>
<input type="text" name="productUnit" value="<%=bill.get("productUnit") %>" placeholder="请输入商品单位">
</div>
<div style="padding: 5px 0px">
<label >商品总额:</label>
<input type="number" name="totalPrice" value="<%=bill.get("totalPrice") %>" placeholder="请输入商品总额" >
</div>
<div style="padding: 5px 0px">
<label >支付状态:</label>
<% int state=(int)bill.get("isPayment");
if(state==1){%>
<input type="radio" name="isPayment" checked="checked" value="1" >未支付
<input type="radio" name="isPayment" value="2" >已支付
<%}else{ %>
<input type="radio" name="isPayment" value="1" >未支付
<input type="radio" name="isPayment" checked="checked" value="2" >已支付
<%} %>
</div>
<div style="padding: 5px 0px">
<label >供应商名称:</label>
<!-- Html5 新增的表单的新用法 -->
<input type="search" name="proName" value="<%=bill.get("proName") %>" placeholder="请输入供应商名称" list="list">
<datalist id="list">
<%
for(int i=0;i<oList.size();i++){
out.print(oList.get(i).get("proName"));
%>
<option><%=oList.get(i).get("proName") %></option>
<%}%>
</datalist>
<%-- <select name="proName">
<%
for(int i=0;i<oList.size();i++){
%>
<option><%=oList.get(i).getProName() %></option>
<%} %>
</select> --%>
</div>
<div style="padding: 5px 0px">
<input type="submit"
value="修改"
style="width: 120px;background-color: green;
border: none;padding: 5px;border-radius: 5px;
color: white;"/>
</div>
</form>
</div>
</div>
</body>
</html>
其页面效果如下:
当用户修改信息后,点击修改按钮将更新后的信息发送给updateBill.do,控制器中接收该请求,并获得更新后的数据信息:
//定义方法,接收修改订单页面发送的数据信息
@RequestMapping(value = "/updateBill.do",
params = {"id","productName","productDesc","productCount","productUnit","totalPrice","isPayment","proName"})
public String updateBill(long id,String productName,String productDesc,
double productCount,String productUnit,double totalPrice,
int isPayment,String proName,HttpSession session){
//创建Map集合,封装数据,便于传输
Map<String,Object> map=new HashMap<>();
map.put("id",id);//订单id
map.put("productName",productName);//商品名称
map.put("productDesc",productDesc);//商品描述
map.put("productCount",productCount);//商品数量
map.put("productUnit",productUnit);//商品单位
map.put("totalPrice",totalPrice);//总金额
map.put("isPayment",isPayment);//支付状态
map.put("proName",proName);//供应商名称
//获得登录的经理的id
map.put("modifyBy",((Map<String,Object>)session.getAttribute("userInfo")).get("id"));
//修改订单的实时时间
map.put("modifyDate",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//需要把供应商名称作为条件查询供应商表对应的供应商id
int i = bService.updateBill(map);
String url="";
if (i>0)
//订单修改成功,刷新页面
url="redirect:GetBills.do" ;
return url;
}
?接着将封装好的数据发送给service接口:
//修改订单
int updateBill(Map<String,Object> map);
service层实现类实现该方法:
@Override
public int updateBill(Map<String, Object> map) {
return dao.updateBill(map);
}
service实现类将数据发送给dao层,但因为用户在修改供应商的时候,涉及到供应商id,因此我们在做修改的操作时需先做查询:
//修改订单,先根据供应商名称查询供应商id,然后完成修改操作
@Update("update smbms_bill set productName=#{productName},productDesc=#{productDesc}," +
"productUnit=#{productUnit},productCount=#{productCount},totalPrice=#{totalPrice}," +
"isPayment=#{isPayment},modifyBy=#{modifyBy},modifyDate=#{modifyDate}," +
"providerId=(select id from smbms_provider where proName=#{proName}) " +
"where id=#{id}")
int updateBill(Map<String,Object> map);
dao层执行完修改操作后将返回值返回控制器,控制器进行判断刷新订单信息列表页面,即可看到是否修改成功,读者也可查阅数据库对应的表观察数据的更新。
|