Accept Merge Request #180: (feature/优化代码结构 -> develop)

Merge Request: 修复进度反馈问题与时区问题,优化界面问题(下发记录等只显示在cnc加工工单处)与opcua超时时长

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/180?initial=true
This commit is contained in:
马广威
2023-05-23 10:46:37 +08:00
9 changed files with 188 additions and 73 deletions

View File

@@ -15,99 +15,148 @@ class StatusChange(models.Model):
default_code = fields.Char(string='内部编码') default_code = fields.Char(string='内部编码')
def action_confirm(self): def action_confirm(self):
# 在原有方法执行前记录日志和执行其他操作
logging.info('函数已经执行=============') logging.info('函数已经执行=============')
if self._get_forbidden_state_confirm() & set(self.mapped('state')):
raise UserError(_(
"It is not allowed to confirm an order in the following states: %s",
", ".join(self._get_forbidden_state_confirm()),
))
logging.info('函数已经执行=============1')
for order in self:
if order.partner_id in order.message_partner_ids:
logging.info('函数已经执行=============2')
continue
order.message_subscribe([order.partner_id.id])
logging.info('函数已经执行=============3')
self.write(self._prepare_confirmation_values())
# Context key 'default_name' is sometimes propagated up to here. # 使用super()来调用原始方法(在本例中为'sale.order'模型的'action_confirm'方法)
# We don't need it and it creates issues in the creation of linked records. res = super(StatusChange, self).action_confirm()
context = self._context.copy()
context.pop('default_name', None) # 原有方法执行后进行额外的操作如调用外部API
logging.info('函数已经执行=============4')
self.with_context(context)._action_confirm()
if self.env.user.has_group('sale.group_auto_done_setting'):
logging.info('函数已经执行=============5')
self.action_done()
process_start_time = str(datetime.now()) process_start_time = str(datetime.now())
config = self.env['res.config.settings'].get_values()
json1 = { json1 = {
'params': { 'params': {
'model_name': 'jikimo.process.order', 'model_name': 'jikimo.process.order',
'field_name': 'name', 'field_name': 'name',
# 'default_code': 'PO-2022-1214-0022',
'default_code': self.default_code, 'default_code': self.default_code,
# 'default_code': self.name,
'state': '加工中', 'state': '加工中',
'process_start_time': process_start_time, 'process_start_time': process_start_time,
}, },
} }
url1 = 'https://bfm.cs.jikimo.com/api/get/state/get_order' url1 = config['bfm_url'] + '/api/get/state/get_order'
requests.post(url1, json=json1, data=None) requests.post(url1, json=json1, data=None)
logging.info('接口已经执行=============') logging.info('接口已经执行=============')
return True return res
def action_cancel(self): def action_cancel(self):
""" Cancel SO after showing the cancel wizard when needed. (cfr `_show_cancel_wizard`) # 在原有方法执行前记录日志和执行其他操作
For post-cancel operations, please only override `_action_cancel`.
note: self.ensure_one() if the wizard is shown.
"""
logging.info('函数已经执行=============') logging.info('函数已经执行=============')
cancel_warning = self._show_cancel_wizard()
# 使用super()来调用原始方法(在本例中为'sale.order'模型的'action_cancel'方法)
res = super(StatusChange, self).action_cancel()
# 原有方法执行后进行额外的操作如调用外部API
logging.info('函数已经执行=============2') logging.info('函数已经执行=============2')
config = self.env['res.config.settings'].get_values()
json1 = { json1 = {
'params': { 'params': {
'model_name': 'jikimo.process.order', 'model_name': 'jikimo.process.order',
'field_name': 'name', 'field_name': 'name',
'default_code': self.default_code, 'default_code': self.default_code,
# 'default_code': self.name,
'state': '待派单', 'state': '待派单',
}, },
} }
url1 = 'https://bfm.cs.jikimo.com/api/get/state/cancel_order' url1 = config['bfm_url'] + '/api/get/state/cancel_order'
requests.post(url1, json=json1, data=None) requests.post(url1, json=json1, data=None)
if cancel_warning:
logging.info('函数已经执行=============3') return res
self.ensure_one()
logging.info('函数已经执行=============4') # def action_confirm(self):
template_id = self.env['ir.model.data']._xmlid_to_res_id( # logging.info('函数已经执行=============')
'sale.mail_template_sale_cancellation', raise_if_not_found=False # if self._get_forbidden_state_confirm() & set(self.mapped('state')):
) # raise UserError(_(
lang = self.env.context.get('lang') # "It is not allowed to confirm an order in the following states: %s",
template = self.env['mail.template'].browse(template_id) # ", ".join(self._get_forbidden_state_confirm()),
if template.lang: # ))
lang = template._render_lang(self.ids)[self.id] # logging.info('函数已经执行=============1')
ctx = { # for order in self:
'default_use_template': bool(template_id), # if order.partner_id in order.message_partner_ids:
'default_template_id': template_id, # logging.info('函数已经执行=============2')
'default_order_id': self.id, # continue
'mark_so_as_canceled': True, # order.message_subscribe([order.partner_id.id])
'default_email_layout_xmlid': "mail.mail_notification_layout_with_responsible_signature", # logging.info('函数已经执行=============3')
'model_description': self.with_context(lang=lang).type_name, # self.write(self._prepare_confirmation_values())
} #
return { # # Context key 'default_name' is sometimes propagated up to here.
'name': _('Cancel %s', self.type_name), # # We don't need it and it creates issues in the creation of linked records.
'view_mode': 'form', # context = self._context.copy()
'res_model': 'sale.order.cancel', # context.pop('default_name', None)
'view_id': self.env.ref('sale.sale_order_cancel_view_form').id, # logging.info('函数已经执行=============4')
'type': 'ir.actions.act_window', # self.with_context(context)._action_confirm()
'context': ctx, # if self.env.user.has_group('sale.group_auto_done_setting'):
'target': 'new' # logging.info('函数已经执行=============5')
} # self.action_done()
else: # process_start_time = str(datetime.now())
return self._action_cancel() # json1 = {
# 'params': {
# 'model_name': 'jikimo.process.order',
# 'field_name': 'name',
# # 'default_code': 'PO-2022-1214-0022',
# 'default_code': self.default_code,
# # 'default_code': self.name,
# 'state': '加工中',
# 'process_start_time': process_start_time,
# },
# }
# url1 = 'https://bfm.cs.jikimo.com/api/get/state/get_order'
# requests.post(url1, json=json1, data=None)
# logging.info('接口已经执行=============')
#
# return True
# def action_cancel(self):
# """ Cancel SO after showing the cancel wizard when needed. (cfr `_show_cancel_wizard`)
#
# For post-cancel operations, please only override `_action_cancel`.
#
# note: self.ensure_one() if the wizard is shown.
# """
# logging.info('函数已经执行=============')
# cancel_warning = self._show_cancel_wizard()
# logging.info('函数已经执行=============2')
# json1 = {
# 'params': {
# 'model_name': 'jikimo.process.order',
# 'field_name': 'name',
# 'default_code': self.default_code,
# # 'default_code': self.name,
# 'state': '待派单',
# },
# }
# url1 = 'https://bfm.cs.jikimo.com/api/get/state/cancel_order'
# requests.post(url1, json=json1, data=None)
# if cancel_warning:
# logging.info('函数已经执行=============3')
# self.ensure_one()
# logging.info('函数已经执行=============4')
# template_id = self.env['ir.model.data']._xmlid_to_res_id(
# 'sale.mail_template_sale_cancellation', raise_if_not_found=False
# )
# lang = self.env.context.get('lang')
# template = self.env['mail.template'].browse(template_id)
# if template.lang:
# lang = template._render_lang(self.ids)[self.id]
# ctx = {
# 'default_use_template': bool(template_id),
# 'default_template_id': template_id,
# 'default_order_id': self.id,
# 'mark_so_as_canceled': True,
# 'default_email_layout_xmlid': "mail.mail_notification_layout_with_responsible_signature",
# 'model_description': self.with_context(lang=lang).type_name,
# }
# return {
# 'name': _('Cancel %s', self.type_name),
# 'view_mode': 'form',
# 'res_model': 'sale.order.cancel',
# 'view_id': self.env.ref('sale.sale_order_cancel_view_form').id,
# 'type': 'ir.actions.act_window',
# 'context': ctx,
# 'target': 'new'
# }
# else:
# return self._action_cancel()
class FinishStatusChange(models.Model): class FinishStatusChange(models.Model):

View File

@@ -29,6 +29,7 @@
'views/machine_monitor.xml', 'views/machine_monitor.xml',
'views/machine_info_present.xml', 'views/machine_info_present.xml',
'views/delivery_record.xml', 'views/delivery_record.xml',
'views/res_config_settings_views.xml',
], ],
'assets': { 'assets': {

View File

@@ -1,3 +1,4 @@
from . import ftp_client from . import ftp_client
from . import ftp_operate from . import ftp_operate
from . import py2opcua from . import py2opcua
from . import res_config_setting

View File

@@ -6,7 +6,7 @@ import json
import hashlib import hashlib
import time import time
import requests import requests
from datetime import datetime from datetime import datetime, timedelta
from odoo.http import request from odoo.http import request
from odoo import fields, models, api, _ from odoo import fields, models, api, _
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
@@ -79,7 +79,7 @@ class FtpButton(models.Model):
_logger.info("======%s下发成功======" % a.display_name) _logger.info("======%s下发成功======" % a.display_name)
ftp.close_ftp() ftp.close_ftp()
up_time = str(datetime.now()) up_time = str(datetime.now() + timedelta(hours=8))
self.env['delivery.record'].create({ self.env['delivery.record'].create({
'workorder_id': self.workorder_id.id, 'workorder_id': self.workorder_id.id,
'delivery_type': '单个下发', 'delivery_type': '单个下发',
@@ -364,7 +364,7 @@ class WorkCenterBarcode(models.Model):
item.button_state = True item.button_state = True
ftp.close_ftp() ftp.close_ftp()
# 增加一键下发记录 # 增加一键下发记录
up_time = str(datetime.now()) up_time = str(datetime.now() + timedelta(hours=8))
sequence_str = ','.join(sequence_collect) sequence_str = ','.join(sequence_collect)
self.delivery_records.create({ self.delivery_records.create({
'delivery_type': '一键下发', 'delivery_type': '一键下发',
@@ -451,7 +451,7 @@ class WorkCenterBarcode(models.Model):
_logger.info("======%s一键合并下发成功======" % a.display_name) _logger.info("======%s一键合并下发成功======" % a.display_name)
ftp.close_ftp() ftp.close_ftp()
# 增加一键合并下发记录 # 增加一键合并下发记录
up_time = str(datetime.now()) up_time = str(datetime.now() + timedelta(hours=8))
sequence_str = ','.join(sequence_collect) sequence_str = ','.join(sequence_collect)
self.delivery_records.create({ self.delivery_records.create({
'delivery_type': '一键合并下发', 'delivery_type': '一键合并下发',

View File

@@ -7,7 +7,7 @@ class Py2opcua:
""" """
def __init__(self, url='opc.tcp://192.168.2.99:4840'): def __init__(self, url='opc.tcp://192.168.2.99:4840'):
self.client = Client(url) self.client = Client(url, timeout=3600000)
# 连接客户端 # 连接客户端
# def connect(self): # def connect(self):

View File

@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
import logging
from odoo import api, fields, models, _
_logger = logging.getLogger(__name__)
class ResBFMConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
bfm_url = fields.Selection(
[("https://bfm.cs.jikimo.com", "开发环境(https://bfm.cs.jikimo.com)"),
("https://bfm.r.jikimo.com", "测试环境(https://bfm.r.jikimo.com)"),
# ("正式环境", "https://bfm.jikimo.com")], string='bfm环境', store=True)
("https://bfm.jikimo.com", "正式环境(https://bfm.jikimo.com)")], string='bfm环境', store=True)
@api.model
def get_values(self):
"""
重载获取参数的方法,参数都存在系统参数中
:return:
"""
values = super(ResBFMConfigSettings, self).get_values()
config = self.env['ir.config_parameter'].sudo()
bfm_url = config.get_param('bfm_url', default='')
values.update(
bfm_url=bfm_url,
)
return values
def set_values(self):
super(ResBFMConfigSettings, self).set_values()
ir_config = self.env['ir.config_parameter'].sudo()
ir_config.set_param("bfm_url", self.bfm_url or "")

View File

@@ -13,7 +13,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//group//field[@name='processing_panel']" position="after"> <xpath expr="//group//field[@name='processing_panel']" position="after">
<!-- invisible="1" --> <!-- invisible="1" -->
<field name="_barcode_scanned" widget="barcode_handler" string="扫码"/> <field name="_barcode_scanned" widget="barcode_handler" string="扫码" attrs='{"invisible": [("routing_type","!=","装夹")]}'/>
</xpath> </xpath>
<xpath expr="//page//field[@name='tray_code']" position="replace"> <xpath expr="//page//field[@name='tray_code']" position="replace">
<field name="tray_code" widget="code"/> <field name="tray_code" widget="code"/>

View File

@@ -7,7 +7,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//page[last()-3]" position="before"> <xpath expr="//page[last()-3]" position="before">
<!-- <page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>--> <!-- <page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>-->
<page string="下发记录"> <page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<field name="delivery_records"> <field name="delivery_records">
<tree create="false"> <tree create="false">
<field name="delivery_type"/> <field name="delivery_type"/>
@@ -17,7 +17,6 @@
</field> </field>
</page> </page>
</xpath> </xpath>
</field> </field>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="res_config_settings_jd_view_form_inherit" model="ir.ui.view">
<field name="name">res.config.settings.jd.view.form.inherit.bpm</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('app_settings_block')]/div" position="before">
<div>
<h2>bfm环境配置</h2>
<div class="row mt16 o_settings_container" id="jd_api">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<div class="text-muted">
<label for="bfm_url"/>
<field name="bfm_url"/>
</div>
</div>
<!-- </div> -->
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>