factory/apps/opm/services.py

122 lines
3.7 KiB
Python

from apps.ecm.tasks import opl_task
from apps.opm.models import Operation, Opl, OplWorker
from apps.third.models import TDevice
from apps.utils.sms import send_sms
from apps.wf.models import Ticket, Transition
def get_op_charger(state, ticket, new_ticket_data, handler):
"""_summary_
Args:
state (_type_): 工作流节点实例
ticket (_type_): 工单实例
new_ticket_data (_type_): 提交的工单数据
handler (_type_): 处理人实例
"""
opl = Opl.objects.filter(ticket=ticket).first()
if opl:
return [opl.charger.id]
def get_op_workers(state, ticket, new_ticket_data, handler):
opl = Opl.objects.filter(ticket=ticket).first()
if opl:
return list(OplWorker.objects.filter(opl=opl).values_list('worker__id', flat=True))
def get_op_monitor(state, ticket, new_ticket_data, handler):
opl = Opl.objects.filter(ticket=ticket).first()
if opl:
return [opl.monitor.id]
def bind_opl(ticket: Ticket, transition: Transition, new_ticket_data: dict):
opl = Opl.objects.get(id=new_ticket_data['opl'])
ticket_data = ticket.ticket_data
ticket_data.update({
'operation': opl.operation.id, # operation id值
'level': opl.level,
'monitor': opl.monitor.id,
'workers': list(OplWorker.objects.filter(opl=opl).values_list('worker__id', flat=True)),
'charger': opl.charger.id,
'dept_ter': opl.operation.dept_ter.id,
'dept_bus': opl.operation.dept_bus.id
})
ticket.ticket_data = ticket_data
ticket.create_by = opl.create_by
ticket.save()
opl.ticket = ticket
opl.number = ticket.sn
opl.save()
op = opl.operation
if op.state == Operation.OP_CREATE:
op.state = Operation.OP_AUDIT
op.save()
def opl_audit_end(ticket: Ticket):
# 任务执行1
opl = Opl.objects.get(ticket=ticket)
op = opl.operation
if op.state == Operation.OP_AUDIT:
op.state = Operation.OP_WAIT
op.save()
# 授予相关工作人员区域进入权限
# worker_ep_ids = list(OplWorker.objects.filter(opl=opl).values_list('worker__id', flat=True))
# 发送通知
try:
phone = opl.create_by.employee.phone
send_sms(phone=phone, template_code=1005, template_param={'name': ticket.workflow.name})
except Exception:
pass
def opl_start(ticket: Ticket):
# 任务执行2 开始许可证作业
opl = Opl.objects.get(ticket=ticket)
op = opl.operation
if op.state == Operation.OP_WAIT:
op.state = Operation.OP_WORK
op.save()
# 给摄像头加载循环拍照算法
# 找到作业点的摄像头, 如果指定摄像头就用指定的摄像头
if op.vchannels:
vc_codes = list(op.vchannels.all().values_list('code', flat=True))
else:
vc_codes = list(TDevice.objects.filter(type=TDevice.DEVICE_VCHANNEL,
area=op.area).values_list('code', flat=True))
opl_id = opl.id
task = opl_task.delay(vc_codes, opl_id)
opl.mtask_id = task.task_id
opl.save()
def opl_end(ticket: Ticket):
"""
作业许可证关闭时执行
"""
opl = ticket.opl
if opl.mtask_id:
from celery.app.control import Control
from server.celery import app
celery_control = Control(app=app)
# 关闭作业视频监控任务
celery_control.revoke(opl.mtask_id, terminate=True)
opl.mtask_id = None
opl.save()
operation = opl.operation
opls = Opl.objects.filter(operation=operation)
opls.filter(ticket=None).delete() # 删除无用许可证
states = opls.values_list('ticket__state__type', flat=True)
if 0 in states or 1 in states: # 查看工单状态
pass
else:
operation.state = Operation.OP_DONE
operation.save()