Beispiel #1
0
    def get(self, request, *args, **kwargs):
        request_data = request.GET
        ticket_id = kwargs.get('ticket_id')
        username = request.META.get('HTTP_USERNAME')
        per_page = int(request_data.get('per_page', 10))
        page = int(request_data.get('page', 1))
        ticket_data = int(request_data.get('ticket_data', 0))
        desc = int(request_data.get('desc', 1)) # 是否降序
        app_name = request.META.get('HTTP_APPNAME')
        app_permission_check, msg = account_base_service_ins.app_ticket_permission_check(app_name, ticket_id)
        if not app_permission_check:
            return api_response(-1, msg, '')

        if not username:
            return api_response(-1, '参数不全,请提供username', '')

        flag, result = ticket_base_service_ins.get_ticket_flow_log(ticket_id, username, per_page, page, ticket_data, desc)

        if flag is not False:
            paginator_info = result.get('paginator_info')
            data = dict(value=result.get('ticket_flow_log_restful_list'), per_page=paginator_info.get('per_page'),
                        page=paginator_info.get('page'), total=paginator_info.get('total'))
            code, msg,  = 0, ''
        else:
            code, data = -1, ''
        return api_response(code, msg, data)
Beispiel #2
0
def timer_transition(ticket_id, state_id, date_time, transition_id):
    """
    定时器流转
    :param ticket_id:
    :param state_id:
    :param date_time:
    :param transition_id:
    :return:
    """
    # 需要满足工单此状态后续无其他操作才自动流转
    # 查询该工单此状态所有操作
    # flow_log_set, msg = TicketBaseService().get_ticket_flow_log(ticket_id, 'loonrobot', per_page=1000)
    flag, result = ticket_base_service_ins.get_ticket_flow_log(ticket_id,
                                                               'loonrobot',
                                                               per_page=1000)
    if flag is False:
        return False, result
    flow_log_list = result.get('ticket_flow_log_restful_list')
    for flow_log in flow_log_list:
        if flow_log.get('state').get('state_id') == state_id and flow_log.get(
                'gmt_created') > date_time:
            return True, '后续有操作,定时器失效'
    # 执行流转
    handle_ticket_data = dict(transition_id=transition_id,
                              username='******',
                              suggestion='定时器流转')
    ticket_base_service_ins.handle_ticket(ticket_id, handle_ticket_data, True)
Beispiel #3
0
def send_ticket_notice(ticket_id):
    """
    发送工单通知
    :param ticket_id:
    :return:
    """
    # 获取工单信息
    # 获取工作流信息,获取工作流的通知信息
    # 获取通知信息的标题和内容模板
    # 将通知内容,通知标题,通知人,作为hook的请求参数
    ticket_obj = TicketRecord.objects.filter(id=ticket_id,
                                             is_deleted=0).first()
    if not ticket_obj:
        return False, 'ticket is not exist or has been deleted'

    workflow_id = ticket_obj.workflow_id
    workflow_obj = Workflow.objects.filter(id=workflow_id,
                                           is_deleted=0).first()
    notices = workflow_obj.notices
    if not notices:
        return True, 'no notice defined'
    notice_str_list = notices.split(',')
    notice_id_list = [int(notice_str) for notice_str in notice_str_list]
    send_notice_result_list = []

    title_template = workflow_obj.title_template
    content_template = workflow_obj.content_template

    # 获取工单所有字段的变量
    flag, ticket_value_info = ticket_base_service_ins.get_ticket_all_field_value(
        ticket_id)
    if flag is False:
        return False, ticket_value_info
    title_result = title_template.format(**ticket_value_info)
    content_result = content_template.format(**ticket_value_info)
    # 获取工单最后一条操作记录
    flag, result = ticket_base_service_ins.get_ticket_flow_log(
        ticket_id, 'loonrobot')
    flow_log_list = result.get('ticket_flow_log_restful_list')

    last_flow_log = flow_log_list[0]
    participant_info_list = []
    participant_username_list = []
    from apps.account.models import LoonUser
    if ticket_obj.participant_type_id == constant_service_ins.PARTICIPANT_TYPE_PERSONAL:
        participant_username_list = [ticket_obj.participant]
    elif ticket_obj.participant_type_id == constant_service_ins.PARTICIPANT_TYPE_MULTI:
        participant_username_list = ticket_obj.participant.split(',')
    elif ticket_obj.participant_type_id == constant_service_ins.PARTICIPANT_TYPE_ROLE:
        flag, participant_username_list = account_base_service_ins.get_role_username_list(
            ticket_obj.participant)
        if flag is False:
            return False, participant_username_list

    elif ticket_obj.participant_type_id == constant_service_ins.PARTICIPANT_TYPE_DEPT:
        flag, participant_username_list = account_base_service_ins.get_dept_username_list(
            ticket_obj.participant)
        if not flag:
            return flag, participant_username_list

    if participant_username_list:
        participant_queryset = LoonUser.objects.filter(
            username__in=participant_username_list, is_deleted=0)
        for participant_0 in participant_queryset:
            participant_info_list.append(
                dict(username=participant_0.username,
                     alias=participant_0.alias,
                     phone=participant_0.phone,
                     email=participant_0.email))

    params = {
        'title_result': title_result,
        'content_result': content_result,
        'participant': ticket_obj.participant,
        'participant_type_id': ticket_obj.participant_type_id,
        'multi_all_person': ticket_obj.multi_all_person,
        'ticket_value_info': ticket_value_info,
        'last_flow_log': last_flow_log,
        'participant_info_list': participant_info_list
    }
    for notice_id in notice_id_list:
        notice_obj = CustomNotice.objects.filter(id=notice_id,
                                                 is_deleted=0).first()
        if not notice_obj:
            continue
        hook_url = notice_obj.hook_url
        hook_token = notice_obj.hook_token
        # gen signature
        flag, headers = common_service_ins.gen_signature_by_token(hook_token)
        try:
            r = requests.post(hook_url, headers=headers, json=params)
            result = r.json()
            if result.get('code') == 0:
                send_notice_result_list.append(
                    dict(notice_id=notice_id,
                         result='success',
                         msg=result.get('msg', '')))
            else:
                send_notice_result_list.append(
                    dict(notice_id=notice_id,
                         result='fail',
                         msg=result.get('msg', '')))
        except Exception as e:
            send_notice_result_list.append(
                dict(notice_id=notice_id, result='fail', msg=e.__str__()))

    return True, dict(send_notice_result_list=send_notice_result_list)