AMPL input:

model; # Alloy Bidding stochastic programming problem

set I := 1..4;      # Suppliers of alloy
set S := {'noStrike','strike'};  # Scenarios

var a {I} >= 0;     # lbs of alloy to buy from supplier i in I
var x {I,S} >= 0;   # extra lbs to order under scenario S from supplier I
var y binary;       # 0 = don't use x[3,*], 1 = do use
var z {S};          # Cost of strategy under scenario s in S

param C {I} ;       # standard alloy cost
param P {I} ;       # premium alloy cost
param U {I} ;       # max alloy available from supplier
param L3;           # min purchase amount from supplier 3 if using on-demand
param Prob{S};      # probability of scenario S
param Pct90;        # 90th percentile for demand


minimize ExpectedCost: sum {s in S} Prob[s]*z[s];

subject to CalcZ1:
   z['noStrike'] = sum {i in I} C[i]*a[i] + sum {i in 3..4} P[i]*x[i,'noStrike'];

subject to CalcZ2:
   z['strike'] = sum {i in 2..4} C[i]*a[i] + sum {i in 3..4} P[i]*x[i,'strike'];

subject to Chance1:   # Chance constraint for scenario 1
   sum {i in I} a[i] + sum {i in 3..4} x[i,'noStrike'] >= Pct90;

subject to Chance2:   # Chance constraint for scenario 2
   sum {i in 2..4 } a[i] + sum {i in 3..4} x[i,'strike'] >= Pct90;

subject to SupplierLimit {i in I, s in S}:  # Max purchases from suppliers
   a[i] + x[i,s] <= U[i];

subject to Sup3Upper {s in S}: # Upper use of supplier 3's premium service
   x[3,s] <= U[3]*y;

subject to Sup3Lower {s in S}: # Lower use of supplier 3's premium service
   a[3]+x[3,s] >= L3*y;
   
subject to NoPremium1 {i in 1..2, s in S}:  # No on-demand from supplier 
   x[i,s] = 0;

data;

param:  C      P         U :=
	1   9.80   .         20000
	2   9.90   .         30000
	3   10.2   11.22     30000
	4   10.6   12.72     50000
	;
param L3 := 15000;
param:    Prob :=
	noStrike  .90
	strike    .10
	;
param Pct90 := 41000;

solve;
display a,x,y,z;

AMPL output: