Merge branch 'refs/heads/develop' into feature/tool_standard_library_process

This commit is contained in:
liaodanlong
2025-03-06 10:44:31 +08:00
13 changed files with 176 additions and 72 deletions

View File

@@ -8,7 +8,7 @@
<field name="arch" type="xml">
<xpath expr="//notebook/page[last()]" position="after">
<field name="routing_type" invisible="1"/>
<page string="异常记录" name="workorder_exception" attrs="{'invisible': [('routing_type', '!=', 'CNC加工')]}">
<page string="异常记录" name="workorder_exception" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "ER")]}'>
<field name="exception_ids" nolabel="1" readonly="1">
<tree create="false" delete="false" edit="false">
<field name="exception_content" string="反馈的异常/问题信息"/>

View File

@@ -6,7 +6,7 @@
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<xpath expr="//page[1]" position="before">
<page string="开料要求" attrs='{"invisible": [("routing_type","!=","切割")]}'>
<page string="开料要求" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CMR")]}'>
<group>
<group>
<field name="product_tmpl_id_materials_id" widget="many2one"/>

View File

@@ -7,7 +7,7 @@
<field name="arch" type="xml">
<xpath expr="//page[last()-3]" position="before">
<!-- <page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>-->
<page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<page string="下发记录" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "HDR")]}'>
<field name="delivery_records">
<tree create="false">
<field name="delivery_type"/>

View File

@@ -6,7 +6,7 @@
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
<field name="arch" type="xml">
<xpath expr="//page[last()-3]" position="before">
<page string="机床信息" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<page string="机床信息" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "MTI")]}'>
<group string="机床信息">
<group>
<field name="machine_tool_name"/>

View File

@@ -4,5 +4,63 @@
<field name="code">PTD</field>
<field name="name">后置三元检测</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_2">
<field name="code">WCP</field>
<field name="name">工件装夹</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_3">
<field name="code">ITD_PP</field>
<field name="name">前置三元检测定位参数</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_4">
<field name="code">2D_MD</field>
<field name="name">2D加工图纸</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_5">
<field name="code">QIS</field>
<field name="name">质检标准</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_6">
<field name="code">WD</field>
<field name="name">工件配送</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_9">
<field name="code">CNC_P</field>
<field name="name">CNC程序</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_10">
<field name="code">CMM_P</field>
<field name="name">CMM程序</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_11">
<field name="code">MTI</field>
<field name="name">机床信息</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_12">
<field name="code">HDR</field>
<field name="name">下发记录</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_13">
<field name="code">ER</field>
<field name="name">异常记录</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_14">
<field name="code">DCP</field>
<field name="name">解除装夹</field>
</record>
<record model="sf.work.individuation.page" id="sf_work_individuation_page_15">
<field name="code">CMR</field>
<field name="name">开料要求</field>
</record>
<!-- 原生页签先不进行配置 -->
<!-- <record model="sf.work.individuation.page" id="sf_work_individuation_page_7">-->
<!-- <field name="code">ML</field>-->
<!-- <field name="name">物料</field>-->
<!-- </record>-->
<!-- <record model="sf.work.individuation.page" id="sf_work_individuation_page_8">-->
<!-- <field name="code">TT</field>-->
<!-- <field name="name">时间跟踪</field>-->
<!-- </record>-->
</data>
</odoo>

View File

@@ -365,7 +365,7 @@ class MrpProduction(models.Model):
and production.schedule_state == '已排' and production.is_rework is False):
production.state = 'pending_cam'
if any((wo.test_results == '返工' and wo.state == 'done' and
(production.programming_state in ['已编程'] or wo.individuation_page_PTD is True))
(production.programming_state in ['已编程'] or 'PTD' in wo.individuation_page_list))
or (wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中', '已编程'])
for wo in production.workorder_ids) or production.is_rework is True:
production.state = 'rework'
@@ -684,7 +684,6 @@ class MrpProduction(models.Model):
logging.info('change_programming_state error:%s' % e)
raise UserError("修改编程单状态失败,请联系管理员")
# cnc程序获取
def fetchCNC(self, production_names):
cnc = self.env['mrp.production'].search([('id', '=', self.id)])
@@ -714,9 +713,9 @@ class MrpProduction(models.Model):
[('id', '=', cnc.product_id.materials_type_id.id)]).materials_no,
'machining_processing_panel': cnc.product_id.model_processing_panel,
'machining_precision': '',
'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.length,
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width,
'embryo_long': cnc.product_id.bom_ids[0].bom_line_ids.product_id.length,
'embryo_height': cnc.product_id.bom_ids[0].bom_line_ids.product_id.height,
'embryo_width': cnc.product_id.bom_ids[0].bom_line_ids.product_id.width,
'order_no': cnc.origin,
'model_order_no': cnc.product_id.default_code,
'user': cnc.env.user.name,
@@ -1298,12 +1297,14 @@ class MrpProduction(models.Model):
'target': 'new',
'context': {
'default_production_id': self.id,
'default_is_clamping': True if self.workorder_ids.filtered(lambda wk: wk.routing_type == '装夹预调') else False,
'default_is_clamping': True if self.workorder_ids.filtered(
lambda wk: wk.routing_type == '装夹预调') else False,
'default_workorder_ids': workorder_ids.ids if workorder_ids.ids != [] else self.workorder_ids.ids,
'default_hidden_workorder_ids': ','.join(map(str, work_id_list)) if work_id_list != [] else '',
'default_reprogramming_num': cloud_programming.get('reprogramming_num') if cloud_programming else '',
'default_programming_state': cloud_programming.get('programming_state') if cloud_programming else '',
'default_is_reprogramming': True if cloud_programming and (cloud_programming.get('programming_state') in ['已下发']) else False
'default_is_reprogramming': True if cloud_programming and (
cloud_programming.get('programming_state') in ['已下发']) else False
}
}
@@ -1337,7 +1338,8 @@ class MrpProduction(models.Model):
for rework_item in rework_workorder:
pending_workorder = production.workorder_ids.filtered(
lambda m1: m1.state in [
'pending'] and m1.processing_panel == rework_item.processing_panel and m1.routing_type in ['CNC加工', '人工线下加工'])
'pending'] and m1.processing_panel == rework_item.processing_panel and m1.routing_type in [
'CNC加工', '人工线下加工'])
if not pending_workorder.cnc_ids:
production.get_new_program(rework_item.processing_panel)
# production.write({'state': 'progress', 'programming_state': '已编程', 'is_rework': False})
@@ -1380,7 +1382,8 @@ class MrpProduction(models.Model):
if productions:
for production in productions:
panel_workorder = production.workorder_ids.filtered(lambda
pw: pw.processing_panel == processing_panel and pw.routing_type in ['CNC加工', '人工线下加工'] and pw.state not in (
pw: pw.processing_panel == processing_panel and pw.routing_type in [
'CNC加工', '人工线下加工'] and pw.state not in (
'rework', 'done'))
if panel_workorder:
if panel_workorder.cmm_ids:
@@ -1406,7 +1409,8 @@ class MrpProduction(models.Model):
'cnc_worksheet': base64.b64encode(open(panel_file_path, 'rb').read())})
logging.info('len(cnc_worksheet):%s' % len(panel_workorder.cnc_worksheet))
pre_workorder = production.workorder_ids.filtered(lambda
ap: ap.routing_type in ['装夹预调', '人工线下加工'] and ap.processing_panel == processing_panel and ap.state not in (
ap: ap.routing_type in ['装夹预调',
'人工线下加工'] and ap.processing_panel == processing_panel and ap.state not in (
'rework', 'done'))
if pre_workorder:
pre_workorder.write(

View File

@@ -20,6 +20,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder'
_order = 'sequence asc'
_description = '工单'
product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name')
@@ -1441,7 +1442,7 @@ class ResMrpWorkOrder(models.Model):
record.production_id.process_state = '待加工'
# 生成工件配送单
record.workpiece_delivery_ids = record._json_workpiece_delivery_list()
if record.routing_type == 'CNC加工' or record.individuation_page_PTD is True:
if record.routing_type == 'CNC加工' or 'PTD' in record.individuation_page_list:
if record.routing_type == 'CNC加工':
record.process_state = '待解除装夹'
# record.write({'process_state': '待加工'})
@@ -1675,10 +1676,10 @@ class ResMrpWorkOrder(models.Model):
# ==============================配置化页签--个性化记录===================================
routing_workcenter_id = fields.Many2one('mrp.routing.workcenter', compute='_compute_routing_workcenter_id',
store=True)
store=True, string='工序作业')
individuation_page_ids = fields.Many2many('sf.work.individuation.page', string='个性化记录', store=True,
compute='_compute_individuation_page_ids')
individuation_page_PTD = fields.Boolean('个性化记录(是否显示后置三元检测[PTD]页签)', default=False)
individuation_page_list = fields.Char('个性化记录', default=None)
@api.depends('name')
def _compute_routing_workcenter_id(self):
@@ -1694,10 +1695,11 @@ class ResMrpWorkOrder(models.Model):
if mw.routing_workcenter_id:
mw.individuation_page_ids = mw.routing_workcenter_id.individuation_page_ids.ids
# 初始化页签配置
mw.individuation_page_PTD = False
mw.individuation_page_list = None
# 根据工单对应的【作业_个性化记录】配置页签
if any(item.code == 'PTD' for item in mw.routing_workcenter_id.individuation_page_ids):
mw.individuation_page_PTD = True
individuation_page_list = [item.code for item in mw.routing_workcenter_id.individuation_page_ids]
if individuation_page_list:
mw.individuation_page_list = list(set(individuation_page_list))
# =============================================================================================

View File

@@ -3,5 +3,6 @@ from odoo import fields, models, api
class QualityCheck(models.Model):
_inherit = "quality.check"
_description = "质量检查"
is_inspect = fields.Boolean('需送检')

View File

@@ -192,5 +192,5 @@ access_sf_programming_reason,sf_programming_reason,model_sf_programming_reason,b
access_sf_programming_record,sf_programming_record,model_sf_programming_record,base.group_user,1,1,1,0
access_sf_work_individuation_page,sf_work_individuation_page,model_sf_work_individuation_page,sf_base.group_sf_mrp_user,1,1,1,0
access_sf_work_individuation_page_group_plan_dispatch,sf_work_individuation_page_group_plan_dispatch,model_sf_work_individuation_page,sf_base.group_plan_dispatch,1,1,0,0
access_sf_sale_order_cancel_wizard,sf_sale_order_cancel_wizard,model_sf_sale_order_cancel_wizard,sf_base.group_sf_order_user,1,0,1,0
access_sf_sale_order_cancel_line,sf_sale_order_cancel_line,model_sf_sale_order_cancel_line,sf_base.group_sf_order_user,1,0,1,0
access_sf_sale_order_cancel_wizard,sf_sale_order_cancel_wizard,model_sf_sale_order_cancel_wizard,sf_base.group_sf_order_user,1,1,1,0
access_sf_sale_order_cancel_line,sf_sale_order_cancel_line,model_sf_sale_order_cancel_line,sf_base.group_sf_order_user,1,0,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
192
193
194
195
196

View File

@@ -227,8 +227,7 @@
<!-- attrs='{"invisible": [("rework_flag","=",True)]}' confirm="是否返工"/>-->
</xpath>
<xpath expr="//page[1]" position="before">
<page string="开料要求"
attrs='{"invisible": [("routing_type","not in",("切割", "线切割", "人工线下加工"))]}'>
<page string="开料要求" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CMR")]}'>
<group>
<group>
<field name="product_tmpl_id_materials_id" widget="many2one"/>
@@ -325,7 +324,7 @@
<xpath expr="//page[1]" position="before">
<page string="工件装夹" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'>
<page string="工件装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WCP")]}'>
<group>
<!-- <field name="_barcode_scanned" widget="barcode_handler"/> -->
<group string="托盘">
@@ -347,7 +346,7 @@
placeholder="如有预调程序信息请在此处输入....."/>
</group>
</page>
<page string="前置三元检测定位参数" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'>
<page string="前置三元检测定位参数" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "ITD_PP")]}'>
<div>左面:</div>
<div class="o_address_format">
@@ -504,17 +503,15 @@
</group>
</page>
<page string="2D加工图纸"
attrs='{"invisible": [("routing_type","not in",["装夹预调", "人工线下加工"])]}'>
<page string="2D加工图纸" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "2D_MD")]}'>
<field name="machining_drawings" widget="adaptive_viewer"/>
</page>
<page string="质检标准" attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
<page string="质检标准" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "QIS")]}'>
<field name="quality_standard" widget="adaptive_viewer"/>
</page>
<page string="工件配送"
attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
<page string="工件配送" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WD")]}'>
<field name="workpiece_delivery_ids">
<tree editable="bottom">
<field name="production_id" invisible="1"/>
@@ -542,11 +539,19 @@
attrs='{"invisible": ["|", ("state","!=","progress"), ("routing_type","!=","装夹预调")]}'/>
</xpath>
<!-- =====原生页签,暂时不进行配置===== -->
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "ML")]}</attribute>-->
<!-- </xpath>-->
<!-- <xpath expr="//page[@name='time_tracking']" position="attributes">-->
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "TT")]}</attribute>-->
<!-- </xpath>-->
<!-- ============================= -->
<xpath expr="//page[1]" position="before">
<field name="results" invisible="1"/>
<field name="individuation_page_PTD" invisible="1"/>
<page string="后置三元检测" attrs='{"invisible": [("individuation_page_PTD", "=", False)]}'>
<field name="individuation_page_list" invisible="1"/>
<page string="后置三元检测" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "PTD")]}'>
<group>
<field name="test_results"
attrs='{"readonly":["&amp;","|",("state","!=","to be detected"), "|",("routing_type","=","CNC加工"),("is_inspect", "=", True),("state","in",["done","rework"])],
@@ -568,16 +573,16 @@
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
<!-- </div>-->
</page>
<page string="2D加工图纸" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<page string="2D加工图纸" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "2D_MD")]}'>
<field name="machining_drawings" widget="adaptive_viewer"/>
</page>
<page string="质检标准" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<page string="质检标准" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "QIS")]}'>
<field name="quality_standard" widget="adaptive_viewer"/>
</page>
</xpath>
<xpath expr="//page[1]" position="before">
<page string="CNC程序" attrs='{"invisible": [("routing_type","not in",["CNC加工", "人工线下加工"])]}'>
<page string="CNC程序" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CNC_P")]}'>
<field name="cnc_ids" widget="one2many" string="工作程序" default_order="sequence_number,id"
readonly="0">
<tree>
@@ -601,7 +606,7 @@
</field>
</page>
<page string="CMM程序" attrs='{"invisible": [("routing_type","not in",["CNC加工", "人工线下加工"])]}'>
<page string="CMM程序" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CMM_P")]}'>
<field name="cmm_ids" widget="one2many" string="CMM程序" readonly="1">
<tree>
<field name="sequence_number"/>
@@ -614,7 +619,7 @@
</page>
</xpath>
<xpath expr="//page[1]" position="before">
<page string="解除装夹" attrs='{"invisible": [("routing_type","!=","解除装夹")]}'>
<page string="解除装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "DCP")]}'>
<!-- <field name="tray_id" readonly="1"/>-->
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
<!-- <button type="object" class="oe_highlight" name="unbindtray" string="解除装夹"-->

View File

@@ -1,4 +1,5 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
class SFSaleOrderCancelWizard(models.TransientModel):
@@ -47,6 +48,23 @@ class SFSaleOrderCancelWizard(models.TransientModel):
def action_confirm_cancel(self):
self.ensure_one()
# 删除现有关联单据行
self.related_docs.unlink()
# 重新生成最新关联单据行
self.env['sf.sale.order.cancel.line'].create_from_order(self.id, self.order_id)
# 强制重新计算校验字段
self._compute_has_movement()
self._compute_display_message()
# 检查是否存在异动
if self.has_movement:
raise UserError(
"存在下游单据异动,无法取消订单!\n"
"请关闭向导重新进入,以查看最新状态!"
)
# 取消销售订单关联的采购单
purchase_orders = self.env['purchase.order'].search([
('origin', '=', self.order_id.name)
@@ -165,6 +183,20 @@ class SFSaleOrderCancelLine(models.TransientModel):
'assigned': '就绪'
}
module_name_dict = {
'purchase': '采购',
'quality': '质量',
'mrp': '制造',
'stock': '库存',
'account': '会计',
'hr': '员工',
'project': '项目',
'crm': '销售',
'point_of_sale': '销售',
'website': '网站',
'sf_plan': '计划',
}
# 检查销售订单
if order.invoice_ids:
a = 0
@@ -195,9 +227,11 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '库存',
'doc_name': '交货单',
'operation_type': '调拨',
# 'category': '库存',
'category': module_name_dict[picking._original_module],
# 'doc_name': '交货单',
'doc_name': picking._description,
'operation_type': picking.picking_type_id.name,
'doc_number': picking.name,
'line_number': b,
'product_name': f'[{move.product_id.default_code}] {move.product_id.name}' if move else '',
@@ -242,8 +276,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '质量',
'doc_name': '质检单',
'category': module_name_dict[quality_check._original_module],
'doc_name': quality_check._description,
'operation_type': '',
'doc_number': f'{quality_check.name}-{quality_check.title}',
'line_number': 1,
@@ -266,8 +300,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '组件制造单',
'category': module_name_dict[comp_mo._original_module],
'doc_name': comp_mo._description,
'operation_type': '',
'doc_number': comp_mo.name,
'line_number': h,
@@ -287,8 +321,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '子制造调拨',
'doc_name': '库存移动',
'category': module_name_dict[pinking_id._original_module],
'doc_name': pinking_id._description,
'doc_number': f'{comp_mo.name}-{pinking_id.name}',
'line_number': y,
'operation_type': pinking_id.picking_type_id.name,
@@ -312,8 +346,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '采购',
'doc_name': '询价单',
'category': module_name_dict[po._original_module],
'doc_name': po._description,
'operation_type': '',
'doc_number': po.name,
'line_number': c,
@@ -338,8 +372,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '库存',
'doc_name': '库存移动',
'category': module_name_dict[pkd._original_module],
'doc_name': pkd._description,
'doc_number': pkd.name,
'line_number': x3,
'operation_type': pkd.picking_type_id.name,
@@ -360,8 +394,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '库存',
'doc_name': '库存移动',
'category': module_name_dict[child_pkd._original_module],
'doc_name': child_pkd._description,
'doc_number': child_pkd.name,
'line_number': x4,
'operation_type': child_pkd.picking_type_id.name,
@@ -387,8 +421,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '制造订单',
'category': module_name_dict[mo._original_module],
'doc_name': mo._description,
'doc_number': mo.name,
'operation_type': '',
'line_number': d,
@@ -412,8 +446,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '询价单',
'category': module_name_dict[po._original_module],
'doc_name': po._description,
'doc_number': po.name,
'line_number': e,
'operation_type': '',
@@ -438,8 +472,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '坯料收货',
'doc_name': '库存移动',
'category': module_name_dict[pkd._original_module],
'doc_name': pkd._description,
'doc_number': pkd.name,
'line_number': x1,
'operation_type': pkd.picking_type_id.name,
@@ -460,8 +494,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '坯料外协',
'doc_name': '库存移动',
'category': module_name_dict[child_pkd._original_module],
'doc_name': child_pkd._description,
'doc_number': child_pkd.name,
'line_number': x2,
'operation_type': child_pkd.picking_type_id.name,
@@ -487,8 +521,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '库存移动',
'category': module_name_dict[picking._original_module],
'doc_name': picking._description,
'doc_number': picking.name,
'line_number': f,
'operation_type': picking.picking_type_id.name,
@@ -509,8 +543,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '工单',
'category': module_name_dict[workorder._original_module],
'doc_name': workorder._description,
'doc_number': f'{mo.name}-{workorder.processing_panel}-{workorder.name}' if workorder.processing_panel else f'{mo.name}-{workorder.name}',
'line_number': g,
'operation_type': '',
@@ -532,8 +566,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '工艺外协',
'doc_name': '库存移动',
'category': module_name_dict[pkd._original_module],
'doc_name': pkd._description,
'doc_number': f'{mo.name}-{workorder.name}-{pkd.name}',
'line_number': z,
'operation_type': pkd.picking_type_id.name,

View File

@@ -18,7 +18,7 @@ class QualityCheck(models.Model):
('cancel', '已取消'), ], string='状态', tracking=True, store=True,
default='none', copy=False, compute='_compute_quality_state')
individuation_page_PTD = fields.Boolean('个性化记录(是否显示后置三元检测[PTD]页签)', related='workorder_id.individuation_page_PTD')
individuation_page_list = fields.Char('个性化记录', related='workorder_id.individuation_page_list')
work_state = fields.Selection(related='workorder_id.state', string='工单状态')
processing_panel = fields.Char(related='workorder_id.processing_panel', string='加工面')
@@ -93,7 +93,7 @@ class QualityCheck(models.Model):
raise ValidationError('请填写【判定结果】里的信息')
if self.test_results == '合格':
raise ValidationError('请重新选择【判定结果】-【检测结果】')
if self.workorder_id.routing_type != 'CNC加工' and self.workorder_id.individuation_page_PTD is False:
if self.workorder_id.routing_type != 'CNC加工' and 'PTD' not in self.workorder_id.individuation_page_list:
self.workorder_id.production_id.write({'detection_result_ids': [(0, 0, {
'rework_reason': self.reason,
'detailed_reason': self.detailed_reason,

View File

@@ -8,7 +8,7 @@
<xpath expr="//field[@name='alert_ids']" position="after">
<field name="production_id" invisible="1"/>
<field name="work_state" invisible="1"/>
<field name="individuation_page_PTD" invisible="1"/>
<field name="individuation_page_list" invisible="1"/>
<field name="production_line_id" attrs="{'invisible': [('production_id', '=', False)]}"/>
<field name="equipment_id" attrs="{'invisible': [('production_id', '=', False)]}"/>
<field name="model_file" widget="Viewer3D" string="模型" readonly="1" force_save="1"