412 lines
17 KiB
Python
412 lines
17 KiB
Python
import json
|
|
import uuid
|
|
|
|
from django.apps import apps
|
|
from django.core.exceptions import ValidationError
|
|
from django.shortcuts import render
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import JsonResponse, HttpResponse
|
|
from django.views.decorators.csrf import csrf_protect
|
|
|
|
from application.fac_mgnt.models import InvoiceRecord
|
|
from application.org_mgnt.models import SecondaryDepartment, PrimaryDepartment
|
|
from application.pjt_mgnt.models import ProjectLedger
|
|
|
|
|
|
def error_page(request):
|
|
return render(request, 'error_page.html')
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
table_data = data.get('table_data')
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
instance_data = {}
|
|
for field_name, value in row_data.items():
|
|
field = Model._meta.get_field(field_name)
|
|
if field.is_relation:
|
|
related_model = field.related_model
|
|
related_field_name_list = related_model._meta.fields
|
|
for related_field_name in related_field_name_list:
|
|
try:
|
|
related_instance = related_model.objects.get(**{related_field_name.name: value})
|
|
value = related_instance
|
|
instance_data[field_name] = value
|
|
break
|
|
except Exception:
|
|
continue
|
|
else:
|
|
instance_data[field_name] = value
|
|
instance = Model(**instance_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
@login_required
|
|
def load_secondary_departments(request):
|
|
try:
|
|
primary_department_name = request.GET.get('primary_department')
|
|
primary_department = PrimaryDepartment.objects.get(department_name=primary_department_name)
|
|
secondary_departments = SecondaryDepartment.objects.filter(primary_department_id=primary_department.primary_department_id).order_by('secondary_department_name')
|
|
|
|
# 创建 HTML 字符串
|
|
options = '<option value="">选择二级部门</option>'
|
|
for dept in secondary_departments:
|
|
options += f'<option value="{dept.secondary_department_name}">{dept.secondary_department_name}</option>'
|
|
|
|
return HttpResponse(options)
|
|
except Exception as e:
|
|
return HttpResponse('')
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_fac_inv(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
table_data = data.get('table_data')
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
row_data['project_id'] = ProjectLedger.objects.get(project_name=row_data['project_name'])
|
|
instance = Model(**row_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_fac_rep(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
table_data = data.get('table_data')
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
row_data['project_id'] = ProjectLedger.objects.get(project_name=row_data['project_name'])
|
|
row_data['invoice'] = InvoiceRecord.objects.get(project_name=row_data['project_name'])
|
|
instance = Model(**row_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_inventory(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
|
|
def convert_replenishment_alert(td):
|
|
for item in td:
|
|
item['replenishment_alert'] = True if item['replenishment_alert'] == '是' else False
|
|
return td
|
|
|
|
table_data = convert_replenishment_alert(data.get('table_data'))
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
instance_data = {}
|
|
for field_name, value in row_data.items():
|
|
field = Model._meta.get_field(field_name)
|
|
if field.is_relation:
|
|
related_model = field.related_model
|
|
related_field_name_list = related_model._meta.fields
|
|
for related_field_name in related_field_name_list:
|
|
try:
|
|
related_instance = related_model.objects.get(**{related_field_name.name: value})
|
|
value = related_instance
|
|
instance_data[field_name] = value
|
|
break
|
|
except Exception:
|
|
continue
|
|
else:
|
|
instance_data[field_name] = value
|
|
instance = Model(**instance_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_svc(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
table_data = data.get('table_data')
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
instance_data = {'usage_records': 0}
|
|
for field_name, value in row_data.items():
|
|
field = Model._meta.get_field(field_name)
|
|
if field.is_relation:
|
|
related_model = field.related_model
|
|
related_field_name_list = related_model._meta.fields
|
|
for related_field_name in related_field_name_list:
|
|
try:
|
|
related_instance = related_model.objects.get(**{related_field_name.name: value})
|
|
value = related_instance
|
|
instance_data[field_name] = value
|
|
break
|
|
except Exception:
|
|
continue
|
|
else:
|
|
instance_data[field_name] = value
|
|
instance = Model(**instance_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_ctt(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
|
|
def convert_replenishment_alert(td):
|
|
for item in td:
|
|
item['payment_agreement_needed'] = True if item['payment_agreement_needed'] == '是' else False
|
|
item['signed'] = True if item['signed'] == '是' else False
|
|
return td
|
|
|
|
table_data = convert_replenishment_alert(data.get('table_data'))
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
instance_data = {}
|
|
for field_name, value in row_data.items():
|
|
field = Model._meta.get_field(field_name)
|
|
if field.is_relation:
|
|
related_model = field.related_model
|
|
related_field_name_list = related_model._meta.fields
|
|
for related_field_name in related_field_name_list:
|
|
try:
|
|
related_instance = related_model.objects.get(**{related_field_name.name: value})
|
|
value = related_instance
|
|
instance_data[field_name] = value
|
|
break
|
|
except Exception:
|
|
continue
|
|
else:
|
|
instance_data[field_name] = value
|
|
instance = Model(**instance_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400)
|
|
|
|
|
|
|
|
@csrf_protect
|
|
@login_required
|
|
def save_excel_table_data_fix(request):
|
|
if request.method == 'POST':
|
|
try:
|
|
data = json.loads(request.body)
|
|
model_config = data.get('model_config')
|
|
table_data = data.get('table_data')
|
|
|
|
if not model_config or not table_data:
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
try:
|
|
app_label, model_name = model_config.split('.')
|
|
Model = apps.get_model(app_label, model_name)
|
|
except (ValueError, LookupError):
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
instances = []
|
|
for row_data in table_data:
|
|
instance_data = {'asset_id': str(uuid.uuid4())}
|
|
for field_name, value in row_data.items():
|
|
field = Model._meta.get_field(field_name)
|
|
if field.is_relation:
|
|
related_model = field.related_model
|
|
related_field_name_list = related_model._meta.fields
|
|
for related_field_name in related_field_name_list:
|
|
try:
|
|
related_instance = related_model.objects.get(**{related_field_name.name: value})
|
|
value = related_instance
|
|
instance_data[field_name] = value
|
|
break
|
|
except Exception:
|
|
continue
|
|
else:
|
|
instance_data[field_name] = value
|
|
instance = Model(**instance_data)
|
|
try:
|
|
instance.full_clean()
|
|
instances.append(instance)
|
|
except ValidationError as e:
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
# 批量保存数据
|
|
Model.objects.bulk_create(instances)
|
|
|
|
return JsonResponse({'success': '数据保存成功'}, status=201)
|
|
except json.JSONDecodeError:
|
|
return JsonResponse({'error': '无效的JSON数据'}, status=400)
|
|
except Exception as e:
|
|
return JsonResponse({'error': f'保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
return JsonResponse({'error': '请求错误'}, status=400) |