I think it is doable. You will need a state updater to record the "occupied" time slots of all the locations in each route. Then in a hard activity constraint, for the newAct and every downstream activity, you will need to check whether the new "occupied" time slot of the activity in the current route conflicts with those of the same location in other routes, and if yes, the insertion would be disallowed.
Note that, the constraint needs to go over the list of activities in the current route, thus it is not efficient, but at this point I cannot think of a more efficient approach.
Hopefully the above helps.