Example #1
0
    def get(self, request, *args, **kwargs):
        """
        获取流转
        :param request:
        :param args:
        :param kwargs:
        :return:
        """
        workflow_id = kwargs.get('workflow_id')
        request_data = request.GET
        per_page = int(request_data.get('per_page', 10)) if request_data.get(
            'per_page', 10) else 10
        page = int(request_data.get('page', 1)) if request_data.get('page',
                                                                    1) else 1
        query_value = request_data.get('search_value', '')
        # if not username:
        #     return api_response(-1, '请提供username', '')
        result, msg = WorkflowTransitionService.get_transitions_serialize_by_workflow_id(
            workflow_id, per_page, page, query_value)

        if result is not False:
            data = dict(value=result,
                        per_page=msg['per_page'],
                        page=msg['page'],
                        total=msg['total'])
            code, msg, = 0, ''
        else:
            code, data = -1, ''
        return api_response(code, msg, data)
    def get_workflow_init_state(cls, workflow_id):
        """
        获取工作的初始状态信息,包括允许的transition
        :param workflow_id:
        :return:
        """
        init_state_obj = State.objects.filter(workflow_id=workflow_id, is_deleted=False, type_id=CONSTANT_SERVICE.STATE_TYPE_START).first()
        if not init_state_obj:
            return False, '该工作流尚未配置初始状态'

        transition_queryset, msg = WorkflowTransitionService.get_state_transition_queryset(init_state_obj.id)
        transition_info_list = []
        for transition in transition_queryset:
            transition_info_list.append(dict(transition_id=transition.id, transition_name=transition.name))

        # 工单基础字段及属性
        field_list = []
        field_list.append(dict(field_key='title', field_name=u'标题', field_value=None, order_id=20,
                               field_type_id=CONSTANT_SERVICE.FIELD_TYPE_STR,
                               field_attribute=CONSTANT_SERVICE.FIELD_ATTRIBUTE_RO, description='工单的标题',
                               field_choice={}, boolean_field_display={}, default_value=None, field_template='', label={}))
        custom_field_dict, msg = WorkflowCustomFieldService.get_workflow_custom_field(workflow_id)
        for key, value in custom_field_dict.items():
            field_list.append(dict(field_key=key, field_name=custom_field_dict[key]['field_name'], field_value=None, order_id=custom_field_dict[key]['order_id'],
                                   field_type_id=custom_field_dict[key]['field_type_id'],
                                   field_attribute=CONSTANT_SERVICE.FIELD_ATTRIBUTE_RO,
                                   default_value=custom_field_dict[key]['default_value'],
                                   description=custom_field_dict[key]['description'],
                                   field_template=custom_field_dict[key]['field_template'],
                                   boolean_field_display=json.loads(custom_field_dict[key]['boolean_field_display']) if custom_field_dict[key]['boolean_field_display'] else {},  # 之前model允许为空了,为了兼容先这么写,
                                   field_choice=json.loads(custom_field_dict[key]['field_choice']),
                                   label=json.loads(custom_field_dict[key]['label'])
                                   ))

        state_field_dict = json.loads(init_state_obj.state_field_str)
        state_field_key_list = state_field_dict.keys()

        new_field_list = []
        for field0 in field_list:
            if field0['field_key'] in state_field_key_list:
                field0['field_attribute'] = state_field_dict[field0['field_key']]
                new_field_list.append(field0)

        # 字段排序
        new_field_list = sorted(new_field_list, key=lambda r: r['order_id'])
        state_info_dict = dict(id=init_state_obj.id, name=init_state_obj.name, workflow_id=init_state_obj.workflow_id,
                               sub_workflow_id=init_state_obj.sub_workflow_id, distribute_type_id=init_state_obj.distribute_type_id,
                               is_hidden=init_state_obj.is_hidden, order_id=init_state_obj.order_id, type_id=init_state_obj.type_id,
                               participant_type_id=init_state_obj.participant_type_id, participant=init_state_obj.participant,
                               field_list=new_field_list, label=json.loads(init_state_obj.label),
                               creator=init_state_obj.creator, gmt_created=str(init_state_obj.gmt_created)[:19],
                               transition=transition_info_list
                               )
        return state_info_dict, ''
Example #3
0
 def patch(self, request, *args, **kwargs):
     """
     编辑
     :param request:
     :param args:
     :param kwargs:
     :return:
     """
     json_str = request.body.decode('utf-8')
     if not json_str:
         return api_response(-1, 'post参数为空', {})
     request_data_dict = json.loads(json_str)
     workflow_id = kwargs.get('workflow_id')
     app_name = request.META.get('HTTP_APPNAME')
     username = request.META.get('HTTP_USERNAME')
     name = request_data_dict.get('name', '')
     transition_type_id = int(request_data_dict.get('transition_type_id',
                                                    0))
     timer = int(request_data_dict.get('timer', 0))
     source_state_id = int(request_data_dict.get('source_state_id', 0))
     destination_state_id = int(
         request_data_dict.get('destination_state_id', 0))
     condition_expression = request_data_dict.get('condition_expression',
                                                  '')
     attribute_type_id = int(request_data_dict.get('attribute_type_id', 0))
     field_require_check = int(
         request_data_dict.get('field_require_check', 0))
     alert_enable = int(request_data_dict.get('alert_enable', 0))
     alert_text = request_data_dict.get('alert_text', '')
     transition_id = kwargs.get('transition_id')
     result, msg = WorkflowTransitionService.edit_workflow_transition(
         transition_id,
         workflow_id,
         name,
         transition_type_id,
         timer,
         source_state_id,
         destination_state_id,
         condition_expression,
         attribute_type_id,
         field_require_check,
         alert_enable,
         alert_text,
     )
     if result is not False:
         data = dict(value=dict(transition_id=result))
         code, msg, = 0, ''
     else:
         code, data = -1, ''
     return api_response(code, msg, data)
Example #4
0
 def delete(self, request, *args, **kwargs):
     """
     删除transition
     :param request:
     :param args:
     :param kwargs:
     :return:
     """
     transition_id = kwargs.get('transition_id')
     result, msg = WorkflowTransitionService.del_workflow_transition(
         transition_id)
     if result is not False:
         data = dict(value=dict(transition_id=result))
         code, msg, = 0, ''
     else:
         code, data = -1, ''
     return api_response(code, msg, data)
    def get_workflow_init_state(cls, workflow_id):
        """
        获取工作的初始状态信息,包括允许的transition
        :param workflow_id:
        :return:
        """
        init_state_obj = State.objects.filter(
            workflow_id=workflow_id,
            is_deleted=False,
            type_id=CONSTANT_SERVICE.STATE_TYPE_START).first()
        if not init_state_obj:
            return False, '该工作流尚未配置初始状态'

        transition_queryset, msg = WorkflowTransitionService.get_state_transition_queryset(
            init_state_obj.id)
        transition_info_list = []
        for transition in transition_queryset:
            transition_info_list.append(
                dict(transition_id=transition.id,
                     transition_name=transition.name))
        state_info_dict = dict(
            id=init_state_obj.id,
            name=init_state_obj.name,
            workflow_id=init_state_obj.workflow_id,
            sub_workflow_id=init_state_obj.sub_workflow_id,
            distribute_type_id=init_state_obj.distribute_type_id,
            is_hidden=init_state_obj.is_hidden,
            order_id=init_state_obj.order_id,
            type_id=init_state_obj.type_id,
            participant_type_id=init_state_obj.participant_type_id,
            participant=init_state_obj.participant,
            state_field=json.loads(init_state_obj.state_field_str),
            label=json.loads(init_state_obj.label),
            creator=init_state_obj.creator,
            gmt_created=str(init_state_obj.gmt_created)[:19],
            transition=transition_info_list)
        return state_info_dict, ''
Example #6
0
def flow_hook_task(ticket_id):
    """
    hook 任务
    :param ticket_id:
    :return:
    """
    # 查询工单状态
    ticket_obj = TicketRecord.objects.filter(id=ticket_id,
                                             is_deleted=0).first()
    state_id = ticket_obj.state_id
    state_obj = State.objects.filter(id=state_id, is_deleted=0).first()

    participant_type_id = state_obj.participant_type_id
    if participant_type_id != CONSTANT_SERVICE.PARTICIPANT_TYPE_HOOK:
        return False, ''
    hook_config = state_obj.participant
    hook_config_dict = json.loads(hook_config)
    hook_url = hook_config_dict.get('hook_url')
    hook_token = hook_config_dict.get('hook_token')
    wait = hook_config_dict.get('wait')

    flag, msg = CommonService().gen_hook_signature(hook_token)
    if not flag:
        return False, msg
    all_ticket_data, msg = TicketBaseService().get_ticket_all_field_value(
        ticket_id)
    r = requests.post(hook_url, headers=msg, json=all_ticket_data, timeout=10)

    result = r.json()
    if result.get('code') == 0:
        # 调用成功
        if wait:
            # date等格式需要转换为str
            for key, value in all_ticket_data.items():
                if type(value) not in [int, str, bool, float]:
                    all_ticket_data[key] = str(all_ticket_data[key])

            all_ticket_data_json = json.dumps(all_ticket_data)
            TicketBaseService().add_ticket_flow_log(
                dict(
                    ticket_id=ticket_id,
                    transition_id=0,
                    suggestion=result.get('msg'),
                    participant_type_id=CONSTANT_SERVICE.PARTICIPANT_TYPE_HOOK,
                    participant='hook',
                    state_id=state_id,
                    ticket_data=all_ticket_data_json,
                    creator='loonrobot'))
            return True, ''
        else:
            # 不等待hook目标回调,直接流转
            transition_queryset, msg = WorkflowTransitionService(
            ).get_state_transition_queryset(state_id)
            transition_id = transition_queryset[0]  # hook状态只支持一个流转

            new_request_dict = {}
            new_request_dict.update({
                'transition_id': transition_id,
                'suggestion': msg,
                'username': '******'
            })
            # 执行流转
            flag, msg = TicketBaseService().handle_ticket(ticket_id,
                                                          new_request_dict,
                                                          by_hook=True)
            if not flag:
                return False, msg

    else:
        TicketBaseService().update_ticket_field_value(
            {'script_run_last_result': False})

        all_ticket_data, msg = TicketBaseService().get_ticket_all_field_value(
            ticket_id)
        # date等格式需要转换为str
        for key, value in all_ticket_data.items():
            if type(value) not in [int, str, bool, float]:
                all_ticket_data[key] = str(all_ticket_data[key])

        all_ticket_data_json = json.dumps(all_ticket_data)
        TicketBaseService().add_ticket_flow_log(
            dict(ticket_id=ticket_id,
                 transition_id=0,
                 suggestion=result.get('msg'),
                 participant_type_id=CONSTANT_SERVICE.PARTICIPANT_TYPE_HOOK,
                 participant='hook',
                 state_id=state_id,
                 ticket_data=all_ticket_data_json,
                 creator='loonrobot'))