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, ''
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)
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, ''
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'))