项目第七天

来源:互联网 发布:nginx ip段访问 编辑:程序博客网 时间:2024/05/09 12:58

课程回顾

1. FastJson工具类的使用(把对象转换成json的字符串)    * 先导入开发的jar包    * 基本的操作:使用JSON.toJsonString(object)    * 采用引用的方式,禁止死循环的问题。禁止引用的方式,引发死循环的问题。2. Struts2框架配置全局异常处理    * dao和service层出现了异常,会默认抛出异常。在Action有2种选择        * 抛出        * 捕获异常,自定义异常的信息。3. 邮件的开发    * JavaMail的方式    * Spring整合JavaMail(推荐的方式)

购销合同模块


购销合同的概述

1. 什么是购销合同    * 公司销售和海外客户签订订单(合同),客户订单中包含货物,公司联系生产厂家生产货物,和生成厂家签订的合同称为购销合同。2. 购销合同的组成,主要由三部分组成(推荐查看购销合同的excel,查看购销合同的属性信息)    * 购销合同的主信息    * 多个货物的信息    * 多个附件的信息    * 注意1:购销合同最多只包含两款商品,如果包含多个商品,一张A4纸打印放不下。    * 注意2:一个A4纸上存放2个产品,要求该产品需要是一个厂家生产的。3. 通过查看购销合同的excel文档,简单的了解购销合同信息的组成    * 下面需要考虑的是购销合同相关的表结构的设计

数据库表结构设计的三大范式

1. 第一范式:做到每一列不可拆分    * 每一列的原子性2. 第二范式:确保一张表只做一件事情    * 例如:用户张三,年龄是20,性别是男,WEB考试成绩是90分,Maven考试成绩是95分,Oracle考试成绩是100分。    * 这种表结构的设计就是用户一张表,又描述了学生的信息,又描述了成绩的信息。3. 第三范式:在满足第二范式的同时,消除表中的传递依赖,目标是空间最省。    * 例如:3<4 4<5 所以3<5  根据依赖传递    * 例如:设计一张表,商品的主键、商品的名称、商品的单价、商品的数量、商品的总价格。4. 反第三范式    * 在进行数据库设计的时候,首选确保你所设计的表结构都能达到第三范式的要求    * 但是在实际开发中,为了满足一些用户的特殊需求,开发时又会在符合第三范式的表中,添加冗余字段,结果导致不符合了第三范式,一般称为反三范式。

购销合同数据库的设计

1. 购销合同的暂时组成    * 购销合同表    * 货物表    * 附件表    * 生产厂家表

分散设计思想

1. 问题    * 在查询购销合同的总金额时,需要关联加载购销合同下的所有货物,并且加载货物下的所有附件,这样显示购销合同的金额时,查询会消耗大量的时间,查询速度比较慢2. 解决,采用分散设计思想    * 在平时添加货物时,添加附件时,分别计算出货物的总金额、附件的总金额,再更新购销合同的金额。    * 这样就相当于将一次集中计算的工作量分散到多次计算过程中,再查询购销合同的速度就比较快速。3. 优缺点    * 缺点是代码的编写量和维护工作量会提升。    * 优点是提供页面数据的检索速度。

编写程序代码


编写domain和映射的配置文件

1. 导入资料中的JavaBean

编写service和实现类

1. 导入service的接口和实现类

购销合同的CRUD的操作

1. 强调:购销合同的模块的名称是cargo    * 创建cn.itcast.jk.action.cargo包结构    * 在struts文件夹下创建struts-cargo.xml配置文件(在struts.xml配置文件引入该配置文件)        <!-- 包名,强调:名称空间必须是cargo,因为数据库中菜单的访问路径已经是固定的了 -->        <package name="cargo" namespace="/cargo" extends="default">            <action name="contractAction_*" class="contractAction" method="{1}">                <result name="list">/WEB-INF/pages/cargo/contract/jContractList.jsp</result>                <result name="toview">/WEB-INF/pages/cargo/contract/jContractView.jsp</result>                <result name="tocreate">/WEB-INF/pages/cargo/contract/jContractCreate.jsp</result>                <result name="page" type="redirectAction">contractAction_list</result>                <result name="toUpdate">/WEB-INF/pages/cargo/contract/jContractUpdate.jsp</result>            </action>        </package>2. 完成CRUD的操作    * 购销合同的新增的时候,两点注意        * 新增购销合同,默认的状态是0    0表示草稿 1表示已经上报        * 新增购销合同,默认的总金额是0元,设置0d3. 修改购销合同通过的功能    public String update() throws Exception {        // 从数据库中查询出来        Contract contract = contractService.get(Contract.class, model.getId());        contract.setCustomName(model.getCustomName());        contract.setPrintStyle(model.getPrintStyle());        contract.setContractNo(model.getContractNo());        contract.setOfferor(model.getOfferor());        contract.setInputBy(model.getInputBy());        contract.setCheckBy(model.getCheckBy());        contract.setInspector(model.getInspector());        contract.setSigningDate(model.getSigningDate());        contract.setImportNum(model.getImportNum());        contract.setShipTime(model.getShipTime());        contract.setTradeTerms(model.getTradeTerms());        contract.setDeliveryPeriod(model.getDeliveryPeriod());        contract.setCrequest(model.getCrequest());        contract.setRemark(model.getRemark());        // 更新购销合同        contractService.saveOrUpdate(contract);        return SUCCESS;    }4. 提交和取消购销合同的功能    * 提交:把购销合同的状态从草稿变成已上报。(state从0修改成1)    * 取消:把购销合同的状态从已上报变成操作。(state从1修改成0)

货物和附件模块


货物模块

1. 构建ContractProductAction,完成相关编写和配置。   2. 货物的分页功能    * 点击购销合同列表页面的货物按钮,跳转到货物的新增页面,但是新增页面的下方需要显示该购销合同已经存在的货物列表数据。    * 解决思路        * 需要工厂的数据列表(注意:工厂是分成货物工厂和附件工厂的,状态为1表示和咱们公司有合作关系的)        * 需要查询该购销合同下所有的货物信息数据    * 具体的代码如下        /**         * 跳转到添加部门页面         * @return         * @throws Exception         */        public String tocreate() throws Exception {            // 查询工厂信息            List<Factory> factoryList = factoryService.find("from Factory where ctype = '货物' and state = 1", Factory.class,                    null);            super.put("factoryList", factoryList);            // 传递的是购销合同的主键            // 查询的是该购销合同下所有的货物数据            page = contractProductService.findPage("from ContractProduct where contract.id = ?", page, ContractProduct.class,                    new String[] { model.getContract().getId() });            // 设置url            page.setUrl("contractProductAction_tocreate");            super.push(page);            return "tocreate";        }3. 货物的新增功能    * 计算这一次的获取的总金额    * 获取到购销合同中的总金额,购销合同总金额 = 总金额 + 货物的总金额    * 更新购销合同数据    * 业务层代码如下        public void saveOrUpdate(ContractProduct entity) {        // 判断,如果是新增,设置部门的状态为1        if(UtilFuns.isEmpty(entity.getId())){            // 添加变量,表示购销合同总金额            double money = 0.0;            // 如果货物的数量不为空,并且货物的单价不为空            if(UtilFuns.isNotEmpty(entity.getCnumber()) && UtilFuns.isNotEmpty(entity.getPrice())){                // 计算货物的总金额                money = entity.getCnumber() * entity.getPrice();                // 设置货物的总金额                entity.setAmount(money);                // 获取到购销合同的总金额                String id = entity.getContract().getId();                Contract contract = baseDao.get(Contract.class, id);                // 设置购销合同的总金额                contract.setTotalAmount(contract.getTotalAmount()+money);                // 更新购销合同                baseDao.saveOrUpdate(contract);            }        }        baseDao.saveOrUpdate(entity);    }2. 货物的修改功能    * 如果修改了货物的数量或者单价,那么也要更新购销合同的总金额    * 减去原来的金额,加上修改后的金额    * 业务层代码如下        public void saveOrUpdate(ContractProduct entity) {            // 判断,如果是新增,设置部门的状态为1            if(UtilFuns.isEmpty(entity.getId())){                // 添加变量,表示购销合同总金额                double money = 0.0;                // 如果货物的数量不为空,并且货物的单价不为空                if(UtilFuns.isNotEmpty(entity.getCnumber()) && UtilFuns.isNotEmpty(entity.getPrice())){                    // 计算货物的总金额                    money = entity.getCnumber() * entity.getPrice();                    // 设置货物的总金额                    entity.setAmount(money);                    // 获取到购销合同的总金额                    String id = entity.getContract().getId();                    Contract contract = baseDao.get(Contract.class, id);                    // 设置购销合同的总金额                    contract.setTotalAmount(contract.getTotalAmount()+money);                    // 更新购销合同                    baseDao.saveOrUpdate(contract);                }            }else{                // 先获取到原有的货物的总金额                double amount = entity.getAmount();                // 设置新的金额                double money = 0.0;                // 如果货物的数量不为空,并且货物的单价不为空                if(UtilFuns.isNotEmpty(entity.getCnumber()) && UtilFuns.isNotEmpty(entity.getPrice())){                    // 计算货物的总金额                    money = entity.getCnumber() * entity.getPrice();                    // 设置货物的总金额                    entity.setAmount(money);                    // 获取到购销合同的总金额                    String id = entity.getContract().getId();                    Contract contract = baseDao.get(Contract.class, id);                    // 设置购销合同的总金额,更新 = 减去原有的购销合同金额 + 新改变的购销合同金额                    contract.setTotalAmount(contract.getTotalAmount() - amount + money);                    // 更新购销合同                    baseDao.saveOrUpdate(contract);                }            }            baseDao.saveOrUpdate(entity);        }3. 货物的删除功能    * 加载货物对象    * 通过获取对象获取到所有的附件对象    * 加载购销合同对象    * 遍历附件对象,购销合同一个一个删除附件总金额    * 购销合同删除货物金额    * 更新购销合同金额                                                                          * 删除货物对象(默认配置了级联删除)    * 删除的业务层代码        public void deleteById(Class<ContractProduct> entityClass, Serializable id) {            // 删除货物对象            // 获取到货物对象            ContractProduct product = baseDao.get(ContractProduct.class, id);            // 获取到该货物下所有的附件对象            Set<ExtCproduct> extCproducts = product.getExtCproducts();            // 加载购销合同对象            Contract contract = product.getContract();            // 先删除附件的总金额            for (ExtCproduct extCproduct : extCproducts) {                // 遍历一次,减去附件的金额,重新给购销合同设置                contract.setTotalAmount(contract.getTotalAmount() - extCproduct.getAmount());            }            // 删除货物的金额            contract.setTotalAmount(contract.getTotalAmount() - product.getAmount());            // 更新购销合同的金额            baseDao.saveOrUpdate(contract);            baseDao.deleteById(entityClass, id);        }