To solve the given optimization problem, we first need to define the decision variables, the objective function, and the constraints.

Let's denote:
- \(x\) as the number of treadmills sold,
- \(y\) as the number of stationary bikes sold.

The objective is to maximize profit. Given that each treadmill yields a profit of $300 and each stationary bike yields a profit of $120, the objective function can be written as:
\[ \text{Maximize:} \quad 300x + 120y \]

There are two types of constraints based on the available time for movers and setup:
1. **Mover Time Constraint:** Each treadmill takes 30 minutes of mover time, and each stationary bike takes 15 minutes of mover time. The company has 10,000 minutes of mover time available.
\[ 30x + 15y \leq 10,000 \]

2. **Setup Time Constraint:** Each treadmill requires 50 minutes of setup time, and each stationary bike requires 30 minutes of setup time. The company has 15,000 minutes of setup time available.
\[ 50x + 30y \leq 15,000 \]

Additionally, the number of treadmills and stationary bikes sold cannot be negative:
\[ x \geq 0 \]
\[ y \geq 0 \]

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
model = Model("Fitness_Equipment_Optimization")

# Define the decision variables
x = model.addVar(vtype=GRB.INTEGER, name="treadmills", lb=0)
y = model.addVar(vtype=GRB.INTEGER, name="stationary_bikes", lb=0)

# Set the objective function
model.setObjective(300*x + 120*y, GRB.MAXIMIZE)

# Add constraints
model.addConstr(30*x + 15*y <= 10000, "mover_time")
model.addConstr(50*x + 30*y <= 15000, "setup_time")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Treadmills: {x.x}")
    print(f"Stationary Bikes: {y.x}")
    print(f"Max Profit: ${300*x.x + 120*y.x:.2f}")
else:
    print("No optimal solution found")
```