基于SSM的商贸平台项目(第十天)

1.数据库总结

1.1 打断设计:

在报运中它的数据库设计比较难,我在这设计时进行打断设计,实现跳跃查询。在设计时我们业务关联曾经是比较多的,报运和购销合同一对多关联,合同又跟货物一对多,货物又跟附件一对多。关联曾经过多,查询效率过多,这当数据大时(100万),查询效率就可能非常低,所以我对这的设计进行了优化,在主表中加入一个打断设计的字段,这个字段存储子表的多个主键。这样就无需建立外键关联。这样设计后,报运查询相关合同下的货物信息时,不像关联方式,必须由报运去找多个合同,再通过每个合同去找多个货物信息,而直接通过打断字段,利用sql in子查询从报运直接去查找合同下的货物信息。这样减少了关联曾经,查询效率很大提高。当系统的用户数据越来越多,业务关联层级越多,这种设计方式的效率越高。它跳跃了中间多层,实现跳跃查询。

1.2 数据搬家(数据冗余)

在报运时,本身货物信息需要新增7个字段,毛重、净重、长、宽、高、出口单价、含税,还需要合同下的货物的货号、数量、包装单位、件数等。如果按原始设计,读取报运信息后,一部分货物信息要从关联的报运下的货物信息中读取,还有一部分要从合同下的货物读取。这样设计比较麻烦,开发结构复杂,业务不利于开发人员学习业务。我们对其进行优化,我们为了查询更快,关系更简单,代码更简单,将相关的合同在报运新增时,直接把所需要的部分货物信息,货号、数量、包装单位、件数直接复制到报运下的货物表中,这样在报运修改时,直接补充7个字段。在需要报运信息时。就变得简单,直接读取报运下的货物表即可。同时,为了后续业务读取这部分货物信息,还有它们关联的附件信息,我们直接也将合同下的附件信息整体搬迁。这样后续的业务直接可以从报运相关的表中查询,而无需通过多级关联去合同下去找,关联曾经变少,效率提高很多。

1.3 一对一的特殊设计

业务装箱和委托、发票、财务都是一对一的。我们为了设计上清晰,我们采用4张。主外键为一个值,委托、发票、财务直接就存放的是装箱单的ID。这样在程序中只要获得其中一个的ID,就可以查询其中任何一个对象。改变传统设计,传统设计财务关联发票,发票关联委托,委托关联装箱。财务需要获取报运的信息和装箱的信息,这时要财务要找到发票,发票找到委托,委托找到装箱,装箱找到多个报运。这样关联层级过多,速度比较慢。我们进行优化设计,改变对应关系,直接设计财务和装箱进行关联。上面的需求就非常简单,通过财务找到装箱,直接获取装箱的部分需要的信息,在通过装箱的打断设计字段,直接获取报运下的货物信息。实现多次跳跃查询。

2.技术总结

2.2 页面结构,批量修改自定义控件

在报运货物的修改中,批量进行数据修改,批量的业务就可以直接套用。利用动态表格技术,实现动态的往一个table中增加tr,动态往tr总增加td,它文本框,单选框,多选框,下拉框,大文本。利用一个js函数addRecord反复调用,就可以实现往表格中插入数据。数据在后台service层进行js串拼接,在拼接过程中,将业务数据就拼接进去。然后利用jQuery ready事件进行js动态执行。由于js运行非常快,用户感知不到表格数据的动态增加,他以为直接展现。如果数据在600行。这时不能使用通过ready事件一行一行执行。如果超过600行,采用的方式来实现。在批量修改时,我就增加了一个行标识,来标识本行记录是否修改,如果修改了,在后台就进行更新,如果没有修改,就不更新操作。

2.3POI复杂报表打印

购销合同复杂报表的打印,这个报表中需要插入用户LOGO,可以插入多个货物的图片,可以插入一根分割线,对合计的值进行公式的设置,打印时用户可以自定义设置打印一款货物,还是打印两款货物,货物生产厂家如果不同,还必须另起一页。获取一个合同信息和多个货物信息。

2.3 POI百万数据导出

在POI高版本中提供了一个特殊的构造方法SXSSF对象,利用这个对象,在构造时可以设定一个参数,产生对象的数量,根据这个数量,在大数据量导出时,当创建这么多对象后,直接POI写到xml临时文件中。当真正写文件时,再从临时文件中获取信息,输出内容。这样做解决了早期版本中,直接在内存中创建大量对象,导致非常容易内存堆溢出。它不支持模板文件操作。

2.4 amcharts 分析统计

  1. 组织数据
  2. 拼接字符串,拼接为amchart官网Demo的html格式

3.革命尚未成功,还需继续努力

  1. 工作流采用最新的Activiti5 5.16版本,它会自动创建24张表,多了一张日志表。在购销合同上报时,同时启动流程。销售专责就行购销合同的处理,然后提交流程到销售部领导的审批,销售部领导审批通过后,提交到船运部。船运部报运专责开始处理报运业务,处理完成,提交给船运部报运经理进行审核,报运经理审核通过后,他提交给船运部装箱专责。船运部装箱专责处理装箱业务,处理完成提交给装箱经理审批,装箱经理审批后,提交给委托专责,委托专责处理委托业务,处理完成提交给发票经理审批,发票经理审批通过后提交给财务部,财务部财务专责处理内部核算,提交给财务经理审批。财务经理审批通过后,流程完成。
  2. 并发处理
    购销合同打印,首先打印时,将临时文件放在服务器的临时目录。基于windows处理文件并发机制。当打印时产生一个文件名,先判断临时目录中文件是否存在,如果存在自动给其再编一个新的名称,再次判断如果这个名称还冲突,再重新命名,只到没有冲突为止。
    下载,下载时控制下载的人数,当这个数量超过阀值(10个,通过配置文件配置),action进行转向友好提示页面,“用户当前下载人数过多,请稍后下载”。