Merge branch 'develop' into feature/commercially_launched

This commit is contained in:
胡尧
2025-03-11 09:06:43 +08:00
14 changed files with 136 additions and 19 deletions

View File

@@ -81,8 +81,29 @@ class StockPicking(models.Model):
return quality_pickings
def action_cancel(self):
"""
调拨单取消后,关联取消质量检查单
"""
context = self.env.context
if not context.get('cancel_check_picking') and self.sudo().mapped('check_ids').filtered(
lambda x: x.quality_state in ['pass', 'fail']):
self.env.cr.rollback()
return {
'type': 'ir.actions.act_window',
'res_model': 'picking.check.cancel.wizard',
'name': '取消质检单',
'view_mode': 'form',
'target': 'new',
'context': {
'default_picking_id': self.id,
'cancel_check_picking': True}
}
elif self.check_ids.filtered(lambda x: x.quality_state != 'cancel'):
self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state != 'cancel').write({
'quality_state': 'cancel'
})
res = super(StockPicking, self).action_cancel()
self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state == 'none').unlink()
# self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state == 'none').unlink()
return res
def action_open_quality_check_picking(self):

View File

@@ -1,2 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_quality_check_wizard,access.quality_check_wizard,model_quality_check_wizard,quality.group_quality_user,1,1,1,0
access_picking_check_cancel_wizard,access.picking_check_cancel_wizard,model_picking_check_cancel_wizard,quality.group_quality_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_quality_check_wizard access.quality_check_wizard model_quality_check_wizard quality.group_quality_user 1 1 1 0
3 access_picking_check_cancel_wizard access.picking_check_cancel_wizard model_picking_check_cancel_wizard quality.group_quality_user 1 1 1 0

View File

@@ -112,3 +112,18 @@ class QualityCheckWizard(models.TransientModel):
default_current_check_id=self.current_check_id.id,
)
return action
class PickingCheckCancelWizard(models.TransientModel):
_name = 'picking.check.cancel.wizard'
_description = 'picking check cancel wizard'
picking_id = fields.Many2one('stock.picking', 'stock picking')
def confirm_picking_check(self):
self.picking_id.action_cancel()
return {'type': 'ir.actions.act_window_close'}
def cancel_picking_check(self):
# 这里是取消后的逻辑
return {'type': 'ir.actions.act_window_close'}

View File

@@ -118,4 +118,21 @@
<field name="context">{}</field>
<field name="target">new</field>
</record>
<!-- ================================================================================================== -->
<record id="picking_check_cancel_wizard_form" model="ir.ui.view">
<field name="name">picking.check.cancel.wizard</field>
<field name="model">picking.check.cancel.wizard</field>
<field name="arch" type="xml">
<form string="Quality Check Failed">
<div>质量检查单已完成,继续取消吗?</div>
<div class="'color': 'red'">注意:关联质量检查单也将被取消。</div>
<footer>
<button name="confirm_picking_check" type="object" class="btn-primary" string="确认"/>
<button name="cancel_picking_check" type="object" string="取消"/>
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -57,15 +57,24 @@ class MrsMaterialModel(models.Model):
remark = fields.Text("备注")
gain_way = fields.Selection(
[("自加工", "自加工"), ("外协", "委外加工"), ("采购", "采购")],
default="", string="获取方式")
default="采购", string="获取方式")
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
active = fields.Boolean('有效', default=True)
@api.constrains("gain_way")
def _check_supplier_ids(self):
for item in self:
if item.gain_way in ('外协', '采购') and not item.supplier_ids:
raise UserError("请添加供应商")
@api.model
def create(self, vals):
res = super(MrsMaterialModel, self).create(vals)
if not vals.get('supplier_ids'):
supplier_id = self.env['res.partner'].search([('name', '=', '湖南傲派自动化设备有限公司')], limit=1)
res.supplier_ids = [(0, 0, {'materials_model_id': res.id, 'partner_id': supplier_id.id or False})]
return res
else:
return res
# @api.constrains("gain_way")
# def _check_supplier_ids(self):
# for item in self:
# if item.gain_way in ('外协', '采购') and not item.supplier_ids:
# raise UserError("请添加供应商")
class MrsProductionProcessCategory(models.Model):

View File

@@ -262,13 +262,13 @@
<group>
<field name="materials_no" readonly="1" force_save="1"/>
<field name="gain_way" required="0"/>
<field name="tensile_strength" required="1"/>
<field name="hardness" required="1"/>
<field name="density" readonly="1"/>
<field name="density" readonly="1" required="1" class="custom_required"/>
</group>
<group>
<field name="rough_machining" required="1"/>
<field name="finish_machining" required="1"/>
<field name="tensile_strength" required="1"/>
<field name="hardness" required="1"/>
<field name="need_h" default="false" readonly="1"/>
<field name="mf_materia_post" attrs="{'invisible':[('need_h','=',False)]} "
readonly="1"/>
@@ -297,7 +297,7 @@
<record model="ir.ui.view" id="sf_materials_model_tree">
<field name="model">sf.materials.model</field>
<field name="arch" type="xml">
<tree string="材料型号" delete="0">
<tree string="材料型号" delete="0" create="0">
<field name="materials_no"/>
<field name="materials_code"/>
<field name="name"/>

View File

@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
import logging
import traceback
import requests
@@ -90,7 +91,8 @@ class ResConfigSettings(models.TransientModel):
_logger.info("同步坯料冗余完成")
except Exception as e:
_logger.info("sf_all_sync error: %s" % e)
traceback_error = traceback.format_exc()
_logger.error("sf_all_sync error:%s" % traceback_error)
raise ValidationError("数据错误导致同步失败,请联系管理员")
@api.model

View File

@@ -19,7 +19,8 @@
'views/view.xml',
'views/quality_cnc_test_view.xml',
'views/mrp_workorder.xml',
'views/quality_check_view.xml'
'views/quality_check_view.xml',
'wizard/check_picking_wizard_view.xml',
],
'assets': {

View File

@@ -5,4 +5,4 @@ from . import custom_quality
from . import quality
from . import quality_cnc_test
from . import mrp_workorder
# from . import stock
from . import stock

View File

@@ -9,13 +9,31 @@ class StockPicking(models.Model):
调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示:
“警告存在不合格产品XXXX n 件、YYYYY m件继续调拨请点“确认”否则请取消
"""
if self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'):
context = self.env.context
if not context.get('again_validate') and self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'):
# 回滚事务,为二次确认/取消做准备
self.env.cr.rollback()
quality_check_ids = self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail')
product_list = list(set([quality_check_id.product_id for quality_check_id in quality_check_ids]))
fail_check_text = ''
for product_id in product_list:
check_ids = quality_check_ids.filtered(lambda qc: qc.product_id == product_id)
number = sum(check_ids.mapped('qty_line'))
if number != 0:
fail_check_text = (f'{fail_check_text}{product_id.name} {number}'
if fail_check_text != '' else f'{product_id.name} {number}')
else:
fail_check_text = (f'{fail_check_text}{product_id.name}'
if fail_check_text != '' else f'{product_id.name}')
return {
'type': 'ir.actions.act_window',
'res_model': 'sf.functional.tool.assembly.order',
'name': ' ',
'res_model': 'picking.validate.check.wizard',
'name': '质检不合格提示',
'view_mode': 'form',
'target': 'new',
'context': {'': True}
'context': {
'default_picking_id': self.id,
'default_fail_check_text': f'警告:存在不合格产品{fail_check_text},继续调拨请点“确认”,否则请取消?',
'again_validate': True}
}
return super(StockPicking, self).button_validate()

View File

@@ -73,6 +73,6 @@ access_quality_cnc_test_group_quality_director,quality_cnc_test_group_quality_di
access_quality_cnc_test_group_sf_equipment_user,quality_cnc_test_group_sf_equipment_user,model_quality_cnc_test,sf_base.group_sf_equipment_user,1,1,0,0
access_picking_validate_check_wizard,access.picking_validate_check_wizard,model_picking_validate_check_wizard,quality.group_quality_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
73
74
75
76
77
78

View File

@@ -0,0 +1 @@
from . import check_picking_wizard

View File

@@ -0,0 +1,17 @@
from odoo import api, models,fields
class PickingValidateCheckWizard(models.TransientModel):
_name = 'picking.validate.check.wizard'
_description = '调拨质检不合格二次验证'
picking_id = fields.Many2one('stock.picking', '调拨单')
fail_check_text = fields.Text('提示信息')
def confirm_picking_validate_check(self):
self.picking_id.button_validate()
return {'type': 'ir.actions.act_window_close'}
def cancel_picking_validate_check(self):
# 这里是取消后的逻辑
return {'type': 'ir.actions.act_window_close'}

View File

@@ -0,0 +1,15 @@
<odoo>
<record id="picking_validate_check_wizard_form" model="ir.ui.view">
<field name="name">picking.validate.check.wizard</field>
<field name="model">picking.validate.check.wizard</field>
<field name="arch" type="xml">
<form>
<field name="fail_check_text" readonly="True"/>
<footer>
<button name="confirm_picking_validate_check" type="object" class="btn-primary" string="确认"/>
<button name="cancel_picking_validate_check" type="object" string="取消"/>
</footer>
</form>
</field>
</record>
</odoo>