Compare commits
48 Commits
feature/新增
...
72f737c370
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72f737c370 | ||
|
|
a2a652eea4 | ||
|
|
98c5b3b013 | ||
|
|
0d76d1a7d3 | ||
|
|
a5bb686708 | ||
|
|
46125dc44b | ||
|
|
05c5c0ef81 | ||
|
|
d0d3215bf3 | ||
|
|
35e80266d7 | ||
|
|
92a0c15708 | ||
|
|
0013f9f8c9 | ||
|
|
149d8e287b | ||
|
|
3f65742add | ||
|
|
b56e3545a1 | ||
|
|
fd7080a332 | ||
|
|
85fb64ed55 | ||
|
|
9ad06b4361 | ||
|
|
f9c13341e6 | ||
|
|
d2a61c79d0 | ||
|
|
5f80b377e5 | ||
|
|
ab2e685004 | ||
|
|
dcc5eef006 | ||
|
|
7e8b2adb3d | ||
|
|
9aa870065b | ||
|
|
60c39929b2 | ||
|
|
9a5b8a2627 | ||
|
|
73696eb72c | ||
|
|
55babb8a35 | ||
|
|
6682dbfb7d | ||
|
|
e0b8e5fe07 | ||
|
|
800f2eb6a7 | ||
|
|
3cc633131e | ||
|
|
e3fb266890 | ||
|
|
844f7de1ab | ||
|
|
13d33488dc | ||
|
|
266601cf84 | ||
|
|
2e168a4ba7 | ||
|
|
68ba47ed70 | ||
|
|
5bb6fcd4f7 | ||
|
|
9a05bbd82c | ||
|
|
b33c992b25 | ||
|
|
5947b3dfe9 | ||
|
|
95e43b0fba | ||
|
|
e7afc76753 | ||
|
|
788183e239 | ||
|
|
f38f60a6a8 | ||
|
|
71a0f39ec9 | ||
|
|
92f591c3e7 |
2
jikimo_demand_plan_queue/__init__.py
Normal file
2
jikimo_demand_plan_queue/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import models
|
||||
18
jikimo_demand_plan_queue/__manifest__.py
Normal file
18
jikimo_demand_plan_queue/__manifest__.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': '机企猫 需求计划排程队列',
|
||||
'version': '1.0',
|
||||
'summary': """ 使用队列进行排程 """,
|
||||
'author': 'fox',
|
||||
'website': '',
|
||||
'category': '',
|
||||
'depends': ['queue_job_batch', 'sf_demand_plan'],
|
||||
'data': [
|
||||
|
||||
],
|
||||
|
||||
'application': True,
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'license': 'LGPL-3',
|
||||
}
|
||||
2
jikimo_demand_plan_queue/models/__init__.py
Normal file
2
jikimo_demand_plan_queue/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import production_demand_plan
|
||||
20
jikimo_demand_plan_queue/models/production_demand_plan.py
Normal file
20
jikimo_demand_plan_queue/models/production_demand_plan.py
Normal file
@@ -0,0 +1,20 @@
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class ProductionDemandPlan(models.Model):
|
||||
_inherit = 'sf.production.demand.plan'
|
||||
|
||||
|
||||
def _do_production_schedule(self, pro_plan_list):
|
||||
"""使用队列进行排程"""
|
||||
batch_size = 10
|
||||
current_time = fields.Datetime.now().strftime('%Y%m%d%H%M%S')
|
||||
index = 1
|
||||
for i in range(0, len(pro_plan_list), batch_size):
|
||||
batch = self.env['queue.job.batch'].get_new_batch('plan-%s-%s' % (current_time, index))
|
||||
pro_plans = pro_plan_list[i:i+batch_size]
|
||||
pro_plans.with_context(
|
||||
job_batch=batch
|
||||
).with_delay().do_production_schedule()
|
||||
index += 1
|
||||
batch.enqueue()
|
||||
@@ -10,7 +10,7 @@
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['sf_plan', 'jikimo_printing'],
|
||||
'depends': ['sf_plan','jikimo_printing'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/demand_plan.xml',
|
||||
|
||||
@@ -72,7 +72,6 @@ class SfProductionDemandPlan(models.Model):
|
||||
model_long = fields.Char('尺寸(mm)', compute='_compute_model_long')
|
||||
blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类',
|
||||
related='product_id.blank_type')
|
||||
blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型', related='product_id.blank_precision')
|
||||
embryo_long = fields.Char('坯料尺寸(mm)', compute='_compute_embryo_long')
|
||||
materials_id = fields.Char('材料', compute='_compute_materials_id', store=True)
|
||||
model_machining_precision = fields.Selection(selection=_get_machining_precision, string='精度',
|
||||
@@ -197,14 +196,11 @@ class SfProductionDemandPlan(models.Model):
|
||||
else:
|
||||
line.model_long = None
|
||||
|
||||
@api.depends('product_id.model_long', 'product_id.model_width', 'product_id.model_height', 'product_id.blank_type')
|
||||
@api.depends('product_id.model_long', 'product_id.model_width', 'product_id.model_height')
|
||||
def _compute_embryo_long(self):
|
||||
for line in self:
|
||||
if line.product_id:
|
||||
if line.product_id.blank_type == '圆料':
|
||||
line.embryo_long = f"Ø{round(line.product_id.model_width, 3)}*{round(line.product_id.model_long, 3)}"
|
||||
else:
|
||||
line.embryo_long = f"{round(line.product_id.model_long, 3)}*{round(line.product_id.model_width, 3)}*{round(line.product_id.model_height, 3)}"
|
||||
line.embryo_long = f"{round(line.product_id.model_long, 3)}*{round(line.product_id.model_width, 3)}*{round(line.product_id.model_height, 3)}"
|
||||
else:
|
||||
line.embryo_long = None
|
||||
|
||||
@@ -327,8 +323,12 @@ class SfProductionDemandPlan(models.Model):
|
||||
date_planned_start = datetime.combine(date_part, time_part)
|
||||
pro_plan_list.production_line_id = sf_production_line.id
|
||||
pro_plan_list.date_planned_start = date_planned_start
|
||||
for pro_plan in pro_plan_list:
|
||||
pro_plan.do_production_schedule()
|
||||
self._do_production_schedule(pro_plan_list)
|
||||
|
||||
def _do_production_schedule(self, pro_plan_list):
|
||||
for pro_plan in pro_plan_list:
|
||||
pro_plan.do_production_schedule()
|
||||
|
||||
|
||||
def button_action_print(self):
|
||||
return {
|
||||
|
||||
@@ -82,8 +82,3 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
th[data-name=processing_time] + th::before{
|
||||
content: '待执行单据';
|
||||
line-height: 38px;
|
||||
}
|
||||
|
||||
@@ -4,13 +4,14 @@
|
||||
<field name="model">sf.production.demand.plan</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="需求计划" default_order="sequence desc,id desc" editable="bottom"
|
||||
class="demand_plan_tree freeze-columns-before-part_number">
|
||||
class="demand_plan_tree">
|
||||
<header>
|
||||
<button string="打印" name="button_action_print" type="object"
|
||||
class="btn-primary"/>
|
||||
</header>
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="id" optional="hide"/>
|
||||
<field name="priority"/>
|
||||
<field name="status"/>
|
||||
<field name="customer_name"/>
|
||||
<field name="order_remark"/>
|
||||
@@ -27,8 +28,7 @@
|
||||
<field name="qty_delivered"/>
|
||||
<field name="qty_to_deliver"/>
|
||||
<field name="model_long"/>
|
||||
<field name="blank_type" optional="hide"/>
|
||||
<field name="blank_precision"/>
|
||||
<field name="blank_type"/>
|
||||
<field name="embryo_long"/>
|
||||
<field name="materials_id"/>
|
||||
<field name="model_machining_precision"/>
|
||||
@@ -43,10 +43,7 @@
|
||||
<field name="date_order"/>
|
||||
<field name="contract_code"/>
|
||||
<field name="plan_remark"/>
|
||||
<field name="priority" decoration-danger="priority == '1'"
|
||||
decoration-warning="priority == '2'"
|
||||
decoration-info="priority == '3'"
|
||||
decoration-success="priority == '4'"/>
|
||||
<field name="processing_time"/>
|
||||
<field name="material_check" optional="hide"/>
|
||||
<field name="hide_action_open_mrp_production" invisible="1"/>
|
||||
<field name="hide_action_purchase_orders" invisible="1"/>
|
||||
@@ -65,7 +62,6 @@
|
||||
<field name="planned_start_date"/>
|
||||
<field name="actual_start_date"/>
|
||||
<field name="actual_end_date"/>
|
||||
<field name="processing_time"/>
|
||||
<field name="create_date" optional="hide" string="创建时间"/>
|
||||
<field name="create_uid" optional="hide" string="创建人"/>
|
||||
<field name="write_date" string="更新时间"/>
|
||||
@@ -95,8 +91,7 @@
|
||||
<group expand="0" string="Group By">
|
||||
<filter name="group_by_priority" string="优先级" domain="[]" context="{'group_by': 'priority'}"/>
|
||||
<filter name="group_by_status" string="状态" domain="[]" context="{'group_by': 'status'}"/>
|
||||
<filter name="group_by_customer_name" string="客户" domain="[]"
|
||||
context="{'group_by': 'customer_name'}"/>
|
||||
<filter name="group_by_customer_name" string="客户" domain="[]" context="{'group_by': 'customer_name'}"/>
|
||||
<filter name="group_by_is_incoming_material" string="客供料" domain="[]"
|
||||
context="{'group_by': 'is_incoming_material'}"/>
|
||||
<filter name="group_by_supply_method" string="供货方式" domain="[]"
|
||||
@@ -127,9 +122,4 @@
|
||||
action="sf_production_demand_plan_action"
|
||||
parent="sf_plan.sf_production_plan_menu"
|
||||
/>
|
||||
|
||||
<!-- 调拨动作中屏蔽验证-->
|
||||
<record id="stock.action_validate_picking" model="ir.actions.server">
|
||||
<field name="binding_model_id" eval="False"/>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -4,12 +4,12 @@
|
||||
<field name="name">sf.demand.plan.print.wizard.tree</field>
|
||||
<field name="model">sf.demand.plan.print.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="打印" class="print_demand" js_class="print_demand" >
|
||||
<tree string="打印" class="print_demand" js_class="print_demand">
|
||||
<field name="model_id"/>
|
||||
<field name="filename_url"/>
|
||||
<field name="type"/>
|
||||
<field name="machining_drawings" attrs="{'column_invisible': True }"/>
|
||||
<field name="cnc_worksheet" attrs="{'column_invisible': True }" />
|
||||
<field name="machining_drawings" attrs="{'column_invisible': True }"/>
|
||||
<field name="cnc_worksheet" attrs="{'column_invisible': True }"/>
|
||||
<field name="status"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
@@ -3,7 +3,6 @@ import logging
|
||||
|
||||
import re
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class ResProductCategory(models.Model):
|
||||
@@ -48,14 +47,11 @@ class ResMrpBomMo(models.Model):
|
||||
item.subcontractor_name = ''
|
||||
|
||||
def bom_create_line_has(self, embryo):
|
||||
product = self.product_tmpl_id
|
||||
if product.unit_number in (0, None, False):
|
||||
raise ValidationError(f'产品{product.name}单件用量的值不能为{product.unit_number}')
|
||||
vals = {
|
||||
'bom_id': self.id,
|
||||
'product_id': embryo.id,
|
||||
'product_tmpl_id': embryo.product_tmpl_id.id,
|
||||
'product_qty': product.unit_number,
|
||||
'product_qty': 1,
|
||||
'product_uom_id': 1
|
||||
}
|
||||
return self.env['mrp.bom.line'].sudo().create(vals)
|
||||
@@ -126,7 +122,7 @@ class ResMrpBomMo(models.Model):
|
||||
# 查bom的原材料
|
||||
def get_raw_bom(self, product):
|
||||
raw_bom = self.env['product.product'].search(
|
||||
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)], limit=1)
|
||||
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)],limit=1)
|
||||
return raw_bom
|
||||
|
||||
|
||||
|
||||
@@ -95,8 +95,6 @@
|
||||
<page string="加工参数">
|
||||
<group>
|
||||
<group string="模型">
|
||||
<field name="blank_type" readonly="1"/>
|
||||
<field name="blank_precision" readonly="1"/>
|
||||
<label for="model_long" string="坯料尺寸[mm]"/>
|
||||
<div class="o_address_format">
|
||||
<label for="model_long" string="长"/>
|
||||
@@ -106,7 +104,7 @@
|
||||
<label for="model_height" string="高"/>
|
||||
<field name="model_height" class="o_address_zip"/>
|
||||
</div>
|
||||
<field name="unit_number" readonly="1"/>
|
||||
<field name="blank_type" readonly="1"/>
|
||||
<field name="model_volume" string="体积[mm³]"/>
|
||||
<field name="product_model_type_id" string="模型类型"/>
|
||||
<field name="model_processing_panel" placeholder="例如R,U" string="加工面板"
|
||||
|
||||
@@ -437,7 +437,7 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
('state', 'in', ['ready', 'progress', 'done'])
|
||||
])
|
||||
|
||||
plan_data_total_counts = sum(plan_data_total.mapped('qty_produced'))
|
||||
plan_data_total_counts = sum(plan_data_total.mapped('qty_production'))
|
||||
|
||||
# # 工单完成量
|
||||
# plan_data_finish_counts = plan_obj.search_count(
|
||||
@@ -601,8 +601,11 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
line_list = ast.literal_eval(kw['line_list'])
|
||||
begin_time_str = kw['begin_time'].strip('"')
|
||||
end_time_str = kw['end_time'].strip('"')
|
||||
begin_time = datetime.strptime(begin_time_str, '%Y-%m-%d %H:%M:%S')
|
||||
end_time = datetime.strptime(end_time_str, '%Y-%m-%d %H:%M:%S')
|
||||
# 将时间减去8小时(UTC+8转UTC)
|
||||
begin_time = (datetime.strptime(begin_time_str, '%Y-%m-%d %H:%M:%S') - timedelta(hours=8))
|
||||
end_time = (datetime.strptime(end_time_str, '%Y-%m-%d %H:%M:%S') - timedelta(hours=8))
|
||||
# begin_time = datetime.strptime(begin_time_str, '%Y-%m-%d %H:%M:%S')
|
||||
# end_time = datetime.strptime(end_time_str, '%Y-%m-%d %H:%M:%S')
|
||||
# print('line_list: %s' % line_list)
|
||||
print('kw', kw)
|
||||
time_unit = kw.get('time_unit', 'day').strip('"') # 默认单位为天
|
||||
@@ -637,6 +640,15 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
|
||||
if time_unit == 'hour':
|
||||
|
||||
# 计划量,目前只能从mail.message中筛选出
|
||||
plan_order_messages = request.env['mail.message'].sudo().search([
|
||||
('model', '=', 'mrp.workorder'),
|
||||
('create_date', '>=', begin_time.strftime('%Y-%m-%d %H:%M:%S')),
|
||||
('create_date', '<=', end_time.strftime('%Y-%m-%d %H:%M:%S')),
|
||||
('tracking_value_ids.field_desc', '=', '状态'),
|
||||
('tracking_value_ids.new_value_char', '=', '就绪')
|
||||
])
|
||||
|
||||
for line in line_list:
|
||||
date_field_name = 'date_finished' # 替换为你模型中的实际字段名
|
||||
order_counts = []
|
||||
@@ -678,19 +690,10 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
)
|
||||
|
||||
# 使用小时和分钟作为键,确保每个小时的数据有独立的键
|
||||
key = start_time.strftime('%H:%M:%S') # 只取小时:分钟:秒作为键
|
||||
key = (start_time + timedelta(hours=8)).strftime('%H:%M:%S') # 只取小时:分钟:秒作为键
|
||||
# time_count_dict[key] = len(orders)
|
||||
time_count_dict[key] = sum(interval_orders.mapped('qty_produced'))
|
||||
|
||||
# 计划量,目前只能从mail.message中筛选出
|
||||
plan_order_messages = request.env['mail.message'].sudo().search([
|
||||
('model', '=', 'mrp.workorder'),
|
||||
('create_date', '>=', begin_time.strftime('%Y-%m-%d %H:%M:%S')),
|
||||
('create_date', '<=', end_time.strftime('%Y-%m-%d %H:%M:%S')),
|
||||
('tracking_value_ids.field_desc', '=', '状态'),
|
||||
('tracking_value_ids.new_value_char', '=', '就绪')
|
||||
])
|
||||
|
||||
for time_interval in time_intervals:
|
||||
start_time, end_time = time_interval
|
||||
|
||||
@@ -715,9 +718,9 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
interval_orders = interval_orders.filtered(lambda o: o.routing_type == 'CNC加工' and o.production_line_id.name == line)
|
||||
|
||||
# 使用小时和分钟作为键,确保每个小时的数据有独立的键
|
||||
key = start_time.strftime('%H:%M:%S') # 只取小时:分钟:秒作为键
|
||||
key = (start_time + timedelta(hours=8)).strftime('%H:%M:%S') # 只取小时:分钟:秒作为键
|
||||
# time_count_dict[key] = len(orders)
|
||||
plan_count_dict[key] = sum(interval_orders.mapped('qty_produced'))
|
||||
plan_count_dict[key] = sum(interval_orders.mapped('qty_production'))
|
||||
|
||||
# order_counts.append()
|
||||
res['data'][line] = {
|
||||
@@ -873,6 +876,18 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
not_done_index = 1
|
||||
done_index = 1
|
||||
|
||||
# 获取当前时间,并计算24小时前的时间
|
||||
current_time = datetime.now()
|
||||
time_48_hours_ago = current_time - timedelta(hours=48)
|
||||
|
||||
# 计划量,目前只能从mail.message中筛选出
|
||||
plan_order_messages = request.env['mail.message'].sudo().search([
|
||||
('model', '=', 'mrp.workorder'),
|
||||
('create_date', '>=', time_48_hours_ago.strftime('%Y-%m-%d %H:%M:%S')),
|
||||
('tracking_value_ids.field_desc', '=', '状态'),
|
||||
('tracking_value_ids.new_value_char', 'in', ['就绪', '生产中'])
|
||||
])
|
||||
|
||||
for line in line_list:
|
||||
|
||||
if line == '业绩总览':
|
||||
@@ -889,19 +904,27 @@ class Sf_Dashboard_Connect(http.Controller):
|
||||
# [('production_line_id.name', '=', line), ('state', 'not in', ['finished']),
|
||||
# ('production_id.state', 'not in', ['cancel', 'done']), ('active', '=', True)
|
||||
# ])
|
||||
not_done_orders = work_order_obj.search(work_order_domain +
|
||||
[('state', 'in', ['ready', 'progress'])], order='id asc'
|
||||
)
|
||||
# not_done_orders = work_order_obj.search(work_order_domain +
|
||||
# [('state', 'in', ['ready', 'progress'])], order='id asc'
|
||||
# )
|
||||
not_done_orders = request.env['mrp.workorder'].sudo().browse(plan_order_messages.mapped('res_id'))
|
||||
if line == '业绩总览':
|
||||
not_done_orders = not_done_orders.filtered(lambda o: o.routing_type in ['人工线下加工', 'CNC加工'])
|
||||
elif line == '人工线下加工中心':
|
||||
not_done_orders = not_done_orders.filtered(lambda o: o.routing_type == '人工线下加工')
|
||||
else:
|
||||
not_done_orders = not_done_orders.filtered(lambda o: o.routing_type == 'CNC加工' and o.production_line_id.name == line)
|
||||
|
||||
|
||||
# 完成订单
|
||||
# 获取当前时间,并计算24小时前的时间
|
||||
current_time = datetime.now()
|
||||
time_24_hours_ago = current_time - timedelta(hours=24)
|
||||
# current_time = datetime.now()
|
||||
# time_24_hours_ago = current_time - timedelta(hours=24)
|
||||
|
||||
finish_orders = work_order_obj.search(work_order_domain + [
|
||||
('state', 'in', ['finished']),
|
||||
('production_id.state', 'not in', ['cancel']),
|
||||
('date_finished', '>=', time_24_hours_ago)
|
||||
('date_finished', '>=', time_48_hours_ago)
|
||||
], order='id asc')
|
||||
# print(finish_orders)
|
||||
|
||||
|
||||
@@ -18,4 +18,5 @@ from . import quick_easy_order
|
||||
from . import purchase_order
|
||||
from . import quality_check
|
||||
from . import purchase_request_line
|
||||
from . import bom
|
||||
# from . import stock_warehouse_orderpoint
|
||||
16
sf_manufacturing/models/bom.py
Normal file
16
sf_manufacturing/models/bom.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from odoo import models
|
||||
from odoo.osv.expression import AND
|
||||
|
||||
|
||||
class MrpBom(models.Model):
|
||||
_inherit = 'mrp.bom'
|
||||
|
||||
def _bom_subcontract_find(self, product, picking_type=None, company_id=False, bom_type='subcontract', subcontractor=False):
|
||||
domain = self._bom_find_domain(product, picking_type=picking_type, company_id=company_id, bom_type=bom_type)
|
||||
if self.env.context.get('stock_picking') == 'outsourcing':
|
||||
return self.search(domain, order='sequence, product_id, id', limit=1)
|
||||
if subcontractor:
|
||||
domain = AND([domain, [('subcontractor_ids', 'parent_of', subcontractor.ids)]])
|
||||
return self.search(domain, order='sequence, product_id, id', limit=1)
|
||||
else:
|
||||
return self.env['mrp.bom']
|
||||
@@ -1709,7 +1709,77 @@ class MrpProduction(models.Model):
|
||||
vals['procurement_group_id'] = product_group_id[product_id.id]
|
||||
else:
|
||||
vals['procurement_group_id'] = is_custemer_group_id[key]
|
||||
return super(MrpProduction, self).create(vals_list)
|
||||
|
||||
productions = super(MrpProduction, self).create(vals_list)
|
||||
|
||||
# 查询成品工序排序(自动化产线加工),供后续使用
|
||||
product_model_type_routing_sorts = self.env['sf.product.model.type.routing.sort'].search([], order='sequence asc')
|
||||
# 查询成品工序排序(人工线下加工),供后续使用
|
||||
manual_product_model_type_routing_sorts = self.env['sf.manual.product.model.type.routing.sort'].search([], order='sequence asc')
|
||||
# 查询坯料工序排序,供后续使用
|
||||
embryo_model_type_routing_sorts = self.env['sf.embryo.model.type.routing.sort'].search([], order='sequence asc')
|
||||
|
||||
for production in productions:
|
||||
# 生成序列号
|
||||
production.action_generate_serial()
|
||||
# 创建工序模板
|
||||
technology_design_values = []
|
||||
i = 0
|
||||
if production.product_id.categ_id.type == '成品':
|
||||
# 根据加工面板的面数及成品工序模板生成工序设计
|
||||
if production.production_type == '自动化产线加工':
|
||||
product_routing_workcenter = product_model_type_routing_sorts.filtered(
|
||||
lambda s: s.product_model_type_id.id == production.product_id.product_model_type_id.id
|
||||
)
|
||||
else:
|
||||
product_routing_workcenter = manual_product_model_type_routing_sorts.filtered(
|
||||
lambda s: s.manual_product_model_type_id.id == production.product_id.product_model_type_id.id
|
||||
)
|
||||
if production.production_type == '自动化产线加工':
|
||||
for k in (production.product_id.model_processing_panel.split(',')):
|
||||
for route in product_routing_workcenter:
|
||||
i += 1
|
||||
technology_design_values.append(
|
||||
self.env['sf.technology.design'].json_technology_design_str(k, route, i, False)
|
||||
)
|
||||
elif production.production_type == '人工线下加工':
|
||||
for route in product_routing_workcenter:
|
||||
i += 1
|
||||
technology_design_values.append(
|
||||
self.env['sf.technology.design'].json_technology_design_str('ZM', route, i, False)
|
||||
)
|
||||
else:
|
||||
for route in product_routing_workcenter:
|
||||
i += 1
|
||||
technology_design_values.append(
|
||||
self.env['sf.technology.design'].json_technology_design_str(False, route, i, False)
|
||||
)
|
||||
elif production.product_id.categ_id.type == '坯料':
|
||||
embryo_routing_workcenter = embryo_model_type_routing_sorts.filtered(
|
||||
lambda s: s.embryo_model_type_id.id == production.product_id.embryo_model_type_id.id
|
||||
)
|
||||
for route_embryo in embryo_routing_workcenter:
|
||||
i += 1
|
||||
technology_design_values.append(
|
||||
self.env['sf.technology.design'].json_technology_design_str(False, route_embryo, i, False)
|
||||
)
|
||||
# 处理表面工艺
|
||||
for item in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids:
|
||||
if item.route_workcenter_id.surface_technics_id.id:
|
||||
for process_param in production.product_id.model_process_parameters_ids:
|
||||
if item.route_workcenter_id.surface_technics_id == process_param.process_id:
|
||||
technology_design_values.append(
|
||||
self.env['sf.technology.design'].json_technology_design_str(
|
||||
False,
|
||||
item.route_workcenter_id,
|
||||
i,
|
||||
process_param
|
||||
)
|
||||
)
|
||||
production.technology_design_ids = technology_design_values
|
||||
# 设置制造订单状态为待工艺确认
|
||||
productions.write({'state': 'technology_to_confirmed'})
|
||||
return productions
|
||||
|
||||
@api.depends('procurement_group_id.stock_move_ids.created_purchase_line_id.order_id',
|
||||
'procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id')
|
||||
|
||||
@@ -27,11 +27,9 @@ class ResProductMo(models.Model):
|
||||
categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True)
|
||||
model_name = fields.Char('模型名称')
|
||||
blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类')
|
||||
blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型')
|
||||
model_long = fields.Float('模型长(mm)', digits=(16, 3))
|
||||
model_width = fields.Float('模型宽(mm)', digits=(16, 3))
|
||||
model_height = fields.Float('模型高(mm)', digits=(16, 3))
|
||||
unit_number = fields.Float('单件用量', digits=(16, 3), default=1)
|
||||
model_volume = fields.Float('模型体积(m³)')
|
||||
model_area = fields.Float('模型表面积(m²)')
|
||||
model_machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度')
|
||||
@@ -903,11 +901,9 @@ class ResProductMo(models.Model):
|
||||
vals = {
|
||||
'name': product_name,
|
||||
'blank_type': item.get('blank_type'),
|
||||
'blank_precision': item.get('blank_precision'),
|
||||
'model_long': item.get('blank_length') if blank_bool else self.format_float(item['model_long'] + embryo_redundancy_id.long),
|
||||
'model_width': item.get('blank_width') if blank_bool else self.format_float(item['model_width'] + embryo_redundancy_id.width),
|
||||
'model_height': item.get('blank_height') if blank_bool else self.format_float(item['model_height'] + embryo_redundancy_id.height),
|
||||
'unit_number': item.get('unit_number'),
|
||||
'model_volume': self.format_float(((item['model_long'] + embryo_redundancy_id.long) *
|
||||
(item['model_width'] + embryo_redundancy_id.width) *
|
||||
(item['model_height'] + embryo_redundancy_id.height))) if not blank_bool else (
|
||||
|
||||
@@ -95,35 +95,36 @@ class StockRule(models.Model):
|
||||
precision_rounding=proc[
|
||||
0].product_uom.rounding) > 0)
|
||||
list2 = []
|
||||
for item in procurements:
|
||||
num = int(item[0].product_qty)
|
||||
for procurement, rule in procurements:
|
||||
num = int(procurement.product_qty)
|
||||
|
||||
product = self.env['product.product'].search(
|
||||
[("id", '=', item[0].product_id.id)])
|
||||
product_tmpl = self.env['product.template'].search(
|
||||
["&", ("id", '=', product.product_tmpl_id.id), ('single_manufacturing', "!=", False)])
|
||||
if product_tmpl:
|
||||
warehouse_id = rule.warehouse_id
|
||||
if not warehouse_id:
|
||||
warehouse_id = rule.location_dest_id.warehouse_id
|
||||