修复返工bug
This commit is contained in:
@@ -136,7 +136,8 @@ class MrpProduction(models.Model):
|
|||||||
# production.state = 'done'
|
# production.state = 'done'
|
||||||
if any(
|
if any(
|
||||||
(
|
(
|
||||||
wo.test_results == '返工' and wo.state == 'done' and production.programming_state == '已编程') or (
|
wo.test_results == '返工' and wo.state == 'done' and production.programming_state in [
|
||||||
|
'已编程', '已下发']) or (
|
||||||
wo.state == 'rework' and production.programming_state == '编程中') or (
|
wo.state == 'rework' and production.programming_state == '编程中') or (
|
||||||
wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中',
|
wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中',
|
||||||
'已编程'])
|
'已编程'])
|
||||||
@@ -203,7 +204,7 @@ class MrpProduction(models.Model):
|
|||||||
production.write({'programming_state': '已编程未下发' if item[
|
production.write({'programming_state': '已编程未下发' if item[
|
||||||
'programming_state'] == '已编程' else '编程中'})
|
'programming_state'] == '已编程' else '编程中'})
|
||||||
else:
|
else:
|
||||||
return item['programming_state']
|
return item
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise UserError(ret['message'])
|
raise UserError(ret['message'])
|
||||||
@@ -744,10 +745,12 @@ class MrpProduction(models.Model):
|
|||||||
|
|
||||||
# 返工
|
# 返工
|
||||||
def button_rework(self):
|
def button_rework(self):
|
||||||
cloud_programming_state = None
|
cloud_programming = None
|
||||||
if self.programming_state != '已编程' and self.reprogramming_num >= 1:
|
if self.programming_state == '已编程' and self.reprogramming_num >= 0:
|
||||||
cloud_programming_state = self._cron_get_programming_state()
|
cloud_programming = self._cron_get_programming_state()
|
||||||
logging.info('cloud_programming_state:%s' % cloud_programming_state)
|
if self.reprogramming_num == 0:
|
||||||
|
self.reprogramming_num = cloud_programming['reprogramming_num']
|
||||||
|
logging.info('cloud_programming_state:%s' % cloud_programming['programming_state'])
|
||||||
logging.info('programming_state:%s' % self.programming_state)
|
logging.info('programming_state:%s' % self.programming_state)
|
||||||
return {
|
return {
|
||||||
'name': _('返工'),
|
'name': _('返工'),
|
||||||
@@ -757,12 +760,14 @@ class MrpProduction(models.Model):
|
|||||||
'target': 'new',
|
'target': 'new',
|
||||||
'context': {
|
'context': {
|
||||||
'default_production_id': self.id,
|
'default_production_id': self.id,
|
||||||
'default_product_id': self.product_id.id,
|
'default_reprogramming_num': self.reprogramming_num,
|
||||||
'default_programming_state': self.programming_state if cloud_programming_state is not None else cloud_programming_state,
|
'default_programming_state': self.programming_state if cloud_programming[
|
||||||
'default_is_reprogramming': False if (cloud_programming_state in ['编程中',
|
'programming_state'] is None else
|
||||||
'待编程'] and self.programming_state in [
|
cloud_programming['programming_state'],
|
||||||
|
'default_is_reprogramming': False if (cloud_programming['programming_state'] in ['编程中',
|
||||||
|
'待编程'] and self.programming_state in [
|
||||||
'编程中'])
|
'编程中'])
|
||||||
or (cloud_programming_state in [
|
or (cloud_programming['programming_state'] in [
|
||||||
'已编程'] and self.programming_state in ['已编程未下发']) else True
|
'已编程'] and self.programming_state in ['已编程未下发']) else True
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -790,11 +795,13 @@ class MrpProduction(models.Model):
|
|||||||
if production.programming_no in program_to_production_names:
|
if production.programming_no in program_to_production_names:
|
||||||
rework_workorder = production.workorder_ids.filtered(lambda m: m.state == 'rework')
|
rework_workorder = production.workorder_ids.filtered(lambda m: m.state == 'rework')
|
||||||
if rework_workorder:
|
if rework_workorder:
|
||||||
new_pancel_workorder = production.workorder_ids.filtered(
|
for rework_item in rework_workorder:
|
||||||
lambda m1: m1.state != 'rework' and m1.processing_panel == rework_workorder[0].processing_panel)
|
pending_workorder = production.workorder_ids.filtered(
|
||||||
if not new_pancel_workorder.cnc_ids:
|
lambda m1: m1.state in [
|
||||||
production.get_new_program(rework_workorder[0].processing_panel)
|
'pending'] and m1.processing_panel == rework_item.processing_panel and m1.routing_type == 'CNC加工')
|
||||||
production.write({'state': 'progress', 'programming_state': '已下发'})
|
if not pending_workorder.cnc_ids:
|
||||||
|
production.get_new_program(rework_item.processing_panel)
|
||||||
|
production.write({'state': 'progress', 'programming_state': '已编程'})
|
||||||
|
|
||||||
# 从cloud获取重新编程过的最新程序
|
# 从cloud获取重新编程过的最新程序
|
||||||
def get_new_program(self, processing_panel):
|
def get_new_program(self, processing_panel):
|
||||||
@@ -808,17 +815,17 @@ class MrpProduction(models.Model):
|
|||||||
r = r.json()
|
r = r.json()
|
||||||
result = json.loads(r['result'])
|
result = json.loads(r['result'])
|
||||||
if result['status'] == 1:
|
if result['status'] == 1:
|
||||||
program_path_tmp_panel = os.path.join('/tmp', result['folder_name'], 'return', processing_panel)
|
# program_path_tmp_panel = os.path.join('/tmp', result['folder_name'], 'return', processing_panel)
|
||||||
if os.path.exists(program_path_tmp_panel):
|
# if os.path.exists(program_path_tmp_panel):
|
||||||
files_r = os.listdir(program_path_tmp_panel)
|
# files_r = os.listdir(program_path_tmp_panel)
|
||||||
if files_r:
|
# if files_r:
|
||||||
for file_name in files_r:
|
# for file_name in files_r:
|
||||||
file_path = os.path.join(program_path_tmp_panel, file_name)
|
# file_path = os.path.join(program_path_tmp_panel, file_name)
|
||||||
os.remove(file_path)
|
# os.remove(file_path)
|
||||||
download_state = self.env['sf.cnc.processing'].download_file_tmp(result['folder_name'],
|
# download_state = self.env['sf.cnc.processing'].download_file_tmp(result['folder_name'],
|
||||||
processing_panel)
|
# processing_panel)
|
||||||
if download_state is False:
|
# if download_state is False:
|
||||||
raise UserError('编程单号为%s的CNC程序文件从FTP拉取失败' % (self.programming_no))
|
# raise UserError('编程单号为%s的CNC程序文件从FTP拉取失败' % (self.programming_no))
|
||||||
productions = self.env['mrp.production'].search(
|
productions = self.env['mrp.production'].search(
|
||||||
[('programming_no', '=', self.programming_no), ('state', 'not in', ['cancel,done'])])
|
[('programming_no', '=', self.programming_no), ('state', 'not in', ['cancel,done'])])
|
||||||
if productions:
|
if productions:
|
||||||
@@ -831,8 +838,8 @@ class MrpProduction(models.Model):
|
|||||||
panel_workorder.cnc_ids.sudo().unlink()
|
panel_workorder.cnc_ids.sudo().unlink()
|
||||||
self.env['sf.cam.work.order.program.knife.plan'].sudo().unlink_cam_plan(
|
self.env['sf.cam.work.order.program.knife.plan'].sudo().unlink_cam_plan(
|
||||||
productions)
|
productions)
|
||||||
# program_path_tmp_panel = os.path.join('C://Users//43484//Desktop//fsdownload//test',
|
program_path_tmp_panel = os.path.join('C://Users//43484//Desktop//fsdownload//test',
|
||||||
# processing_panel)
|
processing_panel)
|
||||||
logging.info('program_path_tmp_panel:%s' % program_path_tmp_panel)
|
logging.info('program_path_tmp_panel:%s' % program_path_tmp_panel)
|
||||||
files_panel = os.listdir(program_path_tmp_panel)
|
files_panel = os.listdir(program_path_tmp_panel)
|
||||||
if files_panel:
|
if files_panel:
|
||||||
@@ -985,7 +992,6 @@ class MrpProduction(models.Model):
|
|||||||
return production_values_str
|
return production_values_str
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class sf_detection_result(models.Model):
|
class sf_detection_result(models.Model):
|
||||||
_name = 'sf.detection.result'
|
_name = 'sf.detection.result'
|
||||||
_description = "检测结果"
|
_description = "检测结果"
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
|
|||||||
|
|
||||||
class ResMrpWorkOrder(models.Model):
|
class ResMrpWorkOrder(models.Model):
|
||||||
_inherit = 'mrp.workorder'
|
_inherit = 'mrp.workorder'
|
||||||
_order = 'id'
|
_order = 'sequence asc'
|
||||||
|
|
||||||
product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name')
|
product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name')
|
||||||
|
|
||||||
@@ -47,7 +47,18 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
('切割', '切割'), ('表面工艺', '表面工艺')
|
('切割', '切割'), ('表面工艺', '表面工艺')
|
||||||
], string="工序类型")
|
], string="工序类型")
|
||||||
results = fields.Char('结果')
|
results = fields.Char('结果')
|
||||||
state = fields.Selection(selection_add=[('to be detected', "待检测"), ('rework', '返工')], tracking=True)
|
state = fields.Selection([
|
||||||
|
('pending', '等待其他工单'),
|
||||||
|
('waiting', '等待组件'),
|
||||||
|
('ready', '就绪'),
|
||||||
|
('progress', '进行中'),
|
||||||
|
('to be detected', "待检测"),
|
||||||
|
('done', '已完工'),
|
||||||
|
('rework', '返工'),
|
||||||
|
('cancel', '取消')], string='Status',
|
||||||
|
compute='_compute_state', store=True,
|
||||||
|
default='pending', copy=False, readonly=True, recursive=True, index=True, tracking=True)
|
||||||
|
# state = fields.Selection(selection_add=[('to be detected', "待检测"), ('rework', '返工')], tracking=True)
|
||||||
|
|
||||||
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
|
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
|
||||||
|
|
||||||
@@ -474,6 +485,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
'context': {
|
'context': {
|
||||||
'default_workorder_id': self.id,
|
'default_workorder_id': self.id,
|
||||||
'default_production_id': self.production_id.id,
|
'default_production_id': self.production_id.id,
|
||||||
|
# 'default_programming_state': self.production_id.programming_state,
|
||||||
'default_routing_type': self.routing_type
|
'default_routing_type': self.routing_type
|
||||||
}}
|
}}
|
||||||
|
|
||||||
@@ -684,8 +696,6 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
# 'target':'new'
|
# 'target':'new'
|
||||||
# }
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def json_workorder_str1(self, k, production, route):
|
def json_workorder_str1(self, k, production, route):
|
||||||
workorders_values_str = [0, '', {
|
workorders_values_str = [0, '', {
|
||||||
'product_uom_id': production.product_uom_id.id,
|
'product_uom_id': production.product_uom_id.id,
|
||||||
@@ -736,15 +746,26 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
('routing_type', '=', '装夹预调'), ('state', '=', 'done')])
|
('routing_type', '=', '装夹预调'), ('state', '=', 'done')])
|
||||||
if pre_workorder:
|
if pre_workorder:
|
||||||
workorder.state = 'waiting'
|
workorder.state = 'waiting'
|
||||||
|
if workorder.routing_type == '解除装夹' and workorder.state not in ['done', 'rework', 'cancel']:
|
||||||
|
cnc_workorder = self.env['mrp.workorder'].search(
|
||||||
|
[('production_id', '=', workorder.production_id.id),
|
||||||
|
('processing_panel', '=', workorder.processing_panel),
|
||||||
|
('routing_type', '=', 'CNC加工'), ('state', '=', 'done')])
|
||||||
|
if cnc_workorder:
|
||||||
|
workorder.state = 'waiting'
|
||||||
elif workorder.production_id.state == 'progress':
|
elif workorder.production_id.state == 'progress':
|
||||||
logging.info('len(re_work):%s' % len(re_work))
|
logging.info('len(re_work):%s' % len(re_work))
|
||||||
logging.info('工序:%s' % workorder.routing_type)
|
logging.info('工序:%s' % workorder.routing_type)
|
||||||
logging.info('状态:%s' % workorder.state)
|
logging.info('状态:%s' % workorder.state)
|
||||||
logging.info('is_rework:%s' % workorder.is_rework)
|
logging.info('is_rework:%s' % workorder.is_rework)
|
||||||
logging.info('面:%s' % workorder.processing_panel)
|
logging.info('面:%s' % workorder.processing_panel)
|
||||||
|
logging.info('reprogramming_num:%s' % workorder.production_id.reprogramming_num)
|
||||||
logging.info('编程状态:%s' % workorder.production_id.programming_state)
|
logging.info('编程状态:%s' % workorder.production_id.programming_state)
|
||||||
logging.info('制造状态:%s' % workorder.production_id.state)
|
logging.info('制造状态:%s' % workorder.production_id.state)
|
||||||
if workorder.routing_type == '装夹预调' and workorder.production_id.programming_state == '已下发':
|
if workorder.routing_type == '装夹预调' and workorder.production_id.programming_state == '已编程' and \
|
||||||
|
workorder.is_rework is False and workorder.state not in [
|
||||||
|
'done', 'rework',
|
||||||
|
'cancel']:
|
||||||
if re_work:
|
if re_work:
|
||||||
workorder.state = 'ready'
|
workorder.state = 'ready'
|
||||||
# else:
|
# else:
|
||||||
|
|||||||
@@ -75,20 +75,21 @@
|
|||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//sheet//group//group[2]//label" position="before">
|
<xpath expr="//sheet//group//group[2]//label" position="before">
|
||||||
<!-- <field name="process_state"/> -->
|
<!-- <field name="process_state"/> -->
|
||||||
<field name="state"/>
|
<field name="state" readonly="0"/>
|
||||||
<!-- <field name="process_state"/> -->
|
<!-- <field name="process_state"/> -->
|
||||||
|
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//sheet//group//group//div[3]" position="after">
|
<xpath expr="//sheet//group//group//div[3]" position="after">
|
||||||
<field name="manual_quotation" readonly="1"/>
|
<field name="manual_quotation" readonly="1"/>
|
||||||
<field name="programming_no" readonly="1"/>
|
<field name="programming_no" readonly="1"/>
|
||||||
<field name="programming_state" readonly="1"
|
<field name="programming_state" readonly="0"
|
||||||
decoration-success="programming_state == '已编程'"
|
decoration-success="programming_state == '已编程'"
|
||||||
decoration-warning="programming_state =='编程中'"
|
decoration-warning="programming_state =='编程中'"
|
||||||
decoration-danger="programming_state =='已编程未下发'"/>
|
decoration-danger="programming_state =='已编程未下发'"/>
|
||||||
<field name="work_state" invisible="1"/>
|
<field name="work_state" invisible="1"/>
|
||||||
<field name="schedule_state" invisible='1'/>
|
<field name="schedule_state" invisible='1'/>
|
||||||
<field name="is_scrap" invisible='1'/>
|
<field name="is_scrap" invisible='1'/>
|
||||||
|
<field name="is_rework" invisible='1'/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='user_id']" position="before">
|
<xpath expr="//field[@name='user_id']" position="before">
|
||||||
<field name="plan_start_processing_time" readonly="1"/>
|
<field name="plan_start_processing_time" readonly="1"/>
|
||||||
@@ -123,7 +124,7 @@
|
|||||||
confirm="是否确认更新程序"
|
confirm="是否确认更新程序"
|
||||||
attrs="{'invisible': ['|',('state', '!=', 'rework'),('programming_state', '!=', '已编程未下发')]}"/>
|
attrs="{'invisible': ['|',('state', '!=', 'rework'),('programming_state', '!=', '已编程未下发')]}"/>
|
||||||
<button name="button_rework" string="返工" type="object" groups="sf_base.group_sf_mrp_user"
|
<button name="button_rework" string="返工" type="object" groups="sf_base.group_sf_mrp_user"
|
||||||
attrs="{'invisible': ['|',('state', '!=', 'rework'),('programming_state', '!=', '已编程')]}"/>
|
attrs="{'invisible': ['|',('state', '!=', 'rework') ,'&',('programming_state', '!=', '已编程'),('is_rework', '=', True)]}"/>
|
||||||
<button name="%(sf_manufacturing.action_sf_production_wizard)d" string="报废" type="action"
|
<button name="%(sf_manufacturing.action_sf_production_wizard)d" string="报废" type="action"
|
||||||
groups="sf_base.group_sf_mrp_user"
|
groups="sf_base.group_sf_mrp_user"
|
||||||
attrs="{'invisible': [('is_scrap', '=', False)]}"/>
|
attrs="{'invisible': [('is_scrap', '=', False)]}"/>
|
||||||
@@ -281,7 +282,7 @@
|
|||||||
|
|
||||||
<xpath expr="//sheet//notebook//page[@name='operations']" position="after">
|
<xpath expr="//sheet//notebook//page[@name='operations']" position="after">
|
||||||
<page string="检测结果" attrs="{'invisible': [('detection_result_ids', '=', [])]}">
|
<page string="检测结果" attrs="{'invisible': [('detection_result_ids', '=', [])]}">
|
||||||
<field name="detection_result_ids" string="" readonly="0">
|
<field name="detection_result_ids" string="" readonly="1">
|
||||||
<tree sample="1">
|
<tree sample="1">
|
||||||
<field name="production_id" invisible="1"/>
|
<field name="production_id" invisible="1"/>
|
||||||
<field name="processing_panel"/>
|
<field name="processing_panel"/>
|
||||||
|
|||||||
@@ -112,6 +112,10 @@
|
|||||||
<field name="model">mrp.workorder</field>
|
<field name="model">mrp.workorder</field>
|
||||||
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//header/field[@name='state']" position="replace">
|
||||||
|
<field name="state" widget="statusbar"
|
||||||
|
statusbar_visible="pending,waiting,ready,progress,to be detected,done,rework"/>
|
||||||
|
</xpath>
|
||||||
<xpath expr="//div[@name='button_box']" position="inside">
|
<xpath expr="//div[@name='button_box']" position="inside">
|
||||||
<button type="object" name="action_view_surface_technics_picking" class="oe_stat_button" icon="fa-truck"
|
<button type="object" name="action_view_surface_technics_picking" class="oe_stat_button" icon="fa-truck"
|
||||||
groups="base.group_user,sf_base.group_sf_order_user"
|
groups="base.group_user,sf_base.group_sf_order_user"
|
||||||
@@ -481,7 +485,8 @@
|
|||||||
<field name="results" invisible="1"/>
|
<field name="results" invisible="1"/>
|
||||||
<page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
<page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
||||||
<group>
|
<group>
|
||||||
<field name="test_results" attrs='{"invisible":[("results","!=",False)]}'/>
|
<field name="test_results"
|
||||||
|
attrs='{"readonly":[("state","!=","to be detected")],"invisible":[("results","!=",False)]}'/>
|
||||||
<!-- <field name="is_remanufacture" attrs='{"invisible":[("test_results","!=","报废")]}'/>-->
|
<!-- <field name="is_remanufacture" attrs='{"invisible":[("test_results","!=","报废")]}'/>-->
|
||||||
<!-- <field name="is_fetchcnc"-->
|
<!-- <field name="is_fetchcnc"-->
|
||||||
<!-- attrs='{"invisible":["|",("test_results","=","合格"),("is_remanufacture","=",False)]}'/>-->
|
<!-- attrs='{"invisible":["|",("test_results","=","合格"),("is_remanufacture","=",False)]}'/>-->
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ class ReworkWizard(models.TransientModel):
|
|||||||
is_reprogramming = fields.Boolean(string='申请重新编程', default=False)
|
is_reprogramming = fields.Boolean(string='申请重新编程', default=False)
|
||||||
reprogramming_num = fields.Integer('重新编程次数', default=0)
|
reprogramming_num = fields.Integer('重新编程次数', default=0)
|
||||||
programming_state = fields.Selection(
|
programming_state = fields.Selection(
|
||||||
[('待编程', '待编程'), ('编程中', '编程中'), ('已编程', '已编程'), ('已编程未下发', '已编程未下发')],
|
[('待编程', '待编程'), ('编程中', '编程中'), ('已编程', '已编程'), ('已编程未下发', '已编程未下发'),
|
||||||
|
('已下发', '已下发')],
|
||||||
string='编程状态')
|
string='编程状态')
|
||||||
|
|
||||||
def confirm(self):
|
def confirm(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user