75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
from apps.mtm.models import Goal, Mgroup
|
||
from django.core.cache import cache
|
||
from django.db.models import Q
|
||
from apps.mtm.models import Material, Process
|
||
from rest_framework.exceptions import ParseError
|
||
from apps.utils.tools import ranstr
|
||
|
||
|
||
def get_mgroup_goals(mgroupId, year, reload=False):
|
||
"""
|
||
获取工段某年的全部目标值, 以字典形式返回, 带缓存
|
||
"""
|
||
goals = Goal.objects.filter(
|
||
Q(mgroup__id=mgroupId) | Q(mgroup__name=mgroupId), year=year)
|
||
key = f'mgroup_{mgroupId}_goals'
|
||
if reload is False:
|
||
mgroup_goals = cache.get(key, None)
|
||
if mgroup_goals is not None:
|
||
return mgroup_goals
|
||
mgroup_goals = {}
|
||
for goal in goals:
|
||
mgroup_goals[f'{goal.goal_cate.code}_year'] = goal.goal_val
|
||
for i in range(12):
|
||
mgroup_goals[f'{goal.goal_cate.code}_{i+1}'] = getattr(
|
||
goal, f'goal_val_{i+1}')
|
||
cache.set(key, mgroup_goals, 10)
|
||
return mgroup_goals
|
||
|
||
|
||
def daoru_material(path: str):
|
||
"""
|
||
导入物料信息
|
||
"""
|
||
type_dict = {'主要原料': 30, '半成品': 20, '成品': 10,
|
||
'辅助材料': 40, '加工工具': 50, '辅助工装': 60, '办公用品': 70}
|
||
from apps.utils.snowflake import idWorker
|
||
from openpyxl import load_workbook
|
||
wb = load_workbook(path)
|
||
sheet = wb.get_sheet_by_name('物料')
|
||
process_l = Process.objects.all()
|
||
process_d = {p.name: p for p in process_l}
|
||
i = 3
|
||
while sheet[f'a{i}'].value is not None:
|
||
type_str = sheet[f'a{i}'].value.replace(' ', '')
|
||
try:
|
||
type = type_dict[type_str]
|
||
name = sheet[f'b{i}'].value.replace(' ', '')
|
||
specification = sheet[f'c{i}'].value.replace(
|
||
'×', '*').replace(' ', '')
|
||
model = sheet[f'd{i}'].value.replace(' ', '')
|
||
unit = sheet[f'e{i}'].value.replace(' ', '')
|
||
except Exception as e:
|
||
raise ParseError(f'{i}行物料信息错误: {str(e)}')
|
||
if type in [20, 30]:
|
||
try:
|
||
process = process_d[sheet[f'f{i}'].value.replace(' ', '')]
|
||
except Exception as e:
|
||
raise ParseError(f'{i}行物料信息错误: {str(e)}')
|
||
try:
|
||
filters = {'type': type, 'name': name, 'specification': specification,
|
||
'model': model, 'unit': unit}
|
||
if type in [20, 30]:
|
||
filters['process'] = process
|
||
default = filters
|
||
default['number'] = f'm{type}_{ranstr(6)}'
|
||
default['id'] = idWorker.get_id()
|
||
Material.objects.update_or_create(
|
||
defaults=default,
|
||
**filters
|
||
)
|
||
except Exception as e:
|
||
raise ParseError(f'{i}行物料有误, 导入失败--{e}')
|
||
i = i + 1
|
||
print(type, name, specification, model, unit, '导入成功')
|