As indicated, your
Input System signals an intent to perform some action. How your game signals the action is really a matter of taste but the point remains the same.
Movement System is then a logical step in your game logic thread. It's resposible for taking the intent specified by the
Input System and determining velocity/force to be applied to movable entities. The velocity/force is determined based on existing entity state such as whether the entity is running, walking, swimming, flying or has some other speed boost aura applied to it's current state.
Physics System takes the calculated velocity/force and applies it to your physics managed entities. This system will determine either a new position for the entity because the movement was allowed or will not move the entity but instead generate a list of collision points. It's here where the magic happens.
At this point you'll need to iterate two types of entities: those with collisions and those without collisions.
For those without; you'll simply want to take the newly calculated position from the physics simulation step and apply that position to the entity's transform component.
For those with a collision; you'll likely want to communicate this collision to remaining parts of the system either via some type of event or callback solution.
To your question in your comment, you simply need to execute whatever logic that needs to know whether a collision happened or not after the physics system has executed it's step in the game loop. It's at this point where you know whether the entity is participating in a collision or not and the ideal place to execute or skip game logic based on this information.