Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化

This commit is contained in:
mgw
2025-02-24 14:46:35 +08:00
15 changed files with 295 additions and 140 deletions

View File

@@ -187,7 +187,7 @@ class CuttingToolModel(models.Model):
def _get_ids(self, cutting_tool_type_code, factory_short_name):
cutting_tool_type_ids = []
for item in cutting_tool_type_code:
cutting_tool_type = self.search([('code', '=', item.replace("JKM", factory_short_name))])
cutting_tool_type = self.search([('code', '=', item)])
if cutting_tool_type:
cutting_tool_type_ids.append(cutting_tool_type.id)
return [(6, 0, cutting_tool_type_ids)]

View File

@@ -25,3 +25,17 @@
.o_search_panel.account_root {
flex: unset !important;
}
.multi-line {
display: flex;
flex-wrap: nowrap;
> label.o_form_label {
width: 52px;
}
> span {
flex: 1;
}
> div {
flex: 2
}
}

View File

@@ -112,6 +112,8 @@
<field name="cutting_tool_material_id"/>
<field name="cutting_tool_type_id"/>
<field name="brand_id"/>
<field name="create_date" optional="hide"/>
<field name="write_date" string="修改时间" optional="hide"/>
</tree>
</field>
</record>
@@ -138,7 +140,7 @@
<field name="brand_id" required="1"/>
<label for="integral_run_out_accuracy_min" string="端跳精度"
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
<div class="o_address_format"
<div class="o_address_format multi-line"
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
<label for="integral_run_out_accuracy_min" string="最小"/>
<field name="integral_run_out_accuracy_min" class="o_address_zip"
@@ -317,28 +319,28 @@
<field name="knife_handle_basic_parameters_ids"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
<tree editable="bottom" class="center" delete="1">
<tree editable="bottom" delete="1">
<field name="cutting_tool_type" invisible="1"/>
<field name="name"/>
<field name="taper_shank_model"/>
<field name="total_length"/>
<field name="shank_length"/>
<field name="shank_diameter" class="diameter"/>
<field name="flange_shank_length"/>
<field name="flange_diameter"/>
<field name="diameter_slip_accuracy"/>
<field name="dynamic_balance_class"/>
<field name="flange_shank_length" optional="hide"/>
<field name="flange_diameter" optional="hide"/>
<field name="diameter_slip_accuracy" optional="hide"/>
<field name="dynamic_balance_class" optional="hide"/>
<field name="min_clamping_diameter" class="diameter"/>
<field name="max_clamping_diameter" class="diameter"/>
<field name="max_rotate_speed"/>
<field name="max_rotate_speed" optional="hide"/>
<field name="fit_chuck_size"/>
<field name="nut"/>
<field name="spanner" string="适配锁紧扳手型号"/>
<field name="clamping_mode"/>
<field name="tool_changing_time"/>
<field name="cooling_model"/>
<field name="is_quick_cutting"/>
<field name="is_safe_lock"/>
<field name="nut" optional="hide"/>
<field name="spanner" string="适配锁紧扳手型号" optional="hide"/>
<field name="clamping_mode" optional="hide"/>
<field name="tool_changing_time" optional="hide"/>
<field name="cooling_model" optional="hide"/>
<field name="is_quick_cutting" optional="hide"/>
<field name="is_safe_lock" optional="hide"/>
</tree>
</field>
<field name="chuck_basic_parameters_ids"

View File

@@ -20,7 +20,9 @@ class AgvScheduling(models.Model):
name = fields.Char('任务单号', index=True, copy=False)
agv_route_id = fields.Many2one('sf.agv.task.route', '任务路线')
agv_route_type = fields.Selection(related='agv_route_id.route_type', string='任务类型', required=True)
def _get_agv_route_type_selection(self):
return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
agv_route_type = fields.Selection(selection=_get_agv_route_type_selection, string='任务类型', required=True)
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站', required=True)
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站', tracking=True)
site_state = fields.Selection([

View File

@@ -69,6 +69,50 @@ class ResMrpWorkOrder(models.Model):
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效',
tracking=True)
back_button_display = fields.Boolean(default=False, compute='_compute_back_button_display', store=True)
@api.depends('state')
def _compute_back_button_display(self):
for record in self:
sorted_workorders = record.production_id.workorder_ids.filtered(lambda w: w.state != 'cancel').sorted(
key=lambda w: w.sequence)
if not sorted_workorders:
continue
position = next((idx for idx, workorder in enumerate(sorted_workorders) if workorder.id == record.id), -1)
cur_workorder = sorted_workorders[position]
if position == len(sorted_workorders) - 1:
picking_ids = cur_workorder.production_id.sale_order_id.picking_ids
finished_product_area = picking_ids.filtered(
lambda picking: picking.location_dest_id.name == '成品存货区' and picking.state == 'done'
)
if finished_product_area:
moves = self.env['stock.move'].search([
('name', '=', cur_workorder.production_id.name),
('state', '!=', 'cancel')
])
finish_move = next((move for move in moves if move.location_dest_id.name == '制造后'), None)
if not finish_move and not cur_workorder.is_subcontract and not cur_workorder.name =='解除装夹':
record.back_button_display = True
else:
record.back_button_display = any(
finish_move.move_dest_ids.ids not in move.ids and record.state == 'done'
for picking in finished_product_area
for move in picking.move_ids
)
else:
if record.state == 'done':
record.back_button_display = True
else:
record.back_button_display = False
else:
next_workorder = sorted_workorders[position + 1]
next_state = next_workorder.state
if ((next_state == 'ready' and not next_workorder.is_subcontract and not next_workorder.name =='解除装夹') or (next_workorder.state == 'pending' and next_workorder.is_subcontract and not next_workorder.name =='解除装夹')) and cur_workorder.state == 'done':
record.back_button_display = True
else:
record.back_button_display = False
if cur_workorder.is_subcontract or cur_workorder.name =='解除装夹':
record.back_button_display = False
date_planned_start = fields.Datetime(tracking=True)
@api.depends('processing_panel')
@@ -86,6 +130,82 @@ class ResMrpWorkOrder(models.Model):
manual_quotation = fields.Boolean('人工编程', default=False, compute=_compute_manual_quotation, store=True)
def button_back(self):
if self.production_id.state == 'rework':
raise UserError('制造订单为返工时不能进行工单回退')
sorted_workorders = self.production_id.workorder_ids.filtered(lambda w: w.state != 'cancel').sorted(
key=lambda w: w.sequence)
position = next((idx for idx, workorder in enumerate(sorted_workorders) if workorder.id == self.id), -1)
cur_workorder = sorted_workorders[position]
if position == len(sorted_workorders) - 1:
# 末工序
picking_ids = cur_workorder.production_id.sale_order_id.picking_ids
finished_product_area = picking_ids.filtered(
lambda picking: picking.location_dest_id.name == '成品存货区' and picking.state == 'done'
)
moves = self.env['stock.move'].search([
('name', '=', cur_workorder.production_id.name),
('state', '!=', 'cancel')
])
finish_move = next((move for move in moves if move.location_dest_id.name == '制造后'), None) or []
if any(
finish_move.move_dest_ids.ids in move.ids
for picking in finished_product_area
for move in picking.move_ids
):
raise UserError('已入库,无法回退')
else:
moves = self.env['stock.move'].search([
('name', '=', cur_workorder.production_id.name),
('state', '!=', 'cancel')
])
move_lines = self.env['stock.move.line'].search([
('reference', '=', cur_workorder.production_id.name),
('state', '!=', 'cancel')
])
moves.state = 'assigned'
external_assistance = move_lines.filtered(
lambda picking: picking.location_id.name != '外协线边仓'
)
external_assistance.state = 'assigned'
# move_lines.state = 'assigned'
self.time_ids.date_end = None
cur_workorder.state = 'progress'
cur_workorder.production_id.state = 'progress'
quality_check = self.env['quality.check'].search(
[('workorder_id', '=', self.id)])
for check_order in quality_check:
if check_order.point_id.is_inspect:
check_order.quality_state = 'waiting'
else:
check_order.quality_state = 'none'
# move_dest_ids
finished_quants = moves.mapped('move_line_ids.lot_id.quant_ids')
finished_quants.quantity = 0
finish_move = next((move for move in moves if move.location_dest_id.name == '制造后'), None)
finish_move.move_dest_ids.reserved_availability = 0
finish_move.move_dest_ids.move_line_ids.state = 'draft'
finish_move.move_dest_ids.move_line_ids.unlink()
# finish_move.move_dest_ids.move_line_ids.reserved_uom_qty = 0
else:
next_workorder = sorted_workorders[position + 1]
next_state = next_workorder.state
if next_state not in ['pending', 'waiting', 'ready']:
raise UserError('下工序已经开始,无法回退')
if next_workorder.is_subcontract:
next_workorder.picking_ids.write({'state': 'waiting'})
next_workorder.state = 'pending'
self.time_ids.date_end = None
cur_workorder.state = 'progress'
cur_workorder.production_id.state = 'progress'
quality_check = self.env['quality.check'].search(
[('workorder_id', '=', self.id)])
for check_order in quality_check:
if check_order.point_id.is_inspect:
check_order.quality_state = 'waiting'
else:
check_order.quality_state = 'none'
def _compute_working_users(self):
super()._compute_working_users()
for item in self:
@@ -1860,7 +1980,10 @@ class WorkPieceDelivery(models.Model):
feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站')
task_delivery_time = fields.Datetime('任务下发时间')
task_completion_time = fields.Datetime('任务完成时间')
type = fields.Selection(related='route_id.route_type', string='类型')
def _get_agv_route_type_selection(self):
return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
type = fields.Selection(selection=_get_agv_route_type_selection, string='类型')
delivery_duration = fields.Float('配送时长', compute='_compute_delivery_duration')
status = fields.Selection(
[('待下发', '待下发'), ('已下发', '待配送'), ('已配送', '已配送'), ('已取消', '已取消')], string='状态',

View File

@@ -1,6 +1,6 @@
import logging
import json
from odoo import models, fields, api
from odoo import models, fields, api, _
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
@@ -24,6 +24,8 @@ class SaleOrder(models.Model):
self.state = 'supply method'
def action_confirm(self):
if self._get_forbidden_state_confirm() & set(self.mapped('state')):
raise UserError(_('订单状态已发生变化,请刷新当前页面'))
# 判断是否所有产品都选择了供货方式
filter_line = self.order_line.filtered(lambda line: not line.supply_method)
if filter_line:

View File

@@ -1,5 +1,8 @@
# -*- coding: utf-8 -*-
import base64
import random
import re
import qrcode
from itertools import groupby
from collections import defaultdict, namedtuple
@@ -738,25 +741,26 @@ class ReStockMove(models.Model):
move.part_number = move.product_id.part_number
move.part_name = move.product_id.part_name
elif move.product_id.categ_id.type == '坯料':
if move.origin:
origin = move.origin.split(',')[0] if ',' in move.origin else move.origin
mrp_productio_info = self.env['mrp.production'].sudo().search(
[('name', '=', origin)])
if mrp_productio_info:
move.part_number = mrp_productio_info.part_number
move.part_name = mrp_productio_info.part_name
product_name = ''
match = re.search(r'(S\d{5}-\d)', move.product_id.name)
# 如果匹配成功,提取结果
if match:
product_name = match.group(0)
if move.picking_id.sale_order_id:
sale_order = move.picking_id.sale_order_id
else:
purchase_order_info = self.env['purchase.order'].sudo().search(
[('name', '=', origin)])
if purchase_order_info:
mrp_production_ids = purchase_order_info._get_mrp_productions().ids
if mrp_production_ids:
mrp_productio_info = self.env['mrp.production'].sudo().search(
[('id', '=', mrp_production_ids[0])])
if mrp_productio_info:
move.part_number = mrp_productio_info.part_number
move.part_name = mrp_productio_info.part_name
sale_order_name = ''
match = re.search(r'(S\d+)', move.product_id.name)
if match:
sale_order_name = match.group(0)
sale_order = self.env['sale.order'].sudo().search(
[('name', '=', sale_order_name)])
filtered_order_line = sale_order.order_line.filtered(
lambda production: product_name in production.product_id.name
)
if filtered_order_line:
move.part_number = filtered_order_line.part_number
move.part_name = filtered_order_line.part_name
def _get_stock_move_values_Res(self, item, picking_type_id, group_id, move_dest_ids=False):
route_id = self.env.ref('sf_manufacturing.route_surface_technology_outsourcing').id
stock_rule = self.env['stock.rule'].sudo().search(

View File

@@ -795,7 +795,7 @@
groups="sf_base.group_plan_dispatch,sf_base.group_sf_mrp_manager"
sequence="1"/>
<menuitem id="stock_picking_type_menu"
<menuitem id="stock.stock_picking_type_menu"
name="驾驶舱"
parent="stock.menu_stock_root"
action="stock.stock_picking_type_action"

View File

@@ -48,6 +48,7 @@
</xpath>
<xpath expr="//field[@name='date_planned_finished']" position="replace">
<field name="date_planned_finished" string="计划结束日期" optional="hide"/>
<field name="back_button_display" invisible="1"/>
</xpath>
<xpath expr="//button[@name='button_start']" position="attributes">
<!-- <attribute name="attrs">{'invisible': ['|', '|', '|','|','|', ('production_state','in', ('draft',-->
@@ -58,6 +59,11 @@
<attribute name="attrs">{'invisible': [('state', '!=', 'ready')]}
</attribute>
</xpath>
<xpath expr="//button[@name='button_start']" position="after">
<button name="button_back" string="回退" type="object" class="btn-primary"
attrs="{'invisible': [('back_button_display', '=', False)]}" confirm="是否确认回退"/>
</xpath>
<xpath expr="//button[@name='%(mrp.act_mrp_block_workcenter_wo)d']" position="attributes">
<attribute name="attrs">{'invisible':
['|',("user_permissions","=",False),("name","=","获取CNC加工程序")]}
@@ -163,7 +169,8 @@
<field name='is_delivery' invisible="1"/>
<field name="is_trayed" invisible="1"/>
<field name="is_inspect" invisible="1"/>
<!-- <field name="rework_flag" invisible="1"/>-->
<field name="back_button_display" invisible="1"/>
<!-- <field name="rework_flag" invisible="1"/>-->
<!-- <field name='is_send_program_again' invisible="1"/>-->
<!-- 工单form页面的开始停工按钮等 -->
<!-- <button name="button_start" type="object" string="开始" class="btn-success" -->
@@ -178,6 +185,8 @@
<!-- <button name="button_start" type="object" string="开始" class="btn-success" confirm="是否确认开始"-->
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel','to be detected')), ('is_user_working', '!=', False)]}"/>-->
<button name="button_back" string="回退" type="object" class="btn-primary"
attrs="{'invisible': [('back_button_display', '=', False)]}" confirm="是否确认回退"/>
<button name="button_start" type="object" string="开始" class="btn-success"
attrs="{'invisible': [('state', '!=', 'ready')]}"/>
<button name="button_pending" type="object" string="暂停" class="btn-warning"
@@ -212,12 +221,13 @@
attrs="{'invisible': ['|', '|', '|', ('routing_type','!=','装夹预调'),('state','!=','progress'), ('is_trayed', '=', False), ('state', 'in', ('done'))]}"/>
<button name="print_method" type="object" string="打印二维码" class="btn-primary"
attrs="{'invisible': ['|',('routing_type','!=','解除装夹'),('state','!=','done')]}"/>
<!-- <button type="object" class="oe_highlight jikimo_button_confirm" name="button_rework"-->
<!-- string="返工"-->
<!-- attrs='{"invisible": [("rework_flag","=",True)]}' confirm="是否返工"/>-->
<!-- <button type="object" class="oe_highlight jikimo_button_confirm" name="button_rework"-->
<!-- string="返工"-->
<!-- 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": [("routing_type","not in",("切割", "线切割", "人工线下加工"))]}'>
<group>
<group>
<field name="product_tmpl_id_materials_id" widget="many2one"/>
@@ -316,7 +326,7 @@
<xpath expr="//page[1]" position="before">
<page string="工件装夹" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'>
<group>
<!-- <field name="_barcode_scanned" widget="barcode_handler"/> -->
<!-- <field name="_barcode_scanned" widget="barcode_handler"/> -->
<group string="托盘">
<field name="tray_serial_number" readonly="1" string="序列号"/>
</group>
@@ -493,7 +503,8 @@
</group>
</page>
<page string="2D加工图纸" attrs='{"invisible": [("routing_type","not in",["装夹预调", "人工线下加工"])]}'>
<page string="2D加工图纸"
attrs='{"invisible": [("routing_type","not in",["装夹预调", "人工线下加工"])]}'>
<field name="machining_drawings" widget="adaptive_viewer"/>
</page>
@@ -642,7 +653,8 @@
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<xpath expr="//form//sheet//group//group[2]" position="replace">
<group string="装夹图纸" attrs="{'invisible': [('routing_type', 'not in', ['装夹预调', '人工线下加工'])]}">
<group string="装夹图纸"
attrs="{'invisible': [('routing_type', 'not in', ['装夹预调', '人工线下加工'])]}">
<!-- 隐藏加工图纸字段名 -->
<field name="processing_drawing" widget="pdf_viewer" string="" readonly="1"/>
<!-- <field name="production_id" invisible="0"/>-->

View File

@@ -54,7 +54,9 @@ class WorkpieceDeliveryWizard(models.TransientModel):
}
}
delivery_type = fields.Selection(related='route_id.route_type', string='类型')
def _get_agv_route_type_selection(self):
return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
delivery_type = fields.Selection(selection=_get_agv_route_type_selection, string='类型')
def dispatch_confirm(self):
if len(self.workorder_ids) < 4:

View File

@@ -68,6 +68,11 @@
<field name="model">stock.picking</field>
</record>
<record id="order_quality_done" model="jikimo.message.bussiness.node">
<field name="name">调拨单质检完成提醒</field>
<field name="model">stock.picking</field>
</record>
<record id="bussiness_mrp_workorder_pre_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">装夹预调工单逾期预警</field>
<field name="model">mrp.workorder</field>

View File

@@ -252,6 +252,18 @@
<field name="content">### 订单发货提醒:
单号:发料出库单[{{name}}]({{request_url}})
事项:销售订单{{sale_order_name}}已全部产出并入库,请及时发货</field>
</record>
<record id="template_order_quality_done" model="jikimo.message.template">
<field name="name">调拨单质检完成提醒</field>
<field name="model_id" ref="stock.model_stock_picking"/>
<field name="model">stock.picking</field>
<field name="bussiness_node_id" ref="order_quality_done"/>
<field name="msgtype">markdown</field>
<field name="urgency">normal</field>
<field name="content">### {{picking_type_name}}待处理提醒:
单号:{{name}}
事项:质量检查已完成</field>
</record>
<record id="template_quality_cnc_test" model="jikimo.message.template">

View File

@@ -9,6 +9,8 @@ class SFMessageStockPicking(models.Model):
_description = "库存调拨"
_inherit = ['stock.picking', 'jikimo.message.dispatch']
quality_check_ids = fields.One2many('quality.check', 'picking_id', '质量检测单')
@api.model_create_multi
def create(self, vals):
result = super(SFMessageStockPicking, self).create(vals)
@@ -20,7 +22,8 @@ class SFMessageStockPicking(models.Model):
logging.info('add_queue调拨入库 error:%s' % e)
return result
@api.depends('move_type', 'immediate_transfer', 'move_ids.state', 'move_ids.picking_id')
@api.depends('move_type', 'immediate_transfer', 'move_ids.state', 'move_ids.picking_id',
'quality_check_ids.quality_state')
def _compute_state(self):
super(SFMessageStockPicking, self)._compute_state()
try:
@@ -48,6 +51,8 @@ class SFMessageStockPicking(models.Model):
all_ready_or_done = all(picking.state in ['assigned', 'done'] for picking in stock_picking_list)
if all_ready_or_done:
mrp_production.add_queue('工序外协发料通知')
if all(qc.quality_state in ['pass', 'fail'] for qc in record.quality_check_ids):
record.add_queue('调拨单质检完成提醒')
except Exception as e:
logging.info('add_queue_compute_state error:%s' % e)
@@ -83,6 +88,11 @@ class SFMessageStockPicking(models.Model):
content = self.deal_stock_picking_sfp(message_queue_id)
if content:
contents.append(content)
elif message_queue_id.message_template_id.name == '调拨单质检完成提醒':
content = message_queue_id.message_template_id.content
content = content.replace('{{picking_type_name}}', self.picking_type_id.name).replace(
'{{name}}', self.name)
contents.append(content)
return contents, message_queue_ids
def get_special_url(self, id, tmplate_name, special_name, model_id):

View File

@@ -1968,8 +1968,7 @@ class CuttingSpeed(models.Model):
self.create({
'name': item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -1989,8 +1988,7 @@ class CuttingSpeed(models.Model):
else:
cutting_speed.write({
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -2023,8 +2021,7 @@ class CuttingSpeed(models.Model):
self.create({
'name': item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -2044,8 +2041,7 @@ class CuttingSpeed(models.Model):
else:
cutting_speed.write({
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -2124,8 +2120,7 @@ class CuttingSpeed(models.Model):
self.create({
'name': item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2137,8 +2132,7 @@ class CuttingSpeed(models.Model):
else:
feed_per_tooth.write({
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2165,8 +2159,7 @@ class CuttingSpeed(models.Model):
self.create({
'name': item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2178,8 +2171,7 @@ class CuttingSpeed(models.Model):
else:
feed_per_tooth.write({
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', item['standard_library_code'])]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2207,7 +2199,7 @@ class Cutting_tool_standard_library(models.Model):
if result['status'] == 1:
for item in result['cutting_tool_standard_library_yesterday_list']:
cutting_tool_standard_library = self.search(
[("code", '=', item['code'].replace("JKM", result['factory_short_name'])),
[("code", '=', item['code']),
('active', 'in', [True, False])])
cutting_tool_type = self.env['sf.cutting.tool.type'].search(
[("code", '=', item['cutting_tool_type_code'])])
@@ -2218,7 +2210,7 @@ class Cutting_tool_standard_library(models.Model):
brand = self.env['sf.machine.brand'].search([("code", '=', item['brand_code'])])
if not cutting_tool_standard_library:
self.create({
"code": item['code'].replace("JKM", result['factory_short_name']),
"code": item['code'],
"name": item['name'],
"cutting_tool_material_id": cutting_tool_material.id,
"cutting_tool_type_id": cutting_tool_type.id,
@@ -2240,9 +2232,9 @@ class Cutting_tool_standard_library(models.Model):
'maintenance.equipment.image'].search(
[('name', '=', item['fit_blade_shape'])]).id,
"chuck_id": False if not item['chuck_code'] else self.search(
[('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['chuck_code'])]).id,
"handle_id": False if not item['handle_code'] else self.search(
[('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['handle_code'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
@@ -2282,9 +2274,9 @@ class Cutting_tool_standard_library(models.Model):
'maintenance.equipment.image'].search(
[('name', '=', item['fit_blade_shape'])]).id,
"chuck_id": False if not item['chuck_code'] else self.search(
[('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['chuck_code'])]).id,
"handle_id": False if not item['handle_code'] else self.search(
[('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['handle_code'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
@@ -2314,7 +2306,7 @@ class Cutting_tool_standard_library(models.Model):
if result['status'] == 1:
for item in result['cutting_tool_standard_library_all_list']:
cutting_tool_standard_library = self.search(
[("code", '=', item['code'].replace("JKM", result['factory_short_name'])),
[("code", '=', item['code']),
("active", 'in', [True, False])])
cutting_tool_type = self.env['sf.cutting.tool.type'].search(
[("code", '=', item['cutting_tool_type_code'])])
@@ -2325,7 +2317,7 @@ class Cutting_tool_standard_library(models.Model):
brand = self.env['sf.machine.brand'].search([("code", '=', item['brand_code'])])
if not cutting_tool_standard_library:
self.create({
"code": item['code'].replace("JKM", result['factory_short_name']),
"code": item['code'],
"name": item['name'],
"cutting_tool_material_id": cutting_tool_material.id,
"cutting_tool_type_id": cutting_tool_type.id,
@@ -2347,9 +2339,9 @@ class Cutting_tool_standard_library(models.Model):
'maintenance.equipment.image'].search(
[('name', '=', item['fit_blade_shape'])]).id,
"chuck_id": False if not item['chuck_code'] else self.search(
[('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['chuck_code'])]).id,
"handle_id": False if not item['handle_code'] else self.search(
[('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['handle_code'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_method') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_method']),
@@ -2389,9 +2381,9 @@ class Cutting_tool_standard_library(models.Model):
'maintenance.equipment.image'].search(
[('name', '=', item['fit_blade_shape'])]).id,
"chuck_id": False if not item['chuck_code'] else self.search(
[('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['chuck_code'])]).id,
"handle_id": False if not item['handle_code'] else self.search(
[('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id,
[('code', '=', item['handle_code'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
@@ -2442,8 +2434,7 @@ class CuttingToolBasicParameters(models.Model):
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[(
'code', '=',
integral_tool_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
integral_tool_item['standard_library_code'])]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2469,8 +2460,7 @@ class CuttingToolBasicParameters(models.Model):
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[(
'code', '=',
integral_tool_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
integral_tool_item['standard_library_code'])]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2503,8 +2493,7 @@ class CuttingToolBasicParameters(models.Model):
'code': blade_item['code'],
'cutting_tool_type': '刀片',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', blade_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', blade_item['standard_library_code'])]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2534,8 +2523,7 @@ class CuttingToolBasicParameters(models.Model):
self.search([('code', '=', blade_item['code'])]).write({
'name': blade_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', blade_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', blade_item['standard_library_code'])]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2574,8 +2562,7 @@ class CuttingToolBasicParameters(models.Model):
'code': chuck_item['code'],
'cutting_tool_type': '夹头',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', chuck_item['standard_library_code'])]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2594,8 +2581,7 @@ class CuttingToolBasicParameters(models.Model):
self.search([('code', '=', chuck_item['code'])]).write({
'name': chuck_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', chuck_item['standard_library_code'])]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2624,8 +2610,7 @@ class CuttingToolBasicParameters(models.Model):
'code': cutter_arbor_item['code'],
'cutting_tool_type': '刀杆',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['standard_library_code'])]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -2643,8 +2628,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_arbor_item['mounting_structure'],
'blade_id': False if not cutter_arbor_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['fit_blade_model_code'])]).id,
'tool_shim': cutter_arbor_item['fit_knife_pad_model'],
'cotter_pin': cutter_arbor_item['fit_pin_model'],
'pressing_plate': cutter_arbor_item['fit_plate_model'],
@@ -2656,8 +2640,7 @@ class CuttingToolBasicParameters(models.Model):
self.search([('code', '=', cutter_arbor_item['code'])]).write({
'name': cutter_arbor_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['standard_library_code'])]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -2675,8 +2658,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_arbor_item['mounting_structure'],
'blade_id': False if not cutter_arbor_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['fit_blade_model_code'])]).id,
'tool_shim': cutter_arbor_item['fit_knife_pad_model'],
'cotter_pin': cutter_arbor_item['fit_pin_model'],
'pressing_plate': cutter_arbor_item['fit_plate_model'],
@@ -2698,8 +2680,7 @@ class CuttingToolBasicParameters(models.Model):
'code': cutter_head_item['code'],
'cutting_tool_type': '刀盘',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['standard_library_code'])]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -2712,8 +2693,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_head_item['mounting_structure'],
'blade_id': False if not cutter_head_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['fit_blade_model_code'])]).id,
'screw': cutter_head_item['fit_screw_model'],
'spanner': cutter_head_item['fit_wrench_model'],
'is_cooling_hole': cutter_head_item['is_cooling_hole'],
@@ -2724,8 +2704,7 @@ class CuttingToolBasicParameters(models.Model):
self.search([('code', '=', cutter_head_item['code'])]).write({
'name': cutter_head_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['standard_library_code'])]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -2738,8 +2717,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_head_item['mounting_structure'],
'blade_id': False if not cutter_head_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['fit_blade_model_code'])]).id,
'screw': cutter_head_item['fit_screw_model'],
'spanner': cutter_head_item['fit_wrench_model'],
'is_cooling_hole': cutter_head_item['is_cooling_hole'],
@@ -2757,8 +2735,7 @@ class CuttingToolBasicParameters(models.Model):
val = {
'name': knife_handle_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', knife_handle_item['standard_library_code'])]).id,
'taper_shank_model': knife_handle_item['taper_shank_model'],
'total_length': knife_handle_item['total_length'],
'flange_shank_length': knife_handle_item['flange_length'],
@@ -2814,8 +2791,7 @@ class CuttingToolBasicParameters(models.Model):
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[(
'code', '=',
integral_tool_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
integral_tool_item['standard_library_code'])]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2841,8 +2817,7 @@ class CuttingToolBasicParameters(models.Model):
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[(
'code', '=',
integral_tool_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
integral_tool_item['standard_library_code'])]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2875,8 +2850,7 @@ class CuttingToolBasicParameters(models.Model):
'code': blade_item['code'],
'cutting_tool_type': '刀片',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', blade_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', blade_item['standard_library_code'])]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2906,8 +2880,7 @@ class CuttingToolBasicParameters(models.Model):
blade.write({
'name': blade_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', blade_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', blade_item['standard_library_code'])]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2946,8 +2919,7 @@ class CuttingToolBasicParameters(models.Model):
'code': chuck_item['code'],
'cutting_tool_type': '夹头',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', chuck_item['standard_library_code'])]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2966,8 +2938,7 @@ class CuttingToolBasicParameters(models.Model):
chuck.write({
'name': chuck_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', chuck_item['standard_library_code'])]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2996,8 +2967,7 @@ class CuttingToolBasicParameters(models.Model):
'code': cutter_arbor_item['code'],
'cutting_tool_type': '刀杆',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['standard_library_code'])]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -3015,8 +2985,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_arbor_item['mounting_structure'],
'blade_id': False if not cutter_arbor_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['fit_blade_model_code'])]).id,
'tool_shim': cutter_arbor_item['fit_knife_pad_model'],
'cotter_pin': cutter_arbor_item['fit_pin_model'],
'pressing_plate': cutter_arbor_item['fit_plate_model'],
@@ -3028,8 +2997,7 @@ class CuttingToolBasicParameters(models.Model):
cutter_arbor.write({
'name': cutter_arbor_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_arbor_item['standard_library_code'])]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -3049,8 +3017,7 @@ class CuttingToolBasicParameters(models.Model):
self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=',
cutter_arbor_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
cutter_arbor_item['fit_blade_model_code'])]).id,
'tool_shim': cutter_arbor_item['fit_knife_pad_model'],
'cotter_pin': cutter_arbor_item['fit_pin_model'],
'pressing_plate': cutter_arbor_item['fit_plate_model'],
@@ -3071,8 +3038,7 @@ class CuttingToolBasicParameters(models.Model):
'code': cutter_head_item['code'],
'cutting_tool_type': '刀盘',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['standard_library_code'])]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -3085,8 +3051,7 @@ class CuttingToolBasicParameters(models.Model):
'installing_structure': cutter_head_item['mounting_structure'],
'blade_id': False if not cutter_head_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['fit_blade_model_code'])]).id,
'screw': cutter_head_item['fit_screw_model'],
'spanner': cutter_head_item['fit_wrench_model'],
'is_cooling_hole': cutter_head_item['is_cooling_hole'],
@@ -3097,8 +3062,7 @@ class CuttingToolBasicParameters(models.Model):
cutter_head.write({
'name': cutter_head_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', cutter_head_item['standard_library_code'])]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -3112,8 +3076,7 @@ class CuttingToolBasicParameters(models.Model):
'blade_id': False if not cutter_head_item['fit_blade_model_code'] else self.env[
'sf.cutting_tool.standard.library'].search(
[('code', '=',
cutter_head_item['fit_blade_model_code'].replace("JKM", result[
'factory_short_name']))]).id,
cutter_head_item['fit_blade_model_code'])]).id,
'screw': cutter_head_item['fit_screw_model'],
'spanner': cutter_head_item['fit_wrench_model'],
'is_cooling_hole': cutter_head_item['is_cooling_hole'],
@@ -3134,8 +3097,7 @@ class CuttingToolBasicParameters(models.Model):
'code': knife_handle_item['code'],
'cutting_tool_type': '刀柄',
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', knife_handle_item['standard_library_code'])]).id,
'total_length': knife_handle_item['total_length'],
'taper_shank_model': knife_handle_item['taper_shank_model'],
'flange_shank_length': knife_handle_item['flange_length'],
@@ -3161,8 +3123,7 @@ class CuttingToolBasicParameters(models.Model):
knife_handle.write({
'name': knife_handle_item['name'],
'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
[('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
'factory_short_name']))]).id,
[('code', '=', knife_handle_item['standard_library_code'])]).id,
'total_length': knife_handle_item['total_length'],
'taper_shank_model': knife_handle_item['taper_shank_model'],
'flange_shank_length': knife_handle_item['flange_length'],

View File

@@ -951,6 +951,12 @@ class SfStockPicking(models.Model):
"""
批量调拨,非就绪状态的会被忽略,完成后有通知提示
"""
# 对所以调拨单的质检单进行是否完成校验
sp_ids = [sp.id for sp in self]
qc_ids = self.env['quality.check'].sudo().search(
[('picking_id', 'in', sp_ids), ('quality_state', 'in', ['waiting', 'none'])])
if qc_ids:
raise ValidationError(f'单据{[qc.picking_id.name for qc in qc_ids]}未完成质量检查,完成后再试。')
for record in self:
if record.state != 'assigned':
continue