Untitled
unknown
plain_text
3 years ago
8.9 kB
8
Indexable
import json
import pandas as pd
from datetime import datetime, timedelta
import time
import plotly
import plotly.express as px
import plotly.graph_objects as go
from operation import Operation
from machine import Machine
import holidays
# import inventory
input_path='.'
india_holidays = holidays.India(years=[2021, 2022, 2023, 2024, 2025, 2026, 2027])
input_file = input_path+'/inputs/Process_schedule.xlsx'
input_file=pd.ExcelFile(input_file)
components={}
components_list=input_file.sheet_names
for sheet_name in components_list:
components[sheet_name]=pd.read_excel(input_file, sheet_name=sheet_name,skiprows=1,header=None,engine="openpyxl")
components[sheet_name].fillna("",inplace=True)
for key in components.keys():
for i in range(0,len(components[key])):
if components[key][1][i]=='' and i!=1:
components[key].drop(i,inplace=True)
op={}
for sheet_name in components_list:
op[sheet_name]={}
for key in components.keys():
for i in range(2,len(components[key])):
total_machines=components[key][2][i].split(',')
op[key][components[key][1][i]]={
"machine" : total_machines,
"transit time" : timedelta(minutes=(float(components[key][4][i] or 0)*60)),
"loading time" : timedelta(minutes=(float(components[key][5][i] or 0)*60)),
"unloading time" : timedelta(minutes=(float(components[key][6][i] or 0)*60)),
"machining time" : timedelta(minutes=(float(components[key][7][i] or 0)*60)),
"inspection time" : timedelta(minutes=(float(components[key][8][i] or 0)*60)),
"total time": timedelta(minutes=(float(components[key][4][i] or 0)*60))+timedelta(minutes=(float(components[key][5][i] or 0)*60))+timedelta(minutes=(float(components[key][6][i] or 0)*60))+timedelta(minutes=(float(components[key][7][i] or 0)*60))+timedelta(minutes=(float(components[key][8][i] or 0)*60))
}
inventory={}
for sheet_name in components_list:
inventory[sheet_name]={
"quantity" : 0,
}
machines={}
for key in components.keys():
for i in range(2,len(components[key])):
machine_list=components[key][2][i].split(',')
for machine in machine_list:
if machine not in machines.keys():
machines[machine]={
"operations" : [],
}
machines[machine]["operations"].append(components[key][1][i])
def getEarliestStartDate(orders_given):
earliest_start_date = ""
for order in orders_given:
if order["start_date"] == "":
continue
if earliest_start_date == "":
earliest_start_date = order["start_date"]
elif order["start_date"] < earliest_start_date:
earliest_start_date = order["start_date"]
return earliest_start_date
def generateSchedule(orders_given):
earliest_start_date = getEarliestStartDate(orders_given)
# inventory = []
operation_list = []
for order in orders_given:
for i in range(order["quantity"]):
for operation in op[order["variant"]]:
operation_list.append(Operation(order["priority"],
op[order["variant"]][operation]["total time"],
operation,
datetime.strptime(order["start_date"],"%Y-%m-%d"),
order["variant"],
op[order["variant"]][operation]["machine"]))
operation_list=sorted(operation_list,key=lambda x: x.priority)
machine_class = []
for machine in machines:
machine_class.append(Machine(machine))
curr_operations={}
for order in orders_given:
for variant in order.keys():
curr_operations[variant]={}
logs = []
working = []
current_datetime = datetime.strptime(earliest_start_date, "%Y-%m-%d")
while len(operation_list):
found=False
for operation in operation_list:
if operation.start_date<=current_datetime:
if len(curr_operations[operation.variant])==0:
machine = operation.findMachine(machine_class)
if machine!=None:
freeat=machine.startMachine(inventory,working,operation,current_datetime)
curr_operations[operation.variant]={
"operation":operation.name,
"time":freeat
}
operation_list.remove(operation)
found=True
logs.append([operation.name,current_datetime, freeat,operation.variant,machine.name])
if not found:
next_start_date = None
for op in operation_list:
if op.start_date>=current_datetime:
if next_start_date==None:
next_start_date = op.start_date
elif op.start_date<next_start_date:
next_start_date = op.start_date
earliest_stopping_machine=None
for machine in working:
if earliest_stopping_machine==None:
earliest_stopping_machine = machine
elif machine.freeat<earliest_stopping_machine.freeat:
earliest_stopping_machine = machine
if next_start_date!=None:
if earliest_stopping_machine.freeat>next_start_date:
current_datetime = next_start_date
else:
current_datetime = earliest_stopping_machine.freeat
earliest_stopping_machine.freeMachine(inventory,working)
else:
current_datetime = earliest_stopping_machine.freeat
earliest_stopping_machine.freeMachine(inventory,working)
if len(working)!=0:
for machine in working:
if machine.freeat<=current_datetime:
machine.freeMachine(inventory,working)
else:
current_datetime+=timedelta(minutes=1)
for key in curr_operations.keys():
if len(curr_operations[key])>0:
if curr_operations[key]["time"]<=current_datetime:
curr_operations[key]={}
for i, log in enumerate(logs):
if log[1].weekday() == 6 or log[1] in india_holidays:
for j in range(i, len(logs)):
logs[j][1] += timedelta(days=1)
logs[j][2] += timedelta(days=1)
logs1 = pd.DataFrame(
logs, columns=["Operation", "Start Time", "End Time", "Variant", "Machine"]
)
fig = px.timeline(
logs1, x_start="Start Time", x_end="End Time", y="Operation", color="Variant"
)
fig.update_layout(height=600, width=1500)
fig.update_yaxes(
autorange="reversed",
categoryorder="array"
# categoryarray=list(datasheet["Operation"]),
)
fig.write_html("./templates/ganttChart.html")
ganttGraphJSON = json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)
fig2 = px.timeline(
logs1, x_start="Start Time", x_end="End Time", y="Machine", color="Variant"
)
fig2.update_layout(height=600, width=1500)
fig2.update_yaxes(
autorange="reversed",
categoryorder="array"
)
fig2.write_html("./templates/machineLoading.html")
machineLoadingGraphJson = json.dumps(fig2, cls=plotly.utils.PlotlyJSONEncoder)
machine_utilization = {}
for log in logs:
if log[4] not in machine_utilization:
machine_utilization[log[4]] = log[2] - log[1]
else:
machine_utilization[log[4]] += log[2] - log[1]
mu = []
for machine in machine_utilization:
mu.append([machine, machine_utilization[machine]])
mu = pd.DataFrame(mu, columns=["Machine", "Utilization"])
mu.sort_values(by="Machine", inplace=True)
mu["Utilization"] = mu["Utilization"].apply(
lambda x: x
/ (current_datetime - datetime.strptime(earliest_start_date, "%Y-%m-%d"))
* 100
)
fig = go.Figure([go.Bar(x=mu["Machine"], y=mu["Utilization"])])
fig.update_layout(
title="Machine Utilization",
xaxis_title="Machine",
yaxis_title="Utilization",
height=600,
width=1500,
)
fig.write_html("./templates/machineUtilization.html")
MachineUtilGraphJSON = json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)
return logs, ganttGraphJSON, MachineUtilGraphJSON, machineLoadingGraphJson
Editor is loading...