open-insight/LSL2/STPROC/WO_SET_SCHEDULE.txt
2024-10-24 16:37:24 -07:00

290 lines
6.8 KiB
Plaintext

Function WO_Set_Schedule(void)
/********************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to
be copied without written permission from SRP Computer Solutions, Inc.
Name : WO Set Schedule
Description :
Tags : [SRP]
Parameters :
History (Date, Initials, Notes)
09/29/08 fjt Initial development
05/28/09 fjt Last updated
********************************************************************************************************/
$insert SRP_APP_INSERTS
Declare subroutine Update_Index, Rlist
Declare function SVC_Scheduler, SVC_Process_Time, SVC_Dates, ReadNextA
Declare function SRP_Sort_Array, SRP_Clean_Array, SRP_Wait, MemberOf
Process = 0
Begin Case
Case @USER4 _eqc "SRP_FRANK"
Loop
Process += 1
On Process GoSub Init, Open, Build_Appt_List, Term
Until (Error OR Done)
Repeat
Case MemberOf(@USER4, "MASTER_SCHED")
Loop
Process += 1
On Process GoSub Init, Open, Time_Checks, Bump, Build_Appt_List, Term
Until (Error OR Done)
Repeat
Case 1
Loop
Process += 1
On Process GoSub Init, Open, Build_Appt_List, Term
Until (Error OR Done)
Repeat
End Case
Wait = SRP_Wait("Term", Wait)
Return Ans
!----- METHODS ------------------------------------------------------------------------------------------
Init:
Ans = ""
Done = No$
Error = ""
Prefs = ""
LenPos = 1
Delim = ""
Locked = ""
// Historical to display
Config = Xlate("CONFIG", "MSC_CONFIGURATION", "", "X")
History = Config<10>
If History EQ "" then History = 4
return
Open:
// Open all the tables
Table = "WO_MAST_SCHED"
Open Table to hTable else hTable = ""
Open "DICT.":Table to hDict else hDict = ""
// Update indexes
Wait = SRP_Wait("Init", "Scheduler Load":@RM:"Updating indexes...")
Update_Index(Table, "SCHED_DT", No$, Yes$)
return
Time_Checks:
// Check to see if any in-process appointments need to have an estimate number and check the pace
Ctr = 0
List = SVC_Process_Time("ProcToday")
Cnt = Count(List, @FM) + (List NE "")
EOL = Len(List)
Pos = 1
List.B = ""
Loop
Ctr += 1
Row = ReadNextA(List, Pos, @FM)
Key = Row<0,2>
Txt = "Checking appointment time estimates and pace... "
rv = SRP_Wait("Update", Wait :@RM: Ctr/Cnt :@RM: Txt :@RM: Key)
Read Rec from hTable, Key then
GoSub Check_Estimate
GoSub Check_Pace
end
While Pos LT EOL
Repeat
return
Bump:
// This process adjusts appointments to the right of the appointment in process
Ctr = 0
Pos = 1
Loop
Ctr += 1
Row = ReadNextA(List, Pos, @FM)
React = Row<0,1>
Appts = ""
// Build a list of appointments for the reactor from the current day forward
For Date = Date() to Date()+60
Txt = "Bumping... "
rv = SRP_Wait("Update", Wait :@RM: Ctr/Cnt :@RM: Txt :@RM: Key)
rv = Xlate("WO_MAST_SCHED_DSR", Date:"*":React, 1, "X")
Until rv EQ ""
Cnt.A = Count(rv, @VM) + (rv NE "")
For a = 1 to Cnt.A
Appt = rv<0,a>
Rec = Xlate(Table, Appt, "", "X")
Gosub Define_Schedule_Times
Appts<-1> = Appt :@VM: T_Start :@VM: T_End :@VM: Stoppage :@VM: T_End - T_Start
Next a
Next Date
Appts = SRP_Sort_Array(Appts, "AR2", Yes$)
Appts = SRP_Clean_Array(Appts, @FM, "UNIQUE")
// The first appointment is really the only one the is subject to change based on the stoppage
OK = (Appts<1,3> + Appts<1,4>) EQ (Appts<2,2>)
Begin Case
Case Appts<2> EQ ""
Case OK
Case Otherwise$ ; GoSub Bump_Sched
End Case
While Pos LT EOL
Repeat
return
Bump_Sched:
Sched = ""
Cnt.A = Count(Appts, @FM) + (Appts NE "")
For a = 1 to Cnt.A
Begin Case
Case a EQ 1
// First appointment remains the same
Sched<-1> = Appts<1,1> :@VM: Appts<1,2> :@VM: Appts<1,3>
Case a EQ 2
Prev_End = Appts<1,3> + Appts<1,4>
New_End = Prev_End + Appts<2,5>
Sched<-1> = Appts<a,1> :@VM: Prev_End :@VM: New_End
Case Otherwise$
Prev_End = Sched<a-1,3>
New_End = Prev_End + Appts<a,5>
Sched<-1> = Appts<a,1> :@VM: Prev_End :@VM: New_End
End Case
Next a
Cnt.S = Count(Sched, @FM) + (Sched NE "")
For s = 1 to Cnt.S
Key = Sched<s,1>
Read Rec from hTable, Key then
T_Start = SVC_Dates("ICONV", Sched<s,2>)
T_End = SVC_Dates("ICONV", Sched<s,3>)
Rec<14> = T_Start<1>
Rec<16> = T_Start<2>
Rec<21> = T_End<1>
Rec<22> = T_End<2>
Write Rec to hTable, Key else null
end
Next s
return
Define_Schedule_Times:
StartDate = Rec<14>
StartTime = Rec<16>
EndDate = Rec<21>
EndTime = Rec<22>
Stoppage = Oconv(Rec<29>, "MD1")
If EndTime EQ 0 then EndTime = Iconv("11:59:59PM", "MT")
T_Start = Oconv(StartDate, "D4/")
T_Start<2> = Oconv(StartTime, "MTS")
T_Start = Iconv(T_Start<1> :" ": T_Start<2>, "DT")
T_End = Oconv(EndDate, "D4/")
T_End<2> = Oconv(EndTime, "MTS")
T_End = Iconv(T_End<1> :" ": T_End<2>, "DT")
return
Build_Appt_List:
Ctr = 0
EOL = No$
// Select
Stmt = "SELECT WO_MAST_SCHED WITH SCHED_DT GT " : Quote(OConv((Date() - History), 'D4/'))
Rlist(Stmt, 5, "", "", "")
Data = Str(\00\, 64000)
Ptr = 1
Loop
Readnext Key then Ctr += 1 else EOL = Yes$
Until EOL
Call Yield()
Read Record from hTable, Key else Record = ""
rv = SRP_Wait("Update", Wait :@RM: Ctr/@RECCOUNT :@RM: "Building appointments, please wait... ":@RM:Key)
// Build the appointment record
Row = SVC_Scheduler("Build_Appt_Rec", Key, Record)
If Record<17> then Locked := Key :@FM
// Append the data
PutBinaryValue(Data, Ptr, CHAR, Row :@FM)
Ptr += GetByteSize(Row :@FM)
Repeat
If Data[-1,1] EQ @FM then Data[-1,1] = ""
If Locked[-1,1] EQ @FM then Locked[-1,1] = ""
Ans = Data :@RM: Locked
return
Term:
Done = Yes$
return
!----- INTERNAL ROUTINES --------------------------------------------------------------------------------
Check_Estimate:
WO = Rec<02>
If Rec<20> LE 0 then
rv = SVC_Process_Time("ProcTime", WO, Rec)
Rec<20> = Field(rv, @RM, 1)
Write Rec to hTable, Key else null
end
return
Check_Pace:
Pace = SVC_Process_Time("RDSpace", WO)
If Pace GT 0 then
Rel = Xlate("WO_MAST_SCHED_REL", WO, "REACTOR_COUNT", "X")
If Rel LT 1 then Rel = 1
Est = Rec<20> * Rel
Diff = Pace - Est
If Diff GE 120 then
Stoppage = Int(Diff / 240)
Half = Mod(Diff, 240)
If Half LE 120 then
Stoppage = Stoppage:"5"
end else
Stoppage = Stoppage+1:"0"
end
List.B<-1> = Key :@VM: Stoppage
Rec<29> = Stoppage
Write Rec to hTable, Key else null
end
end
return