暂时注释稼动率接口

This commit is contained in:
mgw
2025-04-18 14:18:41 +08:00
parent 29ee275840
commit 43c29e30b0

View File

@@ -1411,213 +1411,213 @@ class Sf_Dashboard_Connect(http.Controller):
return json.dumps(res) return json.dumps(res)
@http.route('/api/utilization/rate', type='http', auth='public', methods=['GET', 'POST'], csrf=False, cors="*") # @http.route('/api/utilization/rate', type='http', auth='public', methods=['GET', 'POST'], csrf=False, cors="*")
def UtilizationRate(self, **kw): # def UtilizationRate(self, **kw):
""" # """
获取稼动率 # 获取稼动率
""" # """
logging.info("kw=:%s" % kw) # logging.info("kw=:%s" % kw)
res = {'status': 1, 'message': '成功', 'data': {}} # res = {'status': 1, 'message': '成功', 'data': {}}
# 获取请求的机床数据 # # 获取请求的机床数据
machine_list = ast.literal_eval(kw['machine_list']) # machine_list = ast.literal_eval(kw['machine_list'])
line = kw['line'] # line = kw['line']
orders = request.env['mrp.workorder'].sudo().search([ # orders = request.env['mrp.workorder'].sudo().search([
('routing_type', '=', 'CNC加工'), # 将第一个条件合并进来 # ('routing_type', '=', 'CNC加工'), # 将第一个条件合并进来
('production_line_id.name', '=', line), # ('production_line_id.name', '=', line),
('state', 'in', ['done']) # ('state', 'in', ['done'])
]) # ])
#
faulty_plans = request.env['quality.check'].sudo().search([ # faulty_plans = request.env['quality.check'].sudo().search([
('operation_id.name', '=', 'CNC加工'), # ('operation_id.name', '=', 'CNC加工'),
('quality_state', 'in', ['fail']) # ('quality_state', 'in', ['fail'])
]) # ])
#
# 计算时间范围 # # 计算时间范围
now = datetime.now() # now = datetime.now()
today_start = now.replace(hour=0, minute=0, second=0, microsecond=0) # today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) # month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
#
total_power_on_time = 0 # total_power_on_time = 0
month_power_on_time = 0 # month_power_on_time = 0
today_power_on_time = 0 # today_power_on_time = 0
today_power_on_dict = {} # today_power_on_dict = {}
today_alarm_dict = {} # today_alarm_dict = {}
single_machine_dict = {} # single_machine_dict = {}
#
today_order_data = [] # today_order_data = []
month_order_data = [] # month_order_data = []
today_check_ng = [] # today_check_ng = []
month_check_ng = [] # month_check_ng = []
#
total_alarm_time = 0 # total_alarm_time = 0
today_alarm_time = 0 # today_alarm_time = 0
month_alarm_time = 0 # month_alarm_time = 0
#
for order in orders: # for order in orders:
time = order.date_finished # time = order.date_finished
if time >= today_start: # if time >= today_start:
today_order_data.append(order) # today_order_data.append(order)
if time >= month_start: # if time >= month_start:
month_order_data.append(order) # month_order_data.append(order)
#
for faulty_plan in faulty_plans: # for faulty_plan in faulty_plans:
time = faulty_plan.write_date # time = faulty_plan.write_date
if time >= today_start: # if time >= today_start:
today_check_ng.append(faulty_plan) # today_check_ng.append(faulty_plan)
if time >= month_start: # if time >= month_start:
month_check_ng.append(faulty_plan) # month_check_ng.append(faulty_plan)
#
# 连接数据库 # # 连接数据库
conn = psycopg2.connect(**db_config) # conn = psycopg2.connect(**db_config)
for item in machine_list: # for item in machine_list:
with conn.cursor() as cur: # with conn.cursor() as cur:
cur.execute(""" # cur.execute("""
( # (
SELECT power_on_time, 'latest' AS record_type # SELECT power_on_time, 'latest' AS record_type
FROM device_data # FROM device_data
WHERE device_name = %s # WHERE device_name = %s
AND power_on_time IS NOT NULL # AND power_on_time IS NOT NULL
ORDER BY time DESC # ORDER BY time DESC
LIMIT 1 # LIMIT 1
) # )
UNION ALL # UNION ALL
( # (
SELECT power_on_time, 'month_first' AS record_type # SELECT power_on_time, 'month_first' AS record_type
FROM device_data # FROM device_data
WHERE device_name = %s # WHERE device_name = %s
AND power_on_time IS NOT NULL # AND power_on_time IS NOT NULL
AND time >= date_trunc('month', CURRENT_DATE) -- ✅ 修复日期函数 # AND time >= date_trunc('month', CURRENT_DATE) -- ✅ 修复日期函数
AND time < (date_trunc('month', CURRENT_DATE) + INTERVAL '1 month')::date # AND time < (date_trunc('month', CURRENT_DATE) + INTERVAL '1 month')::date
ORDER BY time ASC # ORDER BY time ASC
LIMIT 1 # LIMIT 1
) # )
UNION ALL # UNION ALL
( # (
SELECT power_on_time, 'day_first' AS record_type # SELECT power_on_time, 'day_first' AS record_type
FROM device_data # FROM device_data
WHERE device_name = %s # WHERE device_name = %s
AND power_on_time IS NOT NULL # AND power_on_time IS NOT NULL
AND time::date = CURRENT_DATE -- ✅ 更高效的写法 # AND time::date = CURRENT_DATE -- ✅ 更高效的写法
ORDER BY time ASC # ORDER BY time ASC
LIMIT 1 # LIMIT 1
); # );
""", (item, item, item)) # """, (item, item, item))
results = cur.fetchall() # results = cur.fetchall()
if len(results) >= 1: # if len(results) >= 1:
total_power_on_time += convert_to_seconds(results[0][0]) # total_power_on_time += convert_to_seconds(results[0][0])
else: # else:
total_power_on_time += 0 # total_power_on_time += 0
if len(results) >= 2: # if len(results) >= 2:
month_power_on_time += convert_to_seconds(results[1][0]) # month_power_on_time += convert_to_seconds(results[1][0])
else: # else:
month_power_on_time += 0 # month_power_on_time += 0
if len(results) >= 3: # if len(results) >= 3:
today_power_on_time += convert_to_seconds(results[2][0]) # today_power_on_time += convert_to_seconds(results[2][0])
today_power_on_dict[item] = today_power_on_time # today_power_on_dict[item] = today_power_on_time
else: # else:
today_power_on_time += 0 # today_power_on_time += 0
today_power_on_dict[item] = 0 # today_power_on_dict[item] = 0
#
with conn.cursor() as cur: # with conn.cursor() as cur:
cur.execute(""" # cur.execute("""
SELECT DISTINCT ON (alarm_start_time) alarm_time, alarm_start_time # SELECT DISTINCT ON (alarm_start_time) alarm_time, alarm_start_time
FROM device_data # FROM device_data
WHERE device_name = %s AND alarm_start_time IS NOT NULL # WHERE device_name = %s AND alarm_start_time IS NOT NULL
ORDER BY alarm_start_time, time; # ORDER BY alarm_start_time, time;
""", (item,)) # """, (item,))
results = cur.fetchall() # results = cur.fetchall()
today_data = [] # today_data = []
month_data = [] # month_data = []
#
for record in results: # for record in results:
if record[0]: # if record[0]:
if float(record[0]) >= 28800: # if float(record[0]) >= 28800:
continue # continue
total_alarm_time += float(record[0]) # total_alarm_time += float(record[0])
else: # else:
total_alarm_time += 0.0 # total_alarm_time += 0.0
alarm_start = datetime.strptime(record[1], "%Y-%m-%d %H:%M:%S") # alarm_start = datetime.strptime(record[1], "%Y-%m-%d %H:%M:%S")
if alarm_start >= today_start: # if alarm_start >= today_start:
today_data.append(record) # today_data.append(record)
if alarm_start >= month_start: # if alarm_start >= month_start:
month_data.append(record) # month_data.append(record)
if today_data: # if today_data:
for today in today_data: # for today in today_data:
if today[0]: # if today[0]:
if float(today[0]) >= 28800: # if float(today[0]) >= 28800:
continue # continue
today_alarm_time += float(today[0]) # today_alarm_time += float(today[0])
today_alarm_dict[item] = today_alarm_time # today_alarm_dict[item] = today_alarm_time
else: # else:
today_alarm_time += 0.0 # today_alarm_time += 0.0
today_alarm_dict[item] = 0 # today_alarm_dict[item] = 0
else: # else:
today_alarm_dict[item] = 0 # today_alarm_dict[item] = 0
for month in month_data: # for month in month_data:
if month[0]: # if month[0]:
if float(month[0]) >= 28800: # if float(month[0]) >= 28800:
continue # continue
month_alarm_time += float(month[0]) # month_alarm_time += float(month[0])
else: # else:
month_alarm_time += 0.0 # month_alarm_time += 0.0
#
conn.close() # conn.close()
#
logging.info('报警时间总月日=============%s, %s, %s' % (total_alarm_time, month_alarm_time, today_alarm_time)) # logging.info('报警时间总月日=============%s, %s, %s' % (total_alarm_time, month_alarm_time, today_alarm_time))
# 计算时间开动率(累计、月、日) # # 计算时间开动率(累计、月、日)
if total_power_on_time: # if total_power_on_time:
total_power_on_rate = (total_power_on_time - total_alarm_time) / total_power_on_time # total_power_on_rate = (total_power_on_time - total_alarm_time) / total_power_on_time
else: # else:
total_power_on_rate = 0 # total_power_on_rate = 0
if month_power_on_time: # if month_power_on_time:
month_power_on_rate = (total_power_on_time - month_power_on_time - month_alarm_time) / ( # month_power_on_rate = (total_power_on_time - month_power_on_time - month_alarm_time) / (
total_power_on_time - month_power_on_time) # total_power_on_time - month_power_on_time)
else: # else:
month_power_on_rate = 0 # month_power_on_rate = 0
if today_power_on_time: # if today_power_on_time:
today_power_on_rate = (total_power_on_time - today_power_on_time - today_alarm_time) / ( # today_power_on_rate = (total_power_on_time - today_power_on_time - today_alarm_time) / (
total_power_on_time - today_power_on_time) # total_power_on_time - today_power_on_time)
else: # else:
today_power_on_rate = 0 # today_power_on_rate = 0
logging.info("总开动率: %s" % total_power_on_rate) # logging.info("总开动率: %s" % total_power_on_rate)
logging.info("月开动率: %s" % month_power_on_rate) # logging.info("月开动率: %s" % month_power_on_rate)
logging.info("日开动率: %s" % today_power_on_rate) # logging.info("日开动率: %s" % today_power_on_rate)
#
# 计算性能开动率(累计、月、日) # # 计算性能开动率(累计、月、日)
logging.info('完成工单数量: %s' % len(orders)) # logging.info('完成工单数量: %s' % len(orders))
total_performance_rate = len(orders) * 30 * 60 / (total_power_on_time - total_alarm_time) # total_performance_rate = len(orders) * 30 * 60 / (total_power_on_time - total_alarm_time)
month_performance_rate = len(month_data) * 30 * 60 / ( # month_performance_rate = len(month_data) * 30 * 60 / (
total_power_on_time - month_power_on_time - month_alarm_time) # total_power_on_time - month_power_on_time - month_alarm_time)
today_performance_rate = len(today_data) * 30 * 60 / ( # today_performance_rate = len(today_data) * 30 * 60 / (
total_power_on_time - today_power_on_time - today_alarm_time) if today_power_on_time != 0 else 0 # total_power_on_time - today_power_on_time - today_alarm_time) if today_power_on_time != 0 else 0
logging.info("总性能率: %s" % total_performance_rate) # logging.info("总性能率: %s" % total_performance_rate)
logging.info("月性能率: %s" % month_performance_rate) # logging.info("月性能率: %s" % month_performance_rate)
logging.info("日性能率: %s" % today_performance_rate) # logging.info("日性能率: %s" % today_performance_rate)
#
# 计算累计合格率 # # 计算累计合格率
total_pass_rate = (len(orders) - len(today_check_ng)) / len(orders) if len(orders) != 0 else 0 # total_pass_rate = (len(orders) - len(today_check_ng)) / len(orders) if len(orders) != 0 else 0
month_pass_rate = (len(month_order_data) - len(month_check_ng)) / len(month_order_data) if len(month_order_data) != 0 else 0 # month_pass_rate = (len(month_order_data) - len(month_check_ng)) / len(month_order_data) if len(month_order_data) != 0 else 0
today_pass_rate = (len(today_order_data) - len(today_check_ng)) / len(today_order_data) if len(today_order_data) != 0 else 0 # today_pass_rate = (len(today_order_data) - len(today_check_ng)) / len(today_order_data) if len(today_order_data) != 0 else 0
logging.info("总合格率: %s" % total_pass_rate) # logging.info("总合格率: %s" % total_pass_rate)
logging.info("月合格率: %s" % month_pass_rate) # logging.info("月合格率: %s" % month_pass_rate)
logging.info("日合格率: %s" % today_pass_rate) # logging.info("日合格率: %s" % today_pass_rate)
#
# # 返回数据 # # # 返回数据
# res['data'][item] = { # # res['data'][item] = {
# 'total_utilization_rate': total_power_on_rate * total_performance_rate * total_pass_rate, # # 'total_utilization_rate': total_power_on_rate * total_performance_rate * total_pass_rate,
# 'month_utilization_rate': month_power_on_rate * month_performance_rate * month_pass_rate, # # 'month_utilization_rate': month_power_on_rate * month_performance_rate * month_pass_rate,
# 'today_utilization_rate': today_power_on_rate * today_performance_rate * today_pass_rate, # # 'today_utilization_rate': today_power_on_rate * today_performance_rate * today_pass_rate,
# } # # }
for i in machine_list: # for i in machine_list:
single_machine_utilization_rate = total_power_on_time - today_power_on_dict[i] - today_alarm_dict[i] / ( # single_machine_utilization_rate = total_power_on_time - today_power_on_dict[i] - today_alarm_dict[i] / (
total_power_on_time - today_power_on_dict[i]) # total_power_on_time - today_power_on_dict[i])
single_machine_dict[i] = single_machine_utilization_rate * today_performance_rate * today_pass_rate # single_machine_dict[i] = single_machine_utilization_rate * today_performance_rate * today_pass_rate
#
res['data'] = { # res['data'] = {
'total_utilization_rate': total_power_on_rate * total_performance_rate * total_pass_rate, # 'total_utilization_rate': total_power_on_rate * total_performance_rate * total_pass_rate,
'month_utilization_rate': month_power_on_rate * month_performance_rate * month_pass_rate, # 'month_utilization_rate': month_power_on_rate * month_performance_rate * month_pass_rate,
'today_utilization_rate': today_power_on_rate * today_performance_rate * today_pass_rate, # 'today_utilization_rate': today_power_on_rate * today_performance_rate * today_pass_rate,
'single_machine_dict': single_machine_dict # 'single_machine_dict': single_machine_dict
} # }
#
return json.dumps(res) # return json.dumps(res)