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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
|
@@ -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',
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
|
18
sf_manufacturing/views/stock_lot_views.xml
Normal file
18
sf_manufacturing/views/stock_lot_views.xml
Normal 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>
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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 组装单打印
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
功能刀具组装
|
功能刀具组装
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user