You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					617 lines
				
				25 KiB
			
		
		
			
		
	
	
					617 lines
				
				25 KiB
			| 
											10 months ago
										 | import dash | ||
|  | import time | ||
|  | import uuid | ||
|  | from dash import dcc | ||
|  | from dash.dependencies import Input, Output, State, ALL | ||
|  | from dash.exceptions import PreventUpdate | ||
|  | import feffery_utils_components as fuc | ||
|  | 
 | ||
|  | from server import app | ||
|  | from utils.common import validate_data_not_empty | ||
|  | from api.fddict import get_fddict_list_api, get_fddict_detail_api, add_fddict_api, edit_fddict_api, delete_fddict_api, export_fddict_list_api,batch_import_fddict_api,download_fddict_import_template_api | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     output=dict( | ||
|  |         fddict_table_data=Output('fddict-list-table', 'data', allow_duplicate=True), | ||
|  |         fddict_table_pagination=Output('fddict-list-table', 'pagination', allow_duplicate=True), | ||
|  |         fddict_table_key=Output('fddict-list-table', 'key'), | ||
|  |         fddict_table_selectedrowkeys=Output('fddict-list-table', 'selectedRowKeys'), | ||
|  |         api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) | ||
|  |     ), | ||
|  |     inputs=dict( | ||
|  |         search_click=Input('fddict-search', 'nClicks'), | ||
|  |         refresh_click=Input('fddict-refresh', 'nClicks'), | ||
|  |         pagination=Input('fddict-list-table', 'pagination'), | ||
|  |         operations=Input('fddict-operations-store', 'data') | ||
|  |     ), | ||
|  |     state=dict( | ||
|  |         fddict_code=State('fddict-fddict_code-input', 'value'), | ||
|  |         fddict_name=State('fddict-fddict_name-input', 'value'), | ||
|  |         remark=State('fddict-remark-input', 'value'), | ||
|  |         status_select=State('fddict-status-select', 'value'), | ||
|  |         button_perms=State('fddict-button-perms-container', 'data') | ||
|  |     ), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def get_fddict_table_data(search_click, refresh_click, pagination, operations, fddict_code, fddict_name,remark, status_select, button_perms): | ||
|  |     """
 | ||
|  |     获取数据字典表格数据回调(进行表格相关增删查改操作后均会触发此回调) | ||
|  |     """
 | ||
|  | 
 | ||
|  |     query_params = dict( | ||
|  |         fddict_code=fddict_code, | ||
|  |         fddict_name=fddict_name, | ||
|  |         remark = remark, | ||
|  |         status_select=status_select, | ||
|  |         page_num=1, | ||
|  |         page_size=10 | ||
|  |     ) | ||
|  |     triggered_id = dash.ctx.triggered_id | ||
|  |     if triggered_id == 'fddict-list-table': | ||
|  |         query_params = dict( | ||
|  |             fddict_code=fddict_code, | ||
|  |             fddict_name=fddict_name, | ||
|  |             remark = remark, | ||
|  |             status_select=status_select, | ||
|  |             page_num=pagination['current'], | ||
|  |             page_size=pagination['pageSize'] | ||
|  |         ) | ||
|  |     if search_click or refresh_click or pagination or operations: | ||
|  |         table_info = get_fddict_list_api(query_params) | ||
|  |         if table_info['code'] == 200: | ||
|  |             table_data = table_info['data']['rows'] | ||
|  |             table_pagination = dict( | ||
|  |                 pageSize=table_info['data']['page_size'], | ||
|  |                 current=table_info['data']['page_num'], | ||
|  |                 showSizeChanger=True, | ||
|  |                 pageSizeOptions=[10, 30, 50, 100], | ||
|  |                 showQuickJumper=True, | ||
|  |                 total=table_info['data']['total'] | ||
|  |             ) | ||
|  |             for item in table_data: | ||
|  |                 if item['status'] == '0': | ||
|  |                     #item['status'] = dict(tag='正常', color='blue') | ||
|  |                     item['status'] = dict(checked=True)  | ||
|  |                 else: | ||
|  |                     #item['status'] = dict(tag='停用', color='volcano') | ||
|  |                     item['status'] = dict(checked=False) | ||
|  |                 item['key'] = str(item['fddict_id']) | ||
|  |                 item['operation'] = [ | ||
|  |                     { | ||
|  |                         'content': '修改', | ||
|  |                         'type': 'link', | ||
|  |                         'icon': 'antd-edit' | ||
|  |                     } if 'dasset:fddict:edit' in button_perms else {}, | ||
|  |                     { | ||
|  |                         'content': '删除', | ||
|  |                         'type': 'link', | ||
|  |                         'icon': 'antd-delete' | ||
|  |                     } if 'dasset:fddict:remove' in button_perms else {}, | ||
|  |                 ] | ||
|  |             return dict( | ||
|  |                 fddict_table_data=table_data, | ||
|  |                 fddict_table_pagination=table_pagination, | ||
|  |                 fddict_table_key=str(uuid.uuid4()), | ||
|  |                 fddict_table_selectedrowkeys=None, | ||
|  |                 api_check_token_trigger={'timestamp': time.time()} | ||
|  |             ) | ||
|  | 
 | ||
|  |         return dict( | ||
|  |             fddict_table_data=dash.no_update, | ||
|  |             fddict_table_pagination=dash.no_update, | ||
|  |             fddict_table_key=dash.no_update, | ||
|  |             fddict_table_selectedrowkeys=dash.no_update, | ||
|  |             api_check_token_trigger={'timestamp': time.time()} | ||
|  |         ) | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | # 重置数据字典搜索表单数据回调 Output('fddict-remark-input', 'value'), | ||
|  | app.clientside_callback( | ||
|  |     '''
 | ||
|  |     (reset_click) => { | ||
|  |         if (reset_click) { | ||
|  |             return [null, null, null, {'type': 'reset'}] | ||
|  |         } | ||
|  |         return window.dash_clientside.no_update; | ||
|  |     } | ||
|  |     ''',
 | ||
|  |     [Output('fddict-fddict_code-input', 'value'), | ||
|  |      Output('fddict-fddict_name-input', 'value'), | ||
|  |      Output('fddict-status-select', 'value'), | ||
|  |      Output('fddict-operations-store', 'data')], | ||
|  |     Input('fddict-reset', 'nClicks'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | 
 | ||
|  | 
 | ||
|  | # 隐藏/显示数据字典搜索表单回调 | ||
|  | app.clientside_callback( | ||
|  |     '''
 | ||
|  |     (hidden_click, hidden_status) => { | ||
|  |         if (hidden_click) { | ||
|  |             return [ | ||
|  |                 !hidden_status, | ||
|  |                 hidden_status ? '隐藏搜索' : '显示搜索' | ||
|  |             ] | ||
|  |         } | ||
|  |         return window.dash_clientside.no_update; | ||
|  |     } | ||
|  |     ''',
 | ||
|  |     [Output('fddict-search-form-container', 'hidden'), | ||
|  |      Output('fddict-hidden-tooltip', 'title')], | ||
|  |     Input('fddict-hidden', 'nClicks'), | ||
|  |     State('fddict-search-form-container', 'hidden'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     Output({'type': 'fddict-operation-button', 'index': 'edit'}, 'disabled'), | ||
|  |     Input('fddict-list-table', 'selectedRowKeys'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def change_fddict_edit_button_status(table_rows_selected): | ||
|  |     """
 | ||
|  |     根据选择的表格数据行数控制编辑按钮状态回调 | ||
|  |     """
 | ||
|  |     outputs_list = dash.ctx.outputs_list | ||
|  |     if outputs_list: | ||
|  |         if table_rows_selected: | ||
|  |             if len(table_rows_selected) > 1: | ||
|  |                 return True | ||
|  | 
 | ||
|  |             return False | ||
|  | 
 | ||
|  |         return True | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     Output({'type': 'fddict-operation-button', 'index': 'delete'}, 'disabled'), | ||
|  |     Input('fddict-list-table', 'selectedRowKeys'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def change_fddict_delete_button_status(table_rows_selected): | ||
|  |     """
 | ||
|  |     根据选择的表格数据行数控制删除按钮状态回调 | ||
|  |     """
 | ||
|  |     outputs_list = dash.ctx.outputs_list | ||
|  |     if outputs_list: | ||
|  |         if table_rows_selected: | ||
|  | 
 | ||
|  |             return False | ||
|  | 
 | ||
|  |         return True | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     output=dict( | ||
|  |         modal_visible=Output('fddict-modal', 'visible', allow_duplicate=True), | ||
|  |         modal_title=Output('fddict-modal', 'title'), | ||
|  |         form_value=Output({'type': 'fddict-form-value', 'index': ALL}, 'value'), | ||
|  |         form_label_validate_status=Output({'type': 'fddict-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), | ||
|  |         form_label_validate_info=Output({'type': 'fddict-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), | ||
|  |         api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |         edit_row_info=Output('fddict-edit-id-store', 'data'), | ||
|  |         modal_type=Output('fddict-operations-store-bk', 'data') | ||
|  |     ), | ||
|  |     inputs=dict( | ||
|  |         operation_click=Input({'type': 'fddict-operation-button', 'index': ALL}, 'nClicks'), | ||
|  |         button_click=Input('fddict-list-table', 'nClicksButton') | ||
|  |     ), | ||
|  |     state=dict( | ||
|  |         selected_row_keys=State('fddict-list-table', 'selectedRowKeys'), | ||
|  |         clicked_content=State('fddict-list-table', 'clickedContent'), | ||
|  |         recently_button_clicked_row=State('fddict-list-table', 'recentlyButtonClickedRow') | ||
|  |     ), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def add_edit_fddict_modal(operation_click, button_click, selected_row_keys, clicked_content, recently_button_clicked_row): | ||
|  |     """
 | ||
|  |     显示新增或编辑数据字典弹窗回调 | ||
|  |     """
 | ||
|  |     trigger_id = dash.ctx.triggered_id | ||
|  |     if trigger_id == {'index': 'add', 'type': 'fddict-operation-button'} \ | ||
|  |             or trigger_id == {'index': 'edit', 'type': 'fddict-operation-button'} \ | ||
|  |             or (trigger_id == 'fddict-list-table' and clicked_content == '修改'): | ||
|  |         # 获取所有输出表单项对应value的index | ||
|  |         form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] | ||
|  |         # 获取所有输出表单项对应label的index | ||
|  |         form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] | ||
|  |         if trigger_id == {'index': 'add', 'type': 'fddict-operation-button'}: | ||
|  |             fddict_info = dict(fddict_name=None, fddict_code=None, fddict_sort=0, status='0', remark=None) | ||
|  |             return dict( | ||
|  |                 modal_visible=True, | ||
|  |                 modal_title='新增数据字典', | ||
|  |                 form_value=[fddict_info.get(k) for k in form_value_list], | ||
|  |                 form_label_validate_status=[None] * len(form_label_list), | ||
|  |                 form_label_validate_info=[None] * len(form_label_list), | ||
|  |                 api_check_token_trigger=dash.no_update, | ||
|  |                 edit_row_info=None, | ||
|  |                 modal_type={'type': 'add'} | ||
|  |             ) | ||
|  |         elif trigger_id == {'index': 'edit', 'type': 'fddict-operation-button'} or (trigger_id == 'fddict-list-table' and clicked_content == '修改'): | ||
|  |             if trigger_id == {'index': 'edit', 'type': 'fddict-operation-button'}: | ||
|  |                 fddict_id = int(','.join(selected_row_keys)) | ||
|  |             else: | ||
|  |                 fddict_id = int(recently_button_clicked_row['key']) | ||
|  |             fddict_info_res = get_fddict_detail_api(fddict_id=fddict_id) | ||
|  |             if fddict_info_res['code'] == 200: | ||
|  |                 fddict_info = fddict_info_res['data'] | ||
|  |                 return dict( | ||
|  |                     modal_visible=True, | ||
|  |                     modal_title='编辑数据字典', | ||
|  |                     form_value=[fddict_info.get(k) for k in form_value_list], | ||
|  |                     form_label_validate_status=[None] * len(form_label_list), | ||
|  |                     form_label_validate_info=[None] * len(form_label_list), | ||
|  |                     api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                     edit_row_info=fddict_info if fddict_info else None, | ||
|  |                     modal_type={'type': 'edit'} | ||
|  |                 ) | ||
|  | 
 | ||
|  |         return dict( | ||
|  |             modal_visible=dash.no_update, | ||
|  |             modal_title=dash.no_update, | ||
|  |             form_value=[dash.no_update] * len(form_value_list), | ||
|  |             form_label_validate_status=[dash.no_update] * len(form_label_list), | ||
|  |             form_label_validate_info=[dash.no_update] * len(form_label_list), | ||
|  |             api_check_token_trigger={'timestamp': time.time()}, | ||
|  |             edit_row_info=None, | ||
|  |             modal_type=None | ||
|  |         ) | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     output=dict( | ||
|  |         form_label_validate_status=Output({'type': 'fddict-form-label', 'index': ALL, 'required': True}, 'validateStatus', | ||
|  |                                           allow_duplicate=True), | ||
|  |         form_label_validate_info=Output({'type': 'fddict-form-label', 'index': ALL, 'required': True}, 'help', | ||
|  |                                         allow_duplicate=True), | ||
|  |         modal_visible=Output('fddict-modal', 'visible'), | ||
|  |         operations=Output('fddict-operations-store', 'data', allow_duplicate=True), | ||
|  |         api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |         global_message_container=Output('global-message-container', 'children', allow_duplicate=True) | ||
|  |     ), | ||
|  |     inputs=dict( | ||
|  |         confirm_trigger=Input('fddict-modal', 'okCounts') | ||
|  |     ), | ||
|  |     state=dict( | ||
|  |         modal_type=State('fddict-operations-store-bk', 'data'), | ||
|  |         edit_row_info=State('fddict-edit-id-store', 'data'), | ||
|  |         form_value=State({'type': 'fddict-form-value', 'index': ALL}, 'value'), | ||
|  |         form_label=State({'type': 'fddict-form-label', 'index': ALL, 'required': True}, 'label') | ||
|  |     ), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def fddict_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): | ||
|  |     """
 | ||
|  |     新增或编辑数据字典弹窗确认回调,实现新增或编辑操作 | ||
|  |     """
 | ||
|  |     if confirm_trigger: | ||
|  |         # 获取所有输出表单项对应label的index | ||
|  |         form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] | ||
|  |         # 获取所有输入表单项对应的value及label | ||
|  |         form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} | ||
|  |         form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} | ||
|  |         if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): | ||
|  |             params_add = form_value_state | ||
|  |             params_edit = params_add.copy() | ||
|  |             params_edit['fddict_id'] = edit_row_info.get('fddict_id') if edit_row_info else None | ||
|  |             api_res = {} | ||
|  |             modal_type = modal_type.get('type') | ||
|  |             if modal_type == 'add': | ||
|  |                 api_res = add_fddict_api(params_add) | ||
|  |             if modal_type == 'edit': | ||
|  |                 api_res = edit_fddict_api(params_edit) | ||
|  |             if api_res.get('code') == 200: | ||
|  |                 if modal_type == 'add': | ||
|  |                     return dict( | ||
|  |                         form_label_validate_status=[None] * len(form_label_output_list), | ||
|  |                         form_label_validate_info=[None] * len(form_label_output_list), | ||
|  |                         modal_visible=False, | ||
|  |                         operations={'type': 'add'}, | ||
|  |                         api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                         global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') | ||
|  |                     ) | ||
|  |                 if modal_type == 'edit': | ||
|  |                     return dict( | ||
|  |                         form_label_validate_status=[None] * len(form_label_output_list), | ||
|  |                         form_label_validate_info=[None] * len(form_label_output_list), | ||
|  |                         modal_visible=False, | ||
|  |                         operations={'type': 'edit'}, | ||
|  |                         api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                         global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') | ||
|  |                     ) | ||
|  | 
 | ||
|  |             return dict( | ||
|  |                 form_label_validate_status=[None] * len(form_label_output_list), | ||
|  |                 form_label_validate_info=[None] * len(form_label_output_list), | ||
|  |                 modal_visible=dash.no_update, | ||
|  |                 operations=dash.no_update, | ||
|  |                 api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                 global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') | ||
|  |             ) | ||
|  | 
 | ||
|  |         return dict( | ||
|  |             form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], | ||
|  |             form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], | ||
|  |             modal_visible=dash.no_update, | ||
|  |             operations=dash.no_update, | ||
|  |             api_check_token_trigger=dash.no_update, | ||
|  |             global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') | ||
|  |         ) | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     [Output('fddict-delete-text', 'children'), | ||
|  |      Output('fddict-delete-confirm-modal', 'visible'), | ||
|  |      Output('fddict-delete-ids-store', 'data')], | ||
|  |     [Input({'type': 'fddict-operation-button', 'index': ALL}, 'nClicks'), | ||
|  |      Input('fddict-list-table', 'nClicksButton')], | ||
|  |     [State('fddict-list-table', 'selectedRowKeys'), | ||
|  |      State('fddict-list-table', 'clickedContent'), | ||
|  |      State('fddict-list-table', 'recentlyButtonClickedRow')], | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def fddict_delete_modal(operation_click, button_click, | ||
|  |                       selected_row_keys, clicked_content, recently_button_clicked_row): | ||
|  |     """
 | ||
|  |     显示删除数据字典二次确认弹窗回调 | ||
|  |     """
 | ||
|  |     trigger_id = dash.ctx.triggered_id | ||
|  |     if trigger_id == {'index': 'delete', 'type': 'fddict-operation-button'} or (trigger_id == 'fddict-list-table' and clicked_content == '删除'): | ||
|  | 
 | ||
|  |         if trigger_id == {'index': 'delete', 'type': 'fddict-operation-button'}: | ||
|  |             fddict_ids = ','.join(selected_row_keys) | ||
|  |         else: | ||
|  |             if clicked_content == '删除': | ||
|  |                 fddict_ids = recently_button_clicked_row['key'] | ||
|  |             else: | ||
|  |                 raise PreventUpdate | ||
|  | 
 | ||
|  |         return [ | ||
|  |             f'是否确认删除数据字典编号为{fddict_ids}的数据字典?', | ||
|  |             True, | ||
|  |             {'fddict_ids': fddict_ids} | ||
|  |         ] | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     [Output('fddict-operations-store', 'data', allow_duplicate=True), | ||
|  |      Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |      Output('global-message-container', 'children', allow_duplicate=True)], | ||
|  |     Input('fddict-delete-confirm-modal', 'okCounts'), | ||
|  |     State('fddict-delete-ids-store', 'data'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def fddict_delete_confirm(delete_confirm, fddict_ids_data): | ||
|  |     """
 | ||
|  |     删除数据字典弹窗确认回调,实现删除操作 | ||
|  |     """
 | ||
|  |     if delete_confirm: | ||
|  | 
 | ||
|  |         params = fddict_ids_data | ||
|  |         delete_button_info = delete_fddict_api(params) | ||
|  |         if delete_button_info['code'] == 200: | ||
|  |             return [ | ||
|  |                 {'type': 'delete'}, | ||
|  |                 {'timestamp': time.time()}, | ||
|  |                 fuc.FefferyFancyMessage('删除成功', type='success') | ||
|  |             ] | ||
|  | 
 | ||
|  |         return [ | ||
|  |             dash.no_update, | ||
|  |             {'timestamp': time.time()}, | ||
|  |             fuc.FefferyFancyMessage('删除失败', type='error') | ||
|  |         ] | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | # 显示数据字典导入弹窗及重置上传弹窗组件状态回调 | ||
|  | app.clientside_callback( | ||
|  |     '''
 | ||
|  |     (nClicks) => { | ||
|  |         if (nClicks) { | ||
|  |             return [ | ||
|  |                 true,  | ||
|  |                 [],  | ||
|  |                 [], | ||
|  |                 false | ||
|  |             ]; | ||
|  |         } | ||
|  |         return [ | ||
|  |             false, | ||
|  |             window.dash_clientside.no_update, | ||
|  |             window.dash_clientside.no_update, | ||
|  |             window.dash_clientside.no_update | ||
|  |         ]; | ||
|  |     } | ||
|  |     ''',
 | ||
|  |     [Output('fddict-import-confirm-modal', 'visible'), | ||
|  |      Output('fddict-upload-choose', 'listUploadTaskRecord'), | ||
|  |      Output('fddict-upload-choose', 'defaultFileList'), | ||
|  |      Output('fddict-import-update-check', 'checked')], | ||
|  |     Input('fddict-import', 'nClicks'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     output=dict( | ||
|  |         confirm_loading=Output('fddict-import-confirm-modal', 'confirmLoading'), | ||
|  |         modal_visible=Output('batch-result-modal', 'visible',allow_duplicate=True), #add | ||
|  |         batch_result=Output('batch-result-content', 'children',allow_duplicate=True), #add | ||
|  |         operations=Output('fddict-operations-store', 'data', allow_duplicate=True), | ||
|  |         api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |         global_message_container=Output('global-message-container', 'children', allow_duplicate=True) | ||
|  |     ), | ||
|  |     inputs=dict( | ||
|  |         import_confirm=Input('fddict-import-confirm-modal', 'okCounts') | ||
|  |     ), | ||
|  |     state=dict( | ||
|  |         list_upload_task_record=State('fddict-upload-choose', 'listUploadTaskRecord'), | ||
|  |         is_update=State('fddict-import-update-check', 'checked') | ||
|  |     ), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def fddict_import_confirm(import_confirm, list_upload_task_record, is_update): | ||
|  |     """
 | ||
|  |     数据字典导入弹窗确认回调,实现批量导入用户操作 | ||
|  |     """
 | ||
|  |     if import_confirm: | ||
|  |         if list_upload_task_record: | ||
|  |             url = list_upload_task_record[-1].get('url') | ||
|  |             batch_param = dict(url=url, is_update=is_update) | ||
|  |             batch_import_result = batch_import_fddict_api(batch_param) | ||
|  |             if batch_import_result.get('code') == 200: | ||
|  |                 return dict( | ||
|  |                     confirm_loading=False, | ||
|  |                     modal_visible=True if batch_import_result.get('message') else False, | ||
|  |                     batch_result=batch_import_result.get('message'), | ||
|  |                     operations={'type': 'batch-import'}, | ||
|  |                     api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                     global_message_container=fuc.FefferyFancyMessage('导入成功', type='success') | ||
|  |                 ) | ||
|  | 
 | ||
|  |             return dict( | ||
|  |                 confirm_loading=False, | ||
|  |                 modal_visible=True, | ||
|  |                 batch_result=batch_import_result.get('message'), | ||
|  |                 operations=dash.no_update, | ||
|  |                 api_check_token_trigger={'timestamp': time.time()}, | ||
|  |                 global_message_container=fuc.FefferyFancyMessage('导入失败', type='error') | ||
|  |             ) | ||
|  |         else: | ||
|  |             return dict( | ||
|  |                 confirm_loading=False, | ||
|  |                 modal_visible=dash.no_update, | ||
|  |                 batch_result=dash.no_update, | ||
|  |                 operations=dash.no_update, | ||
|  |                 api_check_token_trigger=dash.no_update, | ||
|  |                 global_message_container=fuc.FefferyFancyMessage('请上传需要导入的文件', type='error') | ||
|  |             ) | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     [Output('fddict-export-container', 'data', allow_duplicate=True), | ||
|  |      Output('fddict-export-complete-judge-container', 'data'), | ||
|  |      Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |      Output('global-message-container', 'children', allow_duplicate=True)], | ||
|  |     [Input('fddict-export', 'nClicks'), | ||
|  |      Input('download-fddict-import-template', 'nClicks')], | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def export_fddict_list(export_click, download_click): | ||
|  |     """
 | ||
|  |     导出代码管理信息回调 | ||
|  |     """
 | ||
|  |     trigger_id = dash.ctx.triggered_id | ||
|  |     if export_click or download_click: | ||
|  | 
 | ||
|  |         if trigger_id == 'fddict-export': | ||
|  |             export_fddict_res = export_fddict_list_api({}) | ||
|  |             if export_fddict_res.status_code == 200: | ||
|  |                 export_fddict = export_fddict_res.content | ||
|  | 
 | ||
|  |                 return [ | ||
|  |                     dcc.send_bytes(export_fddict, f'代码管理信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), | ||
|  |                     {'timestamp': time.time()}, | ||
|  |                     {'timestamp': time.time()}, | ||
|  |                     fuc.FefferyFancyMessage('导出成功', type='success') | ||
|  |                 ] | ||
|  | 
 | ||
|  |             return [ | ||
|  |                 dash.no_update, | ||
|  |                 dash.no_update, | ||
|  |                 {'timestamp': time.time()}, | ||
|  |                 fuc.FefferyFancyMessage('导出失败', type='error') | ||
|  |             ] | ||
|  | 
 | ||
|  | 
 | ||
|  |         if trigger_id == 'download-fddict-import-template': | ||
|  |             download_template_res = download_fddict_import_template_api() | ||
|  |             if download_template_res.status_code == 200: | ||
|  |                 download_template = download_template_res.content | ||
|  | 
 | ||
|  |                 return [ | ||
|  |                     dcc.send_bytes(download_template, f'代码管理导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), | ||
|  |                     {'timestamp': time.time()}, | ||
|  |                     {'timestamp': time.time()}, | ||
|  |                     fuc.FefferyFancyMessage('下载成功', type='success') | ||
|  |                 ] | ||
|  | 
 | ||
|  |             return [ | ||
|  |                 dash.no_update, | ||
|  |                 dash.no_update, | ||
|  |                 {'timestamp': time.time()}, | ||
|  |                 fuc.FefferyFancyMessage('下载失败', type='error') | ||
|  |             ] | ||
|  | 
 | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     Output('fddict-export-container', 'data', allow_duplicate=True), | ||
|  |     Input('fddict-export-complete-judge-container', 'data'), | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def reset_fddict_export_status(data): | ||
|  |     """
 | ||
|  |     导出完成后重置下载组件数据回调,防止重复下载文件 | ||
|  |     """
 | ||
|  |     time.sleep(0.5) | ||
|  |     if data: | ||
|  | 
 | ||
|  |         return None | ||
|  | 
 | ||
|  |     raise PreventUpdate | ||
|  | 
 | ||
|  | @app.callback( | ||
|  |     [Output('fddict-operations-store', 'data', allow_duplicate=True), | ||
|  |      Output('api-check-token', 'data', allow_duplicate=True), | ||
|  |      Output('global-message-container', 'children', allow_duplicate=True)], | ||
|  |     [Input('fddict-list-table', 'recentlySwitchDataIndex'), | ||
|  |      Input('fddict-list-table', 'recentlySwitchStatus'), | ||
|  |      Input('fddict-list-table', 'recentlySwitchRow')], | ||
|  |     prevent_initial_call=True | ||
|  | ) | ||
|  | def table_switch_fddict_status(recently_switch_data_index, recently_switch_status, recently_switch_row): | ||
|  |     """
 | ||
|  |     表格内切换字典状态回调 | ||
|  |     """
 | ||
|  |     if recently_switch_data_index: | ||
|  |         if recently_switch_status: | ||
|  |             params = dict(fddict_id=int(recently_switch_row['key']), status='0', type='status') | ||
|  |         else: | ||
|  |             params = dict(fddict_id=int(recently_switch_row['key']), status='1', type='status') | ||
|  |         edit_button_result = edit_fddict_api(params) | ||
|  |         if edit_button_result['code'] == 200: | ||
|  | 
 | ||
|  |             return [ | ||
|  |                 {'type': 'switch-status'}, | ||
|  |                 {'timestamp': time.time()}, | ||
|  |                 fuc.FefferyFancyMessage('修改成功', type='success') | ||
|  |             ] | ||
|  | 
 | ||
|  |         return [ | ||
|  |             {'type': 'switch-status'}, | ||
|  |             {'timestamp': time.time()}, | ||
|  |             fuc.FefferyFancyMessage('修改失败', type='error') | ||
|  |         ] | ||
|  | 
 | ||
|  |     raise PreventUpdate |