mongodb 中,甘特图时间冲突的检测 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
msmmbl
V2EX    问与答

mongodb 中,甘特图时间冲突的检测

  •  
  •   msmmbl 2021 年 5 月 26 日 1450 次点击
    这是一个创建于 1773 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mongodb 中,使用这样的数据结构描述甘特图:

    [ { person: "nameA", task: "taskA", from: Date('xxxx'), to: Date('yyyyy')}, { person: "nameA", task: "taskB", from: Date('xxxx'), to: Date('yyyyy')}, { person: "nameB", task: "taskA", from: Date('xxxx'), to: Date('yyyyy')}, ... ] 

    代表 person 在 from 到 to 的时间段做 task 。

    有一个约束条件是,person 在同一个时间段( from - to )不能同时在做两个不同的 task 。例如,在某个时间段,nameA 不能同时即在做 taskA,又在做 taskB 。

    因此,在插入或者修改数据的时候,可以简单的通过下面的语句检测数据库中已经是否有冲突记录

    model.findOne({ person: 'xxxx', task: 'yyyy', to: { $gte: newFrom }, from: { $lte: newEnd } }) 

    存在一个场景,person 比如因为请假或者什么其他原因,从时间 t 开始,他的所有任务都往后移动一天。可以这样更新:

    model.updateMany({ person: 'xxxx', from: { $gte: Date('tttt') }, { $set: { from: { $add: 86400000 } }, { to: { $add: 86400000 } } }) 

    但是这样是没有检查上面说的约束条件的。应该怎么做呢?

    1. 单独一条一条更新记录,检测冲突,而不是像上面那样 updateMany
    2. 将修改的记录的时间段先放到到队列中,然后开启一个异步的任务检测冲突
    第 1 条附言    2021 年 5 月 26 日

    感谢@freeminder提醒,上面的场景有误,正确的是:

    由于有优先级更高的任务插入,导致某个任务需要延后一天。这个时候通过

    model.updateMany({ task: 'xxxx', from: { $gte: Date('tttt') }, { $set: { from: { $add: 86400000 } }, { to: { $add: 86400000 } } }) 

    如下图所示,此时产生冲突。 1.png

    7 条回复    2021-05-27 16:10:33 +08:00
    freeminder
        1
    freeminder  
       2021 年 5 月 26 日
    如果平移前就不存在时间重叠,平移后为什么会产生呢?
    msmmbl
        2
    msmmbl  
    OP
       2021 年 5 月 26 日
    额,我头晕了。我错了。应该是这个场景:task 由于有优先级更高的任务插入,导致某个任务需要延后一天。像下面的图那样子。https://sm.ms/image/J6aZn1VsqQvMyXS
    clf
        3
    clf  
       2021 年 5 月 26 日
    就按照你检查是否冲突的方式标记冲突的任务让配置甘特图的人来处理呗。

    如果只是一个人的话可以简单粗暴的直接让这个人所有的任务都延后一天。但两个人处理同一个任务的时候,会存在可以同时处理和不能同时处理的两种逻辑,而这两种逻辑的处理也会很麻烦。

    另外就是这个任务的所需的标准工时以及每个人的实际效率没有体现在数据库里,还有包括当前各个任务的进度等,如果有这些数据,可以考虑做成部分任务人定,定下后其他任务安排系统自动生成,弄个字段区分人定的和系统自动生成的数据,如果任务有人为调整,则重新生成非人为的部分。
    msmmbl
        4
    msmmbl  
    OP
       2021 年 5 月 26 日
    @lychs1998 厉害了。确实后面还要考虑您说的“标准工时”“实际效率”这些。请问,对于“标记冲突的任务”,是在修改任务时候实时的去标记了,还是异步去处理的。
    clf
        5
    clf  
       2021 年 5 月 26 日
    @msmmbl 在“产生冲突任务”的这一步操作的时候,就是你例子里插入一个任务的时候,返回会冲突的任务,让管理员先去调整完这些任务后,才能完成插入操作,只要插入会产生冲突,就不能完成插入操作。

    这样的好处是不会存在“插入了任务后不去修改那些冲突数据”的情况。(不过感觉也是有点麻烦。
    msmmbl
        6
    msmmbl  
    OP
       2021 年 5 月 27 日
    @lychs1998 嗯,但是实际上,即使插入的时候,数据是不冲突的。但是当做了一次批量任务延期后,就会出现冲突了,后面还需要操作者微调下几个冲突的任务。所以我觉得从插入的地方去堵不是很合适。我做了一版在修改任意任务后,都去查找下这个任务的冲突项。查询数据库次数有点多,先线上跑一跑试试。
    clf
        7
    clf  
       2021 年 5 月 27 日
    @msmmbl 前端有甘特图数据的时候可以前端监测冲突,前端处理完后,然后把“变动过”的数据发上来后,后端再去数据库检查传上来的数据有没有冲突。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4615 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 09:46 PVG 17:46 LAX 02:46 JFK 05:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86