47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import fields, models
|
|
|
|
|
|
class BpdLane(models.Model):
|
|
"""流程图泳道 / 分组框。
|
|
|
|
泳道就是画布上的一个矩形,坐标用画布逻辑单位(默认 1560 x 980)。
|
|
这样参考图那种"手工排版的泳道图"可以被完整表达,而不必受自动布局约束。
|
|
"""
|
|
_name = 'yuthon.bpd.lane'
|
|
_description = '流程图泳道'
|
|
_order = 'sequence, id'
|
|
_rec_name = 'name'
|
|
|
|
diagram_id = fields.Many2one(
|
|
'yuthon.bpd.diagram', string='流程图', required=True,
|
|
ondelete='cascade', index=True,
|
|
)
|
|
name = fields.Char(string='名称', required=True)
|
|
kind = fields.Selection(
|
|
[('column', '纵向泳道'), ('band', '横向泳道'), ('group', '分组框')],
|
|
string='类型', default='column', required=True,
|
|
help='纵向泳道 = 一列(如销售管理);横向泳道 = 一条横带(如仓库管理、财务管理)',
|
|
)
|
|
x = fields.Integer(string='X', default=0, help='矩形左上角 X(画布逻辑单位)')
|
|
y = fields.Integer(string='Y', default=0, help='矩形左上角 Y(画布逻辑单位)')
|
|
w = fields.Integer(string='宽', default=300)
|
|
h = fields.Integer(string='高', default=600)
|
|
head_h = fields.Integer(
|
|
string='标题高', default=34,
|
|
help='仅纵向泳道使用:顶部标题框的高度;横向泳道标题直接写在带子里',
|
|
)
|
|
label_pos = fields.Selection(
|
|
[('top-center', '顶部居中'), ('bottom-center', '底部居中'), ('left', '左侧')],
|
|
string='标题位置', default='top-center',
|
|
)
|
|
sequence = fields.Integer(default=10)
|
|
note = fields.Char(string='备注')
|
|
|
|
node_ids = fields.One2many('yuthon.bpd.node', 'lane_id', string='节点')
|
|
node_count = fields.Integer(string='节点数', compute='_compute_node_count')
|
|
|
|
def _compute_node_count(self):
|
|
for lane in self:
|
|
lane.node_count = len(lane.node_ids)
|