作者:京东物流 柳宏
•目前的线路配载前端基于zTree+FixedHeaderTable+JQuery实现,通过zTree监听节点被选中和取消选中,计算该操作后是否触发节点的合并或展开,进而重新渲染配载列表中的数据
线路X
生效时间 失效时间
2022-11-02 2023-01-25
A(父节点):包含A1、A2、A3三个子节点,当前只存在A1的配载如下:
生效时间 失效时间 班期
A1 2022-11-02 2099-12-31 12
参考日期为11.17日,此时勾选A2+A3后触发A的合并,此时配载列表展示A节点
生效时间 失效时间 班期
A 2022-11-02 2023-01-25 1234567
生效时间 失效时间 班期
A1 2022-11-02 2022-11-16 12
A 2022-11-17 2023-01-25 1234567
A(父节点):包含A1、A2、A3三个子节点,其中任意节点的班期不一致都无法合并
1)如果 原始生效日期小于合并后父节点的生效日期,则切断 原始生效日期 ~ 父节点的生效日期-1天(相当于保留切断前的生效日期那一段)
2)如果 原始失效日期大于合并后父节点的失效日期,则切断 父节点的失效日期+1 ~ 原始失效日期 (相当于保留切断前的失效日期那一段)
1. 配载A的原始生失效时间为 20221103 - 20221110
2. 配载A在经过同级子节点合并后,生失效时间为 20221105-20221108
3. 那么对于配载A来说,在合并后仍然需要保留两段配载记录
3.1 生失效时间为 20221103-20221104
3.2 生失效时间为 20221109-20221110
•采用所见即所的方式保存数据,用户在前端完成切断操作后,保存到数据库的记录与前端展示一致
zTree:配载树
treeNode:配载树中的节点
nodeId:节点id
childrenNodes:包含当前节点的所有子节点集合
stowageList:配载列表的Dom结构
originStowageMapTI:原始配载:{key:节点;value:配载数据的dom结构}
newStowageMapTI:新增节点配载:{key:节点id;value:节点}
stowageFrequencyMap:配载节点和班期关系:{key:节点id;value:班期}
stowageTimeMap:配载节点和生失效日期关系:{key:节点id;value:[生效时间,失效时间]}
frequencyTreeMap:班期和节点的关系:{key:班期;value:节点数组}
node.pid:节点的父id
node.id:节点的id
在配载树上监听事件,当触发选中/取消选中时,递归的获取childrenNodes
维护配载与班期、配载与生失效日期的关系
将已有配载列表中的数据维护到stowageFrequencyMap、stowageTimeMap、originStowageMapTI中
1)如果当前节点非禁用 && 勾选 执行 合并逻辑;否则递归遍历节点;最终返回结果集
2)如果当前节点非半选 && 非父节点,向父节点中查找班期,维护节点属性,加入结果集并返回
3)根据节点的pid查找stowageFrequencyMap中是否存在班期
配载树中的网点关系主要是四级,举例说明 C(快递全国) 下面某些节点的level 与 pid 的关系
level=1
pid:C 表示全国
level=2
pid:C-10 表示华南
level=3
pid:C-10-16 表示福建
level=4
pid:C-10-16-1303 表示泉州
算法逻辑:根据pid截取相应的字符串为key,查找是否存在父节点的班期
1.如果是父节点则遍历,按照每个子节点去stowageFrequencyMap中获取班期,分为两种情况如下;找到班期后维护frequencyTreeMap,将同班期的节点维护到list中保存,即形成 班期-节点list的数据结构
2.向父节点中获取班期,同上
3.向子节点中递归获取班期,并将结果保存到新的数据结构frequencyChildMap中,然后合并到frequencyTreeMap中
对frequencyTreeMap集合进行判断,如果数量为1表示 与该节点同级的节点班期相同,触发了合并,将节点加入结果集返回;否则说明当前节点的同级节点存在不同班期,不能进行节点向上合并,直接遍历frequencyTreeMap中的value集合,加入结果集返回
对于触发了合并的结果集 frequencyTreeMap 中的每个节点遍历 同 当前线路的生失效日期比较,取出同级节点中的最大生效时间,最小失效时间,作为该同级节点中的最大公共时间范围设置到每个节点属性中
定义变量
1. queryTime:参考日期
2. maxDisableTime:最大失效时间
3. enableTime:线路生效时间
4. disableTime:线路失效时间
5. originEnableTime:记录原始生效时间
6. originDisableTime:记录原始失效时间
7. newDisableTime :enableTime - 24 * 60 * 60 * 1000
8. newEnableTime:disableTime + 24 * 60 * 60 * 1000
循环遍历每个结果集中的节点,判断是否渲染到配载列表中
根据当前节点id判断是否存在于 stowageList 中,如果存在直接显示;根据节点id删除originStowageMapTI集合
更新生失效日期,分别判断 原始配载中是否存在需要切断的日期,新添加配载中是否存在需要切断的日期;然后将当前节点添加到配载列表中
•路由线路配载维护业务核心且频繁使用功能,为了实现业务述求,将完全没有关联的树形结构和Dom列表结合在一起。采用了多种数据模型+数据结构的组合形式,构造两者之间的关系,结合遍历、深度优先搜索、字符串查找等算法进行实现,在春节串点优化专项上线后取得了预期的收益。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO