Compare commits
3 Commits
feature/me
...
feature/we
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d28eccd1b | ||
|
|
8dc3f2698b | ||
|
|
69c63f708d |
@@ -1,5 +1,2 @@
|
|||||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||||
"access_jikimo_workorder_exception","access.jikimo.workorder.exception","model_jikimo_workorder_exception","mrp.group_mrp_user",1,1,1,0
|
"access_jikimo_workorder_exception","access.jikimo.workorder.exception","model_jikimo_workorder_exception","mrp.group_mrp_user",1,1,1,0
|
||||||
"access_jikimo_workorder_exception_group_quality","access.jikimo.workorder.exception.group_quality","model_jikimo_workorder_exception","sf_base.group_quality",1,1,1,0
|
|
||||||
"access_jikimo_workorder_exception_group_quality_director","access.jikimo.workorder.exception.group_quality_director","model_jikimo_workorder_exception","sf_base.group_quality_director",1,1,1,0
|
|
||||||
|
|
||||||
|
|||||||
|
@@ -9,7 +9,7 @@
|
|||||||
""",
|
""",
|
||||||
'category': 'sf',
|
'category': 'sf',
|
||||||
'website': 'https://www.sf.jikimo.com',
|
'website': 'https://www.sf.jikimo.com',
|
||||||
'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing','jikimo_attachment_viewer'],
|
'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing'],
|
||||||
'data': [
|
'data': [
|
||||||
'data/stock_data.xml',
|
'data/stock_data.xml',
|
||||||
'views/product_template_management_view.xml',
|
'views/product_template_management_view.xml',
|
||||||
|
|||||||
@@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
from . import hr_employee
|
from . import hr_employee
|
||||||
from . import res_config_setting
|
from . import res_config_setting
|
||||||
|
from . import res_users
|
||||||
|
|||||||
@@ -11,6 +11,42 @@ class JkmPracticeEmployee(models.Model):
|
|||||||
|
|
||||||
we_id = fields.Char(string='企微ID', index=True)
|
we_id = fields.Char(string='企微ID', index=True)
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
for val in vals_list:
|
||||||
|
if 'work_email' in val:
|
||||||
|
val["we_id"] = self._get_we_id(val.get('work_email'))
|
||||||
|
return super(JkmPracticeEmployee, self).create(vals_list)
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
if 'work_email' in vals:
|
||||||
|
vals["we_id"] = self._get_we_id(vals.get('work_email'))
|
||||||
|
return super(JkmPracticeEmployee, self).write(vals)
|
||||||
|
|
||||||
|
@api.depends('work_contact_id', 'work_contact_id.mobile', 'work_contact_id.email')
|
||||||
|
def _compute_work_contact_details(self):
|
||||||
|
for employee in self:
|
||||||
|
if employee.work_contact_id:
|
||||||
|
employee.mobile_phone = employee.work_contact_id.mobile
|
||||||
|
employee.work_email = employee.work_contact_id.email
|
||||||
|
if employee.work_contact_id.email:
|
||||||
|
employee.we_id = self._get_we_id(employee.work_contact_id.email)
|
||||||
|
|
||||||
|
def _get_we_id(self, work_email):
|
||||||
|
json1 = {
|
||||||
|
'params': {
|
||||||
|
'work_email': work_email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url = '/api/get/we_id/info'
|
||||||
|
config = self.env['res.config.settings'].get_values()
|
||||||
|
ret = requests.post((config['ims_url'] + url), json=json1, data={})
|
||||||
|
result = ret.json()['result']
|
||||||
|
if result['code'] == 200:
|
||||||
|
if result['we_id']:
|
||||||
|
return result['we_id']
|
||||||
|
return None
|
||||||
|
|
||||||
def _employee_info_sync(self):
|
def _employee_info_sync(self):
|
||||||
url = '/api/get/organization'
|
url = '/api/get/organization'
|
||||||
config = self.env['res.config.settings'].get_values()
|
config = self.env['res.config.settings'].get_values()
|
||||||
|
|||||||
15
sf_hr/models/res_users.py
Normal file
15
sf_hr/models/res_users.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import random
|
||||||
|
from odoo import models, fields, api
|
||||||
|
from odoo.http import request
|
||||||
|
from odoo.exceptions import AccessDenied
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class ResUsers(models.Model):
|
||||||
|
_inherit = 'res.users'
|
||||||
|
|
||||||
|
we_employee_id = fields.Char(string=u'企业微信账号', related='employee_id.we_id', default="")
|
||||||
@@ -22,10 +22,6 @@ access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_mainten
|
|||||||
|
|
||||||
access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,1,1,0
|
access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,1,1,0
|
||||||
access_maintenance_wizard_system_user,maintenance.request.wizard system user,model_maintenance_request_wizard,base.group_user,1,1,1,0
|
access_maintenance_wizard_system_user,maintenance.request.wizard system user,model_maintenance_request_wizard,base.group_user,1,1,1,0
|
||||||
access_maintenance_sf_group_equipment_user,equipment.request_sf_group_equipment_user,maintenance.model_maintenance_request,sf_group_equipment_user,1,1,1,0
|
|
||||||
access_maintenance_wizard_sf_group_equipment_user,maintenance_wizard_sf_group_equipment_user,model_maintenance_request_wizard,sf_group_equipment_user,1,1,1,0
|
|
||||||
access_maintenance_sf_group_equipment_manager,equipment.request_sf_group_equipment_manager,maintenance.model_maintenance_request,sf_group_equipment_manager,1,1,1,0
|
|
||||||
access_maintenance_wizard_sf_group_equipment_manager,maintenance_wizard_sf_group_equipment_manager,model_maintenance_request_wizard,sf_group_equipment_manager,1,1,1,0
|
|
||||||
|
|
||||||
access_maintenance_equipment_group_plan_dispatch,maintenance.equipment,maintenance.model_maintenance_equipment,sf_base.group_plan_dispatch,1,0,0,0
|
access_maintenance_equipment_group_plan_dispatch,maintenance.equipment,maintenance.model_maintenance_equipment,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
access_maintenance_equipment_oee_group_plan_dispatch,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_base.group_plan_dispatch,1,0,0,0
|
access_maintenance_equipment_oee_group_plan_dispatch,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
|
|||||||
|
@@ -76,61 +76,33 @@
|
|||||||
<field name="equipment_maintenance_id"/>
|
<field name="equipment_maintenance_id"/>
|
||||||
|
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='user_id']" position="replace">
|
<xpath expr="//field[@name='user_id']" position="replace">
|
||||||
<field name="user_id" string="维保人"/>
|
<field name="user_id" string="维保人"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='close_date']" position="replace">
|
<xpath expr="//field[@name='close_date']" position="replace">
|
||||||
<field name="close_date" attrs="{'invisible': [('done', '!=', True)]}" readonly="True"
|
<field name="close_date" attrs="{'invisible': [('done', '!=', True)]}" readonly="True" string="维保日期"/>
|
||||||
string="维保日期"/>
|
</xpath>
|
||||||
</xpath>
|
|
||||||
|
|
||||||
<xpath expr="//field[@name='request_date']" position="attributes">
|
|
||||||
<attribute name="string">计划维保日期</attribute>
|
|
||||||
</xpath>
|
|
||||||
|
|
||||||
<sheet>
|
<sheet>
|
||||||
|
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}"
|
<page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}" context="{'default_standard_id': 'id'}">
|
||||||
context="{'default_standard_id': 'id'}">
|
|
||||||
<field name="maintenance_standards" widget="one2many_list">
|
<field name="maintenance_standards" widget="one2many_list">
|
||||||
<tree multi_edit="" editable="">
|
<tree multi_edit="" editable="">
|
||||||
<field name="name" class="table_custom_required"/>
|
<field name="name" class="table_custom_required"/>
|
||||||
<field name="maintenance_standards" class="table_custom_required"/>
|
<field name="maintenance_standards" class="table_custom_required"/>
|
||||||
<field name="images" force_save="1" required="1" class="table_custom_required">
|
<field name="images" force_save="1" required="1" class="table_custom_required">
|
||||||
</field>
|
</field>
|
||||||
<field name="remark" class="table_custom_required"/>
|
<field name="remark" class="table_custom_required"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
|
|
||||||
|
|
||||||
</sheet>
|
</sheet>
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="maintenance_request_view_tree_sf" model="ir.ui.view">
|
|
||||||
<field name="name">maintenance.request.view.tree.sf</field>
|
|
||||||
<field name="model">maintenance.request</field>
|
|
||||||
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_tree"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//field[@name='request_date']" position="replace">
|
|
||||||
<field name="request_date" string="计划维保日期"/>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//field[@name='user_id']" position="after">
|
|
||||||
<field name="sf_maintenance_type"/>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="equipment_request_view_search_sf" model="ir.ui.view">
|
|
||||||
<field name="name">maintenance.request.view.search.sf</field>
|
|
||||||
<field name="model">maintenance.request</field>
|
|
||||||
<field name="inherit_id" ref="maintenance.hr_equipment_request_view_search"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//filter[@name='inactive']" position="replace">
|
|
||||||
<filter string="不活跃的" name="inactive" domain="[('archive', '=', True)]"/>
|
|
||||||
<filter string="已归档" name="in_active" domain="[('active', '=', False)]"/>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -138,7 +110,7 @@
|
|||||||
<record id="hr_equipment_request_action1" model="ir.actions.act_window">
|
<record id="hr_equipment_request_action1" model="ir.actions.act_window">
|
||||||
<field name="name">维保计划</field>
|
<field name="name">维保计划</field>
|
||||||
<field name="res_model">maintenance.request</field>
|
<field name="res_model">maintenance.request</field>
|
||||||
<field name="view_mode">tree,kanban,form,pivot,graph,calendar</field>
|
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
||||||
<field name="view_id" ref="maintenance.hr_equipment_request_view_kanban"/>
|
<field name="view_id" ref="maintenance.hr_equipment_request_view_kanban"/>
|
||||||
<field name="context">{'default_user_id': uid}</field>
|
<field name="context">{'default_user_id': uid}</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
""",
|
""",
|
||||||
'category': 'sf',
|
'category': 'sf',
|
||||||
'website': 'https://www.sf.jikimo.com',
|
'website': 'https://www.sf.jikimo.com',
|
||||||
'depends': ['sf_base', 'sf_maintenance', 'web_widget_model_viewer', 'sf_warehouse','jikimo_attachment_viewer'],
|
'depends': ['sf_base', 'sf_maintenance', 'web_widget_model_viewer', 'sf_warehouse'],
|
||||||
'data': [
|
'data': [
|
||||||
'data/stock_data.xml',
|
'data/stock_data.xml',
|
||||||
'data/empty_racks_data.xml',
|
'data/empty_racks_data.xml',
|
||||||
@@ -45,8 +45,6 @@
|
|||||||
'sf_manufacturing/static/src/scss/kanban_change.scss',
|
'sf_manufacturing/static/src/scss/kanban_change.scss',
|
||||||
'sf_manufacturing/static/src/xml/button_show_on_tree.xml',
|
'sf_manufacturing/static/src/xml/button_show_on_tree.xml',
|
||||||
'sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js',
|
'sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js',
|
||||||
'sf_manufacturing/static/src/js/qr.js',
|
|
||||||
'sf_manufacturing/static/src/xml/qr.xml',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -141,12 +141,12 @@ class MrpProduction(models.Model):
|
|||||||
], string='工序状态', default='待装夹')
|
], string='工序状态', default='待装夹')
|
||||||
|
|
||||||
# 零件图号
|
# 零件图号
|
||||||
part_number = fields.Char('零件图号', related='product_id.part_number', readonly=True)
|
part_number = fields.Char('零件图号', readonly=True)
|
||||||
|
|
||||||
# 上传零件图纸
|
# 上传零件图纸
|
||||||
part_drawing = fields.Binary('零件图纸', related='product_id.machining_drawings', readonly=True)
|
part_drawing = fields.Binary('零件图纸', readonly=True)
|
||||||
|
|
||||||
quality_standard = fields.Binary('质检标准', related='product_id.quality_standard', readonly=True)
|
quality_standard = fields.Binary('质检标准', readonly=True)
|
||||||
|
|
||||||
@api.depends('product_id.manual_quotation')
|
@api.depends('product_id.manual_quotation')
|
||||||
def _compute_manual_quotation(self):
|
def _compute_manual_quotation(self):
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
compute='_compute_state', store=True,
|
compute='_compute_state', store=True,
|
||||||
default='pending', copy=False, readonly=True, recursive=True, index=True, tracking=True)
|
default='pending', copy=False, readonly=True, recursive=True, index=True, tracking=True)
|
||||||
|
|
||||||
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效',
|
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效')
|
||||||
tracking=True)
|
|
||||||
|
|
||||||
@api.depends('production_id.manual_quotation')
|
@api.depends('production_id.manual_quotation')
|
||||||
def _compute_manual_quotation(self):
|
def _compute_manual_quotation(self):
|
||||||
@@ -1106,11 +1105,9 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
if self.routing_type == '装夹预调':
|
if self.routing_type == '装夹预调':
|
||||||
# 判断是否有坯料的序列号信息
|
# 判断是否有坯料的序列号信息
|
||||||
boolean = False
|
boolean = False
|
||||||
if self.production_id.move_raw_ids:
|
if self.production_id.move_raw_ids[0].move_line_ids:
|
||||||
if self.production_id.move_raw_ids[0].move_line_ids:
|
if self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name:
|
||||||
if self.production_id.move_raw_ids[0].move_line_ids:
|
boolean = True
|
||||||
if self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name:
|
|
||||||
boolean = True
|
|
||||||
if not boolean:
|
if not boolean:
|
||||||
raise UserError('制造订单【%s】缺少组件的序列号信息!' % self.production_id.name)
|
raise UserError('制造订单【%s】缺少组件的序列号信息!' % self.production_id.name)
|
||||||
self.pro_code = self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name
|
self.pro_code = self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name
|
||||||
@@ -1843,7 +1840,7 @@ class WorkPieceDelivery(models.Model):
|
|||||||
return is_free
|
return is_free
|
||||||
else:
|
else:
|
||||||
raise UserError("接驳站暂未反馈站点实时状态,请稍后再试")
|
raise UserError("接驳站暂未反馈站点实时状态,请稍后再试")
|
||||||
|
|
||||||
def delivery_avg(self):
|
def delivery_avg(self):
|
||||||
is_agv_task_dispatch = self.env['ir.config_parameter'].sudo().get_param('is_agv_task_dispatch')
|
is_agv_task_dispatch = self.env['ir.config_parameter'].sudo().get_param('is_agv_task_dispatch')
|
||||||
if is_agv_task_dispatch:
|
if is_agv_task_dispatch:
|
||||||
|
|||||||
@@ -16,12 +16,6 @@ from OCC.Extend.DataExchange import write_stl_file
|
|||||||
class ResProductMo(models.Model):
|
class ResProductMo(models.Model):
|
||||||
_inherit = 'product.template'
|
_inherit = 'product.template'
|
||||||
|
|
||||||
def _get_machining_precision(self):
|
|
||||||
machinings = self.env['sf.machining.accuracy'].sudo().search([])
|
|
||||||
|
|
||||||
list = [(m.sync_id, m.name) for m in machinings]
|
|
||||||
return list
|
|
||||||
|
|
||||||
model_file = fields.Binary('模型文件')
|
model_file = fields.Binary('模型文件')
|
||||||
categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True)
|
categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True)
|
||||||
model_name = fields.Char('模型名称')
|
model_name = fields.Char('模型名称')
|
||||||
@@ -29,7 +23,12 @@ class ResProductMo(models.Model):
|
|||||||
model_width = fields.Float('模型宽(mm)', digits=(16, 3))
|
model_width = fields.Float('模型宽(mm)', digits=(16, 3))
|
||||||
model_height = fields.Float('模型高(mm)', digits=(16, 3))
|
model_height = fields.Float('模型高(mm)', digits=(16, 3))
|
||||||
model_volume = fields.Float('模型体积(m³)')
|
model_volume = fields.Float('模型体积(m³)')
|
||||||
model_machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度')
|
model_machining_precision = fields.Selection([
|
||||||
|
('0.10', '±0.10mm'),
|
||||||
|
('0.05', '±0.05mm'),
|
||||||
|
('0.03', '±0.03mm'),
|
||||||
|
('0.02', '±0.02mm'),
|
||||||
|
('0.01', '±0.01mm')], string='加工精度')
|
||||||
model_processing_panel = fields.Char('模型加工面板')
|
model_processing_panel = fields.Char('模型加工面板')
|
||||||
model_remark = fields.Char('模型备注说明')
|
model_remark = fields.Char('模型备注说明')
|
||||||
length = fields.Float('长(mm)', digits=(16, 3))
|
length = fields.Float('长(mm)', digits=(16, 3))
|
||||||
@@ -777,6 +776,8 @@ class ResProductMo(models.Model):
|
|||||||
part_number = fields.Char(string='零件图号', readonly=True)
|
part_number = fields.Char(string='零件图号', readonly=True)
|
||||||
machining_drawings = fields.Binary('2D加工图纸', readonly=True)
|
machining_drawings = fields.Binary('2D加工图纸', readonly=True)
|
||||||
quality_standard = fields.Binary('质检标准', readonly=True)
|
quality_standard = fields.Binary('质检标准', readonly=True)
|
||||||
|
machining_drawings_name = fields.Char('2D加工图纸名', readonly=True)
|
||||||
|
quality_standard_name = fields.Char('质检标准名', readonly=True)
|
||||||
|
|
||||||
@api.constrains('tool_length')
|
@api.constrains('tool_length')
|
||||||
def _check_tool_length_size(self):
|
def _check_tool_length_size(self):
|
||||||
@@ -838,10 +839,10 @@ class ResProductMo(models.Model):
|
|||||||
else:
|
else:
|
||||||
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
|
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
|
||||||
|
|
||||||
def attachment_update(self, name, res_id, res_field, mimetype):
|
def attachment_update(self, name, res_id, res_field):
|
||||||
attachment_info = self.env['ir.attachment'].sudo().search(
|
attachment_info = self.env['ir.attachment'].sudo().search(
|
||||||
[('res_id', '=', res_id), ('res_field', '=', res_field)], limit=1)
|
[('res_id', '=', res_id), ('res_field', '=', res_field)], limit=1)
|
||||||
attachment_info.write({'name': name, 'mimetype': mimetype})
|
attachment_info.write({'name': name})
|
||||||
|
|
||||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
|
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
|
||||||
def product_create(self, product_id, item, order_id, order_number, i):
|
def product_create(self, product_id, item, order_id, order_number, i):
|
||||||
@@ -881,6 +882,8 @@ class ResProductMo(models.Model):
|
|||||||
'manual_quotation': item['manual_quotation'] or False,
|
'manual_quotation': item['manual_quotation'] or False,
|
||||||
'part_number': item.get('part_number') or '',
|
'part_number': item.get('part_number') or '',
|
||||||
'active': True,
|
'active': True,
|
||||||
|
'machining_drawings_name': item['machining_drawings_name'],
|
||||||
|
'quality_standard_name': item['quality_standard_name'],
|
||||||
'machining_drawings': '' if not item['machining_drawings'] else base64.b64decode(
|
'machining_drawings': '' if not item['machining_drawings'] else base64.b64decode(
|
||||||
item['machining_drawings']),
|
item['machining_drawings']),
|
||||||
'quality_standard': '' if not item['quality_standard'] else base64.b64decode(item['quality_standard']),
|
'quality_standard': '' if not item['quality_standard'] else base64.b64decode(item['quality_standard']),
|
||||||
@@ -891,12 +894,12 @@ class ResProductMo(models.Model):
|
|||||||
vals.update({'taxes_id': [(6, 0, [int(tax_id)])]})
|
vals.update({'taxes_id': [(6, 0, [int(tax_id)])]})
|
||||||
copy_product_id.sudo().write(vals)
|
copy_product_id.sudo().write(vals)
|
||||||
product_id.product_tmpl_id.active = False
|
product_id.product_tmpl_id.active = False
|
||||||
if item['machining_drawings'] and item['machining_drawings_name'] and item['machining_drawings_mimetype']:
|
if item['machining_drawings'] and item['machining_drawings_name']:
|
||||||
self.attachment_update(item['machining_drawings_name'], copy_product_id.product_tmpl_id.id,
|
self.attachment_update(item['machining_drawings_name'], copy_product_id.product_tmpl_id.id,
|
||||||
'machining_drawings', item['machining_drawings_mimetype'])
|
'machining_drawings')
|
||||||
if item['quality_standard'] and item['quality_standard_name'] and item['quality_standard_mimetype']:
|
if item['quality_standard'] and item['quality_standard_name']:
|
||||||
self.attachment_update(item['quality_standard_name'], copy_product_id.product_tmpl_id.id,
|
self.attachment_update(item['quality_standard_name'], copy_product_id.product_tmpl_id.id,
|
||||||
'quality_standard', item['quality_standard_mimetype'])
|
'quality_standard')
|
||||||
return copy_product_id
|
return copy_product_id
|
||||||
|
|
||||||
def _get_ids(self, param):
|
def _get_ids(self, param):
|
||||||
|
|||||||
@@ -272,6 +272,21 @@ class StockRule(models.Model):
|
|||||||
workorder_duration += workorder.duration_expected
|
workorder_duration += workorder.duration_expected
|
||||||
|
|
||||||
sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)])
|
sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)])
|
||||||
|
# 根据销售订单号查询快速订单
|
||||||
|
quick_easy_order = self.env['quick.easy.order'].sudo().search([('sale_order_id', '=', sale_order.id)])
|
||||||
|
if quick_easy_order:
|
||||||
|
production.write({'part_number': quick_easy_order.part_drawing_number,
|
||||||
|
'part_drawing': quick_easy_order.machining_drawings})
|
||||||
|
else:
|
||||||
|
production.write({'part_number': production.product_id.part_number,
|
||||||
|
'part_drawing': production.product_id.machining_drawings,
|
||||||
|
'quality_standard': production.product_id.quality_standard})
|
||||||
|
if production.product_id.machining_drawings and production.product_id.machining_drawings_name:
|
||||||
|
self.attachment_update(production.product_id.machining_drawings_name, production.id,
|
||||||
|
'part_drawing')
|
||||||
|
if production.product_id.quality_standard and production.product_id.quality_standard_name:
|
||||||
|
self.attachment_update(production.product_id.quality_standard_name, production.id,
|
||||||
|
'quality_standard')
|
||||||
if sale_order:
|
if sale_order:
|
||||||
# sale_order.write({'schedule_status': 'to schedule'})
|
# sale_order.write({'schedule_status': 'to schedule'})
|
||||||
self.env['sf.production.plan'].sudo().with_company(company_id).create({
|
self.env['sf.production.plan'].sudo().with_company(company_id).create({
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
/** @odoo-module **/
|
|
||||||
import { registry } from '@web/core/registry';
|
|
||||||
import { Component } from '@odoo/owl';
|
|
||||||
|
|
||||||
class QRCodeWidget extends Component {
|
|
||||||
// 初始化组件
|
|
||||||
setup() {
|
|
||||||
console.log('QRCodeWidget setup');
|
|
||||||
this.qrCodeValue = ''; // 初始化为空字符串,用于存储条码
|
|
||||||
this.inputBuffer = ''; // 存储临时输入的字符
|
|
||||||
this.inputTimer = null; // 定时器
|
|
||||||
|
|
||||||
// 显式绑定上下文
|
|
||||||
this.onGlobalKeyDown = this.onGlobalKeyDown.bind(this);
|
|
||||||
window.addEventListener('keydown', this.onGlobalKeyDown);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清理事件监听器,防止内存泄漏
|
|
||||||
willUnmount() {
|
|
||||||
window.removeEventListener('keydown', this.onGlobalKeyDown);
|
|
||||||
if (this.inputTimer) {
|
|
||||||
clearTimeout(this.inputTimer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 全局键盘事件监听器
|
|
||||||
onGlobalKeyDown(event) {
|
|
||||||
|
|
||||||
// 如果是Tab键,表示扫码输入结束
|
|
||||||
if (event.key === 'Tab' || event.key === 'Enter') {
|
|
||||||
this.qrCodeValue = this.inputBuffer; // 完整条码赋值
|
|
||||||
console.log('完整条码:', this.qrCodeValue);
|
|
||||||
this.onQRCodeChange(this.qrCodeValue); // 调用父组件的 onQRCodeChange 方法
|
|
||||||
this.inputBuffer = ''; // 清空临时缓冲区
|
|
||||||
event.preventDefault(); // 阻止Tab键的默认行为
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 只处理可打印字符
|
|
||||||
if (event.key.length === 1) {
|
|
||||||
this.inputBuffer += event.key; // 添加到缓冲区
|
|
||||||
// console.log('当前缓冲区:', this.inputBuffer);
|
|
||||||
|
|
||||||
// 清除之前的定时器,重新开始计时
|
|
||||||
if (this.inputTimer) {
|
|
||||||
clearTimeout(this.inputTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 启动一个定时器,如果500ms内没有新的输入,则认为条码输入完成
|
|
||||||
this.inputTimer = setTimeout(() => {
|
|
||||||
this.qrCodeValue = this.inputBuffer;
|
|
||||||
// console.log('定时器触发,完整条码:', this.qrCodeValue);
|
|
||||||
this.inputBuffer = ''; // 清空缓冲区
|
|
||||||
}, 500); // 可以根据需要调整时间
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理二维码输入变更
|
|
||||||
async onQRCodeChange(qrCodeValue) {
|
|
||||||
console.log('onQRCodeChange二维码输入变更', qrCodeValue); // 检查二维码的输入是否被捕获
|
|
||||||
|
|
||||||
if (qrCodeValue) {
|
|
||||||
// console.log('二维码输入变更');
|
|
||||||
try {
|
|
||||||
// 发起 RPC 请求
|
|
||||||
const result = await this.env.services.rpc('/web/dataset/call_kw', {
|
|
||||||
model: 'mrp.workorder',
|
|
||||||
method: 'search_read',
|
|
||||||
args: [
|
|
||||||
[['rfid_code', '=', qrCodeValue]], // 查询条件
|
|
||||||
['id'] // 返回的字段
|
|
||||||
],
|
|
||||||
kwargs: {}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (result.length > 0) {
|
|
||||||
console.log('该二维码对应的工单存在!');
|
|
||||||
} else {
|
|
||||||
console.log('未找到对应的工单。');
|
|
||||||
|
|
||||||
const routingTypeField = document.querySelector('[name="routing_type"]');
|
|
||||||
if (routingTypeField) {
|
|
||||||
let fieldValue = routingTypeField.querySelector('span').getAttribute('raw-value');
|
|
||||||
console.log('Routing Type Value:', fieldValue);
|
|
||||||
// 清理多余的引号
|
|
||||||
fieldValue = fieldValue ? fieldValue.replace(/["]+/g, '') : null;
|
|
||||||
console.log(fieldValue);
|
|
||||||
|
|
||||||
if (fieldValue && fieldValue === '装夹预调') {
|
|
||||||
// console.log('routing_type 为装夹预调');
|
|
||||||
|
|
||||||
// 检查 RFID 值
|
|
||||||
if (!qrCodeValue || qrCodeValue.length <= 3) return;
|
|
||||||
|
|
||||||
// 查找 name="button_start" 按钮并触发点击事件
|
|
||||||
const startButton = document.querySelector('[name="button_start"]');
|
|
||||||
if (startButton) {
|
|
||||||
startButton.click();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('查询工单时出错:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 返回模板名称
|
|
||||||
static template = 'sf_manufacturing.QRCodeWidgetTemplate';
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将自定义字段注册到字段注册表
|
|
||||||
registry.category('fields').add('qrcode_widget', QRCodeWidget);
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<templates>
|
|
||||||
<t t-name="sf_manufacturing.QRCodeWidgetTemplate" owl="1">
|
|
||||||
<!-- <div> -->
|
|
||||||
<!-- <input type="text" t-att-value="props.value" placeholder="Scan QR code here" /> -->
|
|
||||||
<!-- </div> -->
|
|
||||||
<div t-esc="props.value">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
</templates>
|
|
||||||
|
|
||||||
@@ -125,9 +125,9 @@
|
|||||||
<field name="model">mrp.workorder</field>
|
<field name="model">mrp.workorder</field>
|
||||||
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<!-- <xpath expr="//form" position="inside"> -->
|
<xpath expr="//form" position="inside">
|
||||||
<!-- <script src="sf_manufacturing/static/src/js/customRFID.js"/> -->
|
<script src="sf_manufacturing/static/src/js/customRFID.js"/>
|
||||||
<!-- </xpath> -->
|
</xpath>
|
||||||
<xpath expr="//header/field[@name='state']" position="replace">
|
<xpath expr="//header/field[@name='state']" position="replace">
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
statusbar_visible="pending,waiting,ready,progress,to be detected,done,rework"/>
|
statusbar_visible="pending,waiting,ready,progress,to be detected,done,rework"/>
|
||||||
@@ -225,7 +225,6 @@
|
|||||||
<xpath expr="//label[1]" position="before">
|
<xpath expr="//label[1]" position="before">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<field name="production_id" invisible="0"/>
|
<field name="production_id" invisible="0"/>
|
||||||
<field name="routing_type" string="工单类型" readonly="1"/>
|
|
||||||
<field name="duration_expected" invisible="1"/>
|
<field name="duration_expected" invisible="1"/>
|
||||||
<field name="date_planned_start" invisible="1"/>
|
<field name="date_planned_start" invisible="1"/>
|
||||||
<field name="date_planned_finished" invisible="1"/>
|
<field name="date_planned_finished" invisible="1"/>
|
||||||
@@ -247,8 +246,8 @@
|
|||||||
<field name='process_state' invisible="1"/>
|
<field name='process_state' invisible="1"/>
|
||||||
<field name='tag_type' readonly="1" attrs='{"invisible": [("tag_type","=",False)]}'
|
<field name='tag_type' readonly="1" attrs='{"invisible": [("tag_type","=",False)]}'
|
||||||
decoration-danger="tag_type == '重新加工'"/>
|
decoration-danger="tag_type == '重新加工'"/>
|
||||||
<field name="rfid_code" force_save="1" readonly="1" cache="True"
|
<field name="rfid_code" force_save="1" readonly="0" cache="True"
|
||||||
attrs="{'invisible': [('rfid_code_old', '!=', False)]}" widget='qrcode_widget'/>
|
attrs="{'invisible': [('rfid_code_old', '!=', False)]}"/>
|
||||||
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
|
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
|
||||||
|
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -467,15 +466,6 @@
|
|||||||
<field name='X_deviation_angle' readonly="1"/>
|
<field name='X_deviation_angle' readonly="1"/>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
|
|
||||||
<page string="2D加工图纸" attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
|
|
||||||
<field name="machining_drawings" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
|
|
||||||
<page string="质检标准" attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
|
|
||||||
<field name="quality_standard" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
|
|
||||||
<page string="工件配送"
|
<page string="工件配送"
|
||||||
attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
|
attrs="{'invisible': [('routing_type','!=','装夹预调')]}">
|
||||||
<field name="workpiece_delivery_ids">
|
<field name="workpiece_delivery_ids">
|
||||||
@@ -529,13 +519,6 @@
|
|||||||
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
|
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
</page>
|
</page>
|
||||||
<page string="2D加工图纸" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
|
||||||
<field name="machining_drawings" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
|
|
||||||
<page string="质检标准" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
|
||||||
<field name="quality_standard" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//page[1]" position="before">
|
<xpath expr="//page[1]" position="before">
|
||||||
<page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
<page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
||||||
@@ -606,6 +589,18 @@
|
|||||||
mrp.group_mrp_manager,sf_base.group_sf_mrp_manager,sf_base.group_sf_equipment_user,sf_base.group_sf_order_user
|
mrp.group_mrp_manager,sf_base.group_sf_mrp_manager,sf_base.group_sf_equipment_user,sf_base.group_sf_order_user
|
||||||
</attribute>
|
</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//sheet//notebook" position="inside">
|
||||||
|
<page string="2D加工图纸">
|
||||||
|
<field name="machining_drawings" widget="adaptive_viewer"
|
||||||
|
attrs="{'invisible': [('routing_type', '!=', 'CNC加工')]}"/>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//sheet//notebook" position="inside">
|
||||||
|
<page string="质检标准">
|
||||||
|
<field name="quality_standard" widget="adaptive_viewer"
|
||||||
|
attrs="{'invisible': [('routing_type', '!=', 'CNC加工')]}"/>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -13,19 +13,6 @@
|
|||||||
<field name="active" eval="True"/>
|
<field name="active" eval="True"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.cron" id="ir_cron_sale_order_recover_time_warning">
|
|
||||||
<field name="name">检查销售订单是否完成并恢复正常时效</field>
|
|
||||||
<field name="model_id" ref="model_sale_order"/>
|
|
||||||
<field name="state">code</field>
|
|
||||||
<field name="code">model._recover_sale_time_warning_func()</field>
|
|
||||||
<field name="interval_number">10</field>
|
|
||||||
<field name="interval_type">minutes</field>
|
|
||||||
<field name="numbercall">-1</field>
|
|
||||||
<field name="doall" eval="False"/>
|
|
||||||
<field name="user_id" ref="base.user_root"/>
|
|
||||||
<field name="active" eval="True"/>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="ir.cron" id="ir_cron_mrp_workorder_overdue_warning">
|
<record model="ir.cron" id="ir_cron_mrp_workorder_overdue_warning">
|
||||||
<field name="name">检查工单是否已逾期预警和逾期</field>
|
<field name="name">检查工单是否已逾期预警和逾期</field>
|
||||||
<field name="model_id" ref="model_mrp_workorder"/>
|
<field name="model_id" ref="model_mrp_workorder"/>
|
||||||
|
|||||||
@@ -97,7 +97,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单逾期预警
|
<field name="content">### 工单逾期预警
|
||||||
事项:共有[{{warning_num}}]({{url}})个工单有逾期风险</field>
|
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_pre_overdue" model="jikimo.message.template">
|
<record id="template_mrp_workorder_pre_overdue" model="jikimo.message.template">
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单已逾期提醒
|
<field name="content">### 工单已逾期提醒
|
||||||
事项:共有[{{overdue_num}}]({{url}})个工单已逾期</field>
|
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_cnc_overdue_warning" model="jikimo.message.template">
|
<record id="template_mrp_workorder_cnc_overdue_warning" model="jikimo.message.template">
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单逾期预警
|
<field name="content">### 工单逾期预警
|
||||||
事项:共有[{{warning_num}}]({{url}})个工单有逾期风险</field>
|
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_cnc_overdue" model="jikimo.message.template">
|
<record id="template_mrp_workorder_cnc_overdue" model="jikimo.message.template">
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单已逾期提醒
|
<field name="content">### 工单已逾期提醒
|
||||||
事项:共有[{{overdue_num}}]({{url}})个工单已逾期</field>
|
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_unclamp_overdue_warning" model="jikimo.message.template">
|
<record id="template_mrp_workorder_unclamp_overdue_warning" model="jikimo.message.template">
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单逾期预警
|
<field name="content">### 工单逾期预警
|
||||||
事项:共有[{{warning_num}}]({{url}})个工单有逾期风险</field>
|
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_unclamp_overdue" model="jikimo.message.template">
|
<record id="template_mrp_workorder_unclamp_overdue" model="jikimo.message.template">
|
||||||
@@ -157,7 +157,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单已逾期提醒
|
<field name="content">### 工单已逾期提醒
|
||||||
事项:共有[{{overdue_num}}]({{url}})个工单已逾期</field>
|
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_surface_overdue_warning" model="jikimo.message.template">
|
<record id="template_mrp_workorder_surface_overdue_warning" model="jikimo.message.template">
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单逾期预警
|
<field name="content">### 工单逾期预警
|
||||||
事项:共有[{{warning_num}}]({{url}})个工单有逾期风险</field>
|
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="template_mrp_workorder_surface_overdue" model="jikimo.message.template">
|
<record id="template_mrp_workorder_surface_overdue" model="jikimo.message.template">
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
<field name="send_type">timing</field>
|
<field name="send_type">timing</field>
|
||||||
<field name="urgency">normal</field>
|
<field name="urgency">normal</field>
|
||||||
<field name="content">### 工单已逾期提醒
|
<field name="content">### 工单已逾期提醒
|
||||||
事项:共有[{{overdue_num}}]({{url}})个工单已逾期</field>
|
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class SFMessageSale(models.Model):
|
|||||||
picking_id.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id).ids
|
picking_id.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id).ids
|
||||||
purchase_order_id.extend(purchase_order_ids)
|
purchase_order_id.extend(purchase_order_ids)
|
||||||
if purchase_order_id:
|
if purchase_order_id:
|
||||||
purchase_order_list = self.env['purchase.order'].sudo().search([('id', 'in', purchase_order_id)])
|
purchase_order_list = self.env['purchase.order'].search([('id', 'in', purchase_order_id)])
|
||||||
for purchase_order_info in purchase_order_list:
|
for purchase_order_info in purchase_order_list:
|
||||||
purchase_order_info.add_queue('坯料采购提醒')
|
purchase_order_info.add_queue('坯料采购提醒')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -45,7 +45,7 @@ class SFMessageSale(models.Model):
|
|||||||
def _get_message(self, message_queue_ids):
|
def _get_message(self, message_queue_ids):
|
||||||
contents = []
|
contents = []
|
||||||
bussiness_node = None
|
bussiness_node = None
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||||
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
|
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
|
||||||
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
|
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
|
||||||
@@ -60,7 +60,7 @@ class SFMessageSale(models.Model):
|
|||||||
contents.append(content)
|
contents.append(content)
|
||||||
elif item.message_template_id.bussiness_node_id.name == '确认接单':
|
elif item.message_template_id.bussiness_node_id.name == '确认接单':
|
||||||
content = super(SFMessageSale, self)._get_message(item)
|
content = super(SFMessageSale, self)._get_message(item)
|
||||||
sale_order_line = self.env['sale.order.line'].sudo().search([('order_id', '=', int(item.res_id))])
|
sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(item.res_id))])
|
||||||
product = sale_order_line[0].product_id.name if len(sale_order_line) == 1 else '%s...' % \
|
product = sale_order_line[0].product_id.name if len(sale_order_line) == 1 else '%s...' % \
|
||||||
sale_order_line[
|
sale_order_line[
|
||||||
0].product_id.name
|
0].product_id.name
|
||||||
@@ -106,36 +106,36 @@ class SFMessageSale(models.Model):
|
|||||||
sale_order = self.sudo().search(
|
sale_order = self.sudo().search(
|
||||||
[('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False), ('delivery_status', '!=', 'full')])
|
[('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False), ('delivery_status', '!=', 'full')])
|
||||||
for item in sale_order:
|
for item in sale_order:
|
||||||
production = self.env['mrp.production'].sudo().search([('origin', '=', item.name)])
|
production = self.env['mrp.production'].search([('origin', '=', item.name)])
|
||||||
production_not_done = production.filtered(lambda p: p.state not in ['done', 'scrap', 'cancel'])
|
production_not_done = production.filtered(lambda p: p.state not in ['done', 'scrap', 'cancel'])
|
||||||
production_done_count = len(production.filtered(lambda p: p.state in ['done', 'scrap', 'cancel']))
|
production_done_count = len(production.filtered(lambda p: p.state in ['done', 'scrap', 'cancel']))
|
||||||
if (len(production_not_done) >= 1 and len(production_not_done) != item.mrp_production_count) or len(
|
if (len(production_not_done) >= 1 and len(production_not_done) != item.mrp_production_count) or len(
|
||||||
production_not_done) != production_done_count:
|
production_not_done) != production_done_count:
|
||||||
# logging.info("-----不等于----")
|
logging.info("-----不等于----")
|
||||||
# logging.info(f"name: {item.name}")
|
logging.info(f"name: {item.name}")
|
||||||
# logging.info(
|
logging.info(
|
||||||
# f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
||||||
# logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}")
|
logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}")
|
||||||
if deadline_check == item.deadline_of_delivery and item.delivery_warning not in ['warning']:
|
if deadline_check == item.deadline_of_delivery and item.delivery_warning not in ['warning']:
|
||||||
item.delivery_warning = 'warning'
|
item.delivery_warning = 'warning'
|
||||||
elif today >= item.deadline_of_delivery and item.delivery_warning not in ['overdue']:
|
elif today >= item.deadline_of_delivery and item.delivery_warning not in ['overdue']:
|
||||||
item.delivery_warning = 'overdue'
|
item.delivery_warning = 'overdue'
|
||||||
elif production_done_count == item.mrp_production_count:
|
elif production_done_count == item.mrp_production_count:
|
||||||
# logging.info("-----等于----")
|
logging.info("-----等于----")
|
||||||
# logging.info(f"name: {item.name}")
|
logging.info(f"name: {item.name}")
|
||||||
# logging.info(
|
logging.info(
|
||||||
# f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
||||||
# logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}")
|
logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}")
|
||||||
if item.delivery_status in ['pending', 'partial']:
|
if item.delivery_status in ['pending', 'partial']:
|
||||||
if deadline_check == item.deadline_of_delivery and item.delivery_warning not in ['warning']:
|
if deadline_check == item.deadline_of_delivery and item.delivery_warning not in ['warning']:
|
||||||
item.delivery_warning = 'warning'
|
item.delivery_warning = 'warning'
|
||||||
elif today >= item.deadline_of_delivery and item.delivery_warning not in ['overdue']:
|
elif today >= item.deadline_of_delivery and item.delivery_warning not in ['overdue']:
|
||||||
item.delivery_warning = 'overdue'
|
item.delivery_warning = 'overdue'
|
||||||
else:
|
else:
|
||||||
# logging.info("-----1111111----")
|
logging.info("-----1111111----")
|
||||||
# logging.info(f"name: {item.name}")
|
logging.info(f"name: {item.name}")
|
||||||
# logging.info(
|
logging.info(
|
||||||
# f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}")
|
||||||
continue
|
continue
|
||||||
# 获取业务节点
|
# 获取业务节点
|
||||||
business_node_ids = {
|
business_node_ids = {
|
||||||
@@ -146,11 +146,11 @@ class SFMessageSale(models.Model):
|
|||||||
for wo in overdue_orders:
|
for wo in overdue_orders:
|
||||||
business_node_id = business_node_ids.get(wo.delivery_warning)
|
business_node_id = business_node_ids.get(wo.delivery_warning)
|
||||||
if business_node_id:
|
if business_node_id:
|
||||||
message_template = self.env["jikimo.message.template"].sudo().search([
|
message_template = self.env["jikimo.message.template"].search([
|
||||||
("model", "=", self._name),
|
("model", "=", self._name),
|
||||||
("bussiness_node_id", "=", business_node_id)
|
("bussiness_node_id", "=", business_node_id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
sale_order_has = self.env['jikimo.message.queue'].sudo().search([
|
sale_order_has = self.env['jikimo.message.queue'].search([
|
||||||
('res_id', '=', wo.id),
|
('res_id', '=', wo.id),
|
||||||
('message_status', '=', 'pending'),
|
('message_status', '=', 'pending'),
|
||||||
('message_template_id', '=', message_template.id)
|
('message_template_id', '=', message_template.id)
|
||||||
@@ -158,15 +158,3 @@ class SFMessageSale(models.Model):
|
|||||||
if not sale_order_has:
|
if not sale_order_has:
|
||||||
message_name = '销售订单逾期预警' if wo.delivery_warning == 'warning' else '销售订单已逾期'
|
message_name = '销售订单逾期预警' if wo.delivery_warning == 'warning' else '销售订单已逾期'
|
||||||
wo.add_queue(message_name)
|
wo.add_queue(message_name)
|
||||||
|
|
||||||
def _recover_sale_time_warning_func(self):
|
|
||||||
sale_order_done = self.sudo().search([('state', 'in', ['sale']), ('delivery_status', '=', 'full')])
|
|
||||||
sale_order_overdue = sale_order_done.filtered(lambda x: x.delivery_warning in ['overdue', 'warning'])
|
|
||||||
if sale_order_overdue:
|
|
||||||
sale_order_overdue.write({'delivery_warning': 'normal'})
|
|
||||||
message_queue_ids = self.env["jikimo.message.queue"].sudo().search([
|
|
||||||
("message_status", "=", "pending"),
|
|
||||||
("res_id", "in", [item.id for item in sale_order_overdue])
|
|
||||||
])
|
|
||||||
if message_queue_ids:
|
|
||||||
message_queue_ids.write({'message_status': 'cancel'})
|
|
||||||
|
|||||||
@@ -29,14 +29,14 @@ class SFMessageStockPicking(models.Model):
|
|||||||
[('origin', '=', record.origin), ('state', '!=', 'done'),
|
[('origin', '=', record.origin), ('state', '!=', 'done'),
|
||||||
('picking_type_id.sequence_code', '=', 'SFP')])
|
('picking_type_id.sequence_code', '=', 'SFP')])
|
||||||
if not stock_picking_sfp:
|
if not stock_picking_sfp:
|
||||||
stock_picking_send = self.env["jikimo.message.queue"].sudo().search([('res_id', '=', record.id)])
|
stock_picking_send = self.env["jikimo.message.queue"].search([('res_id', '=', record.id)])
|
||||||
if not stock_picking_send:
|
if not stock_picking_send:
|
||||||
record.add_queue('订单发货提醒')
|
record.add_queue('订单发货提醒')
|
||||||
|
|
||||||
def deal_stock_picking_sfp(self, message_queue_id): # 处理订单发货提醒
|
def deal_stock_picking_sfp(self, message_queue_id): # 处理订单发货提醒
|
||||||
content = None
|
content = None
|
||||||
stock_picking = self.env['stock.picking'].sudo().search([('id', '=', int(message_queue_id.res_id))])
|
stock_picking = self.env['stock.picking'].search([('id', '=', int(message_queue_id.res_id))])
|
||||||
stock_picking_out = self.env['stock.picking'].sudo().search(
|
stock_picking_out = self.env['stock.picking'].search(
|
||||||
[('origin', '=', stock_picking.origin), ('state', '=', 'assigned'),
|
[('origin', '=', stock_picking.origin), ('state', '=', 'assigned'),
|
||||||
('picking_type_id.sequence_code', '=', 'OUT')])
|
('picking_type_id.sequence_code', '=', 'OUT')])
|
||||||
if stock_picking_out and len(stock_picking_out) > 0:
|
if stock_picking_out and len(stock_picking_out) > 0:
|
||||||
@@ -54,10 +54,10 @@ class SFMessageStockPicking(models.Model):
|
|||||||
i = 0
|
i = 0
|
||||||
if message_queue_id.message_template_id.name == '坯料发料提醒':
|
if message_queue_id.message_template_id.name == '坯料发料提醒':
|
||||||
content = message_queue_id.message_template_id.content
|
content = message_queue_id.message_template_id.content
|
||||||
stock_picking_line = self.env['stock.picking'].sudo().search([('id', '=', int(message_queue_id.res_id))])
|
stock_picking_line = self.env['stock.picking'].search([('id', '=', int(message_queue_id.res_id))])
|
||||||
mrp_production_info = self.env['mrp.production'].sudo().search(
|
mrp_production_info = self.env['mrp.production'].search(
|
||||||
[('name', '=', stock_picking_line.origin)])
|
[('name', '=', stock_picking_line.origin)])
|
||||||
mrp_production_list = self.env['mrp.production'].sudo().search(
|
mrp_production_list = self.env['mrp.production'].search(
|
||||||
[('product_id', '=', mrp_production_info.product_id.id)])
|
[('product_id', '=', mrp_production_info.product_id.id)])
|
||||||
for mrp_production_line in mrp_production_list:
|
for mrp_production_line in mrp_production_list:
|
||||||
picking_ids = mrp_production_line.picking_ids
|
picking_ids = mrp_production_line.picking_ids
|
||||||
@@ -87,9 +87,9 @@ class SFMessageStockPicking(models.Model):
|
|||||||
return super(SFMessageStockPicking, self).get_special_url(id, tmplate_name, special_name, model_id)
|
return super(SFMessageStockPicking, self).get_special_url(id, tmplate_name, special_name, model_id)
|
||||||
|
|
||||||
def request_url(self):
|
def request_url(self):
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||||
action_id = self.env.ref('stock.stock_picking_type_action').id
|
action_id = self.env.ref('stock.stock_picking_type_action').id
|
||||||
menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_theme_treehouse')]).id
|
menu_id = self.env['ir.model.data'].search([('name', '=', 'module_theme_treehouse')]).id
|
||||||
# 查询参数
|
# 查询参数
|
||||||
params = {'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
|
params = {'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
|
||||||
'view_type': 'kanban'}
|
'view_type': 'kanban'}
|
||||||
@@ -100,9 +100,9 @@ class SFMessageStockPicking(models.Model):
|
|||||||
return full_url
|
return full_url
|
||||||
|
|
||||||
def request_url1(self, id):
|
def request_url1(self, id):
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||||
action_id = self.env.ref('stock.action_picking_tree_all').id
|
action_id = self.env.ref('stock.action_picking_tree_all').id
|
||||||
menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_theme_treehouse')]).id
|
menu_id = self.env['ir.model.data'].search([('name', '=', 'module_theme_treehouse')]).id
|
||||||
# 查询参数
|
# 查询参数
|
||||||
params = {'id': id, 'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
|
params = {'id': id, 'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
|
||||||
'view_type': 'form'}
|
'view_type': 'form'}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class SFMessageWork(models.Model):
|
|||||||
contents = []
|
contents = []
|
||||||
product_id = []
|
product_id = []
|
||||||
bussiness_node = None
|
bussiness_node = None
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||||
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
|
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
|
||||||
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
|
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
|
||||||
@@ -39,8 +39,8 @@ class SFMessageWork(models.Model):
|
|||||||
for message_queue_id in message_queue_ids:
|
for message_queue_id in message_queue_ids:
|
||||||
if message_queue_id.message_template_id.name == '工单已下发通知':
|
if message_queue_id.message_template_id.name == '工单已下发通知':
|
||||||
content = message_queue_id.message_template_id.content
|
content = message_queue_id.message_template_id.content
|
||||||
mrp_workorder_line = self.env['mrp.workorder'].sudo().search([('id', '=', int(message_queue_id.res_id))])
|
mrp_workorder_line = self.env['mrp.workorder'].search([('id', '=', int(message_queue_id.res_id))])
|
||||||
mrp_workorder_list = self.env['mrp.workorder'].sudo().search(
|
mrp_workorder_list = self.env['mrp.workorder'].search(
|
||||||
[('product_id', '=', mrp_workorder_line.product_id.id), ('state', '=', 'ready'),
|
[('product_id', '=', mrp_workorder_line.product_id.id), ('state', '=', 'ready'),
|
||||||
('routing_type', '=', '装夹预调')])
|
('routing_type', '=', '装夹预调')])
|
||||||
if len(mrp_workorder_list) > 0 and mrp_workorder_line.product_id.id not in product_id:
|
if len(mrp_workorder_list) > 0 and mrp_workorder_line.product_id.id not in product_id:
|
||||||
@@ -69,7 +69,7 @@ class SFMessageWork(models.Model):
|
|||||||
search_condition = [
|
search_condition = [
|
||||||
('delivery_warning', '=', 'warning')] if bussiness_node in template_names['预警'] else [
|
('delivery_warning', '=', 'warning')] if bussiness_node in template_names['预警'] else [
|
||||||
('delivery_warning', '=', 'overdue')]
|
('delivery_warning', '=', 'overdue')]
|
||||||
record = self.sudo().search(search_condition + [('id', '=', int(message_queue_id.res_id))])
|
record = self.sudo().search(search_condition + [('id', '=', int(item.res_id))])
|
||||||
if record:
|
if record:
|
||||||
i += 1
|
i += 1
|
||||||
if i >= 1:
|
if i >= 1:
|
||||||
@@ -84,13 +84,12 @@ class SFMessageWork(models.Model):
|
|||||||
return contents
|
return contents
|
||||||
|
|
||||||
def request_url(self):
|
def request_url(self):
|
||||||
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||||
action_id = self.env.ref('sf_message.mrp_workorder_issued_action').id
|
action_id = self.env.ref('sf_message.mrp_workorder_action_notify').id
|
||||||
menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_stock_dropshipping')]).id
|
menu_id = self.env['ir.model.data'].search([('name', '=', 'module_stock_dropshipping')]).id
|
||||||
active_id = self.env['mrp.workcenter'].sudo().search([('name', '=', '工件装夹中心')]).id
|
|
||||||
# 查询参数
|
# 查询参数
|
||||||
params = {'menu_id': menu_id, 'action': action_id, 'model': 'mrp.workorder',
|
params = {'menu_id': menu_id, 'action': action_id, 'model': 'mrp.workorder',
|
||||||
'view_type': 'list', 'active_id': active_id}
|
'view_type': 'list', 'active_id': 1}
|
||||||
# 拼接查询参数
|
# 拼接查询参数
|
||||||
query_string = urlencode(params)
|
query_string = urlencode(params)
|
||||||
# 拼接URL
|
# 拼接URL
|
||||||
@@ -128,14 +127,10 @@ class SFMessageWork(models.Model):
|
|||||||
f"Planned Finish: {date_planned_finished}")
|
f"Planned Finish: {date_planned_finished}")
|
||||||
item.delivery_warning = 'warning'
|
item.delivery_warning = 'warning'
|
||||||
business_node_ids = {
|
business_node_ids = {
|
||||||
'装夹预调_overdue': self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue').id,
|
'装夹预调': self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue_warning').id,
|
||||||
'装夹预调_warning': self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue_warning').id,
|
'CNC加工': self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue_warning').id,
|
||||||
'CNC加工_overdue': self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue').id,
|
'解除装夹': self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue_warning').id,
|
||||||
'CNC加工_warning': self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue_warning').id,
|
'表面工艺': self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue_warning').id,
|
||||||
'解除装夹_overdue': self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue').id,
|
|
||||||
'解除装夹_warning': self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue_warning').id,
|
|
||||||
'表面工艺_overdue': self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue').id,
|
|
||||||
'表面工艺_warning': self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue_warning').id,
|
|
||||||
}
|
}
|
||||||
message_templates = {key: self.env["jikimo.message.template"].sudo().search([
|
message_templates = {key: self.env["jikimo.message.template"].sudo().search([
|
||||||
("model", "=", self._name),
|
("model", "=", self._name),
|
||||||
@@ -143,17 +138,13 @@ class SFMessageWork(models.Model):
|
|||||||
]) for key in business_node_ids}
|
]) for key in business_node_ids}
|
||||||
for item in orders:
|
for item in orders:
|
||||||
if item.delivery_warning in ['overdue', 'warning']:
|
if item.delivery_warning in ['overdue', 'warning']:
|
||||||
warning_type = 'warning' if item.delivery_warning == 'warning' else 'overdue'
|
bussiness_node_id = business_node_ids.get(item.routing_type)
|
||||||
key = f"{item.routing_type}_{warning_type}"
|
if bussiness_node_id and message_templates[item.routing_type]:
|
||||||
bussiness_node_id = business_node_ids.get(key, None)
|
message_queue_ids = self.env["jikimo.message.queue"].sudo().search([
|
||||||
if bussiness_node_id:
|
("message_template_id", "=", message_templates[item.routing_type].id),
|
||||||
message_template = message_templates.get(key)
|
("message_status", "=", "pending"),
|
||||||
if message_template and message_template.id:
|
("res_id", "=", item.id)
|
||||||
message_queue_ids = self.env["jikimo.message.queue"].sudo().search([
|
])
|
||||||
("message_template_id", "=", message_template.id),
|
|
||||||
("message_status", "=", "pending"),
|
|
||||||
("res_id", "=", item.id)
|
|
||||||
], limit=1)
|
|
||||||
if not message_queue_ids:
|
if not message_queue_ids:
|
||||||
overdue_message = '工单已逾期' if item.delivery_warning == 'overdue' else '工单逾期预警'
|
overdue_message = '工单已逾期' if item.delivery_warning == 'overdue' else '工单逾期预警'
|
||||||
queue_method_name = f'add_queue'
|
queue_method_name = f'add_queue'
|
||||||
@@ -165,11 +156,4 @@ class SFMessageWork(models.Model):
|
|||||||
def _recover_time_warning_func(self):
|
def _recover_time_warning_func(self):
|
||||||
workorder_done = self.env['mrp.workorder'].search([("state", "in", ["done", "rework", "cancel"])])
|
workorder_done = self.env['mrp.workorder'].search([("state", "in", ["done", "rework", "cancel"])])
|
||||||
workorder_overdue = workorder_done.filtered(lambda x: x.delivery_warning in ['overdue', 'warning'])
|
workorder_overdue = workorder_done.filtered(lambda x: x.delivery_warning in ['overdue', 'warning'])
|
||||||
if workorder_overdue:
|
workorder_overdue.write({'delivery_warning': 'normal'})
|
||||||
workorder_overdue.write({'delivery_warning': 'normal'})
|
|
||||||
message_queue_ids = self.env["jikimo.message.queue"].sudo().search([
|
|
||||||
("message_status", "=", "pending"),
|
|
||||||
("res_id", "in", [item.id for item in workorder_overdue])
|
|
||||||
])
|
|
||||||
if message_queue_ids:
|
|
||||||
message_queue_ids.write({'message_status': 'cancel'})
|
|
||||||
|
|||||||
@@ -30,36 +30,5 @@
|
|||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<record model="ir.actions.act_window" id="mrp_workorder_issued_action">
|
|
||||||
<field name="name">工单</field>
|
|
||||||
<field name="type">ir.actions.act_window</field>
|
|
||||||
<field name="res_model">mrp.workorder</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
<field name="view_ids" eval="[(5, 0, 0),
|
|
||||||
(0, 0, {'view_mode': 'tree', 'view_id': ref('mrp.mrp_production_workorder_tree_editable_view')}) ]"/>
|
|
||||||
<!-- (0, 0, {'view_mode': 'kanban', 'view_id': ref('mrp.workcenter_line_kanban')})-->
|
|
||||||
<!-- <field name="target">fullscreen</field>-->
|
|
||||||
<field name="target">current</field>
|
|
||||||
<field name="domain">[('state', '!=', 'cancel'),('schedule_state', '=', '已排')]</field>
|
|
||||||
<field name="context">{'search_default_product': 1, 'search_default_workcenter_id':
|
|
||||||
active_id,'search_default_ready': 1, 'search_default_progress': 1}
|
|
||||||
</field>
|
|
||||||
<field name="help" type="html">
|
|
||||||
<p class="o_view_nocontent_workorder">
|
|
||||||
没有工单要做!
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
工作订单是作为制造订单的一部分执行的操作。
|
|
||||||
工序在物料清单中定义或直接添加到制造订单中。
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
使用工作台工作中心控制面板直接登记车间中的操作.
|
|
||||||
平板电脑为您的工人提供工作表,并允许他们报废产品,跟踪时间,
|
|
||||||
发起维护请求,执行质量测试等.
|
|
||||||
</p>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -3166,5 +3166,5 @@ class MachiningAccuracySync(models.Model):
|
|||||||
self.env['sf.machining.accuracy'].sudo().create({
|
self.env['sf.machining.accuracy'].sudo().create({
|
||||||
"sync_id": time['id'],
|
"sync_id": time['id'],
|
||||||
"name": time['name'],
|
"name": time['name'],
|
||||||
"standard_tolerance": time['standard_tolerance'],
|
"discount": time['discount'],
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
'author': 'jikimo',
|
'author': 'jikimo',
|
||||||
'website': 'https://sf.cs.jikimo.com',
|
'website': 'https://sf.cs.jikimo.com',
|
||||||
# 此处依赖sf_manufacturing是因为我要重写其中的一个字段operation_id的string,故需要sf_manufacturing先安装
|
# 此处依赖sf_manufacturing是因为我要重写其中的一个字段operation_id的string,故需要sf_manufacturing先安装
|
||||||
'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing','jikimo_attachment_viewer'],
|
'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing'],
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'views/view.xml',
|
'views/view.xml',
|
||||||
|
|||||||
@@ -20,12 +20,6 @@ class QuickEasyOrder(models.Model):
|
|||||||
_description = '简易下单'
|
_description = '简易下单'
|
||||||
_order = 'id desc'
|
_order = 'id desc'
|
||||||
|
|
||||||
def _get_machining_precision(self):
|
|
||||||
machinings = self.env['sf.machining.accuracy'].sudo().search([])
|
|
||||||
|
|
||||||
list = [(m.sync_id, m.name) for m in machinings]
|
|
||||||
return list
|
|
||||||
|
|
||||||
name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order'))
|
name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order'))
|
||||||
model_length = fields.Float('长(mm)', digits=(16, 3))
|
model_length = fields.Float('长(mm)', digits=(16, 3))
|
||||||
model_width = fields.Float('宽(mm)', digits=(16, 3))
|
model_width = fields.Float('宽(mm)', digits=(16, 3))
|
||||||
@@ -33,7 +27,12 @@ class QuickEasyOrder(models.Model):
|
|||||||
model_volume = fields.Float('体积(mm³)', digits=(16, 3))
|
model_volume = fields.Float('体积(mm³)', digits=(16, 3))
|
||||||
model_processing_side = fields.Char('加工面', default='A')
|
model_processing_side = fields.Char('加工面', default='A')
|
||||||
model_feature = fields.Char('特征')
|
model_feature = fields.Char('特征')
|
||||||
machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度')
|
machining_precision = fields.Selection([
|
||||||
|
('0.10', '±0.10mm'),
|
||||||
|
('0.05', '±0.05mm'),
|
||||||
|
('0.03', '±0.03mm'),
|
||||||
|
('0.02', '±0.02mm'),
|
||||||
|
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
||||||
material_id = fields.Many2one('sf.production.materials', '材料', tracking=True)
|
material_id = fields.Many2one('sf.production.materials', '材料', tracking=True)
|
||||||
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]",
|
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]",
|
||||||
tracking=True)
|
tracking=True)
|
||||||
@@ -220,14 +219,7 @@ class QuickEasyOrder(models.Model):
|
|||||||
'total_amount': item.price,
|
'total_amount': item.price,
|
||||||
'remark': '',
|
'remark': '',
|
||||||
'manual_quotation': True,
|
'manual_quotation': True,
|
||||||
'barcode': barcode,
|
'barcode': barcode
|
||||||
'part_number': item.part_drawing_number,
|
|
||||||
'machining_drawings_name': '',
|
|
||||||
'quality_standard_name': '',
|
|
||||||
'machining_drawings_mimetype': '',
|
|
||||||
'quality_standard_mimetype': '',
|
|
||||||
'machining_drawings': item.machining_drawings,
|
|
||||||
'quality_standard': '',
|
|
||||||
})
|
})
|
||||||
# res['bfm_process_order_list'] = json.dumps(res['bfm_process_order_list'])
|
# res['bfm_process_order_list'] = json.dumps(res['bfm_process_order_list'])
|
||||||
product_id = self.env.ref('sf_dlm.product_template_sf').sudo()
|
product_id = self.env.ref('sf_dlm.product_template_sf').sudo()
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ class ReSaleOrder(models.Model):
|
|||||||
store=True, readonly=False, copy=False, precompute=True,
|
store=True, readonly=False, copy=False, precompute=True,
|
||||||
states=READONLY_FIELD_STATES, default=fields.Datetime.now)
|
states=READONLY_FIELD_STATES, default=fields.Datetime.now)
|
||||||
|
|
||||||
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效',
|
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效')
|
||||||
tracking=True)
|
|
||||||
|
|
||||||
# 业务平台分配工厂后在智能工厂先创建销售订单
|
# 业务平台分配工厂后在智能工厂先创建销售订单
|
||||||
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
|
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
|
||||||
@@ -118,16 +117,12 @@ class ReSaleOrder(models.Model):
|
|||||||
|
|
||||||
# 业务平台分配工厂时在创建完产品后再创建销售明细信息
|
# 业务平台分配工厂时在创建完产品后再创建销售明细信息
|
||||||
def sale_order_create_line(self, product, item):
|
def sale_order_create_line(self, product, item):
|
||||||
machining_accuracy_name = ''
|
|
||||||
if product.model_machining_precision:
|
|
||||||
machining_accuracy_name = self.env['sf.machining.accuracy'].sudo().search(
|
|
||||||
[('sync_id', '=', product.model_machining_precision)]).name
|
|
||||||
vals = {
|
vals = {
|
||||||
'order_id': self.id,
|
'order_id': self.id,
|
||||||
'product_id': product.id,
|
'product_id': product.id,
|
||||||
'name': '%s/%s/%s/%s/%s/%s' % (
|
'name': '%s/%s/%s/%s/±%s/%s' % (
|
||||||
product.model_long, product.model_width, product.model_height, product.model_volume,
|
product.model_long, product.model_width, product.model_height, product.model_volume,
|
||||||
machining_accuracy_name,
|
product.model_machining_precision,
|
||||||
product.materials_id.name),
|
product.materials_id.name),
|
||||||
'price_unit': product.list_price,
|
'price_unit': product.list_price,
|
||||||
'product_uom_qty': item['number'],
|
'product_uom_qty': item['number'],
|
||||||
|
|||||||
@@ -80,8 +80,8 @@
|
|||||||
<field name="unit_price"/>
|
<field name="unit_price"/>
|
||||||
<field name="price" options="{'format': false}"/>
|
<field name="price" options="{'format': false}"/>
|
||||||
<field name="part_drawing_number"/>
|
<field name="part_drawing_number"/>
|
||||||
<field name="machining_drawings" filename="machining_drawings_name" widget="pdf_viewer"/>
|
<!-- <field name="machining_drawings" filename="machining_drawings_name" widget="pdf_viewer"/>-->
|
||||||
<field name="machining_drawings_name" invisible="1"/>
|
<!-- <field name="machining_drawings_name" invisible="1"/>-->
|
||||||
<field name="sale_order_id"
|
<field name="sale_order_id"
|
||||||
attrs='{"invisible": [("sale_order_id","=",False)],"readonly": [("sale_order_id","!=",False)]}'/>
|
attrs='{"invisible": [("sale_order_id","=",False)],"readonly": [("sale_order_id","!=",False)]}'/>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
Reference in New Issue
Block a user