factory/apps/opm/models.py

150 lines
7.7 KiB
Python

from django.db import models
from apps.hrm.models import Certificate
from apps.system.models import Dept, Dictionary, File, User
from apps.utils.models import BaseModel, CommonADModel, CommonAModel, CommonBDModel, CommonBModel
from apps.am.models import Area
from apps.wf.models import Ticket, Workflow
# Create your models here.
class OplCate(CommonAModel):
"""
作业许可种类
"""
code = models.CharField('标识', max_length=10, unique=True)
name = models.CharField('名称', max_length=20, unique=True)
description = models.TextField('描述', null=True, blank=True)
workflow = models.ForeignKey(Workflow, verbose_name='使用的工作流')
template_export = models.TextField('导出word模板', null=True, blank=True)
risk_options = models.ManyToManyField(Dictionary, verbose_name='风险分析')
measure_options = models.ManyToManyField(Dictionary, verbose_name='控制措施')
close_options = models.ManyToManyField(Dictionary, verbose_name='关闭工作')
class Operation(CommonBDModel):
OP_CREATE = 10
OP_AUDIT = 20
OP_WAIT = 30
OP_WORK = 40
OP_CLOSE = 50
OP_STATE_CHOICES = (
(OP_CREATE, '创建中'),
(OP_AUDIT, '审批中'),
(OP_WAIT, '待作业'),
(OP_WORK, '作业中'),
(OP_CLOSE, '已关闭')
)
number = models.CharField('作业编号', max_length=20, null=True, blank=True)
name = models.CharField('作业简述', max_length=200)
area = models.ForeignKey(Area, verbose_name='作业区域',
on_delete=models.CASCADE)
place = models.TextField('具体地点', null=True, blank=True)
start_time = models.DateTimeField('作业开始时间')
end_time = models.DateTimeField('作业结束时间')
dept_ter = models.ForeignKey(Dept, verbose_name='属地部门',
on_delete=models.CASCADE)
dept_bus = models.ForeignKey(Dept, verbose_name='业务部门',
on_delete=models.CASCADE)
coordinator = models.ForeignKey(User, verbose_name='业务部门协调员',
on_delete=models.CASCADE)
state_work = models.CharField('生产状态', max_length=20, help_text='运行/停机/检修')
class Opl(CommonBDModel):
"""
作业许可证
"""
CLOSE_CHOICES1 = (
(10, '作业正常结束'),
(20, '因计划改变停止作业'),
(30, '因发生异常终止作业'),
(40, '其他')
)
operation = models.ForeignKey(Operation, verbose_name='关联作业',
on_delete=models.CASCADE, related_name='opl_operation')
number = models.CharField('作业许可编号', max_length=20, null=True, blank=True)
level = models.CharField('作业级别', max_length=20,
help_text='特技/三级/二级/主干道/次干道', null=True, blank=True)
cate = models.ForeignKey(OplCate, verbose_name='作业许可种类',
on_delete=models.CASCADE)
start_time = models.DateTimeField('作业开始时间', null=True, blank=True)
end_time = models.DateTimeField('作业结束时间', null=True, blank=True)
dept_do = models.ForeignKey(Dept, verbose_name='作业部门',
on_delete=models.CASCADE)
charger = models.ForeignKey(User, verbose_name='作业负责人',
on_delete=models.CASCADE, related_name='opl_charger')
monitor = models.ForeignKey(User, verbose_name='作业监护人',
on_delete=models.CASCADE, related_name='opl_monitor')
# electrician = models.ForeignKey(User, verbose_name='电工',
# on_delete=models.CASCADE,
# related_name='opl_electrician', null=True, blank=True)
work_time = models.DateTimeField('安装/拆除时间', null=True, blank=True)
accept_time = models.DateTimeField('验收时间', null=True, blank=True)
work_type = models.CharField('安装/拆除', max_length=20, null=True, blank=True)
power = models.PositiveIntegerField('用电功率', null=True, blank=True)
power_to = models.CharField('用电地点', max_length=20, null=True, blank=True)
power_from = models.CharField('电源接入点', max_length=20, null=True, blank=True)
power_end_time = models.DateTimeField('用电截至', null=True, blank=True)
power_start_time = models.DateTimeField('用电开始', null=True, blank=True)
power_days = models.PositiveSmallIntegerField('计划用电天数', null=True, blank=True)
other_risk = models.TextField('其他风险', null=True, blank=True)
other_emr = models.TextField('其他应急处置', null=True, blank=True)
escape_route = models.TextField('逃生路径', null=True, blank=True)
risks_checked = models.JSONField('风险选择', default=list, null=False, blank=True)
measures_checked = models.JSONField('措施选择', default=list, null=False, blank=True)
workers = models.ManyToManyField(User, verbose_name='作业人员', through='opm.oplworker')
create_imgs = models.ManyToManyField(File, verbose_name='作业审批照片')
close_imgs = models.ManyToManyField(File, verbose_name='作业关闭照片')
close_note = models.PositiveSmallIntegerField('作业关闭情况',
choices=CLOSE_CHOICES1,
help_text='正常结束/计划改变停止/发生异常停止/其他',
null=True, blank=True)
close_dos = models.JSONField('关闭工作', default=list, null=False, blank=True)
close_desc = models.TextField('作业关闭描述', null=True, blank=True)
ticket = models.OneToOneField(Ticket, verbose_name='关联工单',
on_delete=models.CASCADE,
null=True, blank=True)
class OplWorker(BaseModel):
"""
作业许可人员
"""
worker = models.ForeignKey(User, verbose_name='作业人员',
on_delete=models.CASCADE)
opl = models.ForeignKey(Opl, verbose_name='作业许可',
on_delete=models.CASCADE)
duty = models.CharField('工作职责', null=True, blank=True, help_text='作业人员/起重司机/司索人员/起重指挥/电工')
certificates = models.ManyToManyField(Certificate, verbose_name='关联证书', through='opt.optcert')
class OplCert(BaseModel):
"""
作业许可人员证书
"""
opl_worker = models.ForeignKey(OplWorker, verbose_name='关联作业人员',
on_delete=models.CASCADE)
certificate = models.ForeignKey(Certificate, verbose_name='关联证书',
on_delete=models.CASCADE)
name = models.CharField('证书名称', max_length=20)
number = models.CharField('证书编号', max_length=20)
type = models.PositiveSmallIntegerField('证书类型', default=10)
issue_date = models.DateField('发证日期')
expiration_date = models.DateField('有效期')
review_date = models.DateField('下一次复审日期')
file = models.TextField('文件地址', null=True, blank=True)
class GasCheck(CommonADModel):
"""
气体检测记录
"""
check_time = models.DateTimeField('检测时间')
check_place = models.CharField('检测部位')
o2 = models.DecimalField(decimal_places=1, max_digits=3)
co = models.PositiveSmallIntegerField()
lel = models.DecimalField(decimal_places=1, max_digits=3)
is_ok = models.BooleanField('是否正常', default=True)
checker = models.ForeignKey(User, verbose_name='检测人')
opl = models.ForeignKey(Opl, verbose_name='关联作业许可')