基于Python的ERP系统中能力需求计划(CRP)的计算

一、目的

1、深入理解、掌握能力需求计划理论, ERP中MRP、工作中心、工艺路线等相关模块的关系,以及ERP系统信息集成的含义。
2、综合运用能力需求计划理论和程序设计技术,设计适合表示能力需求计划参数及计划结果的数据结构,并使用程序设计语言实现。
3、综合运用能力需求计划理论和程序设计技术,设计能力需求计划计算的算法,并使用程序设计语言实现。
4、设计并实现能力需求计划结果显示形式。
5、对于给定的能力需求计划参数实例,制定可行的能力需求计划。

二、内容

1、设计并实现适合存储能力需求计划参数及计算结果的数据结构。
2、设计并实现能力需求计划计算的算法。
3、设计并实现能力需求计划结果显示形式。
4、根据数据文件的说明完成数据文件的解析,读取计算能力需求计划的相关参数,根据读入的参数完成能力需求计划的计算(具体计算内容包括:已确认和计划MRP的总负荷、余/欠能力、累积余/欠能力),并显示(如表、图等,也可以输出到Excel中)计算结果

三、存储相关参数的文件及说明

1、MRPConfirmed.txt:已确认的MRP。文件可能包含若干行。每行对应一种物料。每行的格式如下:
物料名称 时段1需求量 时段2需求量 ... 时段n需求量
例如
X 10 8 6 12 5 8
表示物料X在 时段1到时段6的需求量分别为10 8 6 12 5 8

2、MRPPredicted.txt:计划的MRP。文件可能包含若干行。每行对应一种物料。每行的格式如下:
物料名称 时段1需求量 时段2需求量 ... 时段n需求量
例如
X 0 4 5 3 0 2
表示物料X在 时段1到时段6的需求量分别为10 8 6 12 5 8

3、Routing.txt:工艺路线文件。文件可能包含若干行。每行对应某种物料的一道工序。每行的格式如下:
物料名称 工序总数 该工序的执行顺序 该工序对应的工作中心 额定能力需求
例如
X 2 1 WC01 3
表示物料X一共有2道工序,第一道工序需要在工作中心WC01加工3个小时

4、WCRatedCapacity.txt:工作中心额定能力。文件可能包含若干行。每行对应一个工作中心。每行的格式如下:
工作中心名 额定能力(工时)
例如
WC01 90
表示工作中心WC01在一个时段内的额定能力为90小时

四、相关理论知识

1. 能力需求计划是对物料需求计划(MRP)所需能力进行核算的一种计划管理方法。具体地讲,CRP就是对各生产阶段和各工作中心所需的各种资源进行精确计算,得出人力负荷、设备负荷等资源负荷情况,并做好生产能力负荷的平衡工作。

2. 能力需求计划可以解决以下几个问题:
(1)各个物料经过哪些工作中心加工?
(2)各工作中心的可用能力和负荷是多少?
(3)工作中心的各个时段的可用能力和负荷是多少

3. 考虑能力需求计划的计算方式时,要把物料需求计划的物料需求量转换为 负荷小时,即把物料需求转换为对能力的需求。不但要考虑MRP的计划订单,还要结合工作中心和生产日历,同时还得考虑工作中心的停工及维修情况,最 后确定各工作中心在各时间段的可用能力,计算模型如图所示。

基于Python的ERP系统中能力需求计划(CRP)的计算_第1张图片

4. 工作中心加工物品的负荷计算方法下所示:
*负荷=该物品产量X占用该工作中心的标准工时(或台时)
*若能力-负荷>=0,则满足加工要求,能力富余(或刚好)。
*若能力-负荷<0,则不能满足加工要求,能力不足。

5. 编制能力需求计划的步骤分述如下:
(1)收集数据
(2)计算负荷
(3)分析负荷情况
(4)能力/负荷调整
(5)确认能力需求计划

6. 读取数据文件的方法:

def ReadMatInfo(filepath):
  with open(filepath,'r') as file:
    data:List[str] = [line.strip() for line in file.readlines()]
    return data

 

五、源代码

from typing import List
import xlsxwriter

#读取txt信息函数:
def ReadMatInfo(filepath):
  with open(filepath,'r') as file:
    data:List[str] = [line.strip() for line in file.readlines()]
    return data

#将从文件读取的物料X的已确定的MRP进行处理换行符
temp_confirmed_mrp_X = ReadMatInfo('./data_files/MRPConfirmed.txt')[0].split(' ',-1)

#读取物料X的已确定MRP并加入数组
Confirmed_MRP_X = []
for i in range(len(temp_confirmed_mrp_X)-1):
  Confirmed_MRP_X.insert(i,int(temp_confirmed_mrp_X[i+1]))

#将从文件读取的物料Y的已确定的MRP进行处理换行符
temp_confirmed_mrp_Y = ReadMatInfo('./data_files/MRPConfirmed.txt')[1].split(' ',-1)

#读取物料Y的已确定MRP并加入数组
Confirmed_MRP_Y = []
for i in range(len(temp_confirmed_mrp_Y)-1):
  Confirmed_MRP_Y.insert(i,int(temp_confirmed_mrp_Y[i+1]))

#将从文件读取的物料X的预测MRP进行处理换行符
temp_pre_mrp_X = ReadMatInfo('./data_files/MRPPredicted.txt')[0].split(' ',-1)

#读取物料X的预测MRP
Predicted_MRP_X = []
for i in range(len(temp_pre_mrp_X)-1):
  Predicted_MRP_X.insert(i,int(temp_pre_mrp_X[i+1]))

#将从文件读取的物料Y的预测MRP进行处理换行符
temp_pre_mrp_Y = ReadMatInfo('./data_files/MRPPredicted.txt')[1].split(' ',-1)

#读取物料Y的预测MRP
Predicted_MRP_Y = []
for i in range(len(temp_pre_mrp_Y)-1):
  Predicted_MRP_Y.insert(i,int(temp_pre_mrp_Y[i+1]))

#读取加工车间额定工作能力:

#读取车间WC01的额定工作能力:
workshop01 = int((ReadMatInfo('./data_files/WCRatedCapacity.txt')[0].split(' ',-1))[1])

#读取车间WC02的额定工作能力:
workshop02 = int((ReadMatInfo('./data_files/WCRatedCapacity.txt')[1].split(' ',-1))[1])

#读取文件中工艺路线信息(一共有3条工艺路线)
#读取第一条工艺路线X1
X1_process_num = int((ReadMatInfo('./data_files/Routing.txt')[0].split(' ',-1))[1])
X1_process_order = int((ReadMatInfo('./data_files/Routing.txt')[0].split(' ',-1))[2])
X1_workshop = (ReadMatInfo('./data_files/Routing.txt')[0].split(' ',-1))[3]
X1_precess_time = int((ReadMatInfo('./data_files/Routing.txt')[0].split(' ',-1))[4])
#读取第二条工艺路线X2
X2_process_num = int((ReadMatInfo('./data_files/Routing.txt')[1].split(' ',-1))[1])
X2_process_order = int((ReadMatInfo('./data_files/Routing.txt')[1].split(' ',-1))[2])
X2_workshop = (ReadMatInfo('./data_files/Routing.txt')[1].split(' ',-1))[3]
X2_precess_time = int((ReadMatInfo('./data_files/Routing.txt')[1].split(' ',-1))[4])
#读取第三条工艺路线Y
Y_process_num = int((ReadMatInfo('./data_files/Routing.txt')[2].split(' ',-1))[1])
Y_process_order = int((ReadMatInfo('./data_files/Routing.txt')[2].split(' ',-1))[2])
Y_workshop = (ReadMatInfo('./data_files/Routing.txt')[2].split(' ',-1))[3]
Y_precess_time = int((ReadMatInfo('./data_files/Routing.txt')[2].split(' ',-1))[4])

#计算过去需求负荷
#计算WC01的过去需求负载
past_demand_load1 = []
for i in range(len(Confirmed_MRP_X)):
  past_demand_load1.insert(i,Confirmed_MRP_X[i] * X1_precess_time + Confirmed_MRP_Y[i] * Y_precess_time)

#计算WC02的过去需求负载
past_demand_load2 = []
for i in range(len(Confirmed_MRP_X)):
  past_demand_load2.insert(i,Confirmed_MRP_X[i] * X2_precess_time)

#计算计划需求负荷
#计算WC01的计划需求负荷
plan_demand_load1 = []
for i in range(len(Confirmed_MRP_X)):
  plan_demand_load1.insert(i,Predicted_MRP_X[i] * X1_precess_time + Predicted_MRP_Y[i] * Y_precess_time)

#计算WC02的计划需求负荷
plan_demand_load2 = []
for i in range(len(Confirmed_MRP_X)):
  past_demand_load2.insert(i,Predicted_MRP_X[i] * X2_precess_time)

#计算总负荷
#计算WC01的总负荷
total_load1 = []
for i in range(len(Confirmed_MRP_X)):
  total_load1.insert(i,past_demand_load1[i] + plan_demand_load1[i])

#计算WC02的总负荷
total_load2 = []
for i in range(len(Confirmed_MRP_X)):
  total_load2.insert(i,past_demand_load2[i] + plan_demand_load2[i])

#计算平均能力
#计算WC01的平均能力
average_process_time1 = []
for i in range(len(Confirmed_MRP_X)):
  average_process_time1.insert(i,workshop01)
#计算WC02的平均能力
average_process_time2 = []
for i in range(len(Confirmed_MRP_X)):
  average_process_time2.insert(i,workshop02)

#计算余/欠能力
#计算WC01的余/欠能力
surplus_capacity1 = []
for i in range(len(Confirmed_MRP_X)):
  surplus_capacity1.insert(i,total_load1[i] - average_process_time1[i])

#计算WC02的余/欠能力
surplus_capacity2 = []
for i in range(len(Confirmed_MRP_X)):
  surplus_capacity2.insert(i,total_load2[i] - average_process_time2[i])

#计算累计能力
#计算WC01的累计能力
acc_capacity1 = []
acc_capacity1.insert(0,surplus_capacity1[0])
for i in range(1,len(Confirmed_MRP_X)):
  acc_capacity1.insert(i,surplus_capacity1[i] + surplus_capacity1[i-1])
#计算WC02的累计能力
acc_capacity2 = []
acc_capacity2.insert(0,surplus_capacity2[0])
for i in range(1,len(Confirmed_MRP_X)):
  acc_capacity2.insert(i,surplus_capacity2[i] + surplus_capacity2[i-1])


#将数据写入到Excel并创建表格
#创建Excel文档
print("正在进行Excel录入中:")
wb = xlsxwriter.Workbook("/Users/jayphone/Desktop/calculation_of_CRP.xlsx")
#创建WC01计算结果的表单
ws1 = wb.add_worksheet(name="caculation_of_WC01")
calculation_item = ['过去需求量','计划需求量','总负荷量','平均能力','余/欠能力','累计能力']
headline = ['周数','1','2','3','4','5','6']
#将数据插入到表格中:
ws1.write_row('A1',headline)
ws1.write_column('A2',calculation_item)
ws1.write_row('B2',past_demand_load1)
ws1.write_row('B3',plan_demand_load1)
ws1.write_row("B4",total_load1)
ws1.write_row('B5',average_process_time1)
ws1.write_row('B6',surplus_capacity1)
ws1.write_row('B7',acc_capacity1)

#创建WC02计算结果的表单
ws2 = wb.add_worksheet(name="caculation_of_WC02")
calculation_item = ['过去需求量','计划需求量','总负荷量','平均能力','余/欠能力','累计能力']
headline = ['周数','1','2','3','4','5','6']
#将数据插入到表格中:
ws2.write_row('A1',headline)
ws2.write_column('A2',calculation_item)
ws2.write_row('B2',past_demand_load2)
ws2.write_row('B3',plan_demand_load2)
ws2.write_row("B4",total_load2)
ws2.write_row('B5',average_process_time2)
ws2.write_row('B6',surplus_capacity2)
ws2.write_row('B7',acc_capacity2)

print("Excel录入完毕!!")
wb.close()

#在控制台简单输出:
print("WC01结果:")
print("过去需求量是:")
print(past_demand_load1)
print("计划需求量是:")
print(plan_demand_load1)
print("总负荷是:")
print(total_load1)
print("平均能力是:")
print(average_process_time1)
print("余/欠能力是:")
print(surplus_capacity1)
print("累计能力是:")
print(acc_capacity1)

print("WC02结果:")
print("过去需求量是:")
print(past_demand_load2)
print("计划需求量是:")
print(plan_demand_load2)
print("总负荷是:")
print(total_load2)
print("平均能力是:")
print(average_process_time2)
print("余/欠能力是:")
print(surplus_capacity2)
print("累计能力是:")
print(acc_capacity2)

 

六、结果

1.在PyCharm控制台输出

基于Python的ERP系统中能力需求计划(CRP)的计算_第2张图片

2.WC01计算结果输出Excel

基于Python的ERP系统中能力需求计划(CRP)的计算_第3张图片

3.WC02计算结果输出Excel

基于Python的ERP系统中能力需求计划(CRP)的计算_第4张图片

七、所使用的数据文件

链接:https://pan.baidu.com/s/1YyhGcHkreHXq_ePR0R67Ew  密码:byw2

你可能感兴趣的:(ERP)