项目场景:

这次的业务场景是以前的同事写的"假代码",业务接口就没有实现,没实现也就算了,还搞一条假数据,好像实现了一样。这都是欠的业务债啊。
       最近,公司也是各种狗血啊。什么加班的调休有效期是一个月,然后,如果调休了就没有项目奖金;然后上班时间调整,中午你猜有多长时间吃饭休息?12:45-13:30,这是遇到的最短的中场休息了,扎扎实实日工作时间是8个小时啊,其实很多公司实际上都只7.5个小时。。。


问题描述


用户一直看到这个假消息。。。。
接口跟踪看源码,原来是这么玩的。。。。


原因分析:

还有啥好分析的啊,就是没有实现呗。
       产品重新设计,这块要显示工单信息、APP通知。APP通知的还好说就一个入口,工单这块有几类,而且工单节点处理了,这边也是要有新的信息的(节点处理了产生新的信息,产品没有提,我想应该是需要的,也不想后面再调,所以一次性想到了要设计)。
       工单这块的入口、节点处理、那可是太多地方了,我可不想一个个找入口,况且,现在已经是交付期,大改危险,而且前期的工单也非我处理设计,那要找费劲啊。
       最后想到了一个主动拉取自己的工单到消息模块的方案,感觉还不错就分享给大家。
       这里分享给大家的其实是想让大家感受下逆向思维。既然入口不好处理,那我们就在出口做处理,一样也是可行的。


解决方案:

1、先看流程图:

2、思路说明:
       其实就是逆向处理,既然在工单的多个入口处不好增加消息信息,那么在用户点击消息模块的出口这里人为的先去查询自己提的工单数据,经过转换处理后入库,然后再做查询自己的工单的消息。这里要注意的:
       A、判断页码,只在第一页才去同步工单转换(另外一个原因是每页都同步会影响分页数据)
       B、已存在的就注意判断更新时间字段比我这条信息的阅读时间是否晚,如果晚,那肯定是要更新读取状态为未读的(正向的入口逻辑是工单处理了需要产生一条消息记录的)
       C、要注意数据量、注意不要太影响查询数据的接口速度
3、看核心代码

@Overridepublic Result<?> pullAndQueryList(Map<String, String> param) {//参数校验Result<?> res = SuggestionUtil.checkPullAndQueryParam(param);if (res != null){return res;}//参数拆解Integer userId = Integer.parseInt(param.get("userId"));Integer subjectId = Integer.parseInt(param.get("subjectId"));Integer page = Integer.parseInt(param.get("page"));Integer size = Integer.parseInt(param.get("size"));//查询用户信息UserInfo userInfo = userInfoMapper.selectByPrimaryKey(userId);if (userInfo == null){return ResultGenerator.genFailResult(ResponseCodeI18n.USER_NOT_EXIST.getMsg());}if (page.intValue() == 1){//pull工单数据pullWorkOrderInfo(userInfo,subjectId);}//查询数据PageHelper.startPage(page,size);List<SuggestionInfoDto> ls = suggestionInfoMapper.querySuggestionDtoList(param);PageInfo<SuggestionInfoDto> pageInfo = new PageInfo<>(ls);return ResultGenerator.genSuccessResult(pageInfo);}/*** 拉取用户最新的工单信息* @param userInfo 用户信息* @param subjectId 项目id*/private void pullWorkOrderInfo(UserInfo userInfo, Integer subjectId) {//suggestioninfo基础信息SuggestionInfo si = new SuggestionInfo();si.setIsDeleted(BusinessConstant.NO_DELETE);si.setSubjectId(subjectId);si.setOrgId(userInfo.getOrgId());//组织pull工单信息参数WorkOrderInfo woRecord = new WorkOrderInfo();//前端创建的来源=99woRecord.setCreateSource(99);//前端创建的workType=1woRecord.setWorkType(1);woRecord.setIsDeleted(BusinessConstant.NO_DELETE);woRecord.setOrgId(userInfo.getOrgId());woRecord.setSubjectId(subjectId);woRecord.setCreateBy(userInfo.getId());woRecord.setCreateTime(null);List<WorkOrderInfo> odList = workOrderInfoMapper.select(woRecord);if (CollectionUtil.isNotEmpty(odList)){odList.stream().forEach(d->{//转换为suggestioninfo信息SuggestionInfo tmp = new SuggestionInfo();BeanUtil.copyProperties(si,tmp,CopyOptions.create().setIgnoreNullValue(Boolean.TRUE));tmp.setMsgId(d.getId());tmp.setMsgType(1);//先查询是否存在List<SuggestionInfo> sgLs = suggestionInfoMapper.select(tmp);if (CollectionUtil.isEmpty(sgLs)){tmp.setDescription(d.getWorkTitle());tmp.setContent(d.getWorkContent());tmp.setIsRead(0);tmp.setMobile(userInfo.getMobile());tmp.setCreateTime(d.getCreateTime());tmp.setUpdateTime(si.getCreateTime());tmp.setUserId(userInfo.getId());suggestionInfoMapper.insert(tmp);}else {SuggestionInfo sg = sgLs.get(0);Integer re = sg.getIsRead();if (re.intValue() == 1){//已读需要根据更新时间判定Date sgReadTime = sg.getReadTime();Date odUpTime = d.getUpdateTime();if (sgReadTime != null && odUpTime.after(sgReadTime)){sg.setIsRead(0);}sg.setUpdateTime(d.getUpdateTime());suggestionInfoMapper.updateByPrimaryKeySelective(sg);}}});}}

总结:

1、逆向思维还是很有必要的
2、要注意数据量、处理好优化,否在会影响查询数据接口的性能
3、做之前一定一定要多想想设计,想多了,你就会事半功倍
4、code review很重要,要是之前就有这样的机制,这种问题其实应该不会发生,这里奇怪的是测试居然也过了。。。。
5、The debt owed by the team will always be repaid
       好了,就写道这里,希望能开拓大家处理问题的思路。

欠的债总要有人替你还相关推荐

  1. 曾经欠的“债”,迟早都要还的

    背景 高考就像人生的分水岭,那一步的选择,很大程度决定这你以后的路. 学计算机也算是阴差阳错,当时计算机是很冷门的专业,而且高中好多培训学校如:某鸟,天天去我高中宣讲,考不上大学的,可以选择他们学习计 ...

  2. 英国工人手机上网欠巨债 收到2.7万英镑帐单

    中国,加拿大的用户都出现了这一问题,接下来看看英国. 英国达拉谟郡一位工厂工人因将其手机当作电脑调制解调器上网而欠下了高达2.7万英镑的话费. 29岁的伊恩·辛普森(Ian Simpson)在网上的下 ...

  3. android平板软件生态,雷军:做安卓平板生态 总要有人先种树

    文/雷军 不少米粉一直都在呼吁我们做平板,在此之前市场上的Android平板也不少.但为什么小米创业四年后我们才开始做?因为平板是个非常难做的产品. 苹果CEO Tim Cook没少挖苦Android ...

  4. 苹果又魔改安卓?有人说,还不如看鸿蒙……

    ‍ ‍ 来源| 网易科技<态℃>栏目组 文|御柳 7天前,华为发布了面向未来万物互联的.全新的操作系统鸿蒙OS. 昨天,苹果更新了OS全家桶.然而,新功能升级却处处"似曾相识&q ...

  5. 毕业10年,一个上海女程序员的职业之路—02

    作者 | 杨小二 来源 | web前端开发(web_qdkf) 前言 2009年的7月,一张车票初入上海,从一个完全没有任何基础的前端小白,最后通过自学前端,终于成功找到了工作,中间的过程很坎坷,但结 ...

  6. 传参时带有日期参数,@JsonFormat与@DateTimeFormat

    先鸡汤一波,平时不注意,欠的债总还是要还的,换工作了,自己写个项目,居然不知道他俩的区别. 注解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ...

  7. 用devc++表白_邑大表白墙 第七季 第059期

    我在 [纵梦邑大] 等你   点击上方蓝字关注 我想吃 想爱 还想在一瞬间变成天上忽明忽暗的云 ♥表白1to  180114赵同学 其实我已经喜欢你很久了,但是一直都没有胆量说出口,只能远远的望着你, ...

  8. 那些年我们程序员欠下的技术债

    2019独角兽企业重金招聘Python工程师标准>>> 前言 关于这个问题其实在心里酝酿了很久,直到女票发来一篇文章,简单扫了一眼.第二天清晨,灵光一现,突然就有了这么一个标题. 我 ...

  9. 代码质量与规范,那些年你欠下的技术债

    提到"质量"二字时,我们的第一反应往往是"有多少BUG?""性能好不好?"这样的问题.我们对软件产品或服务的质量定义看其能不能满足用户的需求 ...

最新文章

  1. log file sycn 概述
  2. 彻底解决Git中文乱码问题
  3. 和方舟rust一样的手游_三大高人气手游盘点,《方舟:生存进化》的世界靠支配恐龙来生存...
  4. 用python设计学生管理系统_Django实现学生管理系统实例分享
  5. fpga开发教程 labview_LabVIEW项目样例 - NI VST FPGA软件编程使用步骤与实例教程
  6. IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)
  7. 高通8155车载芯片_WEY来“摩卡”云首秀,搭载高通8155芯片
  8. macos中xcode使用opencv,错误总结
  9. 网信办:2021年全国受理网络违法和不良信息举报1.66亿件
  10. GitHub高赞,一款足以取代迅雷的开源下载工具
  11. 论文准备:基于区块链的一些设计IIoT的最新动向调查【已公开发表】
  12. LaTex符号大全(LaTeX_Symbols)
  13. 自动驾驶汽车传感器技术解析—毫米波雷达
  14. MATLAB复数相关运用
  15. Java树形结构设计与开发
  16. 东南大学 通信工程/电子信息工程 院校分析 通信保研面试重点问题
  17. 2023美国大学生数学建模竞赛(美赛)思路代码
  18. CentOS如何修改时区
  19. Python中yield的用法详解——最简单,最清晰的解释
  20. 什么样的电脑配置跑Vivado FPGA综合最快?

热门文章

  1. 外延生长在GaAs衬底上的 Fez0 单晶薄膜-供应压铸铝合金表面耐蚀性银基非晶/易降解的镀铝/顶层金属薄膜定制
  2. AnyCasting压铸局部挤压功能
  3. Auto你的IT——AutoIt是啥?
  4. 跨境电商亚马逊刚入行必须要知道的20个运营术语(一)
  5. matlab仿真 调频立体声广播,调频立体声广播系统的建模与仿真.doc
  6. 思维导图制作软件/网站
  7. DXP设计PCB过程中批量修改元件符号大小的方法
  8. 点一下详情系统挂了,CPU100%
  9. js 中数字小数点末尾的0显示与否
  10. 计算机系统如何恢复出厂设置路由器,路由器怎么恢复出厂设置