【springmvc+mybatis项目实战】杰信商贸-16.新增从表货物信息

本文介绍了一种购销合同与货物信息的一对多关联方式,通过MyBatis实现单表操作,简化了关联关系,并详细展示了实体类、Mapper文件、DAO层、Service层及Controller层的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的购销合同相对于货物是一对多的,所以我们需要配置对象之间的关联关系。

首先先编写实体类ContractProduct.java:
[java]  view plain copy
  1. package cn.hpu.jk.domain;  
  2.   
  3. public class ContractProduct {  
  4.     private String id;  
  5.       
  6.     //private Contract contract;//将复杂的关联变成单表操作  
  7.     private String contractId;//关联关系的表,都成为普通字段  
  8.     private String factoryId;  
  9.       
  10.     private String factoryName;  
  11.     private String productNo;  
  12.     private String productImage;  
  13.     private String productDesc;//货物描述  
  14.     private Integer cnumber;//数量  
  15.     private Integer outNumber;//出货数量  
  16.     private String loadingRate;//装率  
  17.     private String boxNum;//箱数  
  18.     private String packingUnit;//包装单位  
  19.     private Double price;//单价  
  20.     private Double amount;//总价  
  21.     private Integer finished;//是否出货完毕  
  22.     private String exts;//附件  
  23.     private Integer orderNo;//排序号  
  24.   
  25.   
  26.     //get与set方法省略  
  27. }  
我们将关系对象的形式变成了一张单表,变得简单了(比hibernate效率高),我们的关键是如何将他们关联起来而已。

我们然后来做一个映射,编写映射文件ContractProductMapper.xml:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="cn.hpu.jk.mapper.ContractProductMapper">  
  6.     <!-- 映射合同和合同下的货物信息一对多 -->  
  7.     <resultMap type="cn.hpu.jk.domain.ContractProduct" id="ContractProductRM">  
  8.         <id property="id" column="CONTRACT_PRODUCT_ID"/>  
  9.         <result property="contractId" column="CONTRACT_ID"/>  
  10.         <result property="factoryId" column="FACTORY_ID"/>  
  11.         <result property="factoryName" column="FACTORY_NAME"/>  
  12.         <result property="productNo" column="PRODUCT_NO"/>  
  13.         <result property="productImage" column="PRODUCT_IMAGE"/>  
  14.         <result property="productDesc" column="PRODUCT_DESC"/>  
  15.         <result property="cnumber" column="CNUMBER"/>  
  16.         <result property="outNumber" column="OUT_NUMBER"/>  
  17.         <result property="loadingRate" column="LOADING_RATE"/>  
  18.         <result property="boxNum" column="BOX_NUM"/>  
  19.         <result property="packingUnit" column="PACKING_UNIT"/>  
  20.         <result property="price" column="PRICE"/>  
  21.         <result property="amount" column="AMOUNT"/>  
  22.         <result property="finished" column="FINISHED"/>  
  23.         <result property="exts" column="EXTS"/>  
  24.         <result property="orderNo" column="ORDER_NO"/>  
  25.     </resultMap>  
  26.        
  27.      <!-- 查询 -->  
  28.      <select id="find" parameterType="map" resultMap="ContractProductRM">  
  29.         select * from contract_product_c  
  30.         where 1=1  
  31.      </select>  
  32.        
  33.      <!-- 查询一个 -->  
  34.       <select id="get" parameterType="String" resultMap="ContractProductRM">  
  35.         select * from contract_product_c  
  36.         where contract_product_id=#{id}  
  37.      </select>  
  38.        
  39.      <insert id="insert" parameterType="cn.hpu.jk.domain.ContractProduct">  
  40.         insert into contract_product_c  
  41.         (CONTRACT_PRODUCT_ID,CONTRACT_ID,FACTORY_ID,FACTORY_NAME,PRODUCT_NO,  
  42.             PRODUCT_IMAGE,PRODUCT_DESC,CNUMBER,OUT_NUMBER,LOADING_RATE,BOX_NUM,  
  43.             PACKING_UNIT,PRICE,AMOUNT,FINISHED,EXTS,ORDER_NO)  
  44.         values(  
  45.             #{id},  
  46.             #{contractId},  
  47.             #{factoryId},  
  48.             #{factoryName, jdbcType=VARCHAR},  
  49.             #{productNo, jdbcType=VARCHAR},  
  50.             #{productImage, jdbcType=VARCHAR},  
  51.             #{productDesc, jdbcType=VARCHAR},  
  52.             #{cnumber, jdbcType=INTEGER},  
  53.             #{outNumber, jdbcType=INTEGER},  
  54.             #{loadingRate, jdbcType=VARCHAR},  
  55.             #{boxNum, jdbcType=INTEGER},  
  56.             #{packingUnit, jdbcType=VARCHAR},  
  57.             #{price, jdbcType=DOUBLE},  
  58.             #{amount, jdbcType=DOUBLE},  
  59.             #{finished, jdbcType=INTEGER},  
  60.             #{exts, jdbcType=VARCHAR},  
  61.             #{orderNo, jdbcType=INTEGER}  
  62.         )  
  63.      </insert>  
  64.        
  65.      <update id="update" parameterType="cn.hpu.jk.domain.ContractProduct">  
  66.         update contract_product_c  
  67.         <set>  
  68.             CONTRACT_ID=#{contractId},  
  69.             FACTORY_ID=#{factoryId},  
  70.             <if test="factoryName != null">FACTORY_NAME=#{factoryName},</if>  
  71.             <if test="productNo != null">PRODUCT_NO=#{productNo},</if>  
  72.             <if test="productImage != null">PRODUCT_IMAGE=#{productImage},</if>  
  73.             <if test="productDesc != null">PRODUCT_DESC=#{productDesc},</if>  
  74.             <if test="cnumber != null">CNUMBER=#{cnumber},</if>  
  75.             <if test="outNumber != null">OUT_NUMBER=#{outNumber},</if>  
  76.             <if test="loadingRate != null">LOADING_RATE=#{loadingRate},</if>  
  77.             <if test="boxNum != null">BOX_NUM=#{boxNum},</if>  
  78.             <if test="packingUnit != null">PACKING_UNIT=#{packingUnit},</if>  
  79.             <if test="price != null">PRICE=#{price},</if>  
  80.             <if test="amount != null">AMOUNT=#{amount},</if>  
  81.             <if test="finished != null">FINISHED=#{finished},</if>  
  82.             <if test="exts != null">EXTS=#{exts},</if>  
  83.             <if test="orderNo != null">ORDER_NO=#{orderNo},</if>  
  84.         </set>  
  85.         where contract_product_id=#{id}  
  86.      </update>  
  87.        
  88.      <!-- 删除一条 -->  
  89.     <delete id="deleteById" parameterType="string">  
  90.         delete from contract_product_c  
  91.         where contract_product_id=#{id}  
  92.     </delete>  
  93.       
  94.     <!-- 删除多条(一维字符串数组) -->  
  95.     <delete id="delete" parameterType="string">  
  96.         delete from contract_product_c  
  97.         where contract_product_id in  
  98.         <foreach collection="array" item="id" open="(" close=")" separator=",">  
  99.             #{id}  
  100.         </foreach>  
  101.     </delete>  
  102. </mapper>  

之后我们写Dao层:
ContractProductDao.java:
[java]  view plain copy
  1. package cn.hpu.jk.dao;  
  2.   
  3. import cn.hpu.jk.domain.Contract;  
  4.   
  5. public interface ContractProductDao extends BaseDao<ContractProduct>{  
  6.     //我们这里可以直接使用继承的BaseDao的增删改查方法  
  7.     //创建一系列其它Dao的原因是因为其它Dao有可能需要拓展  
  8.   
  9.   
  10. }  

ContractProductDaoImpl.java:
[java]  view plain copy
  1. package cn.hpu.jk.dao.impl;  
  2.   
  3. import org.springframework.stereotype.Repository;  
  4.   
  5. import cn.hpu.jk.dao.ContractProductDao;  
  6. import cn.hpu.jk.domain.ContractProduct;  
  7.   
  8.   
  9. @Repository //为了包扫描的时候这个Dao被扫描到  
  10. public class ContractProductDaoImpl extends BaseDaoImpl<ContractProduct> implements ContractProductDao{  
  11.       
  12.     public ContractProductDaoImpl(){  
  13.         //设置命名空间  
  14.         super.setNs("cn.hpu.jk.mapper.ContractProductMapper");  
  15.     }  
  16.   
  17.   
  18. }  

然后是Service层
ContractProductService.java:
[java]  view plain copy
  1. package cn.hpu.jk.service;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import cn.hpu.jk.domain.Contract;  
  8. import cn.hpu.jk.domain.ContractProduct;  
  9. import cn.hpu.jk.pagination.Page;  
  10.   
  11.   
  12. public interface ContractProductService {  
  13.     public List<ContractProduct> findPage(Page page); //分页查询  
  14.     public List<ContractProduct> find(Map paraMap);       //带条件查询,条件可以为null,既没有条件;返回list对象集合  
  15.     public ContractProduct get(Serializable id);                //只查询一个,常用于修改  
  16.     public void insert(ContractProduct contractProduct);        //插入,用实体作为参数  
  17.     public void update(ContractProduct contractProduct);        //修改,用实体作为参数  
  18.     public void deleteById(Serializable id);    //按id删除,删除一条;支持整数型和字符串类型ID  
  19.     public void delete(Serializable[] ids); //批量删除;支持整数型和字符串类型ID  
  20. }  


ContractProductServiceImpl.java:

[java]  view plain copy
  1. package cn.hpu.jk.service.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.UUID;  
  7.   
  8. import javax.annotation.Resource;  
  9.   
  10. import org.springframework.stereotype.Service;  
  11.   
  12. import cn.hpu.jk.dao.ContractProductDao;  
  13. import cn.hpu.jk.domain.ContractProduct;  
  14. import cn.hpu.jk.pagination.Page;  
  15. import cn.hpu.jk.service.ContractProductService;  
  16.   
  17. @Service  
  18. public class ContractProductServiceImpl implements ContractProductService{  
  19.       
  20.     @Resource  
  21.     ContractProductDao contractProductDao;  
  22.       
  23.   
  24.   
  25.     @Override  
  26.     public void delete(Serializable[] ids) {  
  27.         contractProductDao.delete(ids);  
  28.     }  
  29.   
  30.   
  31.     @Override  
  32.     public void deleteById(Serializable id) {  
  33.         contractProductDao.deleteById(id);  
  34.     }  
  35.   
  36.   
  37.     @Override  
  38.     public List<ContractProduct> find(Map paraMap) {  
  39.         return contractProductDao.find(paraMap);  
  40.     }  
  41.   
  42.   
  43.     @Override  
  44.     public List<ContractProduct> findPage(Page page) {  
  45.         // TODO Auto-generated method stub  
  46.         return null;  
  47.     }  
  48.   
  49.   
  50.     @Override  
  51.     public ContractProduct get(Serializable id) {  
  52.         return contractProductDao.get(id);  
  53.     }  
  54.   
  55.   
  56.     @Override  
  57.     public void insert(ContractProduct contractProduct) {  
  58.         //设置UUID  
  59.         contractProduct.setId(UUID.randomUUID().toString());  
  60.         contractProductDao.insert(contractProduct);  
  61.     }  
  62.   
  63.   
  64.     @Override  
  65.     public void update(ContractProduct contractProduct) {  
  66.           
  67.         contractProductDao.update(contractProduct);  
  68.     }  
  69.   
  70.   
  71. }  

然后在beans-service.xml增加contractProductService的注入
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  7.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  8.             http://www.springframework.org/schema/mvc   
  9.             http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd   
  10.             http://www.springframework.org/schema/context   
  11.             http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  12.             http://www.springframework.org/schema/aop   
  13.             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
  14.             http://www.springframework.org/schema/tx   
  15.             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">  
  16.               
  17.         <!-- 加载service-->   
  18.         <bean name="factoryService" class="cn.hpu.jk.service.impl.FactoryServiceImpl"/>  
  19.         <bean name="contractService" class="cn.hpu.jk.service.impl.ContractServiceImpl"/>  
  20.         <bean name="contractProductService" class="cn.hpu.jk.service.impl.ContractProductServiceImpl"/>  
  21.   
  22.   
  23. </beans>  

之后我们来编写Controller层,我们先写一个新增方法
[java]  view plain copy
  1. package cn.hpu.jk.controller.cargo.contract;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Controller;  
  5. import org.springframework.ui.Model;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7.   
  8.   
  9. import cn.hpu.jk.controller.BaseController;  
  10. import cn.hpu.jk.domain.ContractProduct;  
  11. import cn.hpu.jk.service.ContractProductService;  
  12.   
  13.   
  14. @Controller  
  15. public class ContractProductController extends BaseController{  
  16.       
  17.     @Autowired  
  18.     ContractProductService contractProductService;   
  19.       
  20.     //转向新增页面  
  21.     @RequestMapping("/cargo/contractproduct/tocreate.action")  
  22.     public String tocreate(String contractId,Model model){  
  23.         //传递购销合同Id  
  24.         model.addAttribute("contractId", contractId);  
  25.         return "/cargo/contract/jContractProductCreate.jsp";//货物的新增页面  
  26.     }  
  27.       
  28.     //新增  
  29.     @RequestMapping("/cargo/contractproduct/insert.action")  
  30.     public String insert(ContractProduct contractProduct,Model model){  
  31.         contractProductService.insert(contractProduct);  
  32.           
  33.         model.addAttribu("contractId", contractProduct.getContractId());  
  34.           
  35.         return "redirect:/cargo/contractproduct/tocreate.action";  
  36.     }  
  37. }  

回顾一下我们的货物表


由于我们后面要对生产厂家(Factory)带条件查询,所以我们将生产厂家的Mapper配置文件的find方法修改一下:
[html]  view plain copy
  1. <!-- 查询 -->  
  2. <select id="find" parameterType="map" resultMap="factoryRM">  
  3.     select * from factory_c  
  4.     where 1=1  
  5.     <if test="state != null"> and STATE=#{state}</if>  
  6. </select>  
即保证了单独跳向生产厂家页面的时候取所有,又保证带state参数跳向生产厂家列表的时候按条件取数据。

同时我们还要在生产厂家的Service加一些处理代码

在FactoryService中添加

public List<Factory> getFactoryList(); //获取生产厂家列表

在FactoryServiceImpl中添加

[java]  view plain copy
  1. @Override  
  2. public List<Factory> getFactoryList() {  
  3.           
  4.     Map<String,Object> paraMap=new HashMap<String,Object>();  
  5.     paraMap.put("state"1);//1启用,代表只查询启用的生产厂家  
  6.           
  7.     return factoryDao.find(paraMap);  
  8. }  


这里我们修改一下刚刚我们写的货物的Controller层(准备生产厂家的下拉列表)
[java]  view plain copy
  1. package cn.hpu.jk.controller.cargo.contract;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.ui.Model;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10. import cn.hpu.jk.controller.BaseController;  
  11. import cn.hpu.jk.domain.ContractProduct;  
  12. import cn.hpu.jk.domain.Factory;  
  13. import cn.hpu.jk.service.ContractProductService;  
  14. import cn.hpu.jk.service.FactoryService;  
  15.   
  16. @Controller  
  17. public class ContractProductController extends BaseController{  
  18.       
  19.     @Autowired  
  20.     ContractProductService contractProductService;   
  21.     @Autowired  
  22.     FactoryService factoryService;  
  23.       
  24.     //转向新增页面  
  25.     @RequestMapping("/cargo/contractproduct/tocreate.action")  
  26.     public String tocreate(String contractId,Model model){  
  27.         //传递购销合同Id  
  28.         model.addAttribute("contractId", contractId);  
  29.           
  30.         //准备生产厂家的下拉列表  
  31.         List<Factory> factoryList=factoryService.getFactoryList();  
  32.         model.addAttribute("factoryList",factoryList);  
  33.           
  34.         return "/cargo/contract/jContractProductCreate.jsp";//货物的新增页面  
  35.     }  
  36.       
  37.     //新增  
  38.     @RequestMapping("/cargo/contractproduct/insert.action")  
  39.     public String insert(ContractProduct contractProduct,Model model){  
  40.         contractProductService.insert(contractProduct);  
  41.           
  42.         model.addAttribu("contractId", contractProduct.getContractId());  
  43.           
  44.         return "redirect:/cargo/contractproduct/tocreate.action";  
  45.     }  
  46. }  

为了能看到新增的货物,我们在编辑页面添加货物的列表
因为我们是按照选择的生产厂家去看的货物列表,所以我们要修改我们的ContractProductMapper.xml中的find语句块:
[html]  view plain copy
  1. <!-- 查询某个合同下的货物信息 -->  
  2. <select id="find" parameterType="map" resultMap="ContractProductRM">  
  3.     select * from contract_product_c  
  4.     where 1=1  
  5.     <if test="contractId != null"> and contractId=#{CONTRACT_ID}</if>  
  6. </select>  


我们在修改Controller来在转向货物编辑页面时带着相应合同的货物列表过去:

[java]  view plain copy
  1. //转向新增页面  
  2. @RequestMapping("/cargo/contractproduct/tocreate.action")  
  3. public String tocreate(String contractId,Model model){  
  4.     //传递购销合同Id  
  5.     model.addAttribute("contractId", contractId);  
  6.       
  7.     //准备生产厂家的下拉列表  
  8.     List<Factory> factoryList=factoryService.getFactoryList();  
  9.     model.addAttribute("factoryList",factoryList);  
  10.       
  11.     //某个合同下的货物  
  12.     Map paraMap=new HashMap();  
  13.     paraMap.put("contractId", contractId);  
  14.     List<ContractProduct> dataList=contractProductService.find(paraMap);  
  15.     model.addAttribute("dataList", dataList);  
  16.       
  17.     return "/cargo/contract/jContractProductCreate.jsp";//货物的新增页面  
  18. }  

下面是最终的编辑新增页面jContractProductCreate.jsp:

[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ include file="../../base.jsp"%>  
  3. <%@ include file="../../baselist.jsp"%>  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head>  
  6.     <title>添加货物信息</title>  
  7.     <script type="text/javascript">  
  8.         //设置冗余的生产厂家名称  
  9.         function setFactoryName(val){  
  10.             var ele=document.getElementById("factoryName");  
  11.             ele.value=val;  
  12.         }  
  13.     </script>  
  14. </head>  
  15. <body>  
  16. <form method="post">  
  17. <div id="menubar">  
  18. <div id="middleMenubar">  
  19. <div id="innerMenubar">  
  20.     <div id="navMenubar">  
  21. <ul>  
  22. <li id="save"><a href="#" onclick="formSubmit('insert.action','_self');">确定</a></li>  
  23. <li id="back"><a href="list.action">返回</a></li>  
  24. </ul>  
  25.     </div>  
  26. </div>  
  27. </div>  
  28. </div>  
  29.        
  30. <div class="textbox" id="centerTextbox">  
  31.       
  32.     <div class="textbox-header">  
  33.     <div class="textbox-inner-header">  
  34.     <div class="textbox-title">  
  35.         添加货物信息  
  36.     </div>   
  37.     </div>  
  38.     </div>  
  39. <div>  
  40.    
  41.     <div>  
  42.         <table class="commonTable" cellspacing="1">  
  43.             <input type="hidden" name="contractId" value="${contractId}"/>  
  44.                 <tr>  
  45.                     <td class="columnTitle_mustbe">厂家名称:</td>  
  46.                     <td class="tableContent">  
  47.                     <select name="factoryId" onchange="setFactoryName(this.options[this.selectedIndex].text);">  
  48.                         <option value="">--请选择--</option>  
  49.                         <c:forEach items="${factoryList}" var="f">  
  50.                         <option value="${f.id}">${f.factoryName }</option>  
  51.                         </c:forEach>  
  52.                         <input type="hidden" id="factoryName" name="factoryName" value=""/>  
  53.                     </select>  
  54.                     </td>  
  55.                     <td class="columnTitle_mustbe">货号:</td>  
  56.                     <td class="tableContent"><input type="text" name="productNo" /></td>  
  57.                 </tr>  
  58.                   
  59.                 <tr>  
  60.                     <td class="columnTitle_mustbe">货物照片:</td>  
  61.                     <td class="tableContent"><input type="text" name="productImage" /></td>  
  62.                       
  63.                 </tr>  
  64.                   
  65.                 <tr>  
  66.                     <td class="columnTitle_mustbe">数量</td>  
  67.                     <td class="tableContent"><input type="text" name="cnumber" /></td>  
  68.                     <td class="columnTitle_mustbe">装率:</td>  
  69.                     <td class="tableContent"><input type="text" name="loadingRate" /></td>  
  70.                 </tr>  
  71.                   
  72.                  <tr>  
  73.                     <td class="columnTitle_mustbe">箱数:</td>  
  74.                     <td class="tableContent"><input type="text" name="boxNum" /></td>  
  75.                     <td class="columnTitle_mustbe">单价:</td>  
  76.                     <td class="tableContent"><input type="text" name="price" /></td>  
  77.                 </tr>  
  78.                   
  79.                  <tr>  
  80.                     <td class="columnTitle_mustbe">包装单位:</td>  
  81.                     <td class="tableContent"><input type="text" name="packingUnit" /></td>  
  82.                     <td class="columnTitle_mustbe">排序号:</td>  
  83.                     <td class="tableContent"><input type="text" name="orderNo" /></td>  
  84.                 </tr>  
  85.                   
  86.                 <tr>  
  87.                     <td class="columnTitle_mustbe">货物描述:</td>  
  88.                     <td class="tableContent"><textarea  name="productDesc" style="height:200px;width: 400px"></textarea></td>  
  89.                 </tr>  
  90.             </table>  
  91.     </div>  
  92. </div>  
  93.   
  94.   
  95.   
  96.   
  97. <div class="textbox" id="centerTextbox">  
  98.   <div class="textbox-header">  
  99.   <div class="textbox-inner-header">  
  100.   <div class="textbox-title">  
  101.     货物列表  
  102.   </div>   
  103.   </div>  
  104.   </div>  
  105.     
  106. <div>  
  107. <div class="eXtremeTable" >  
  108. <table id="ec_table" class="tableRegion" width="98%" >  
  109.     <thead>  
  110.     <tr>  
  111.         <td class="tableHeader"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></td>  
  112.         <td class="tableHeader">序号</td>  
  113.         <td class="tableHeader">厂家名称</td>  
  114.         <td class="tableHeader">货号</td>  
  115.         <td class="tableHeader">数量</td>  
  116.         <td class="tableHeader">包装单位</td>  
  117.         <td class="tableHeader">装率</td>  
  118.         <td class="tableHeader">箱数</td>  
  119.         <td class="tableHeader">单价</td>  
  120.         <td class="tableHeader">总金额</td>  
  121.     </tr>  
  122.     </thead>  
  123.     <tbody class="tableBody" >  
  124.       
  125.     <c:forEach items="${dataList}" var="o" varStatus="status">  
  126.     <tr class="odd" onmouseover="this.className='highlight'" onmouseout="this.className='odd'" >  
  127.         <td><input type="checkbox" name="id" value="${o.id}"/></td>  
  128.         <td>${status.index+1}</td>  
  129.         <td>${o.factoryName}</td>  
  130.         <td>${o.productNo}</td>  
  131.         <td>${o.cnumber}</td>  
  132.         <td>${o.packingUnit}</td>  
  133.         <td>${o.loadingRate }</td>  
  134.         <td>${o.boxNum }</td>  
  135.         <td>${o.price }</td>  
  136.         <td>${o.amount}</td>  
  137.     </tr>  
  138.     </c:forEach>  
  139.       
  140.     </tbody>  
  141. </table>  
  142. </div>  
  143.    
  144. </div>  
  145.   
  146.   
  147.    
  148. </form>  
  149. </body>  
  150. </html>  

新增货物搞定了,但是我们需要一个入口来新增货物。我们在购销合同的列表中新加一列“操作”选项,然后通过这一列可以添加货物。
[html]  view plain copy
  1. <tr>  
  2. <td class="tableHeader">操作</td>  
  3. </tr>  
  4. <tr>  
  5. <td><a href="${ctx}/cargo/contractproduct/tocreate.action?contractId=${o.id}" title="新增货物信息">[货物]</a><td></tr>  

效果:


之后我们为第一个购销合同添加两个货物:


我们添加成功之后在编辑框下可以看到相应的货物信息:


我们的“总金额”是计算出来的而不是填写出来的,所以我们要在必要的地方添加计算的代码。我们这里在ContractProductServiceImpl中的insert与update方法来计算总金额:
[java]  view plain copy
  1. @Override  
  2. public void insert(ContractProduct contractProduct) {  
  3.     //设置UUID  
  4.     contractProduct.setId(UUID.randomUUID().toString());  
  5.       
  6.     //自动计算总金额=数量*单价  ...修改,删除;同步合同金额  
  7.     if(UtilFuns.isNotEmpty(contractProduct.getCnumber())  
  8.                 &&UtilFuns.isNotEmpty(contractProduct.getCnumber())){  
  9.         contractProduct.setAmount(contractProduct.getCnumber()*contractProduct.getPrice());  
  10.         }  
  11.       
  12.     contractProductDao.insert(contractProduct);  
  13. }  
  14.   
  15. @Override  
  16. public void update(ContractProduct contractProduct) {  
  17.       
  18.     //自动计算总金额=数量*单价  ...修改,删除;同步合同金额  
  19.     if(UtilFuns.isNotEmpty(contractProduct.getCnumber())  
  20.             &&UtilFuns.isNotEmpty(contractProduct.getCnumber())){  
  21.     contractProduct.setAmount(contractProduct.getCnumber()*contractProduct.getPrice());  
  22.     }  
  23.       
  24.     contractProductDao.update(contractProduct);  
  25. }  

其中,UtilFuns是我们在cn.hpu.jk.Util包下放入的工具类UtilFuns.java,它是关于所有(对象、字符串、列表)判断是否为空的类,其中isNotEmpty方法如下:
[java]  view plain copy
  1. public static boolean isNotEmpty(String str){  
  2.     try{  
  3.       if(str==null || str.equals("null") || str.equals("")){  
  4.           return false;  
  5.       }  
  6.       return true;  
  7.     }catch(Exception e){  
  8.       return true;  
  9.     }  
  10.   }  
  11.   
  12.   
  13.   public static boolean isNotEmpty(Object obj){  
  14.     try{  
  15.       if(obj==null || obj.toString().equals("null") || obj.toString().equals("")){  
  16.           return false;  
  17.       }  
  18.       return true;  
  19.     }catch(Exception e){  
  20.       return true;  
  21.     }  
  22.   }  

接下来我们测试,我们来填写一下货物信息
(解释一下“装率”:我们的货物是玻璃器皿,玻璃器皿不能直接放在集装箱里,我们需要先把玻璃器皿放入纸盒子里,一个纸盒子能装多少个玻璃杯,那多少个就成为装率。例如,客户定300个玻璃杯,装到一个盒子能容纳3个玻璃杯,需要100个盒子,那么装率就是1/3。“箱数”=数量/装率的分母=300/3=100,若是有不足3个的就加一个箱子)


可以看到,我们的总金额被计算出来了:



至此,我们完成了随购销合同的货物的主要业务功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值