全球观点:物流路由线路配载前端算法逻辑实现方案
作者:京东物流 柳宏
【资料图】
•目前的线路配载前端基于zTree+FixedHeaderTable+JQuery实现,通过zTree监听节点被选中和取消选中,计算该操作后是否触发节点的合并或展开,进而重新渲染配载列表中的数据
2. 现状问题2.1 节点合并算法逻辑有误如果一个父节点下的所有子节点都被维护,即使子节点下的班期不同、生失效日期不重叠,系统都会自动合并到父节点。合并的展示效果为:班期:对于纯新增配载显示1234567;对于父节点下有一个子节点,班期显示为已存在配载的班期生失效时间:统一为该切段线路的生失效日期例如:X线路被切割成两段,2022-11-022023-01-25以及2022-01-26长久有效两段,在线路视图点击2022-11-02~2023-01-25 这段的配载维护,X下有A1(配载时间为2022-11-02长久有效、班期12),其父节点为A,A下还有子节点A2、A3。今天是11.17日,将A2、A3都勾选上(时间任意,班期为12345),配载会立刻合并为A(生效时间2022-11-022023-01-25,配载1234567)线路X 生效时间 失效时间 2022-11-02 2023-01-25A(父节点):包含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 12345672.2 配载保存和显示的值不一致上面操作触发合并,提交后库中保存的配载记录为:生效时间 失效时间 班期A1 2022-11-02 2022-11-16 12A 2022-11-17 2023-01-25 12345672.3 本质原因原有根据zTree节点触发合并的算法有问题,不考虑当前节点下其他子节点的配载的班期和生失效日期,而是根据是否同一个父节点直接合并。导致合并逻辑错误,保存与展示的数据不一致。3. 预期效果3.1 配载合并班期逻辑条件:同一个父节点+各个子节点班期一致A(父节点):包含A1、A2、A3三个子节点,其中任意节点的班期不一致都无法合并3.2 配载生失效日期切断逻辑新添加节点,生效日期为 参考日期,失效日期为 线路失效日期参考日期选择 大于 当前 同级子节点的某天,当触发合并时合并后的父节点:生效日期取参考日期,失效时间取同级子节点列表中失效时间最小的合并后的子节点:1)如果 原始生效日期小于合并后父节点的生效日期,则切断 原始生效日期 ~ 父节点的生效日期-1天(相当于保留切断前的生效日期那一段)
2)如果 原始失效日期大于合并后父节点的失效日期,则切断 父节点的失效日期+1 ~ 原始失效日期 (相当于保留切断前的失效日期那一段)
针对同一个节点的配载生失效日期切断的逻辑,举例1. 配载A的原始生失效时间为 20221103 - 202211102. 配载A在经过同级子节点合并后,生失效时间为 20221105-202211083. 那么对于配载A来说,在合并后仍然需要保留两段配载记录 3.1 生失效时间为 20221103-20221104 3.2 生失效时间为 20221109-202211103.3 配载合并后保存逻辑•采用所见即所的方式保存数据,用户在前端完成切断操作后,保存到数据库的记录与前端展示一致
4. 实现逻辑4.1 整体逻辑4.2 定义数据结构及初始化zTree:配载树treeNode:配载树中的节点nodeId:节点idchildrenNodes:包含当前节点的所有子节点集合stowageList:配载列表的Dom结构originStowageMapTI:原始配载:{key:节点;value:配载数据的dom结构}newStowageMapTI:新增节点配载:{key:节点id;value:节点}stowageFrequencyMap:配载节点和班期关系:{key:节点id;value:班期}stowageTimeMap:配载节点和生失效日期关系:{key:节点id;value:[生效时间,失效时间]}frequencyTreeMap:班期和节点的关系:{key:班期;value:节点数组}node.pid:节点的父idnode.id:节点的id在配载树上监听事件,当触发选中/取消选中时,递归的获取childrenNodes
维护配载与班期、配载与生失效日期的关系
将已有配载列表中的数据维护到stowageFrequencyMap、stowageTimeMap、originStowageMapTI中
4.3 配载合并班期逻辑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 中的每个节点遍历 同 当前线路的生失效日期比较,取出同级节点中的最大生效时间,最小失效时间,作为该同级节点中的最大公共时间范围设置到每个节点属性中
4.4 配载生失效日期切断逻辑定义变量
1. queryTime:参考日期2. maxDisableTime:最大失效时间3. enableTime:线路生效时间4. disableTime:线路失效时间5. originEnableTime:记录原始生效时间6. originDisableTime:记录原始失效时间7. newDisableTime :enableTime - 24 * 60 * 60 * 10008. newEnableTime:disableTime + 24 * 60 * 60 * 1000循环遍历每个结果集中的节点,判断是否渲染到配载列表中
根据当前节点id判断是否存在于 stowageList 中,如果存在直接显示;根据节点id删除originStowageMapTI集合
更新生失效日期,分别判断 原始配载中是否存在需要切断的日期,新添加配载中是否存在需要切断的日期;然后将当前节点添加到配载列表中
遍历 originStowageMapTI ,判断历史的配载节点是否需要进行日期切断,分为以下两种情况;然后根据节点id删除 originStowageMapTI如果 originEnableTime < enableTime:添加新的配载记录,生效时间取 originEnableTime, 失效时间取newDisableTime如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime遍历 newStowageMapTI ,判断新添加的节点是否需要进行日期切断;然后根据节点id删除 newStowageMapTI如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime5. 总结•路由线路配载维护业务核心且频繁使用功能,为了实现业务述求,将完全没有关联的树形结构和Dom列表结合在一起。采用了多种数据模型+数据结构的组合形式,构造两者之间的关系,结合遍历、深度优先搜索、字符串查找等算法进行实现,在春节串点优化专项上线后取得了预期的收益。
关键词:
-
全球观点:物流路由线路配载前端算法逻辑实现方案
2023-04-13 -
【天天速看料】美报告:约1/5美国受访者称有亲人死于枪下
2023-04-13 -
传音控股跌近6% 股东源科基金以大宗交易累计减持达5%股份
2023-04-13 -
Uzi预测亚运会阵容,上路位置不确定,其他位置八九不离十|要闻速递
2023-04-13 -
阿里阿里,搞不定政企 天天看点
2023-04-13 -
Mysteel早报:预计今日上海冷轧及镀锌板卷价格或将下调20-30元/吨:每日速读
2023-04-13 -
观天下!报火警,拉电闸,他“救”下一栋楼的邻居
2023-04-13 -
世界快看:ICE美元指数连跌两天
2023-04-13 -
4月12日基金净值:太平丰盈一年定开债券发起式最新净值0.9892,涨0.05%
2023-04-13 -
水浒传梗概400字(水浒传梗概400字)-天天热点
2023-04-12 -
太阳能(000591.SZ):2022年度净利增16.60%至13.87亿元 拟10派1.28元
2023-04-12 -
还用戴口罩吗?这份官方文件详细解答
2023-04-12 -
【环球速看料】苏州乐园门票团购价格_苏州乐园门票团购
2023-04-12 -
天天热讯:动物的运动知识点_动物的运动
2023-04-12 -
黑龙江省第十五届运动会击剑比赛开幕 首日哈尔滨队获3金
2023-04-12 -
3月四川CPI同比上涨0.7% PPI降幅扩大至1.6%:新消息
2023-04-12 -
环球讯息:三层肉_三层肉怎么做好吃
2023-04-12 -
【世界时快讯】去年致死138人!北京交管局:违规电动三四轮车明年起禁行
2023-04-12 -
14.85亿元股权遭冻结!贾跃亭回国了?真相是-世界今日报
2023-04-12 -
宁波远洋:公司目前生产经营稳定有序,同时严格履行信息披露义务,截至目前未有应披露而未披露的重大事项
2023-04-12 -
成都糖酒会免费摆渡车开通时间+站点+线路2023
2023-04-12 -
往入侵物种非洲大蜗牛身上撒盐,属于虐待小动物还是消灭害虫?-世界微动态
2023-04-12 -
Steam加速器推荐 免费好用的Steam加速器分享:微资讯
2023-04-12 -
京东零售取消事业群制 全面打通自营与POP-看热讯
2023-04-12 -
第三届消博会|从消博会看绿色消费新趋势
2023-04-12 -
焦点快看:广东上线电力市场零售数字化平台 一万四千家企业上网“淘电”
2023-04-12 -
2023年4月11日铋粉价格最新行情预测-当前通讯
2023-04-12 -
【肖战水仙】宠臣 魏无羡&言冰云 第四章_焦点速读
2023-04-12 -
环球简讯:马来西亚2月社会零售总额录得两位数增长
2023-04-11 -
加贰佰|油耗比肩比亚迪DM-i 理想L8真实馈电油耗实测-每日热讯
2023-04-11
-
守住网络直播的伦理底线
2021-12-16 -
石窟寺文化需要基于保护的“新开发”
2021-12-16 -
电影工作者不能远离生活
2021-12-16 -
提升隧道安全管控能力 智慧高速让司乘安心
2021-12-16 -
人民财评:提升消费体验,服务同样重要
2021-12-16 -
卫冕?突破?旗手?——武大靖留给北京冬奥会三大悬念
2021-12-16 -
新能源车险专属条款出台“三电”系统、起火燃烧等都可保
2021-12-16 -
美术作品中的党史 | 第97集《窗外》
2021-12-16 -
基金销售业务违规!浦发银行厦门分行等被厦门证监局责令改正
2021-12-16 -
保持稳定发展有支撑——从11月“成绩单”看中国经济走势
2021-12-16