## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem. We have two types of cookies: chocolate chip and oatmeal. Let's denote the number of chocolate chip cookies as $x_1$ and the number of oatmeal cookies as $x_2$.

## Step 2: Formulate the objective function
The objective function is to maximize Linda's revenue. Each chocolate chip cookie can be sold for $4 and each oatmeal cookie can be sold for $3. Therefore, the objective function can be written as $4x_1 + 3x_2$.

## 3: Define the constraints
We have two constraints: mixing time and vanilla extract. Each chocolate chip cookie requires 10 minutes of mixing and each oatmeal cookie requires 20 minutes of mixing. There are 360 minutes of mixing time available. This can be written as $10x_1 + 20x_2 \leq 360$. Each chocolate chip cookie requires 1 table spoon of vanilla extract and each oatmeal cookie requires 2 table spoons of vanilla extract. There are 50 table spoons of vanilla extract available. This can be written as $x_1 + 2x_2 \leq 50$. Also, $x_1 \geq 0$ and $x_2 \geq 0$ because the number of cookies cannot be negative.

## 4: Write down the symbolic representation of the problem
The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'chocolate chip cookies'), ('x2', 'oatmeal cookies')],
    'objective_function': '4*x1 + 3*x2',
    'constraints': [
        '10*x1 + 20*x2 <= 360',
        'x1 + 2*x2 <= 50',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## 5: Convert the problem into Gurobi code
Now, let's convert the problem into Gurobi code:
```python
import gurobi

# Create a new model
model = gurobi.Model()

# Define the variables
x1 = model.addVar(name="chocolate_chip_cookies", lb=0)
x2 = model.addVar(name="oatmeal_cookies", lb=0)

# Set the objective function
model.setObjective(4 * x1 + 3 * x2, gurobi.GRB.MAXIMIZE)

# Add the constraints
model.addConstr(10 * x1 + 20 * x2 <= 360, name="mixing_time")
model.addConstr(x1 + 2 * x2 <= 50, name="vanilla_extract")

# Optimize the model
model.optimize()

# Print the solution
if model.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of chocolate chip cookies: {x1.varValue}")
    print(f"Number of oatmeal cookies: {x2.varValue}")
    print(f"Maximum revenue: {model.objVal}")
else:
    print("No optimal solution found.")
```