Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/新增工件装夹

# Conflicts:
#	sf_maintenance/__manifest__.py
This commit is contained in:
jinling.yang
2023-07-13 16:58:49 +08:00
20 changed files with 418 additions and 108 deletions

View File

@@ -3,4 +3,3 @@ from . import sf_maintenance
from . import sf_maintenance_logs
from . import sf_equipment_maintenance_standards
from . import sf_maintenance_requests
from . import production_line_base

View File

@@ -4,6 +4,6 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.gr
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1
access_maintenance_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1
access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
4 access_maintenance_equipment maintenance_equipment model_maintenance_equipment base.group_user 1 1 1 1
5 access_maintenance_standards maintenance_standards model_maintenance_standards base.group_user 1 1 1 1
6
7
8
9

View File

@@ -20,6 +20,7 @@
'views/mrp_routing_workcenter_view.xml',
'views/mrp_workcenter_views.xml',
'views/mrp_workorder_view.xml',
'views/production_line_view.xml',
'views/tray_view.xml',
'views/model_type_view.xml',

View File

@@ -8,6 +8,7 @@ from . import mrp_maintenance
from . import mrp_routing_workcenter
from . import stock
from . import res_user
from . import production_line_base

View File

@@ -5,7 +5,7 @@ access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,mod
access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,base.group_user,1,1,1,1
access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,base.group_user,1,1,1,1
access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
5 access_sf_embryo_model_type_routing_sort sf_embryo_model_type_routing_sort model_sf_embryo_model_type_routing_sort base.group_user 1 1 1 1
6 access_sf_surface_technics_model_type_routing_sort sf_surface_technics_model_type_routing_sort model_sf_surface_technics_model_type_routing_sort base.group_user 1 1 1 1
7 access_sf_production_line sf.production.line model_sf_production_line base.group_user 1 1 1 1
8
9
10
11

View File

@@ -10,11 +10,11 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['sf_maintenance'],
'depends': ['sf_manufacturing'],
'data': [
'security/ir.model.access.csv',
# 'security/ir.model.access.csv',
'views/paln_base_view.xml',
'views/plan_base_view.xml',
'views/menu_view.xml',
],
'demo': [

View File

@@ -19,7 +19,7 @@ class ProcedureEquipmentResourceSetting(models.Model):
working_procedure = fields.Char(string='工序', readonly=True)
production_capacity = fields.Float(string='产能', required=True, digits=(4, 1))
working_calendar_id = fields.Many2one('sf.work.log.setting', string='工作日历')
working_shift = fields.Char(string='班次', readonly=True, compute='_onchange_working_calendar_id')
working_shift_id = fields.Many2many('sf.working.shift', string='班次', readonly=True, compute='_onchange_working_calendar_id')
create_time = fields.Datetime(string='新增时间', default=lambda self: fields.Datetime.now(), readonly=True)
status = fields.Selection([('正常', '正常'), ('1', '故障停机'), ('2', '计划停机')],
string='设备状态',
@@ -49,7 +49,7 @@ class ProcedureEquipmentResourceSetting(models.Model):
@api.depends('working_calendar_id')
def _onchange_working_calendar_id(self):
for record in self:
record.working_shift = record.working_calendar_id.working_shift
record.working_shift_id = record.working_calendar_id.working_shift_id

View File

@@ -1,3 +1,5 @@
from datetime import datetime, timedelta
from odoo import models, fields, api
import re
@@ -45,29 +47,21 @@ class WorkLogSetting(models.Model):
end_time_M = fields.Selection(time_M_or_S_selection(), '', required=True)
duration = fields.Char(string='时长', readonly=True, compute='_compute_duration')
day_off = fields.Char(string='休息日', required=True)
day_off_id = fields.Many2many('sf.day.off', string='休息日', required=True)
user_defined_working_shift_status = fields.Boolean(string='自定义班次', default=False)
working_shift = fields.Char(string='班次')
working_shift_char = fields.Char(string='班次', readonly=True, compute='_compute_working_shift_time')
working_shift_select = fields.Selection([('早班00:00-08:00', '早班00:00-08:00'),
('白班08:00-16:00', '白班08:00-16:00'),
('晚班16:00-24:00', '晚班16:00-24:00'),
('长白班08:00-20:00', '长白班08:00-20:00'),
('长晚班20:00-08:00', '长晚班20:00-08:00')], string='班次')
working_shift_start_time_H = fields.Selection(time_H_selection(), '班次开始时间:时',
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
working_shift_start_time_M = fields.Selection(time_M_or_S_selection(), '',
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
working_shift_end_time_H = fields.Selection(time_H_selection(), '班次结束时间:时',
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
working_shift_end_time_M = fields.Selection(time_M_or_S_selection(), '',
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
working_shift_id = fields.Many2many('sf.working.shift', string='班次')
status = fields.Boolean(string='状态', default=True)
update_person = fields.Char(string='更新人', default=lambda self: self.env.user.name)
update_time = fields.Datetime(string='更新时间', default=lambda self: fields.Datetime.now())
setting_to_calendar_ids = fields.One2many('sf.work.schedule.calendar', 'name_id', '工作日历')
# @api.model
# def create(self, vals):
# vals['setting_to_calendar_ids'] = [(4, child.id)]
# return super(WorkLogSetting, self).create(vals)
@api.depends('start_time_H', 'start_time_M')
def _compute_start_time(self):
"""
@@ -86,27 +80,7 @@ class WorkLogSetting(models.Model):
for record in self:
record.end_time = f"{record.end_time_H}:{record.end_time_M}:00"
@api.onchange('working_shift_char', 'working_shift_select')
def _onchange_working_shift(self):
"""
对班次是否手动输入是进行不同的展示
:return:
"""
for record in self:
if record.working_shift_select:
record.working_shift = record.working_shift_select
else:
record.working_shift = record.working_shift_char
@api.depends(
'working_shift_start_time_H', 'working_shift_start_time_M',
'working_shift_end_time_H', 'working_shift_end_time_M')
def _compute_working_shift_time(self):
start_time = f"{self.working_shift_start_time_H}:{self.working_shift_start_time_M}:00"
end_time = f"{self.working_shift_end_time_H}:{self.working_shift_end_time_M}:00"
self.working_shift_char = f"自定义班次{start_time}-{end_time}"
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
def _compute_duration(self):
"""
根据日开始时间和日结束时间计算每日工作时长
@@ -119,6 +93,114 @@ class WorkLogSetting(models.Model):
end_m = float(record.end_time_M)
# 日开始时间小于日结束时间
if st_h < end_h:
record.duration = str(round(end_h-st_h+(end_m-st_m)/60, 2))
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60, 2))
else:
record.duration = str(round(end_h-st_h+(end_m-st_m)/60+24, 2))
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60 + 24, 2))
@api.onchange('day_off_id')
def _onchange_day_off_id(self):
# 先删除之前创建的工作日历事件记录
# self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).unlink()
# 获取当年的一月一号的日期
year = fields.Datetime.now().year # 2023
first_day = datetime(year, 1, 1).date() # 2023-01-01
day_of_week = first_day.strftime("%A") # 星期日
# 根据day_of_week将其设置为起始0循环周一到周日按循环顺序设置为0-6
# 列:{'星期日': 0, '星期一': 1, '星期二': 2, '星期三': 3, '星期四': 4, '星期五': 5, '星期六': 6}
desc = {}
desc_weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
status = False
ints = 0
while len(desc) < 7:
if len(desc) != 0:
for week in desc_weekdays:
if len(desc) < 7:
desc.update({week: ints})
ints += 1
else:
for week in desc_weekdays:
if status:
desc.update({week: ints})
ints += 1
if day_of_week == week:
desc.update({week: ints})
status = True
ints += 1
# 创建工作日历的休息日事件
day_off_ids = self.day_off_id.mapped('name')
record = self.env['sf.work.log.setting'].search([('code', '=', self.code)])
# record.setting_to_calendar_ids.unlink()
# self.env.cr.commit()
for week in day_off_ids:
num = desc[week]
while num <= 30:
target_date = first_day + timedelta(days=num)
num += 7
self.env['sf.work.schedule.calendar'].create({'name': '休息日',
'name_id': record.id,
'calendar_code': self.code,
'date_time': target_date})
class WorkingShift(models.Model):
_name = 'sf.working.shift'
_description = '班次'
def _get_code(self):
"""
自动生成编码
:return:
"""
fixture_material = self.env['sf.working.shift'].sudo().search(
[('code', '!=', '')],
limit=1,
order="id desc")
if not fixture_material:
num = "%03d" % 1
else:
m = int(fixture_material.code) + 1
num = "%03d" % m
return num
code = fields.Char('编码', default=_get_code, readonly=True)
name = fields.Char('名称', required=True)
start_time = fields.Datetime('班次开始时间')
end_time = fields.Datetime('班次结束时间')
remark = fields.Char('备注')
class DayOff(models.Model):
_name = 'sf.day.off'
_description = '休息日'
name = fields.Selection([
('星期一', '星期一'),
('星期二', '星期二'),
('星期三', '星期三'),
('星期四', '星期四'),
('星期五', '星期五'),
('星期六', '星期六'),
('星期日', '星期日')], '休息日名称')
class WorkScheduleCalendar(models.Model):
_name = 'sf.work.schedule.calendar'
_description = '工作日历'
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机')], '日历事件名称')
date_time = fields.Date('休息时间')
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
calendar_code = fields.Char('工作日历编码')
day_off_id = fields.Many2many('sf.day.off', string='休息日')
scheduled_outage = fields.Char('计划停机')
monthly_rest_days = fields.Char('月休息天数', readonly=True)
annual_rest_days = fields.Char('年休息天数', readonly=True)
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)

View File

@@ -2,6 +2,10 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sf_work_log_setting,sf.work.log.setting,model_sf_work_log_setting,base.group_user,1,1,1,1
access_sf_procedure_equipment_resource_setting,sf.procedure.equipment.resource.setting,model_sf_procedure_equipment_resource_setting,base.group_user,1,1,1,1
access_sf_day_off,sf.day.off,model_sf_day_off,base.group_user,1,1,1,1
access_sf_working_shift,sf.working.shift,model_sf_working_shift,base.group_user,1,1,1,1
access_sf_work_schedule_calendar,sf.work.schedule.calendar,model_sf_work_schedule_calendar,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sf_work_log_setting sf.work.log.setting model_sf_work_log_setting base.group_user 1 1 1 1
3 access_sf_procedure_equipment_resource_setting sf.procedure.equipment.resource.setting model_sf_procedure_equipment_resource_setting base.group_user 1 1 1 1
4 access_sf_day_off sf.day.off model_sf_day_off base.group_user 1 1 1 1
5 access_sf_working_shift sf.working.shift model_sf_working_shift base.group_user 1 1 1 1
6 access_sf_work_schedule_calendar sf.work.schedule.calendar model_sf_work_schedule_calendar base.group_user 1 1 1 1
7
8
9
10
11

View File

@@ -25,4 +25,25 @@
action="sf_procedure_equipment_resource_setting_act"
sequence="10"
/>
<menuitem id="menu_sf_working_shift"
name="班次"
parent="menu_sf_basic_setting"
action="sf_working_shift_act"
sequence="12"
/>
<menuitem id="menu_sf_day_off"
name="休息日"
parent="menu_sf_basic_setting"
action="sf_day_off_act"
sequence="15"
/>
<menuitem id="menu_sf_work_schedule_calendar"
name="工作日历"
parent="menu_sf_basic_setting"
action="sf_work_schedule_calendar_act"
sequence="15"
/>
</odoo>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--========================================工作日历设置========================================-->
<!--================================================工作日历设置================================================-->
<record id="sf_work_log_setting_tree" model="ir.ui.view">
<field name="name">工作日历设置</field>
<field name="model">sf.work.log.setting</field>
@@ -11,11 +11,12 @@
<field name="start_time"/>
<field name="end_time"/>
<field name="duration"/>
<field name="day_off"/>
<field name="working_shift"/>
<field name="day_off_id" widget="many2many_tags"/>
<field name="working_shift_id" widget="many2many_tags"/>
<field name="status"/>
<field name="update_person"/>
<field name="update_time"/>
<!-- <button string="查看日历" type="object" name="sf_work_schedule_calendar_act"/>-->
</tree>
</field>
</record>
@@ -35,29 +36,7 @@
</group>
</group>
<group string="选择班次">
<group>
<group>
<field name="working_shift_char" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
<field name="working_shift_select" attrs="{'invisible': [('user_defined_working_shift_status', '!=', False)]}"/>
</group>
<group>
<field name="user_defined_working_shift_status"/>
<field name="working_shift" invisible="True"/>
</group>
</group>
</group>
<group>
<group>
<group>
<field name="working_shift_start_time_H" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
<field name="working_shift_end_time_H" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
</group>
<group>
<field name="working_shift_start_time_M" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
<field name="working_shift_end_time_M" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
</group>
</group>
<field name="working_shift_id"/>
</group>
<group string="工作时间">
<group>
@@ -80,13 +59,14 @@
<group>
<group>
<field name="duration"/>
</group>
<group>
<field name="day_off"/>
<field name="day_off_id"
widget="many2many_tags"
options="{'no_create': True, 'no_quick_create': True}"/>
</group>
</group>
<group string="日历状态">
<field name="status"/>
<field name="setting_to_calendar_ids"/>
</group>
</sheet>
</form>
@@ -100,7 +80,138 @@
</record>
<!--========================================产线设备资源设置========================================-->
<!--================================================休息日================================================-->
<record id="sf_day_off_tree" model="ir.ui.view">
<field name="name">休息日</field>
<field name="model">sf.day.off</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
<record id="sf_day_off_act" model="ir.actions.act_window">
<field name="name">休息日</field>
<field name="res_model">sf.day.off</field>
<field name="view_mode">tree,form</field>
</record>
<!--================================================班次================================================-->
<record id="sf_working_shift_tree" model="ir.ui.view">
<field name="name">班次</field>
<field name="model">sf.working.shift</field>
<field name="arch" type="xml">
<tree>
<field name="code"/>
<field name="name"/>
<field name="start_time"/>
<field name="end_time"/>
<field name="remark"/>
</tree>
</field>
</record>
<record id="sf_working_shift_form" model="ir.ui.view">
<field name="name">班次</field>
<field name="model">sf.working.shift</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="start_time"/>
<field name="end_time"/>
<field name="remark"/>
</group>
<group>
<field name="code"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="sf_working_shift_act" model="ir.actions.act_window">
<field name="name">班次</field>
<field name="res_model">sf.working.shift</field>
<field name="view_mode">tree,form</field>
</record>
<!--================================================工作日历================================================-->
<record id="sf_work_schedule_calendar_tree" model="ir.ui.view">
<field name="name">工作日历</field>
<field name="model">sf.work.schedule.calendar</field>
<field name="arch" type="xml">
<tree>
<field name="name_id" invisible="True"/>
<field name="name"/>
<field name="date_time"/>
</tree>
</field>
</record>
<record id="sf_work_schedule_calendar_form" model="ir.ui.view">
<field name="name">工作日历</field>
<field name="model">sf.work.schedule.calendar</field>
<field name="arch" type="xml">
<form>
<sheet>
<group string="日历基本信息">
<group>
<field name="name"/>
<field name="date_time"/>
</group>
<group>
<field name="name_id"/>
<field name="calendar_code"/>
</group>
</group>
<group string="其他">
<field name="monthly_rest_days"/>
<field name="annual_rest_days"/>
<field name="monthly_planned_downtime"/>
<field name="annual_planned_downtime"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="sf_work_schedule_calendar_search" model="ir.ui.view">
<field name="name">工作日历</field>
<field name="model">sf.work.schedule.calendar</field>
<field name="arch" type="xml">
<search>
<searchpanel>
<field name="name_id" icon="fa-building" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
<record id="sf_work_schedule_calendar_calendar" model="ir.ui.view">
<field name="name">工作日历</field>
<field name="model">sf.work.schedule.calendar</field>
<field name="arch" type="xml">
<calendar string="工作日历" mode="year" date_start="date_time">
<field name="name"/>
</calendar>
</field>
</record>
<record id="sf_work_schedule_calendar_act" model="ir.actions.act_window">
<field name="name">工作日历</field>
<field name="res_model">sf.work.schedule.calendar</field>
<field name="view_mode">calendar,search,tree,form</field>
</record>
<!--================================================产线设备资源设置================================================-->
<record id="sf_procedure_equipment_resource_setting_tree" model="ir.ui.view">
<field name="name">产线设备资源设置</field>
<field name="model">sf.procedure.equipment.resource.setting</field>
@@ -114,7 +225,7 @@
<field name="working_procedure"/>
<field name="production_capacity"/>
<field name="working_calendar_id"/>
<field name="working_shift"/>
<field name="working_shift_id" widget="many2many_tags"/>
<field name="create_time"/>
<field name="status"/>
<field name="participate_in_scheduling"/>
@@ -161,7 +272,7 @@
<field name="create_time"/>
</group>
<group>
<field name="working_shift"/>
<field name="working_shift_id" widget="many2many_tags"/>
</group>
</group>
</sheet>
@@ -182,7 +293,7 @@
<field name="working_procedure"/>
<field name="production_capacity"/>
<field name="working_calendar_id"/>
<field name="working_shift"/>
<field name="working_shift_id"/>
<field name="create_time"/>
<field name="status"/>
<field name="participate_in_scheduling"/>

View File

@@ -23,7 +23,11 @@
'web.assets_qweb': [
],
'web.assets_backend':[
'sf_warehouse/static/src/kanban_color_change.scss'
# 'sf_warehouse/static/src/js/vanilla-masker.min.js',
'sf_warehouse/static/src/css/kanban_color_change.scss',
'sf_warehouse/static/src/js/custom_kanban_controller.js',
'sf_warehouse/static/src/xml/custom_kanban_controller.xml',
]

View File

@@ -10,22 +10,12 @@ class SfLocation(models.Model):
name = fields.Char('Location Name', required=True, size=20)
barcode = fields.Char('Barcode', copy=False, required=True, size=15)
# 仓库类别selection仓库、库区、库位、货位)
# 仓库类别selection库区、库位、货位
location_type = fields.Selection([
('仓库', '仓库'),
('库区', '库区'),
('货架', '货架'),
('货位', '货位')
], string='仓库类别')
# 仓库类型(分类:成品库、坯料库、原材料库、刀具库、线边料库、线边刀库)
location_category = fields.Selection([
('成品库', '成品库'),
('坯料库', '坯料库'),
('原材料库', '原材料库'),
('刀具库', '刀具库'),
('线边料库', '线边料库'),
('线边刀库', '线边刀库')
], string='仓库类型')
# 库区类型selection拣货区、存货区、收货区、退货区、次品区
area_type = fields.Selection([
('拣货区', '拣货区'),
@@ -34,6 +24,13 @@ class SfLocation(models.Model):
('退货区', '退货区'),
('次品区', '次品区')
], string='库区类型')
# 存储类型selection库区、货架
storage_type = fields.Selection([
('库区', '库区'),
('货架', '货架')
], string='存储类型')
# 产品类别 关联product.category
product_type = fields.Many2many('product.category', string='产品类别')
# 货架独有字段通道、方向、货架高度m、货架层数、层数容量
channel = fields.Char(string='通道', required=True)
direction = fields.Selection([
@@ -64,6 +61,27 @@ class SfLocation(models.Model):
hide_shelf = fields.Boolean(compute='_compute_hide_what', string='隐藏货架')
hide_location = fields.Boolean(compute='_compute_hide_what', string='隐藏货位')
@api.model
def create(self, vals):
"""
重写create方法添加自定义的约束
"""
print('create', vals)
if vals.get('location_id'):
location = self.env['stock.location'].browse(vals.get('location_id'))
if location.storage_type == '库区':
raise UserError('库区不能作为父级仓库')
return super().create(vals)
@api.onchange('location_id')
def _onchange_location_id(self):
"""
重写onchange方法添加自定义的约束
"""
if self.location_id:
if self.location_id.storage_type == '库区':
raise UserError('库区不能作为父级仓库')
# @api.constrains('shelf_height')
# def _check_shelf_height(self):
# for record in self:
@@ -84,6 +102,9 @@ class SfLocation(models.Model):
@api.depends('product_sn_id')
def _compute_product_id(self):
"""
根据产品序列号,获取产品
"""
for record in self:
if record.product_sn_id:
record.product_id = record.product_sn_id.product_id
@@ -153,6 +174,9 @@ class SfLocation(models.Model):
# 生成货位
def create_location(self):
"""
当仓库类型为货架时,自动生成其下面的货位,数量为货架层数*层数容量
"""
if self.location_type == '货架':
for i in range(self.shelf_layer):
for j in range(self.layer_capacity):
@@ -165,8 +189,12 @@ class SfLocation(models.Model):
})
def generate_barcode(self, i, j):
"""
生成货位条码
"""
# 这里是你生成barcode的代码
area_type_barcode = self.location_id.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

View File

@@ -0,0 +1,25 @@
.oe_kanban_card.kanban_color_1 {
background-color: #73b9a2 !important;
}
.oe_kanban_card.kanban_color_2 {
background-color: #ac6767 !important;
}
.oe_kanban_card.kanban_color_3 {
background-color: #77787b !important;
}
.color-guide {
border: 1px solid #ccc;
background-color: #f9f9f9;
padding: 10px;
}
.color-guide-item {
display: inline-block;
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
}

View File

@@ -0,0 +1,21 @@
/** @odoo-module */
import { KanbanController } from "@web/views/kanban/kanban_controller";
import { kanbanView } from "@web/views/kanban/kanban_view";
import { registry } from "@web/core/registry";
// the controller usually contains the Layout and the renderer.
class CustomKanbanController extends KanbanController {
// Your logic here, override or insert new methods...
// if you override setup(), don't forget to call super.setup()
}
CustomKanbanController.template = "sf_warehouse.CustomKanbanView";
export const customKanbanView = {
...kanbanView, // contains the default Renderer/Controller/Model
Controller: CustomKanbanController,
};
// Register it to the views registry
registry.category("views").add("custom_kanban", customKanbanView);

View File

@@ -1,11 +0,0 @@
.oe_kanban_card.kanban_color_1 {
background-color: red !important;
}
.oe_kanban_card.kanban_color_2 {
background-color: blue !important;
}
.oe_kanban_card.kanban_color_3 {
background-color: green !important;
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
<t t-name="sf_warehouse.CustomKanbanView" t-inherit="web.KanbanView" owl="1">
<!-- <xpath expr="//Layout" position="before"> -->
<!-- <div> -->
<!-- Hello world ! -->
<!-- </div> -->
<!-- </xpath> -->
<xpath expr="//t[@t-component='props.Renderer']" position="before">
<div>
Hello world !
</div>
</xpath>
</t>
</templates>

View File

@@ -30,11 +30,13 @@
<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)], 'required': [('hide_location', '!=', False), ('location_status', '=', '空闲')]}"/>
<field name="area_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
</group>
<group>
<field name="location_category" attrs="{'invisible': [('hide_location_type', '=', False)], 'required': [('hide_location_type', '!=', False)]}"/>
<field name="area_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
<field name="storage_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
<field name="product_type" widget="many2many_tags" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
<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)]}"/>
@@ -53,7 +55,13 @@
<button string="生成货位" name="create_location" type="object" class="oe_highlight" attrs="{'invisible': [('hide_shelf', '=', False)]}"/>
</header>
</xpath>
<xpath expr="//form/sheet/group[last()]">
<notebook position="after" attrs="{'invisible': [('hide_area', '=', False)]}">
<page string="库存信息">
<field name="quant_ids" widget="one2many_list" context="{'location': active_id}"/>
</page>
</notebook>
</xpath>
</field>
</record>
@@ -74,7 +82,7 @@
<field name="name">example.kanban</field>
<field name="model">stock.location</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<kanban class="o_kanban_mobile" js_class="custom_kanban">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click