66 @date:2026/1/14 19:14
77 @desc:
88"""
9+ import json
10+ from functools import reduce
911
1012import uuid_utils .compat as uuid
1113from django .db .models import QuerySet
1214
13- from application .models import ChatUserType , Chat , ChatRecord , ChatSourceChoices
15+ from application .models import ChatUserType , Chat , ChatRecord , ChatSourceChoices , Application
1416from chat .serializers .chat import ChatSerializers
1517from knowledge .models .knowledge_action import State
16-
1718from trigger .handler .base_task import BaseTriggerTask
18- from trigger .models import TaskRecord
19+ from trigger .models import TaskRecord , TriggerTask
1920
2021
2122def get_reference (fields , obj ):
@@ -28,32 +29,82 @@ def get_reference(fields, obj):
2829 return obj
2930
3031
31- def get_field_value (value , kwargs ):
32+ def conversion_custom_value (value , _type ):
33+ if ['array' , 'dict' , 'float' , 'int' , 'boolean' ].__contains__ (_type ):
34+ return json .loads (value )
35+ if _type == 'any' :
36+ try :
37+ return json .loads (value )
38+ except Exception as e :
39+ pass
40+ return value
41+
42+
43+ def valid_value_type (value , _type ):
44+ if _type == 'array' :
45+ return isinstance (value , list )
46+ if _type == 'dict' :
47+ return isinstance (value , dict )
48+ if _type == 'float' :
49+ return isinstance (value , float )
50+ if _type == 'int' :
51+ return isinstance (value , int )
52+ if _type == 'boolean' :
53+ return isinstance (value , bool )
54+ return isinstance (value , str )
55+
56+
57+ def get_field_value (value , kwargs , _type , required , default_value , field ):
3258 source = value .get ('source' )
3359 if source == 'custom' :
34- return value .get ('value' )
60+ _value = value .get ('value' )
61+ if _value :
62+ _value = conversion_custom_value (_value , _type )
63+ else :
64+ if default_value :
65+ return default_value
66+ if required :
67+ raise Exception (f'{ field } is required' )
68+ else :
69+ return None
3570 else :
36- return get_reference (value .get ('value' ), kwargs )
71+ _value = get_reference (value .get ('value' ), kwargs )
72+ valid = valid_value_type (_value , _type )
73+ if not valid :
74+ raise Exception (f'{ field } type error' )
75+ return _value
3776
3877
39- def get_application_execute_parameters (parameter_setting , kwargs ):
78+ def get_application_execute_parameters (parameter_setting , application_parameters_setting , kwargs ):
79+ many_field = ['api_input_field_list' , 'user_input_field_list' ]
4080 parameters = {'form_data' : {}}
41- question_setting = parameter_setting .get ('question' )
42- if question_setting :
43- parameters ['message' ] = get_field_value (question_setting , kwargs )
44- filed_list = ['image_list' , 'document_list' , 'audio_list' , 'video_list' , 'other_list' ]
45- for field in filed_list :
46- field_setting = parameter_setting .get (field )
47- if field_setting :
48- parameters [field ] = get_field_value (field_setting , kwargs )
49- api_input_field_list = parameter_setting .get ('api_input_field_list' )
50- if api_input_field_list :
51- for key , value in api_input_field_list .items ():
52- parameters ['form_data' ][key ] = get_field_value (value , kwargs )
53- user_input_field_list = parameter_setting .get ('user_input_field_list' )
54- if user_input_field_list :
55- for key , value in user_input_field_list .items ():
56- parameters ['form_data' ][key ] = get_field_value (value , kwargs )
81+ for key , value in application_parameters_setting .items ():
82+ setting = parameter_setting .get (key )
83+ if setting :
84+ if many_field .__contains__ (key ):
85+ for ck , cv in value .items ():
86+ _setting = setting .get (ck )
87+ if _setting :
88+ _value = get_field_value (_setting , kwargs , cv .get ('type' ), cv .get ('required' ),
89+ cv .get ('default_value' ), cv .get ('field' ))
90+ parameters ['form_data' ][ck ] = _value
91+ else :
92+ if cv .get ('default_value' ):
93+ parameters ['form_data' ][ck ] = cv .get ('default_value' )
94+ else :
95+ if cv .get ('required' ):
96+ raise Exception (f'{ ck } is required' )
97+ else :
98+ value = get_field_value (setting , kwargs , value .get ('type' ), value .get ('required' ),
99+ value .get ('default_value' ), value .get ('field' ))
100+ parameters ['message' if key == 'question' else key ] = value
101+ else :
102+ if value .get ('default_value' ):
103+ parameters ['message' if key == 'question' else key ] = value .get ('default_value' )
104+ else :
105+ if value .get ('required' ):
106+ raise Exception (f'{ "message" if key == "question" else key } is required' )
107+
57108 return parameters
58109
59110
@@ -76,13 +127,63 @@ def get_workflow_state(details):
76127 return State .SUCCESS
77128
78129
130+ def get_user_field_component_input_type (input_type ):
131+ if input_type == "MultiRow" :
132+ return 'array'
133+ if input_type == "SwitchInput" :
134+ return 'boolean'
135+ return 'string'
136+
137+
138+ def get_application_parameters_setting (application ):
139+ application_parameter_setting = {'question' : {
140+ 'required' : True ,
141+ 'type' : 'string'
142+ }}
143+ if application .type == 'SIMPLE' :
144+ return application_parameter_setting
145+ else :
146+ base_node_list = [n for n in application .work_flow .get ('nodes' ) if n .get ('type' ) == "base-node" ]
147+ if len (base_node_list ) == 0 :
148+ raise Exception ('错误的应用工作流信息' )
149+ base_node = base_node_list [0 ]
150+ api_input_field_list = base_node .get ('properties' ).get ('api_input_field_list' ) or []
151+ api_input_field_list = {user_field .get ('variable' ): {
152+ 'required' : user_field .get ('is_required' ),
153+ 'default_value' : user_field .get ('default_value' ),
154+ 'type' : 'string'
155+ } for user_field in api_input_field_list }
156+ user_input_field_list = base_node .get ('properties' ).get ('user_input_field_list' ) or []
157+ user_input_field_list = {user_field .get ('field' ): {
158+ 'required' : user_field .get ('required' ),
159+ 'default_value' : user_field .get ('default_value' ),
160+ 'type' : get_user_field_component_input_type (user_field .get ('input_type' ))
161+ } for user_field in user_input_field_list }
162+ application_parameter_setting ['api_input_field_list' ] = api_input_field_list
163+ application_parameter_setting ['user_input_field_list' ] = user_input_field_list
164+ node_data = base_node .get ('properties' ).get ('node_data' ) or {}
165+ file_upload_enable = node_data .get ('file_upload_enable' )
166+ if file_upload_enable :
167+ file_upload_setting = node_data .get ('file_upload_setting' ) or {}
168+ for field in ['audio' , 'document' , 'image' , 'other' , 'video' ]:
169+ v = file_upload_setting .get (field )
170+ if v :
171+ application_parameter_setting [field ] = {'required' : False , 'default_value' : [], 'type' : 'array' }
172+ return application_parameter_setting
173+
174+
79175class ApplicationTask (BaseTriggerTask ):
80176 def support (self , trigger_task , ** kwargs ):
81177 return trigger_task .get ('source_type' ) == 'APPLICATION'
82178
83179 def execute (self , trigger_task , ** kwargs ):
84180 parameter_setting = trigger_task .get ('parameter' )
85- parameters = get_application_execute_parameters (parameter_setting , kwargs )
181+ application = QuerySet (Application ).filter (id = trigger_task .get ('source_id' )).only ('type' , 'work_flow' ).first ()
182+ if application is None :
183+ QuerySet (TriggerTask ).filter (id = trigger_task .get ('id' )).delete ()
184+ return
185+ application_parameters_setting = get_application_parameters_setting (application )
186+ parameters = get_application_execute_parameters (parameter_setting , application_parameters_setting , kwargs )
86187 parameters ['re_chat' ] = False
87188 parameters ['stream' ] = True
88189 chat_id = uuid .uuid7 ()
0 commit comments