《小麦收购系统》项目研发阶段性总结
作者:人家呢
本次任务完成时间:2018年12月1日~2018年12月7日
开发工具与关键技术:myEclipse、mysql、javabean、servlet、jsp
完成模块功能:已完成
一、项目概要
价格管理:根据价格方案选择一套方案进行价格制定,设置单价、质量标准等信息。其状态是已激活就不能进行删除或者修改操作。
价格方案:制定方案,选择参与化验的项目,设置优于/次于标准差和增减加比例。
权限管理:对平台用户访问权限进行分配。用户管理:对系统用户信息等录入。
初检录入: 对初检信息的录入,根据小麦的品质选择制定好的价格套餐。其状态为“初检录入”;
化验管理:对录入的信息进行化验操作。步骤为取样——》化验确认——》明细——》计算——》录入。
审核管理:对化验过关的信息,进行审核操作。状态为未审核 ------》等待审核 ------》审核通过/审核不通过,
是否通过是由两方面决定的一是客户,客户对化验得出的执行单价不满意,则审核就不能通过。二是审核员工。
过磅管理:对小麦进行过磅操作,计算净重,根据执行单价算出结算金额。
付款管理:对过完磅的小麦进行付款操作。其中的流水号自动生成不可重复。
入仓管理:最后就是小麦入仓操作。入仓完成其收购结束。
收购流程图:
二、功能实现
1、模块:价格管理
1.1、实现
制定价格,当为已激活的价格其修改和删除不能使用的。其中价格编号自动生成不可重复,质量标准:与化验结果进行比较,计算出化验单间和执行单价;
1.2、相关业务表和关系
1.3、经典代码
2、模块:价格方案
2.1、实现
制定价格方案,方案编号自动生成的。方案信息用于价格制定,价格制定中的明细信息项目就是方案中的项目明细;
2.2、相关业务表和关系
2.3、经典代码
/**
* 方案信息修改保存
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void update(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
//获取值
String priceSchemeId=req.getParameter("id");//方案id
String programmeNumber=req.getParameter("pN");//编号
String scenarioName=req.getParameter("sN");//名称
String valueA=req.getParameter("valueA");//方案明细信息
String activation=req.getParameter("activation");
//创建PriceSchemePo类对象
PriceSchemePo priceSchemePo=new PriceSchemePo();
//添加数据
priceSchemePo.setPriceSchemeId(Integer.parseInt(priceSchemeId));
priceSchemePo.setProgrammeNumber(programmeNumber);
priceSchemePo.setScenarioName(scenarioName);
priceSchemePo.setActivation(Boolean.parseBoolean(activation));
//创建对象
IPriceSchemeService priceSchemeService=new PriceSchemeServiceImpl();
//调用方法
priceSchemeService.edit(priceSchemePo);
//字符串分割
String[] v=valueA.split(",");
//创建List<PriceSchemeDetailPo>列表
List<PriceSchemeDetailPo> list=new ArrayList<PriceSchemeDetailPo>();
//循环遍历v数组
for (int j = 0; j < v.length; j=j+6) {
//创建PriceSchemeDetailPo类对象,
PriceSchemeDetailPo r=new PriceSchemeDetailPo(); //0
//基础id
r.setBasicId(Integer.parseInt(v[j])); //0 6
//方案id
r.setPriceSchemeId(Integer.parseInt(priceSchemeId));
//优于标准差
r.setgStandardDeviation(Double.parseDouble(v[j+1])); //1
//增加比例
r.setIncreaseInProportion(Double.parseDouble(v[j+2])); //2
//次于标准差
r.setdStandardDeviation(Double.parseDouble(v[j+3])); //3
//减价比例
r.setReductionRatio(Double.parseDouble(v[j+4])); //4
list.add(r);
}
boolean returnA=false;
//循环遍历list 每一条方案明细
for (PriceSchemeDetailPo pSDP : list) {
//创建对象
IPriceSchemeDetailService priceSchemeDetailService=new PriceSchemeDetailServiceImpl();
//调用方法,查询方案明细信息是否存在
PriceSchemeDetailPo priceSchemeDetailPo=priceSchemeDetailService.findById(pSDP.getPriceSchemeId(), pSDP.getBasicId());
if(priceSchemeDetailPo.getPriceSchemeDetaiId()>0){
//修改方案明细信息
returnA=priceSchemeDetailService.edit(pSDP);
}else{
//新增方案明细信息
returnA=priceSchemeDetailService.insert(pSDP);
}
}
if(returnA){
req.getSession().setAttribute("strMsg", "修改成功");
}else
{
req.getSession().setAttribute("strMsg", "修改失败");
}
//转发
req.getRequestDispatcher("/jsp/pricemodule/pricescheme.jsp").forward(req, resp);
}
3、模块:初检录入
3.1、实现
对小麦信息进行录入操作,根据小麦的品质选择价格方案,每个价格都有一个基础单价,而最终执行的单价是执行单价。其中状态为“初检录入 ------》等待化验 ------》等待录入 ------等待审核------等待过磅------等待入仓------》已完成”
3.2、相关业务表和关系
3.3、经典代码
IBasicService basicService =new BasicServierImpl();
//气味
List<BasicTablePo> listSmell=basicService.findAll(44);
req.setAttribute("listSmell", listSmell);
//色泽
List<BasicTablePo> listTinct =basicService.findAll(41);
req.setAttribute("listTinct", listTinct);
//品牌选择
IPriceService priceService=new PriceServiceImpl();
List<PricePo> listPricePo = priceService.findAll();
req.setAttribute("listPricePo", listPricePo);
//录入时间
String dateT=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
req.setAttribute("dateT", dateT);
//初检单号
String num="JC";
//获取当前时间
String dateN=new SimpleDateFormat("yyyyMMdd").format(new Date());
num=num+dateN;
//查询所有录入信息,排序
IEnteringService enteringService=new EnteringServiceImpl();
List<EnteringPo> listEnteringPo=enteringService.findAll();
//判断是否有数据,否则单号从0001开始
if(listEnteringPo.size()>0){
//获取录入信息最后一条数据
EnteringPo enteringPo=listEnteringPo.get(listEnteringPo.size()-1);
//获取录入时间
Timestamp t=enteringPo.getInputTime();
//转为字符串
String d=new SimpleDateFormat("yyyyMMdd").format(t);
//判断现在时间和获取的时间是否相同,不相同,单号后四位就从0001开始
if(d.equals(dateN)){
//JC201807300001,获取后四位
String oddNumbers = enteringPo.getOddNumbers().substring(10,14);
//转为int类型,加一
int number=Integer.parseInt(oddNumbers)+1;
//转为字符串
String numS=Integer.toString(number);
//循环,补零
for (int i = numS.length(); i < 4; i++) {
num+="0";
}
num+=number;
}else{
num=num+"0001";
}
}else{
num=num+"0001";
}
//设置单号
req.setAttribute("num", num);
//排队号
String sortNumber=num.substring(10, 14);
req.setAttribute("sortNumber", sortNumber);
req.getRequestDispatcher("/jsp/enteringModule/entering.jsp").forward(req, resp);
4、模块:化验管理
4.1、实现
化验管理,点击取样按钮,选择录入信息状态为“初检录入”提取进仓;点击化验按钮进行小麦品质的化验,化验项目就价格明细信息的项目数;点击明细按钮,会根据项目项生成对应的文本框,录入化验数据,点击计算化验单价;计算完成点击录入按钮化验完成;
4.2、相关业务表和关系
4.3、经典代码
/**
* 计算化验单价
* @param req
* @param resp
*/
public void computeUnitPrice(HttpServletRequest req,HttpServletResponse resp){
//化验Id
String laboratoryId=req.getParameter("laboratoryId");
//价格Id
String priceId=req.getParameter("priceId");
//化验明细
String valArray=req.getParameter("valArray");
String[] v=valArray.split(",");
List<LaboratoryDetailPo> listLaboratoryDetailPo=new ArrayList<LaboratoryDetailPo>();
for (int j = 0; j < v.length; j=j+2) {
LaboratoryDetailPo r=new LaboratoryDetailPo();
r.setBasicId(Integer.parseInt(v[j]));
r.setLaboratoryData(Double.parseDouble(v[j+1]));
listLaboratoryDetailPo.add(r);
}
//查询价格信息,价格方案Id
IPriceService priceService =new PriceServiceImpl();
PricePo pricePo= priceService.findById(Integer.parseInt(priceId));
int priceSchemeId=pricePo.getPriceSchemeId();
//价格明细信息
IPriceDetailService priceDetailService =new PriceDetailServiceImpl();
List<PriceDetailPo> listPriceDetailPo=priceDetailService.selectPriceSchemeDetail(Integer.parseInt(priceId));
//价格方案信息
IPriceSchemeDetailService priceSchemeDetailService =new PriceSchemeDetailServiceImpl();
List<PriceSchemeDetailPo> listPriceSchemeDetailPo=priceSchemeDetailService.findAll(priceSchemeId);
List<LaboratoryDetailPo> list=new ArrayList<LaboratoryDetailPo>();
//遍历价格明细
for (PriceDetailPo priceDetailPo : listPriceDetailPo) {
//遍历化验明细
for (LaboratoryDetailPo laboratoryDetailPo : listLaboratoryDetailPo) {
//判断价格明细和化验明细的基础iD是否相同(BasicId)
if(priceDetailPo.getBasicId()==laboratoryDetailPo.getBasicId()){
//计算标准差 化验数据 -质量标准 = 标准差
double standardDeviation=laboratoryDetailPo.getLaboratoryData()-priceDetailPo.getQualityStandard();
//遍历价格方案明细
for (PriceSchemeDetailPo priceSchemeDetailPo : listPriceSchemeDetailPo) {
//判断价格明细和价格方案明细的基础iD是否相同(BasicId)
if(priceDetailPo.getBasicId()==priceSchemeDetailPo.getBasicId()){
if(standardDeviation>0){
//增价比例
double advancePriceScale=priceSchemeDetailPo.getIncreaseInProportion()/priceSchemeDetailPo.getgStandardDeviation();
//增价数
double advancePrice=standardDeviation*advancePriceScale;
//创建对象,赋值
LaboratoryDetailPo l=new LaboratoryDetailPo();
//基础id
l.setBasicId(priceDetailPo.getBasicId());
//化验数据
l.setLaboratoryData(laboratoryDetailPo.getLaboratoryData());
//增减价
l.setIncreaseOrDecreasePrice(advancePrice);
list.add(l);
}else if(standardDeviation<0){
//减价比例
double cheapenScale =priceSchemeDetailPo.getReductionRatio()/priceSchemeDetailPo.getdStandardDeviation();
//减价数
double cheapen=standardDeviation*cheapenScale;
//创建对象,赋值
LaboratoryDetailPo l=new LaboratoryDetailPo();
//基础id
l.setBasicId(priceDetailPo.getBasicId());
//化验数据
l.setLaboratoryData(laboratoryDetailPo.getLaboratoryData());
//增减价
l.setIncreaseOrDecreasePrice(cheapen);
list.add(l);
}else if(standardDeviation==0){
//创建对象,赋值
LaboratoryDetailPo l=new LaboratoryDetailPo();
//基础id
l.setBasicId(priceDetailPo.getBasicId());
//化验数据
l.setLaboratoryData(laboratoryDetailPo.getLaboratoryData());
//增减价
l.setIncreaseOrDecreasePrice(0);
list.add(l);
}
}
}
}
}
}
double increaseOrDecreasePrice =0;
//循环相加,计算增减价
for (LaboratoryDetailPo laboratoryDetail : list) {
increaseOrDecreasePrice+=laboratoryDetail.getIncreaseOrDecreasePrice();
}
//设置double类型小数点后位数格式
DecimalFormat df=new DecimalFormat("0.000");
String str=df.format(increaseOrDecreasePrice);
try {
//返回值
resp.getWriter().println(str);
resp.getWriter().println(",,");
JSONArray jsonArray = JSONArray.fromObject(list);
resp.getWriter().println(jsonArray);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
5、模块:审核管理
5.1、实现
化验成功后,生成审核信息,其状态为未审核,而初检的状态则为等待审核。审核是否能通过有两个决定因素,一个是客户是否对当前执行单价是否满意,不满意则审核不能通过。二是操作员进行审核,检查是否有异常,有则不能通过。
5.2、相关业务表和关系
5.3、经典代码
//正则判断整数或小数
function regularJudgment(i){
var valueS=$("#data"+i).val();
if(valueS!=""){
var reg = /^\d+(\.\d+)?$/g;
if(!reg.test(valueS)){
layer.alert("输入格式不正确,请重新输入,格式为小数或整数。", { icon: 0, title: '提示'});
$("#data"+i).val("");
}
}
}
6、模块:过磅管理
6.1、实现
过磅管理,对审核完成的小麦信息进行过磅操作;点击选择按钮选择录入信息状态为“等待审核”,输入信息,不能为空,毛重和扣杂填写完成会自动计算出净重;点击计算按钮,计算结算金额;点击保存按钮过磅操作完成;
6.2、相关业务表和关系
6.3、经典代码
7、模块:权限管理
7.1、实现
权限管理,对系统操作员访问权进行分配;权限分配同一有管理员操作。查询,可以多条件查询操作员信息;分配保存,勾选操作员、权限、模块即可保存;重置,清空操作员权限信息;
7.2、相关业务表和关系
7.3、经典代码
//bangb
String num="GB";
//获取当前时间
String dateN=new SimpleDateFormat("yyyyMMdd").format(new Date());
num=num+dateN;
//查询所有录入信息,排序
IPonderationService ponderationService =new PonderationServiceImpl();
List<PonderationPo> listPonderationPo=ponderationService.findAll();
//判断是否有数据,否则单号从0001开始
if(listPonderationPo!=null&&listPonderationPo.size()>0 ){
//获取录入信息最后一条数据
PonderationPo ponderationPo=listPonderationPo.get(listPonderationPo.size()-1);
//获取录入时间
Timestamp t=ponderationPo.getDateAndTime();
//转为字符串
String d=new SimpleDateFormat("yyyyMMdd").format(t);
//判断现在时间和获取的时间是否相同,不相同,单号后四位就从0001开始
if(d.equals(dateN)){
//JC201807300001,获取后四位
String oddNumbers = ponderationPo.getPoundListNumber().substring(10,14);
//转为int类型,加一
int number=Integer.parseInt(oddNumbers)+1;
//转为字符串
String numS=Integer.toString(number);
//循环,补零
for (int i = numS.length(); i < 4; i++) {
num+="0";
}
num+=number;
}else{
num=num+"0001";
}
}else{
num=num+"0001";
}
8、模块:收购前台(单独收购流程操作,没有基础数据维护)
8.1、实现
小麦收购系统,主要就是收购、基础数据维护和管理三大部分;就把收购部分抽取出了做前台,功能基本相同的,就不做展示了;
三、开发总结(不少于500字)
Java web核心就是Servlet,Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要,接收请求数据,处理请求,完成响应。就相当于中介,例如,一个客户需要买一套房子找到中介商,并且告诉他我要的找房子的要求,中介就会帮你找房子,找到是会反馈,不就是请求和响应吗。Servlet的生命周期是加载、实例化、服务、销毁,init()方法只执行一次它是在服务器装入Servlet时执行的,负责初始化Servlet对象,不管多少次访问init()都不会重复执行。service()方法,它是Servlet的核心,负责响应客户的请求,其中实例化只实例一次,直到销毁,是个单例设计模式。Web 中有三大神器,分别是过滤器、监听器、拦截器。过滤器,web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件、字符编码等进行拦截,从而实现一些特殊的功能。在项目中运用过过滤器进行字符编码集统一,将所有的字符设置为uft-8的字符集,防止乱码出现。监听器用于监听域对象的属性发生修改的事件,可以在事件发生前、发生后做一些必要的处理等。监听器的用途例如,统计在线人数和在线用户,统计网站访问量等。拦截器,用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。上面说到的不足之处,就是对java web技术缺乏使用,只是单纯的增删改查,实现目的就行,就比如web中的三大神器过滤器、监听器、拦截器,其中就用过过滤器而其他两种却不加以运用,在这方面需要改进。