项目第七天
来源:互联网 发布: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); }
阅读全文
0 0
- 项目组长第七天
- 项目第七天
- 项目第七天
- 实战项目商城(第七天)
- ReactNative学习第七天 项目fetch+ListView
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- 第七天
- Unity中实现一个状态机
- 解除浏览中百度对大文件下载限制
- 抽象类
- Linux下Django Nginx + uWSGI搭建及常见问题
- javascript中的this
- 项目第七天
- 字符串指针的典型错误
- 一个用于网站自动化测试的生态系统实现
- Oracle 重建控制文件
- Tigase-01 使用spark或spi登录Tigase服务器
- 算法分析之时间复杂度与空间复杂度
- css3兼容IE8的方案 各个ie的hack
- 微信开发解决方案:(二)尴尬了
- 流式导航菜单