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

This commit is contained in:
liaodanlong
2025-01-06 08:46:19 +08:00
14 changed files with 138 additions and 8 deletions

View File

@@ -139,7 +139,7 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
owl.onMounted(() => {
this.activeElement = this.uiService.activeElement;
this.setRequired()
// this.listherHeaderBodyNum()
this.listherHeaderBodyNum()
})
return this._super(...arguments);
},

View File

@@ -20,7 +20,7 @@
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['purchase', 'base_tier_validation', 'documents', 'purchase_request', 'account'],
'depends': ['purchase', 'base_tier_validation', 'documents', 'purchase_request', 'account', 'purchase_order_approved'],
# always loaded
'data': [

View File

@@ -23,6 +23,10 @@ class jikimo_purchase_tier_validation(models.Model):
for record in self:
if record.need_validation and record.validation_status != 'validated':
raise ValidationError(_('此操作需要至少对一条记录进行审批。\n请发起审批申请。'))
if record.state in ['to approve']:
raise ValidationError(_('请先完成审批。'))
if record.state == 'approved':
record.state = 'purchase'
return super().button_confirm()
# def button_confirm(self):
@@ -83,7 +87,17 @@ class jikimo_purchase_tier_validation(models.Model):
def _validate_tier(self, tiers=False):
res = super(jikimo_purchase_tier_validation, self)._validate_tier(tiers)
self.state = 'approved'
tier_reviews = tiers or self.review_ids
# 检查是否所有审批都已通过
all_approved = all(
tier_review.status == 'approved'
for tier_review in tier_reviews
)
if all_approved and tier_reviews: # 确保有审批记录
self.state = 'approved'
return res
def _rejected_tier(self, tiers=False):

View File

@@ -1,11 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record model="ir.ui.view" id="tier_validation_view_approved_purchase_order_form_inherit">
<field name="name">tier_validation_view_approved_purchase_order_form_inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase_order_approved.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='button_release']" position="replace">
</xpath>
</field>
</record>
<record model="ir.ui.view" id="tier_validation_view_purchase_order_form_inherit">
<field name="name">tier_validation_view_purchase_order_form_inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//header/button[@name='button_approve']" position="replace">
</xpath>
<xpath expr="//header/button[@name='button_cancel']" position="replace">
</xpath>
<xpath expr="//header/field[@name='state']" position="replace">

View File

@@ -519,6 +519,7 @@
<field name="name">Quality Checks</field>
<field name="res_model">quality.check</field>
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="context">{'is_web_request': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality check found

View File

@@ -12,7 +12,7 @@
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify', 'stock', 'sf_quality', 'mrp',
'sf_manufacturing','product'],
'sf_manufacturing', 'product', 'quality'],
'data': [
'data/bussiness_node.xml',
'data/cron_data.xml',
@@ -20,6 +20,7 @@
'security/ir.model.access.csv',
'views/mrp_workorder_views.xml',
'views/purchase_order_view.xml',
'views/stock_picking_view.xml',
],
'test': [
],

View File

@@ -150,5 +150,10 @@
<field name="name">采购单已逾期提醒</field>
<field name="model">purchase.order</field>
</record>
<record id="bussiness_quality_check" model="jikimo.message.bussiness.node">
<field name="name">待质检提醒</field>
<field name="model">product.product</field>
</record>
</data>
</odoo>

View File

@@ -389,5 +389,17 @@
事项:[共有{{num}}个采购订单已逾期]({{url}})
</field>
</record>
<record id="template_quality_check" model="jikimo.message.template">
<field name="name">待质检提醒</field>
<field name="model_id" ref="product.model_product_product"/>
<field name="model">product.product</field>
<field name="bussiness_node_id" ref="bussiness_quality_check"/>
<field name="msgtype">markdown</field>
<field name="urgency">normal</field>
<field name="content">### 待质检提醒:
单号:产品[{{name}}]({{url}})
事项:有{{num}}个质检单需要处理。</field>
</record>
</data>
</odoo>

View File

@@ -13,3 +13,4 @@ from . import sf_message_maintenance_logs
from . import sf_message_mrp_production_wizard
from . import sf_message_mrp_production_adjust_wizard
from . import sf_message_product
from . import sf_message_quality_check

View File

@@ -63,8 +63,9 @@ class SFMessageMrpProduction(models.Model):
[('origin', 'in', mrp_production_names), ('state', '=', 'assigned')])
if stock_picking_num >= 1:
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
action_id = self.env.ref('stock.action_picking_tree_ready').id
url_with_id = f"{url}/web#view_type=list&action={action_id}"
action_id = self.env.ref('sf_message.action_picking_outsourced_tree_ready').id
menu_id = self.env.ref('stock.menu_stock_root').id
url_with_id = f"{url}/web#view_type=list&action={action_id}&menu_id={menu_id}"
content = content.replace('{{name}}', mrp_production.product_id.name).replace('{{url}}',
url_with_id).replace(
'{{num}}', str(stock_picking_num))

View File

@@ -3,7 +3,7 @@ from odoo import models, fields, api, _
from urllib.parse import urlencode
class SFMessagePlan(models.Model):
class SFMessageProduct(models.Model):
_name = 'product.product'
_inherit = ['product.product', 'jikimo.message.dispatch']
@@ -28,6 +28,18 @@ class SFMessagePlan(models.Model):
'{{number}}', str(production_num)).replace(
'{{request_url}}', url)
contents.append(content)
if message_queue_id.message_template_id.name == '待质检提醒':
content = message_queue_id.message_template_id.content
product_product = self.env['product.product'].sudo().search([('id', '=', int(message_queue_id.res_id))])
quality_check_num = self.env['quality.check'].sudo().search_count(
[('product_id', '=', product_product.id), ('quality_state', '=', 'none')])
if quality_check_num >= 1:
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
action_id = self.env.ref('quality_control.quality_check_action_report').id
url_with_id = f"{url}/web#view_type=list&action={action_id}"
content = content.replace('{{name}}', product_product.name).replace('{{url}}', url_with_id).replace(
'{{num}}', str(quality_check_num))
contents.append(content)
return contents, message_queue_ids
def get_request_url(self):

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
import logging
from odoo import models, fields, api, _
class SFMessageQualityCheck(models.Model):
_name = 'quality.check'
_inherit = ['quality.check', 'jikimo.message.dispatch']
@api.model_create_multi
def create(self, vals_list):
result = super().create(vals_list)
try:
# 判断是否为web页面创建请求
is_web_request = self.env.context.get('is_web_request', False)
if not is_web_request:
for obj in result:
jikimo_message_queue = self.get_message_queue(obj.product_id.id)
if not jikimo_message_queue:
obj.product_id.add_queue('待质检提醒')
except Exception as e:
logging.info('add_queue待质检提醒 error:%s' % e)
return result
def get_message_queue(self, res_id):
business_node_id = self.env.ref('sf_message.bussiness_quality_check').id
message_template = self.env["jikimo.message.template"].sudo().search([
("name", "=", '待质检提醒'),
("bussiness_node_id", "=", business_node_id)
], limit=1)
jikimo_message_queue = self.env['jikimo.message.queue'].sudo().search(
[('res_id', '=', res_id), ("message_status", "in", ("pending", "sent")),
('message_template_id', '=', message_template.id)])
return jikimo_message_queue

View File

@@ -32,7 +32,7 @@ class SFMessageSale(models.Model):
for purchase_order_id in purchase_order_ids:
if purchase_order_id.purchase_type == 'outsourcing':
purchase_order_id.add_queue('委外加工采购单提醒')
if purchase_order_id.purchase_type == 'standard':
if purchase_order_id.purchase_type == 'outside':
purchase_order_id.add_queue('外购订单采购单提醒')
except Exception as e:
logging.info('add_queue error:%s' % e)

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_picking_internal_search_sf" model="ir.ui.view">
<field name="name">stock.picking.search</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_internal_search"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='activities_exception']" position="before">
<filter name="outsourced" string="外协出库" domain="[('picking_type_id.name', '=', '外协出库')]"
invisible="1"/>
<separator/>
</xpath>
</field>
</record>
<record id="action_picking_outsourced_tree_ready" model="ir.actions.act_window">
<field name="name">待办</field>
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">tree,kanban,form,calendar</field>
<field name="domain"></field>
<field name="context">{'search_default_outsourced': 1,'contact_display': 'partner_address',
'search_default_available': 1}
</field>
<field name="search_view_id" ref="stock.view_picking_internal_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
没有仓库调拨。 让我们创建一个!
</p>
<p>
移动允许您将产品从一个位置移动到另外一个位置。
</p>
</field>
</record>
</odoo>