Files
yuthon_base/yuthon_bpd/models/bpd_lane.py
T
2026-09-22 15:09:11 +08:00

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)