Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化

# Conflicts:
#	sf_warehouse/views/shelf_location.xml
This commit is contained in:
mgw
2024-02-20 17:37:52 +08:00
11 changed files with 114 additions and 33 deletions

View File

@@ -263,11 +263,14 @@ class ToolGroups(models.Model):
headers = Common.get_headers(obj, token, sf_secret_key) headers = Common.get_headers(obj, token, sf_secret_key)
strurl = sf_sync_config['sf_url'] + create_url strurl = sf_sync_config['sf_url'] + create_url
device_id = '' device_id = ''
for equipment_id in obj.equipment_ids: name = None
device_id = '%s,%s' % (device_id, equipment_id.name) if obj:
for equipment_id in obj.equipment_ids:
device_id = '%s,%s' % (device_id, equipment_id.name)
name = obj.name
val = { val = {
'DeviceId': device_id, 'DeviceId': device_id,
'GroupName': obj.name, 'GroupName': name,
} }
kw = json.dumps(val, ensure_ascii=False) kw = json.dumps(val, ensure_ascii=False)
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
@@ -279,7 +282,7 @@ class ToolGroups(models.Model):
# def write(self, vals): # def write(self, vals):
# obj = super().write(vals) # obj = super().write(vals)
# self._register_tool_groups(obj) # self._register_tool_groups(self)
# return obj # return obj
# #
# @api.model_create_multi # @api.model_create_multi

View File

@@ -22,6 +22,9 @@ access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_pr
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0 access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0
access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0 access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0 access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0
access_sf_production_process_parameter_group_plan_director,sf_production_process_parameter_group_plan_director,model_sf_production_process_parameter,sf_base.group_plan_director,1,0,0,0
access_sf_production_process_parameter_group_purchase_director,sf_production_process_parameter_group_purchase_director,model_sf_production_process_parameter,sf_base.group_purchase_director,1,0,0,0
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
access_sf_production_process_parameter_admin,sf_production_process_parameter_admin,model_sf_production_process_parameter,base.group_system,1,1,1,0 access_sf_production_process_parameter_admin,sf_production_process_parameter_admin,model_sf_production_process_parameter,base.group_system,1,1,1,0
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,0 access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,0
access_sf_production_process_category_admin,sf_production_process_category_admin,model_sf_production_process_category,base.group_system,1,1,1,0 access_sf_production_process_category_admin,sf_production_process_category_admin,model_sf_production_process_category,base.group_system,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
22 access_sf_supplier_sort sf_supplier_sort model_sf_supplier_sort base.group_user 1 1 1 0
23 access_sf_supplier_sort_admin sf_supplier_sort_admin model_sf_supplier_sort base.group_system 1 1 1 0
24 access_sf_production_process_parameter sf_production_process_parameter model_sf_production_process_parameter base.group_user 1 1 1 0
25 access_sf_production_process_parameter_group_plan_director sf_production_process_parameter_group_plan_director model_sf_production_process_parameter sf_base.group_plan_director 1 0 0 0
26 access_sf_production_process_parameter_group_purchase_director sf_production_process_parameter_group_purchase_director model_sf_production_process_parameter sf_base.group_purchase_director 1 0 0 0
27 access_sf_production_process_parameter_group_sale_director sf_production_process_parameter_group_sale_director model_sf_production_process_parameter sf_base.group_sale_director 1 0 0 0
28 access_sf_production_process_parameter_admin sf_production_process_parameter_admin model_sf_production_process_parameter base.group_system 1 1 1 0
29 access_sf_production_process_category sf_production_process_category model_sf_production_process_category base.group_user 1 1 1 0
30 access_sf_production_process_category_admin sf_production_process_category_admin model_sf_production_process_category base.group_system 1 1 1 0

View File

@@ -17,6 +17,7 @@
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'wizard/workpiece_delivery_views.xml', 'wizard/workpiece_delivery_views.xml',
'views/mrp_views_menus.xml', 'views/mrp_views_menus.xml',
'views/stock_lot_views.xml',
'views/mrp_production_addional_change.xml', 'views/mrp_production_addional_change.xml',
'views/mrp_routing_workcenter_view.xml', 'views/mrp_routing_workcenter_view.xml',
'views/production_line_view.xml', 'views/production_line_view.xml',

View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import base64 import base64
import qrcode
from collections import defaultdict, namedtuple from collections import defaultdict, namedtuple
import logging import logging
import json import json
@@ -12,6 +13,7 @@ from odoo.tools import float_compare
from odoo.addons.stock.models.stock_rule import ProcurementException from odoo.addons.stock.models.stock_rule import ProcurementException
from odoo.addons.sf_base.commons.common import Common from odoo.addons.sf_base.commons.common import Common
from odoo.exceptions import UserError from odoo.exceptions import UserError
from io import BytesIO
class StockRule(models.Model): class StockRule(models.Model):
@@ -264,6 +266,60 @@ class ProductionLot(models.Model):
return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1) return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1)
return "%s-%03d" % (product.name, 1) return "%s-%03d" % (product.name, 1)
qr_code_image = fields.Binary(string='二维码', compute='_generate_qr_code')
@api.depends('name')
def _generate_qr_code(self):
for record in self:
# Generate QR code
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(record.name)
qr.make(fit=True)
qr_image = qr.make_image(fill_color="black", back_color="white")
# Encode the image data in base64
image_stream = BytesIO()
qr_image.save(image_stream, format="PNG")
encoded_image = base64.b64encode(image_stream.getvalue())
record.qr_code_image = encoded_image
def print_qr_code(self):
self.ensure_one() # 确保这个方法只为一个记录调用
# if not self.lot_id:
# raise UserError("没有找到序列号。")
# 假设_lot_qr_code方法已经生成了二维码并保存在字段中
qr_code_data = self.qr_code_image
if not qr_code_data:
raise UserError("没有找到二维码数据。")
# 生成下载链接或直接触发下载
# 此处的实现依赖于你的具体需求,以下是触发下载的一种示例
attachment = self.env['ir.attachment'].sudo().create({
'datas': self.qr_code_image,
'type': 'binary',
'description': '二维码图片',
'name': self.name + '.png',
# 'res_id': invoice.id,
# 'res_model': 'stock.picking',
'public': True,
'mimetype': 'application/x-png',
# 'model_name': 'stock.picking',
})
# 返回附件的下载链接
download_url = '/web/content/%s?download=true' % attachment.id
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
return {
'type': 'ir.actions.act_url',
'url': str(base_url) + download_url,
'target': 'self',
}
class StockPicking(models.Model): class StockPicking(models.Model):
_inherit = 'stock.picking' _inherit = 'stock.picking'

View File

@@ -3,6 +3,9 @@ access_sf_cnc_processing,sf_cnc_processing,model_sf_cnc_processing,sf_base.group
access_sf_cnc_processing_manager,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_manager,1,1,1,0 access_sf_cnc_processing_manager,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_model_type,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_model_type,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_model_type_manager,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_manager,1,1,1,0 access_sf_model_type_manager,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_model_type_group_sale_director,sf_model_type_group_sale_director,model_sf_model_type,sf_base.group_sale_director,1,0,0,0
access_sf_model_type_group_purchase_director,sf_model_type_group_purchase_director,model_sf_model_type,sf_base.group_purchase_director,1,0,0,0
access_sf_model_type_group_plan_director,sf_model_type_group_plan_director,model_sf_model_type,sf_base.group_plan_director,1,0,0,0
access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_product_model_type_routing_sort_manager,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0 access_sf_product_model_type_routing_sort_manager,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
3 access_sf_cnc_processing_manager sf_cnc_processing model_sf_cnc_processing sf_base.group_sf_mrp_manager 1 1 1 0
4 access_sf_model_type sf_model_type model_sf_model_type sf_base.group_sf_mrp_user 1 0 0 0
5 access_sf_model_type_manager sf_model_type model_sf_model_type sf_base.group_sf_mrp_manager 1 1 1 0
6 access_sf_model_type_group_sale_director sf_model_type_group_sale_director model_sf_model_type sf_base.group_sale_director 1 0 0 0
7 access_sf_model_type_group_purchase_director sf_model_type_group_purchase_director model_sf_model_type sf_base.group_purchase_director 1 0 0 0
8 access_sf_model_type_group_plan_director sf_model_type_group_plan_director model_sf_model_type sf_base.group_plan_director 1 0 0 0
9 access_sf_product_model_type_routing_sort sf_product_model_type_routing_sort model_sf_product_model_type_routing_sort sf_base.group_sf_mrp_user 1 0 0 0
10 access_sf_product_model_type_routing_sort_manager sf_product_model_type_routing_sort model_sf_product_model_type_routing_sort sf_base.group_sf_mrp_manager 1 1 1 0
11 access_sf_embryo_model_type_routing_sort sf_embryo_model_type_routing_sort model_sf_embryo_model_type_routing_sort sf_base.group_sf_mrp_user 1 0 0 0

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="stock_production_lot_form_generate_qr_code" model="ir.ui.view">
<field name="name">stock.lot.form.quality</field>
<field name="model">stock.lot</field>
<field name="inherit_id" ref="stock.view_production_lot_form"/>
<field name="arch" type="xml">
<xpath expr="//form//sheet//group//group[2]" position="inside">
<field name="qr_code_image" widget="image"/>
</xpath>
<xpath expr="//sheet" position="before">
<header>
<button string="打印二维码" name="print_qr_code" type="object" class="btn-primary"/>
</header>
</xpath>
</field>
</record>
</odoo>

View File

@@ -12,7 +12,7 @@ class Manufacturing_Connect(http.Controller):
cors="*") cors="*")
def get_equipment_tool_Info(self, **kw): def get_equipment_tool_Info(self, **kw):
""" """
机床当前刀库实时信息 机床刀库实时信息
:param kw: :param kw:
:return: :return:
""" """
@@ -31,6 +31,7 @@ class Manufacturing_Connect(http.Controller):
for equipment_tool_id in item.product_template_ids: for equipment_tool_id in item.product_template_ids:
functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search( functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search(
[('code', '=', equipment_tool_id.tool_code)]) [('code', '=', equipment_tool_id.tool_code)])
alarm_time = None alarm_time = None
if functional_tool_id.functional_tool_status == '报警': if functional_tool_id.functional_tool_status == '报警':
alarm_time = self.env['sf.functional.tool.warning'].sudo().search( alarm_time = self.env['sf.functional.tool.warning'].sudo().search(

View File

@@ -956,18 +956,6 @@ class FunctionalToolAssembly(models.Model):
return functional_tool return functional_tool
return False return False
def automated_assembly(self):
"""
todo 自动组装
:return:
"""
def automatic_printing_of_QR_code(self):
"""
todo 自动打印二维码
:return:
"""
def assemble_single_print(self): def assemble_single_print(self):
""" """
todo 组装单打印 todo 组装单打印

View File

@@ -967,10 +967,10 @@
}" }"
attrs="{'invisible': [('assemble_status', '!=', '0')]}" groups="sf_base.group_sf_mrp_user" attrs="{'invisible': [('assemble_status', '!=', '0')]}" groups="sf_base.group_sf_mrp_user"
class="btn-primary"/> class="btn-primary"/>
<button string="组装单打印" name="assemble_single_print" type="object" <!-- <button string="组装单打印" name="assemble_single_print" type="object"-->
groups="sf_base.group_sf_mrp_user" <!-- groups="sf_base.group_sf_mrp_user"-->
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" <!-- attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"-->
confirm="是否确认打印组装单"/> <!-- confirm="是否确认打印组装单"/>-->
</tree> </tree>
</field> </field>
</record> </record>
@@ -1006,14 +1006,10 @@
attrs="{'invisible': [('assemble_status', '!=', '0')]}" attrs="{'invisible': [('assemble_status', '!=', '0')]}"
class="btn-primary"/> class="btn-primary"/>
<button string="打印二维码" name="automatic_printing_of_QR_code" type="object" <!-- <button string="组装单打印" name="assemble_single_print" type="object"-->
groups="sf_base.group_sf_mrp_user" <!-- groups="sf_base.group_sf_mrp_user"-->
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" <!-- attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"-->
confirm="是否确认打印二维码"/> <!-- confirm="是否确认打印组装单"/>-->
<button string="组装单打印" name="assemble_single_print" type="object"
groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"
confirm="是否确认打印组装单"/>
<field name="assemble_status" widget="statusbar" statusbar_visible="0,1"/> <field name="assemble_status" widget="statusbar" statusbar_visible="0,1"/>
</header> </header>
<sheet> <sheet>

View File

@@ -445,6 +445,21 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
if obj.after_assembly_functional_tool_length == 0: if obj.after_assembly_functional_tool_length == 0:
raise ValidationError('组装参数信息【伸出长】不能为0') raise ValidationError('组装参数信息【伸出长】不能为0')
@api.constrains('rfid')
def _check_rfid(self):
self.get_rfid()
@api.onchange('rfid')
def _onchange_rfid(self):
self.get_rfid()
def get_rfid(self):
for obj in self:
if obj.rfid:
tool_entity = self.env['sf.functional.cutting.tool.entity'].sudo().search([('rfid', '=', obj.rfid)])
if tool_entity:
raise ValidationError('%s】的rfid已被使用请重新录入' % obj.rfid)
def functional_tool_assembly(self): def functional_tool_assembly(self):
""" """
功能刀具组装 功能刀具组装

View File

@@ -116,7 +116,6 @@
<field name="model">sf.shelf.location</field> <field name="model">sf.shelf.location</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Shelf Location"> <form string="Shelf Location">
<header> <header>
<field name="location_status" invisible="1"/> <field name="location_status" invisible="1"/>
<button string="禁用货位" name="action_location_status_disable" type="object" class="oe_highlight" <button string="禁用货位" name="action_location_status_disable" type="object" class="oe_highlight"
@@ -131,15 +130,13 @@
class="oe_stat_button" class="oe_stat_button"
context="{'search_default_current_location_id': [active_id]}" context="{'search_default_current_location_id': [active_id]}"
icon="fa-exchange"> icon="fa-exchange">
<field string="当前位置历史" name="current_move_ids" widget="statinfo"/> <field string="当前位置历史" name="current_move_ids" widget="statinfo"/>
</button> </button>
<button name="%(stock_move_line_action1)d" <button name="%(stock_move_line_action1)d"
type="action" type="action"
class="oe_stat_button" class="oe_stat_button"
context="{'search_default_destination_location_id': [active_id]}" context="{'search_default_destination_location_id': [active_id]}"
icon="fa-exchange"> icon="fa-exchange">
<field string="目标位置历史" name="destination_move_ids" widget="statinfo"/> <field string="目标位置历史" name="destination_move_ids" widget="statinfo"/>
</button> </button>
</div> </div>