The best system is linear weights. It assigns a run value to every offensive outcome, both at the plate and on the bases.
Conceptually, think about it like this, each outcome is a variable in an equation.
1B + 2B + 3B + HR + BB + HBP + IBB + SF + SH + Out + HIDP + SB + CS + RoE = Runs
That's 14 variables, and each year you have 30 team outputs. Since the number of equations is greater than the number of variables, you can solve it as a system of equations and determine the value of each outcome.
On BB-Ref, they keep this stat. It's called Batting Runs, only it's displayed relative to league average (for all players - not by position). So a player with 10 BtRns is 10 runs better than average by linear weights.