发票申请和处理功能实现总结

记录发票处理功能实现的一些误区和总结

发票相关术语

  • 发票代码和发票号码 : 发票代码和发票号码是发票的唯一标识 。发票代码是由税务机关颁发 的,用于标识发票所属的单位或个人。发票号码是由开票单位 自行填写的,用于标识发票的唯一编号
  • 发票类型 : 发票类型指的是根据开票对象和纳税人资格划分的不同发票种类。常见个人 或者企业
  • 其他属性: 抬头名称、纳税号码、消费明细。

数据库设计

  • 对消费产生作出记录的前提下,需要消费主体的信息消费本身的信息 ,通常为个人信息和消费单号,此外需要添加发票相关属性到发票处理表中,以及其他冗余字段备用。
  • 需要注意的是因为是要对消费记录进行开票申请,所以要关联记录申请时间处理时间 ,申请时间可以采用数据库 新增记录的当前时间戳来生成。(SQL:CREATE_TIM timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)
  • 通常一个发票的申请开票不会超过消费产生的一定时间。
  • 创建其他视图来为显示记录作支撑。
  • 遇到的第一个问题:当我想通过主键关联多张表时,有一张表的关联属于同一服务的不同数据库,此时就需要设计到使用数据库名.表名来选中其他数据库的表。
  • 遇到的第二个问题:当我需要关联消费记录时,因为是多种消费记录,故而有不同的主键单号,为使全部记录共存在同一表格中,采用了UNION ALL合并多个子查询的结果集作为视图 ,那么此时就有一个问题,如何在一个视图中区分多种主键ID,我采用了最朴素的办法,就是视图创建一个虚字段,用来记录消费种类,比如10:商品 20:咨询费 30:订阅费,跟随子查询作为评定类型的值。

代码设计

因为是前后端不分离的Jsp支持的项目所以有很多种前后端交互的方法,这里想用什么都可以,但是部分请求或者处理过程中,若采用传统的前后分离项目的Ajax或者Axios有时会造成原有jsp域的数据不好处理会被清空。

遇到的问题

  • Hibernate读取视图表且在视图在没有主键的情况下选中一条记录时,无法提供唯一值来供逻辑操作,此处采用给视图添加虚字段为行号作为主键 (row_number ( ) OVER ( ORDER BY 表名.字段名 ) AS 别名),这样有一个好处,可以直接传送视图表的主键值作为查询依据,如果有主键值为varchar类型还可以避免比较字符串类型,效率更高!
  • 发现自己一个误区,在传统SpringMVC中视图控制器可以在不指定@ResponseBody时返回视图 ,但是如果前端是Ajax发送请求 是无法返回视图的,因为ajax无法处理更改整个页面 ,目前据我所知,只有前端的a标签还有form表单可以更改页面跳转,所以不要再用ajax去跳转视图啦!
  • 在使用jsp:include时需要注意,如果style标签写在jsp:include的前,会覆盖掉原有界面的样式。

技术总结

  • 近xx天计算SQl:to_days(now())-to_days(reciveTime)<=30,原理是to_days()通过转换当前时间与0000年(公元1年)的总天数。
  • 前端找一找方法,找兄弟 siblings(),找大儿 方法(其实是找右兄弟,我问我同事他在我右边他是谁,他说他是我的好大儿,哈哈 )nextAll()且支持入参,来找寻右边特点dom节点,基于Jquery选择器选择。
  • js代码的函数劫持 ,这个巨好用,因为在不改动已有全局代码的基础上切入自己的代码非常爽! (别问我为什么不动,你就问问你自己系统全局js你敢动吗?反正我不敢! )
    下面是使用的案例:
js 复制代码
//首先是场景是基于公司代码有自己封装好的轮子,
//然后我需要在以公司轮子为前提得情况下去实现自己的逻辑,
//首先代码提供了一个已经封装好的checkbox框,我需要在每个checkbox框所在行判断状态来禁用多选框,
//具体代码如下
  var originalChangePage = grid.setChooseBox;    //公司自定义函数,可以保留复选框的选择状态
  grid.setChooseBox = function () {
       originalChangePage.apply(this, arguments);//执行原有的函数
       dealCheckBoxUnUse();                      //实行自己的代码逻辑,用来禁用多选框
    };
    
//处理复选框禁用
  function dealCheckBoxUnUse(){
     //处理invStat存在的复选框不可选
     JQ("#gridTab").find("tr").each(function() {
        var tdElement = JQ(this).find("td[colnam='invStat']").filter(function() {
           return JQ.trim(JQ(this).text()) !== "";
        });
        if(tdElement.length>0){
           tdElement.closest('tr').find("td.gridBoxTd input").prop("disabled", true);
        }
     });
  }

写在最后

发票申请和处理的功能是在公司第一次的系统性的,从建表建实体类到前端到后端交互独立完成的一次经历,来到公司满打满算快三个月了,前后端不分离的项目能够锻炼到的技术与主流前后端分离来说有点少,虽然前端JavaScript不少写,但后端代码很少改,很难从点破面的去了解整个项目,与技术而言,我虽然写了这一整篇文章,但是其实凭心而论,基本没有什么技术点,道阻且长,仍需努力啊。

相关推荐
RainbowSea11 分钟前
“ 蒲公英图仓 ” —— 论坛
后端
Brookty24 分钟前
Java线程创建与运行全解析
java·开发语言·后端·学习·java-ee·线程
JosieBook34 分钟前
【前端】Vue3 前端项目实现动态显示当前系统时间
前端·vue3·系统时间
Data_Adventure35 分钟前
AI让我6天开发完移动端大屏编辑器,卷吗?
前端
野生程序员y41 分钟前
spring容器的bean是单例还是多例的?线程安全吗?
java·后端·spring
MiyueFE1 小时前
Nuxt 4.0 深度解析:从架构革新到实战迁移 🚀
前端·nuxt.js
天天向上的鹿茸1 小时前
web前端用MVP模式搭建项目
前端·javascript·设计模式
星辰大海的精灵1 小时前
Java 线程池的工作原理及实践
java·后端·架构
满分观察网友z1 小时前
从选择困难到最优策略:我如何用DP搞定“鱼和熊掌兼得”的排程难题(1751. 最多可以参加的会议数目 II)
后端·算法
我命由我123451 小时前
Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页
java·spring boot·后端·sql·spring·java-ee·mybatis