To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of bulldozers as \(B\) and the number of forklifts as \(F\). The profit per bulldozer is $7000, and the profit per forklift is $6000. Therefore, the total profit can be represented as \(7000B + 6000F\).

The constraints are based on the available time for assembly and QC. Each bulldozer requires 3 hours of assembly line time and 2 hours of QC time, while each forklift requires 2 hours of assembly line time and 1.5 hours of QC time. Given that there are 600 hours of assembly line time and 400 hours of QC time available, we can write the following inequalities to represent these constraints:

1. Assembly line time constraint: \(3B + 2F \leq 600\)
2. QC time constraint: \(2B + 1.5F \leq 400\)

Also, \(B \geq 0\) and \(F \geq 0\) because the company cannot produce a negative number of bulldozers or forklifts.

The goal is to maximize the total profit, which is represented by the objective function \(7000B + 6000F\), subject to these constraints.

Here's how we can translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Construction_Company")

# Define the decision variables
B = m.addVar(lb=0, vtype=GRB.INTEGER, name="Bulldozers")
F = m.addVar(lb=0, vtype=GRB.INTEGER, name="Forklifts")

# Set the objective function to maximize profit
m.setObjective(7000*B + 6000*F, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3*B + 2*F <= 600, name="Assembly_Line_Time")
m.addConstr(2*B + 1.5*F <= 400, name="QC_Time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of Bulldozers: {B.x}")
    print(f"Number of Forklifts: {F.x}")
    print(f"Maximum Profit: ${7000*B.x + 6000*F.x:.2f}")
else:
    print("No optimal solution found.")
```