Merge branch 'refs/heads/develop' into feature/part_number
This commit is contained in:
@@ -139,7 +139,7 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|||||||
owl.onMounted(() => {
|
owl.onMounted(() => {
|
||||||
this.activeElement = this.uiService.activeElement;
|
this.activeElement = this.uiService.activeElement;
|
||||||
this.setRequired()
|
this.setRequired()
|
||||||
// this.listherHeaderBodyNum()
|
this.listherHeaderBodyNum()
|
||||||
})
|
})
|
||||||
return this._super(...arguments);
|
return this._super(...arguments);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
'version': '0.1',
|
'version': '0.1',
|
||||||
|
|
||||||
# any module necessary for this one to work correctly
|
# 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
|
# always loaded
|
||||||
'data': [
|
'data': [
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ class jikimo_purchase_tier_validation(models.Model):
|
|||||||
for record in self:
|
for record in self:
|
||||||
if record.need_validation and record.validation_status != 'validated':
|
if record.need_validation and record.validation_status != 'validated':
|
||||||
raise ValidationError(_('此操作需要至少对一条记录进行审批。\n请发起审批申请。'))
|
raise ValidationError(_('此操作需要至少对一条记录进行审批。\n请发起审批申请。'))
|
||||||
|
if record.state in ['to approve']:
|
||||||
|
raise ValidationError(_('请先完成审批。'))
|
||||||
|
if record.state == 'approved':
|
||||||
|
record.state = 'purchase'
|
||||||
return super().button_confirm()
|
return super().button_confirm()
|
||||||
|
|
||||||
# def button_confirm(self):
|
# def button_confirm(self):
|
||||||
@@ -83,7 +87,17 @@ class jikimo_purchase_tier_validation(models.Model):
|
|||||||
|
|
||||||
def _validate_tier(self, tiers=False):
|
def _validate_tier(self, tiers=False):
|
||||||
res = super(jikimo_purchase_tier_validation, self)._validate_tier(tiers)
|
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
|
return res
|
||||||
|
|
||||||
def _rejected_tier(self, tiers=False):
|
def _rejected_tier(self, tiers=False):
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
<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">
|
<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="name">tier_validation_view_purchase_order_form_inherit</field>
|
||||||
<field name="model">purchase.order</field>
|
<field name="model">purchase.order</field>
|
||||||
<field name="inherit_id" ref="purchase.purchase_order_form"/>
|
<field name="inherit_id" ref="purchase.purchase_order_form"/>
|
||||||
<field name="arch" type="xml">
|
<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 expr="//header/button[@name='button_cancel']" position="replace">
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//header/field[@name='state']" position="replace">
|
<xpath expr="//header/field[@name='state']" position="replace">
|
||||||
|
|||||||
@@ -519,6 +519,7 @@
|
|||||||
<field name="name">Quality Checks</field>
|
<field name="name">Quality Checks</field>
|
||||||
<field name="res_model">quality.check</field>
|
<field name="res_model">quality.check</field>
|
||||||
<field name="view_mode">tree,kanban,form,pivot,graph</field>
|
<field name="view_mode">tree,kanban,form,pivot,graph</field>
|
||||||
|
<field name="context">{'is_web_request': True}</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
No quality check found
|
No quality check found
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
'category': 'sf',
|
'category': 'sf',
|
||||||
'website': 'https://www.sf.jikimo.com',
|
'website': 'https://www.sf.jikimo.com',
|
||||||
'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify', 'stock', 'sf_quality', 'mrp',
|
'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify', 'stock', 'sf_quality', 'mrp',
|
||||||
'sf_manufacturing','product'],
|
'sf_manufacturing', 'product', 'quality'],
|
||||||
'data': [
|
'data': [
|
||||||
'data/bussiness_node.xml',
|
'data/bussiness_node.xml',
|
||||||
'data/cron_data.xml',
|
'data/cron_data.xml',
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'views/mrp_workorder_views.xml',
|
'views/mrp_workorder_views.xml',
|
||||||
'views/purchase_order_view.xml',
|
'views/purchase_order_view.xml',
|
||||||
|
'views/stock_picking_view.xml',
|
||||||
],
|
],
|
||||||
'test': [
|
'test': [
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -150,5 +150,10 @@
|
|||||||
<field name="name">采购单已逾期提醒</field>
|
<field name="name">采购单已逾期提醒</field>
|
||||||
<field name="model">purchase.order</field>
|
<field name="model">purchase.order</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="bussiness_quality_check" model="jikimo.message.bussiness.node">
|
||||||
|
<field name="name">待质检提醒</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -389,5 +389,17 @@
|
|||||||
事项:[共有{{num}}个采购订单已逾期]({{url}})
|
事项:[共有{{num}}个采购订单已逾期]({{url}})
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</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>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -13,3 +13,4 @@ from . import sf_message_maintenance_logs
|
|||||||
from . import sf_message_mrp_production_wizard
|
from . import sf_message_mrp_production_wizard
|
||||||
from . import sf_message_mrp_production_adjust_wizard
|
from . import sf_message_mrp_production_adjust_wizard
|
||||||
from . import sf_message_product
|
from . import sf_message_product
|
||||||
|
from . import sf_message_quality_check
|
||||||
|
|||||||
@@ -63,8 +63,9 @@ class SFMessageMrpProduction(models.Model):
|
|||||||
[('origin', 'in', mrp_production_names), ('state', '=', 'assigned')])
|
[('origin', 'in', mrp_production_names), ('state', '=', 'assigned')])
|
||||||
if stock_picking_num >= 1:
|
if stock_picking_num >= 1:
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
||||||
action_id = self.env.ref('stock.action_picking_tree_ready').id
|
action_id = self.env.ref('sf_message.action_picking_outsourced_tree_ready').id
|
||||||
url_with_id = f"{url}/web#view_type=list&action={action_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}}',
|
content = content.replace('{{name}}', mrp_production.product_id.name).replace('{{url}}',
|
||||||
url_with_id).replace(
|
url_with_id).replace(
|
||||||
'{{num}}', str(stock_picking_num))
|
'{{num}}', str(stock_picking_num))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from odoo import models, fields, api, _
|
|||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
|
||||||
class SFMessagePlan(models.Model):
|
class SFMessageProduct(models.Model):
|
||||||
_name = 'product.product'
|
_name = 'product.product'
|
||||||
_inherit = ['product.product', 'jikimo.message.dispatch']
|
_inherit = ['product.product', 'jikimo.message.dispatch']
|
||||||
|
|
||||||
@@ -28,6 +28,18 @@ class SFMessagePlan(models.Model):
|
|||||||
'{{number}}', str(production_num)).replace(
|
'{{number}}', str(production_num)).replace(
|
||||||
'{{request_url}}', url)
|
'{{request_url}}', url)
|
||||||
contents.append(content)
|
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
|
return contents, message_queue_ids
|
||||||
|
|
||||||
def get_request_url(self):
|
def get_request_url(self):
|
||||||
|
|||||||
34
sf_message/models/sf_message_quality_check.py
Normal file
34
sf_message/models/sf_message_quality_check.py
Normal 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
|
||||||
@@ -32,7 +32,7 @@ class SFMessageSale(models.Model):
|
|||||||
for purchase_order_id in purchase_order_ids:
|
for purchase_order_id in purchase_order_ids:
|
||||||
if purchase_order_id.purchase_type == 'outsourcing':
|
if purchase_order_id.purchase_type == 'outsourcing':
|
||||||
purchase_order_id.add_queue('委外加工采购单提醒')
|
purchase_order_id.add_queue('委外加工采购单提醒')
|
||||||
if purchase_order_id.purchase_type == 'standard':
|
if purchase_order_id.purchase_type == 'outside':
|
||||||
purchase_order_id.add_queue('外购订单采购单提醒')
|
purchase_order_id.add_queue('外购订单采购单提醒')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.info('add_queue error:%s' % e)
|
logging.info('add_queue error:%s' % e)
|
||||||
|
|||||||
37
sf_message/views/stock_picking_view.xml
Normal file
37
sf_message/views/stock_picking_view.xml
Normal 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>
|
||||||
Reference in New Issue
Block a user