增加排程后各工单时间预估功能
This commit is contained in:
@@ -187,6 +187,23 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
|
|
||||||
# 拼接工单对象属性值
|
# 拼接工单对象属性值
|
||||||
def json_workorder_str(self, k, production, route):
|
def json_workorder_str(self, k, production, route):
|
||||||
|
# 计算预计时长duration_expected
|
||||||
|
if route.routing_type == '切割':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '切割')]).time_cycle
|
||||||
|
elif route.routing_type == '获取CNC加工程序':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '获取CNC加工程序')]).time_cycle
|
||||||
|
elif route.routing_type == '工件装夹':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '工件装夹')]).time_cycle
|
||||||
|
elif route.routing_type == '前置三元定位检测':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '前置三元定位检测')]).time_cycle
|
||||||
|
elif route.routing_type == 'CNC加工':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', 'CNC加工')]).time_cycle
|
||||||
|
elif route.routing_type == '后置三元质量检测':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '后置三元质量检测')]).time_cycle
|
||||||
|
elif route.routing_type == '解除装夹':
|
||||||
|
duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '解除装夹')]).time_cycle
|
||||||
|
else:
|
||||||
|
duration_expected = 60
|
||||||
workorders_values_str = [0, '', {
|
workorders_values_str = [0, '', {
|
||||||
'product_uom_id': production.product_uom_id.id,
|
'product_uom_id': production.product_uom_id.id,
|
||||||
'qty_producing': 0,
|
'qty_producing': 0,
|
||||||
@@ -201,7 +218,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
production.product_id),
|
production.product_id),
|
||||||
'date_planned_start': False,
|
'date_planned_start': False,
|
||||||
'date_planned_finished': False,
|
'date_planned_finished': False,
|
||||||
'duration_expected': 60,
|
'duration_expected': duration_expected,
|
||||||
'duration': 0,
|
'duration': 0,
|
||||||
|
|
||||||
}]
|
}]
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ class sf_production_plan(models.Model):
|
|||||||
_name = 'sf.production.plan'
|
_name = 'sf.production.plan'
|
||||||
# _inherit = 'mrp.production'
|
# _inherit = 'mrp.production'
|
||||||
_description = 'sf_production_plan'
|
_description = 'sf_production_plan'
|
||||||
|
_order = 'create_date desc'
|
||||||
|
|
||||||
state = fields.Selection([
|
state = fields.Selection([
|
||||||
('draft', '待排程'),
|
('draft', '待排程'),
|
||||||
@@ -41,18 +42,12 @@ class sf_production_plan(models.Model):
|
|||||||
actual_end_time = fields.Datetime(string='实际结束时间')
|
actual_end_time = fields.Datetime(string='实际结束时间')
|
||||||
shift = fields.Char(string='班次')
|
shift = fields.Char(string='班次')
|
||||||
|
|
||||||
|
|
||||||
# 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期
|
# 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期
|
||||||
# sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True,
|
# sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True,
|
||||||
# default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan'))
|
# default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan'))
|
||||||
sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True)
|
sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True)
|
||||||
current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划')
|
current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# state = fields.Selection([
|
# state = fields.Selection([
|
||||||
# ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True,
|
# ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True,
|
||||||
# store=True, tracking=True)
|
# store=True, tracking=True)
|
||||||
@@ -179,16 +174,62 @@ class sf_production_plan(models.Model):
|
|||||||
else:
|
else:
|
||||||
aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)])
|
aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)])
|
||||||
workorder_time = 0
|
workorder_time = 0
|
||||||
print(aa.workorder_ids)
|
workorder_id_list = self.production_id.workorder_ids.ids
|
||||||
print(type(aa.workorder_ids))
|
print(workorder_id_list)
|
||||||
if aa.workorder_ids:
|
print(type(self.production_id.workorder_ids))
|
||||||
for item in aa.workorder_ids:
|
if self.production_id.workorder_ids:
|
||||||
current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)])
|
for item in self.production_id.workorder_ids:
|
||||||
workorder_time += current_workorder.duration_expected
|
if item.name == 'CNC加工':
|
||||||
print(workorder_time)
|
item.date_planned_start = self.date_planned_start
|
||||||
|
item.date_planned_finished = item.date_planned_start + timedelta(
|
||||||
|
minutes=self.env['mrp.routing.workcenter'].sudo().search(
|
||||||
|
[('name', '=', 'CNC加工')]).time_cycle)
|
||||||
|
item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
|
||||||
|
[('name', '=', 'CNC加工')]).time_cycle
|
||||||
|
# print(item.id)
|
||||||
|
sequence = workorder_id_list.index(item.id) - 1
|
||||||
|
# print('sequence', sequence)
|
||||||
|
# print('total', len(workorder_id_list))
|
||||||
|
# 计算CNC加工之前工单的开始结束时间
|
||||||
|
for i in range(sequence):
|
||||||
|
current_workorder_id = (item.id - (i + 1))
|
||||||
|
current_workorder_obj = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('id', '=', current_workorder_id)])
|
||||||
|
old_workorder_obj = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('id', '=', (current_workorder_id + 1))])
|
||||||
|
work_order = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
|
||||||
|
work_order.date_planned_finished = old_workorder_obj.date_planned_start
|
||||||
|
work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta(
|
||||||
|
minutes=self.env['mrp.routing.workcenter'].sudo().search(
|
||||||
|
[('name', '=', current_workorder_obj.name)]).time_cycle)
|
||||||
|
# work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', current_workorder_obj.name)]).time_cycle
|
||||||
|
# 计算CNC加工之后工单的开始结束时间
|
||||||
|
for j in range(len(workorder_id_list) - sequence - 2):
|
||||||
|
current_workorder_id = (item.id + (j + 1))
|
||||||
|
current_workorder_obj = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('id', '=', current_workorder_id)])
|
||||||
|
old_workorder_obj = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('id', '=', (current_workorder_id - 1))])
|
||||||
|
work_order = self.env['mrp.workorder'].sudo().search(
|
||||||
|
[('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
|
||||||
|
try:
|
||||||
|
work_order.date_planned_start = old_workorder_obj.date_planned_finished
|
||||||
|
print('work_order.data_start', work_order.date_planned_start)
|
||||||
|
work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta(
|
||||||
|
minutes=self.env['mrp.routing.workcenter'].sudo().search(
|
||||||
|
[('name', '=', current_workorder_obj.name)]).time_cycle)
|
||||||
|
except ValueError as e:
|
||||||
|
print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
|
||||||
|
|
||||||
|
current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)])
|
||||||
|
workorder_time += current_workorder.duration_expected
|
||||||
|
print('workorder_time', workorder_time)
|
||||||
self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time)
|
self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time)
|
||||||
self.state = 'done'
|
self.state = 'done'
|
||||||
aa.schedule_state = '已排'
|
self.production_id.schedule_state = '已排'
|
||||||
|
# self.production_id.date_planned_start = self.date_planned_start
|
||||||
|
# self.production_id.date_planned_finished = self.date_planned_finished
|
||||||
else:
|
else:
|
||||||
raise ValidationError("未找到工单")
|
raise ValidationError("未找到工单")
|
||||||
# self.date_planned_finished = self.date_planned_start + timedelta(days=3)
|
# self.date_planned_finished = self.date_planned_start + timedelta(days=3)
|
||||||
|
|||||||
Binary file not shown.
@@ -50,39 +50,39 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- 调整质量菜单顺序 -->
|
<!-- 调整质量菜单顺序 -->
|
||||||
<record id="quality_control.menu_quality_root" model="ir.ui.menu">
|
<!-- <record id="quality_control.menu_quality_root" model="ir.ui.menu"> -->
|
||||||
<field name="sequence" eval="42"/>
|
<!-- <field name="sequence" eval="42"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 调整设备菜单顺序 -->
|
<!-- 调整设备菜单顺序 -->
|
||||||
<record id="maintenance.menu_maintenance_title" model="ir.ui.menu">
|
<!-- <record id="maintenance.menu_maintenance_title" model="ir.ui.menu"> -->
|
||||||
<field name="sequence" eval="45"/>
|
<!-- <field name="sequence" eval="45"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 调整条码菜单顺序 -->
|
<!-- 调整条码菜单顺序 -->
|
||||||
<record id="stock_barcode.stock_barcode_menu" model="ir.ui.menu">
|
<!-- <record id="stock_barcode.stock_barcode_menu" model="ir.ui.menu"> -->
|
||||||
<field name="sequence" eval="48"/>
|
<!-- <field name="sequence" eval="48"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 调整库存菜单顺序 -->
|
<!-- 调整库存菜单顺序 -->
|
||||||
<record id="stock.menu_stock_root" model="ir.ui.menu">
|
<!-- <record id="stock.menu_stock_root" model="ir.ui.menu"> -->
|
||||||
<field name="sequence" eval="51"/>
|
<!-- <field name="sequence" eval="51"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 调整仪表板菜单顺序 -->
|
<!-- 调整仪表板菜单顺序 -->
|
||||||
<record id="spreadsheet_dashboard.spreadsheet_dashboard_menu_root" model="ir.ui.menu">
|
<!-- <record id="spreadsheet_dashboard.spreadsheet_dashboard_menu_root" model="ir.ui.menu"> -->
|
||||||
<field name="sequence" eval="54"/>
|
<!-- <field name="sequence" eval="54"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 调整开票菜单名字及顺序 -->
|
<!-- 调整开票菜单名字及顺序 -->
|
||||||
<record id="account.menu_finance" model="ir.ui.menu">
|
<!-- <record id="account.menu_finance" model="ir.ui.menu"> -->
|
||||||
<field name="name">应收应付</field>
|
<!-- <field name="name">应收应付</field> -->
|
||||||
<field name="sequence" eval="57"/>
|
<!-- <field name="sequence" eval="57"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
<!-- 隐藏跟踪链 -->
|
<!-- 隐藏跟踪链 -->
|
||||||
<record id="utm.menu_link_tracker_root" model="ir.ui.menu">
|
<!-- <record id="utm.menu_link_tracker_root" model="ir.ui.menu"> -->
|
||||||
<field name="active" eval="False"/>
|
<!-- <field name="active" eval="False"/> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
|
|
||||||
<!-- 移除字段属性 -->
|
<!-- 移除字段属性 -->
|
||||||
<record id="view_order_form_inherited" model="ir.ui.view">
|
<record id="view_order_form_inherited" model="ir.ui.view">
|
||||||
|
|||||||
Reference in New Issue
Block a user