货架货位对象拆分

This commit is contained in:
mgw
2024-02-20 17:35:31 +08:00
parent efdde5aef0
commit 6103bca698
4 changed files with 201 additions and 157 deletions

View File

@@ -223,9 +223,82 @@ class SfLocation(models.Model):
# return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + i_str + '-' + j_str
class SfShelf(models.Model):
_name = 'sf.shelf'
_description = '货架'
_order = 'name'
name = fields.Char('货架名称', required=True, size=20)
barcode = fields.Char('编码', copy=False, size=15, required=True)
# 货位
location_ids = fields.One2many('sf.shelf.location', 'shelf_id', string='货位')
check_state = fields.Selection([
('enable', '启用'),
('close', '关闭')
], string='审核状态', default='close')
def action_check(self):
self.check_state = 'enable'
# 绑定库区
shelf_location_id = fields.Many2one('stock.location', string='所属库区')
# 货架独有字段通道、方向、货架高度m、货架层数、层数容量
channel = fields.Char(string='通道', required=True, size=10)
direction = fields.Selection([
('R', 'R'),
('L', 'L')
], string='方向', required=True)
shelf_height = fields.Float(string='货架高度(m)')
shelf_layer = fields.Integer(string='货架层数')
layer_capacity = fields.Integer(string='层数容量')
@api.onchange('shelf_location_id')
def _onchange_shelf_location_id(self):
"""
根据货架的所属库区修改货位的所属库区
"""
if self.name:
all_location = self.env['sf.shelf.location'].search([('name', 'ilike', self.name)])
for record in self:
for location in all_location:
location.location_id = record.shelf_location_id.id
def create_location(self):
"""
当仓库类型为货架时,自动生成其下面的货位,数量为货架层数*层数容量
"""
area_obj = self.env['sf.shelf.location']
for i in range(self.shelf_layer):
for j in range(self.layer_capacity):
location_name = self.name + '-' + str(i + 1) + '' + '-' + str(j + 1) + '位置'
# 检查是否已经有同名的位置存在
existing_location = area_obj.search([('name', '=', location_name)])
if not existing_location:
area_obj.create({
'name': location_name,
'location_id': self.shelf_location_id.id,
'barcode': self.generate_barcode(i, j),
'location_status': '空闲',
'shelf_id': self.id
})
def generate_barcode(self, i, j):
"""
生成货位条码
"""
# 这里是你生成barcode的代码
# area_type_barcode = self.location_id.barcode
area_type_barcode = self.barcode
i_str = str(i + 1).zfill(3) # 确保是两位数如果不足两位左侧补0
j_str = str(j + 1).zfill(3) # 确保是两位数如果不足两位左侧补0
return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + i_str + '-' + j_str
class ShelfLocation(models.Model):
_name = 'sf.shelf.location'
_description = '架货'
_description = '货位'
_order = 'name'
# current_location_id = fields.Many2one('sf.shelf.location', string='当前位置')
@@ -245,8 +318,10 @@ class ShelfLocation(models.Model):
if record.location_status == '禁用':
record.storage_time = False
name = fields.Char('名称', required=True, size=20)
barcode = fields.Char('编码', copy=False, size=15)
name = fields.Char('货位名称', required=True, size=20)
barcode = fields.Char('货位编码', copy=False, size=15)
# 货架
shelf_id = fields.Many2one('sf.shelf', string='货架')
check_state = fields.Selection([
('enable', '启用'),
@@ -256,27 +331,18 @@ class ShelfLocation(models.Model):
def action_check(self):
self.check_state = 'enable'
# 仓库类别selection库区、库位、货位
location_type = fields.Selection([
('货架', '货架'),
('货位', '货位')
], string='存储类型')
# # 仓库类别selection库区、库位、货位
# location_type = fields.Selection([
# ('货架', '货架'),
# ('货位', '货位')
# ], string='存储类型')
# 绑定库区
shelf_location_id = fields.Many2one('stock.location', string='所属库区', domain=[('location_type', '=', '库区')])
location_id = fields.Many2one('stock.location', string='所属库区', domain=[('location_type', '=', '库区')])
# shelf_location_id = fields.Many2one('stock.location', string='所属库区', domain=[('location_type', '=', '库区')])
location_id = fields.Many2one('stock.location', string='所属库区')
# 产品类别 关联product.category
# product_type = fields.Many2many('product.category', string='产品类别')
# picking_product_type = fields.Many2many('stock.picking', string='调拨产品类别', related='location_dest_id.product_type')
# 货架独有字段通道、方向、货架高度m、货架层数、层数容量
channel = fields.Char(string='通道')
direction = fields.Selection([
('R', 'R'),
('L', 'L')
], string='方向')
shelf_height = fields.Float(string='货架高度(m)')
shelf_layer = fields.Integer(string='货架层数')
layer_capacity = fields.Integer(string='层数容量')
# 货位独有字段:货位状态、产品(关联产品对象)、产品序列号(关联产品序列号对象)
location_status = fields.Selection([
@@ -288,9 +354,6 @@ class ShelfLocation(models.Model):
product_id = fields.Many2one('product.product', string='产品', compute='_compute_product_id', readonly=True)
product_sn_id = fields.Many2one('stock.lot', string='产品序列号')
hide_shelf = fields.Boolean(compute='_compute_hide_what', string='隐藏货架')
hide_location = fields.Boolean(compute='_compute_hide_what', string='隐藏货位')
# 修改货位状态为禁用
def action_location_status_disable(self):
self.location_status = '禁用'
@@ -299,17 +362,6 @@ class ShelfLocation(models.Model):
def action_location_status_enable(self):
self.location_status = '空闲'
@api.onchange('shelf_location_id')
def _onchange_shelf_location_id(self):
"""
根据货架的所属库区修改货位的所属库区
"""
if self.name:
all_location = self.env['sf.shelf.location'].search([('name', 'ilike', self.name)])
for record in self:
for location in all_location:
location.location_id = record.shelf_location_id.id
@api.depends('product_sn_id')
def _compute_product_id(self):
"""
@@ -321,53 +373,7 @@ class ShelfLocation(models.Model):
record.sudo().location_status = '占用'
else:
record.product_id = False
# record.location_status = '空闲'
@api.depends('location_type')
def _compute_hide_what(self):
"""
根据仓库类别,隐藏不需要的字段
:return:
"""
for record in self:
record.sudo().hide_shelf = False
record.sudo().hide_location = False
if record.location_type and record.location_type == '货架':
record.sudo().hide_shelf = True
elif record.location_type and record.location_type == '货位':
record.sudo().hide_location = True
else:
pass
def create_location(self):
"""
当仓库类型为货架时,自动生成其下面的货位,数量为货架层数*层数容量
"""
if self.location_type == '货架':
for i in range(self.shelf_layer):
for j in range(self.layer_capacity):
location_name = self.name + '-' + str(i + 1) + '' + '-' + str(j + 1) + '位置'
# 检查是否已经有同名的位置存在
existing_location = self.search([('name', '=', location_name)])
if not existing_location:
self.create({
'name': location_name,
'location_id': self.shelf_location_id.id,
'location_type': '货位',
'barcode': self.generate_barcode(i, j),
'location_status': '空闲',
})
def generate_barcode(self, i, j):
"""
生成货位条码
"""
# 这里是你生成barcode的代码
# area_type_barcode = self.location_id.barcode
area_type_barcode = self.barcode
i_str = str(i + 1).zfill(3) # 确保是两位数如果不足两位左侧补0
j_str = str(j + 1).zfill(3) # 确保是两位数如果不足两位左侧补0
return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + i_str + '-' + j_str
record.location_status = '空闲'
class Sf_stock_move_line(models.Model):

View File

@@ -1,7 +1,9 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sf_shelf_location,sf.shelf.location,model_sf_shelf_location,sf_warehouse.group_sf_stock_user,1,0,0,0
access_sf_shelf_location,sf.shelf.location,model_sf_shelf_location,sf_warehouse.group_sf_stock_manager,1,1,1,0
access_sf_shelf_location_group_sf_stock_user,sf.shelf.location,model_sf_shelf_location,sf_warehouse.group_sf_stock_user,1,0,0,0
access_sf_shelf_location_group_sf_stock_manager,sf.shelf.location,model_sf_shelf_location,sf_warehouse.group_sf_stock_manager,1,1,1,0
access_sf_shelf_group_sf_stock_user,sf.shelf.group.sf.stock.user,model_sf_shelf,sf_warehouse.group_sf_stock_user,1,0,0,0
access_sf_shelf_group_sf_stock_manager,sf.shelf.group.sf.stock.manager,model_sf_shelf,sf_warehouse.group_sf_stock_manager,1,1,1,0
access_procurement_group,procurement.group,stock.model_procurement_group,base.group_user,1,1,1,0
access_stock_warehouse_manager,stock.warehouse.manager,stock.model_stock_warehouse,sf_warehouse.group_sf_stock_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sf_shelf_location access_sf_shelf_location_group_sf_stock_user sf.shelf.location model_sf_shelf_location sf_warehouse.group_sf_stock_user 1 0 0 0
3 access_sf_shelf_location access_sf_shelf_location_group_sf_stock_manager sf.shelf.location model_sf_shelf_location sf_warehouse.group_sf_stock_manager 1 1 1 0
4 access_procurement_group access_sf_shelf_group_sf_stock_user procurement.group sf.shelf.group.sf.stock.user stock.model_procurement_group model_sf_shelf base.group_user sf_warehouse.group_sf_stock_user 1 1 0 1 0 0
5 access_sf_shelf_group_sf_stock_manager sf.shelf.group.sf.stock.manager model_sf_shelf sf_warehouse.group_sf_stock_manager 1 1 1 0
6 access_procurement_group procurement.group stock.model_procurement_group base.group_user 1 1 1 0
7 access_stock_warehouse_manager stock.warehouse.manager stock.model_stock_warehouse sf_warehouse.group_sf_stock_user 1 1 1 0
8 access_stock_warehouse_user stock.warehouse.user stock.model_stock_warehouse base.group_user 1 0 0 0
9 access_stock_location_partner_manager stock.location.partner.manager stock.model_stock_location base.group_partner_manager 1 0 0 0

View File

@@ -11,7 +11,6 @@
</xpath>
<xpath expr="//field[@name='location_dest_id'][2]" position="after">
<field name="destination_location_id" domain="[
('location_type', '=', '货位'),
('location_id', '=', location_dest_id_value),
('location_status', '=', '空闲')
]"/>

View File

@@ -1,14 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 货架视图 -->
<record id="view_sf_shelf" model="ir.ui.view">
<field name="name">Sf Shelf</field>
<field name="model">sf.shelf</field>
<field name="arch" type="xml">
<form string="Sf Shelf">
<header>
<button string="生成货位" name="create_location" type="object" class="oe_highlight"/>
</header>
<sheet>
<group>
<field name="barcode" string="货架编码"/>
<field name="name" string="货架名称"/>
<field name="check_state" string="审核状态"/>
<field name="channel" string="通道"/>
<field name="shelf_location_id" string="所属库区"/>
<field name="direction" string="方向"/>
<field name="shelf_height" string="货架高度(m)"/>
<field name="shelf_layer" string="货架层数"/>
<field name="layer_capacity" string="层数容量"/>
</group>
<field name="location_ids" widget="one2many_list">
<tree string="Shelf Location">
<field name="barcode" string="编码"/>
<field name="name" string="名称"/>
</tree>
</field>
</sheet>
</form>
</field>
</record>
<record id="view_sf_shelf_tree" model="ir.ui.view">
<field name="name">Sf Shelf tree</field>
<field name="model">sf.shelf</field>
<field name="arch" type="xml">
<tree string="Sf Shelf">
<field name="barcode" string="货架编码"/>
<field name="name" string="名称"/>
<field name="shelf_location_id" string="所属库区"/>
</tree>
</field>
</record>
<!-- 货架action -->
<record id="sf_shelf_action" model="ir.actions.act_window">
<field name="name">货架</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.shelf</field>
<field name="view_mode">tree,form</field>
<!-- <field name="view_id" ref="view_sf_shelf_tree"/> -->
</record>
<!-- 货架菜单 -->
<menuitem
id="sf_shelf_menu"
name="货架"
parent="stock.menu_warehouse_config"
sequence="19"
action="sf_shelf_action"
groups="sf_warehouse.group_sf_stock_user"/>
<record id="view_shelf_location_tree" model="ir.ui.view">
<field name="name">Shelf Location tree</field>
<field name="model">sf.shelf.location</field>
<field name="arch" type="xml">
<tree string="Shelf Location">
<field name="name" string="名称"/>
<field name="barcode" string="编码"/>
<field name="location_type"/>
<field name="barcode"/>
<field name="name"/>
<field name="location_id"/>
<!-- <field name="check_state" widget="label_selection"-->
<!-- options="{'classes': {'unchecked':'warning','checked': 'success'}}"/>-->
<!-- <button name="action_check" string="审核" type="object"-->
@@ -56,20 +119,10 @@
<header>
<field name="location_status" invisible="1"/>
<button string="生成货位" name="create_location" type="object" class="oe_highlight"
attrs="{'invisible': [('hide_shelf', '=', False)]}"/>
<button string="禁用货位" name="action_location_status_disable" type="object" class="oe_highlight"
attrs="{'invisible': ['|', ('hide_shelf', '=', True), ('location_status', '!=', '空闲')]}"/>
attrs="{'invisible': [('location_status', '!=', '空闲')]}"/>
<button string="启用货位" name="action_location_status_enable" type="object" class="oe_highlight"
attrs="{'invisible': ['|', ('hide_shelf', '=', True), ('location_status', '!=', '禁用')]}"/>
<!-- <button name="%(shelf_location_kanban_action_id)d"-->
<!-- type="action"-->
<!-- class="oe_stat_button"-->
<!-- context="{'search_default_maintenance_equipment_id': [active_id]}"-->
<!-- icon="fa-wrench">-->
<!-- <field string="目标位置调拨" name="destination_move_ids" widget="statinfo"/>-->
<!-- </button>-->
attrs="{'invisible': [('location_status', '!=', '禁用')]}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
@@ -91,31 +144,13 @@
</button>
</div>
<group>
<field name="hide_shelf" invisible="1"/>
<field name="hide_location" invisible="1"/>
<field name="name" string="名称"/>
<field name="barcode" string="编码"/>
<field name="location_type"/>
<field name="shelf_location_id" attrs="{'invisible': [('location_type', '=', '货位')]}"/>
<field name="location_id"
attrs="{'readonly': [('location_type', '=', '货位')], 'invisible': [('location_type', '=', '货架')]}"/>
<field name="channel"
attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<field name="direction"
attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<field name="product_sn_id" attrs="{'invisible': [('hide_location', '=', False)]}"/>
<!-- <field name="product_type" widget="many2many_tags"/> -->
<field name="shelf_height"
attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<field name="shelf_layer"
attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<field name="layer_capacity"
attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<!-- <field name="product_id" attrs="{'invisible': [('hide_location', '=', False)], 'required': [('hide_location', '!=', False), ('location_status', '=', '占用')]}"/> -->
<field name="product_id" attrs="{'invisible': [('hide_location', '=', False)]}"/>
<!-- <field name="product_type" attrs="{'invisible': [('hide_location', '=', False)], 'required': [('hide_location', '!=', False), ('location_status', '=', '占用')]}" widget="many2many_tags"/> -->
<field name="location_status"
attrs="{'invisible': [('hide_location', '=', False)], 'required': [('hide_location', '!=', False)]}"/>
<field name="barcode"/>
<field name="name"/>
<field name="shelf_id"/>
<field name="location_id"/>
<field name="product_sn_id"/>
<field name="product_id"/>
<field name="location_status"/>
<field name="storage_time" widget="datetime"/>
</group>
</sheet>
@@ -156,16 +191,16 @@
<!-- #{record.location_status.raw_value == '空闲' ? 'kanban_color_1' : ''} -->
<!-- #{record.location_status.raw_value == '占用' ? 'kanban_color_2' : ''} -->
<!-- #{record.location_status.raw_value == '禁用' ? 'kanban_color_3' : ''}"> -->
<!-- --><!-- 看板内容 -->
<!-- 看板内容 -->
<!-- </div> -->
<!-- <div t-attf-class="oe_kanban_card"> -->
<!-- --><!-- 标题 -->
<!-- 标题 -->
<!-- <div class="o_kanban_card_header"> -->
<!-- <div class="o_kanban_card_header_title"> -->
<!-- <field name="name"/> -->
<!-- </div> -->
<!-- </div> -->
<!-- --><!-- 内容 -->
<!-- 内容 -->
<!-- <div class="o_kanban_record_bottom"> -->
<!-- <field name="location_status"/> -->
<!-- </div> -->
@@ -186,10 +221,12 @@
<field name="name">shelf.location.search</field>
<field name="model">sf.shelf.location</field>
<field name="arch" type="xml">
<search string="货架货位">
<search string="货位">
<searchpanel class="account_root">
<!-- <field name="location_type" icon="fa-filter"/> -->
<field name="location_id" select="multi" icon="fa-filter"/>
<!-- <field name="location_id" select="multi" icon="fa-filter"/> -->
<field name="location_id" string="所属库区" icon="fa-filter"/>
<field name="shelf_id" string="货架"/>
<!-- <field name="location_status" icon="fa-filter"/> -->
</searchpanel>
</search>
@@ -197,11 +234,11 @@
</record>
<record id="shelf_location_kanban_action_id" model="ir.actions.act_window">
<field name="name">架货</field>
<field name="name">货位看板</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.shelf.location</field>
<field name="view_mode">kanban,form</field>
<field name="domain">[('location_type', '=', '货位'),('check_state','=','enable')]</field>
<!-- <field name="domain">[('check_state','=','enable')]</field> -->
</record>
<!-- <record id="example_action" model="ir.actions.act_window"> -->
@@ -223,7 +260,7 @@
groups="sf_warehouse.group_sf_stock_user"/>
<record id="action_sf_shelf_location" model="ir.actions.act_window">
<field name="name">架货</field>
<field name="name">货位</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.shelf.location</field>
<field name="view_mode">tree,form</field>
@@ -246,8 +283,8 @@
<!-- sequence="50" -->
<!-- action="kanban_action_id"/> -->
<menuitem id="menu_sf_shelf_location" name="货架货位" parent="stock.menu_warehouse_config"
sequence="2"
<menuitem id="menu_sf_shelf_location" name="货位" parent="stock.menu_warehouse_config"
sequence="20"
action="action_sf_shelf_location"
groups="sf_warehouse.group_sf_stock_user"/>