XH_Digital_Management/application/pjt_mgnt/views.py

600 lines
25 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
from django.http import JsonResponse, Http404
from django.shortcuts import render, get_object_or_404
from django.template.loader import render_to_string
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods, require_POST
from application.accounts.models import AccountProfile
from application.fac_mgnt.models import InvoiceRecord
from application.fac_mgnt.views import primary_department_filter
from application.pjt_mgnt.forms import *
from application.pjt_mgnt.models import *
from common.auth import custom_permission_required, permission_based_queryset, dynamic_form_selection
from common.utils.page_helper import paginate_query_and_assign_numbers
@custom_permission_required('pjt_mgnt.view_projectledger')
def invoice_detail(request):
project_name = request.GET.get('project_name')
if project_name:
try:
project = ProjectLedger.objects.get(project_id=project_name)
invoices = InvoiceRecord.objects.filter(project_name=project)
if invoices.exists():
data = {
'total_amount': [invoice.total_amount for invoice in invoices],
'year_month': [invoice.invoice_date.strftime('%Y-%m') if invoice.invoice_date else None for invoice
in invoices],
'project_members': project.project_members # 返回项目组员数据
}
return JsonResponse(data)
else:
return JsonResponse({'error': '找不到此项目名称的发票记录'})
except ProjectLedger.DoesNotExist:
return JsonResponse({'error': '项目不存在'})
return JsonResponse({'error': '未提供项目名称'})
@custom_permission_required('pjt_mgnt.view_projectledger')
def get_project_details(request):
project_name = request.GET.get('project_name')
if project_name:
try:
project = ProjectLedger.objects.get(project_id=project_name)
data = {
'project_id': project.project_id,
'primary_department': project.primary_department,
'project_leader': project.project_leader,
'project_nature': project.project_nature,
'revenue': project.revenue,
}
return JsonResponse(data)
except ValueError:
project = ProjectLedger.objects.get(project_name=project_name)
data = {
'project_id': project.project_id,
'primary_department': project.primary_department,
'project_leader': project.project_leader,
'project_nature': project.project_nature,
}
return JsonResponse(data)
except ProjectLedger.DoesNotExist:
return JsonResponse({'error': '项目不存在'}, status=404)
else:
projects = ProjectLedger.objects.all()
data = [{
'project_id': project.project_id,
'primary_department': project.primary_department,
'project_leader': project.project_leader,
'project_nature': project.project_nature,
'project_name': project.project_name
} for project in projects]
return JsonResponse(data, safe=False)
@custom_permission_required('pjt_mgnt.view_projectledger')
@permission_based_queryset('pjt_mgnt', 'ProjectLedger', 'project_id', 'project_leader', 'primary_department')
@dynamic_form_selection
def proj_ledger_list_view(request):
"""
基础数据-项目管理-项目台账-列表视图
"""
# 声明查询集,只显示当前用户作为主办人的记录
query_set = request.query_set
FormClass = request.form_class
if FormClass.__name__ == 'ProjectLedgerForm':
is_show_btn = True
else:
is_show_btn = False
# 获取查询参数
project_name = request.GET.get('project_name', '')
customer_name = request.GET.get('customer_name', '')
primary_department = request.GET.get('primary_department', '')
project_leader = request.GET.get('project_leader', '')
province = request.GET.get('province', '')
city = request.GET.get('city', '')
district = request.GET.get('district', '')
resource_type = request.GET.get('resource_type', '')
project_nature = request.GET.get('project_nature', '')
# 根据提供的参数进行筛选
if project_name:
query_set = query_set.filter(project_name__icontains=project_name)
if customer_name:
query_set = query_set.filter(customer_name__icontains=customer_name)
if primary_department:
query_set = query_set.filter(primary_department__icontains=primary_department)
if project_leader:
query_set = query_set.filter(project_leader__icontains=project_leader)
if province:
query_set = query_set.filter(province__icontains=province)
if city:
query_set = query_set.filter(city__icontains=city)
if district:
query_set = query_set.filter(district__icontains=district)
if resource_type:
query_set = query_set.filter(resource_type=resource_type)
if project_nature:
query_set = query_set.filter(project_nature=project_nature)
# 对查询结果进行分页每页10条记录
items = paginate_query_and_assign_numbers(
request=request,
queryset=query_set,
per_page=10
)
# 查询项目类型并添加到items中
for item in items:
if item.primary_department == '天信' or item.primary_department == '混改':
sub_table = ChildProjectLedgerA.objects.filter(project_id=item.project_id).first()
elif item.primary_department == '艾力芬特':
sub_table = ChildProjectLedgerB.objects.filter(project_id=item.project_id).first()
elif item.primary_department == '星河':
sub_table = ChildProjectLedgerC.objects.filter(project_id=item.project_id).first()
elif item.primary_department == '星海':
sub_table = ChildProjectLedgerD.objects.filter(project_id=item.project_id).first()
else:
sub_table = None
item.project_type = sub_table.project_type if sub_table else '-'
# 构建上下文查询参数字符串
query_params = '&project_name={}&customer_name={}'.format(project_name, customer_name)
# Excel上传模板
template_name = "项目管理-项目台账-Excel上传模板.xlsx"
# 构建上下文
context = {
"model_config": 'pjt_mgnt.ProjectLedger',
"items": items,
"breadcrumb_list": [
{"title": "首页", "name": "index"},
{"title": "项目管理", "name": "index"},
{"title": "项目台账", "name": "proj_ledger_list"}
],
"filters": [
{"type": "text", "id": "project_name", "name": "project_name", "label": "项目名称",
"placeholder": "请输入项目名称"},
{"type": "text", "id": "customer_name", "name": "customer_name", "label": "客户名称",
"placeholder": "请输入客户名称"},
{"type": "text", "id": "project_leader", "name": "project_leader", "label": "负责人",
"placeholder": "请输入负责人"},
{"type": "select", "id": "province", "name": "province", "label": "", "placeholder": "请选择省"},
{"type": "select", "id": "city", "name": "city", "label": "", "placeholder": "请选择市"},
{"type": "select", "id": "district", "name": "district", "label": "区县", "placeholder": "请选择区县"},
primary_department_filter,
{"type": "select", "id": "resource_type", "name": "resource_type", "label": "资源类型", "options": [
{"value": "", "display": "全部"},
{"value": "公司", "display": "公司"},
{"value": "个人", "display": "个人"}
]},
{"type": "select", "id": "project_nature", "name": "project_nature", "label": "项目性质", "options": [
{"value": "", "display": "全部"},
{"value": "新增", "display": "新增"},
{"value": "存量", "display": "存量"},
{"value": "新增及存量", "display": "新增及存量"},
{"value": "老客户新业务", "display": "老客户新业务"}
]}
],
"excel_upload_config": {
"template_name": template_name,
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
"parse_url": reverse("ep_common_parse"),
"save_url": reverse("save_excel_table_data")
},
"query_params": query_params,
"form_action_url": reverse('proj_ledger_list'),
"modify_url": reverse("proj_ledger_list_modify"),
"add_url": reverse("proj_ledger_list_add"),
"delete_url": reverse("proj_ledger_list_delete"),
"table_exclude_field_name": ['project_id'],
"add_button": is_show_btn,
"report_excel_button": True,
"export_url": reverse("export_data"),
"import_excel_button": True
}
return render(request, 'project_list_inherit.html', context)
@custom_permission_required('pjt_mgnt.add_projectledger')
@dynamic_form_selection
def proj_ledger_list_add(request):
"""
基础数据-项目管理-项目台账-添加视图
"""
FormClass = request.form_class
if request.method == 'POST':
form = FormClass(request.POST)
if form.is_valid():
instance = form.save(commit=False)
if isinstance(form, ProjectLedgerForm):
current_user = request.user
account_profile = AccountProfile.objects.get(user=current_user)
instance.project_leader = account_profile.employee_information.name
instance.save()
return JsonResponse({"message": "添加成功"})
else:
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400)
elif request.method == 'GET':
form = FormClass()
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html})
else:
return JsonResponse({"message": "无效的请求方法"}, status=405)
@custom_permission_required('pjt_mgnt.change_projectledger')
@dynamic_form_selection
def proj_ledger_list_modify(request):
"""
基础数据-项目管理-项目台账-修改视图
"""
FormClass = request.form_class
if request.method == 'POST':
if 'id' in request.POST:
instance = ProjectLedger.objects.get(project_id=request.POST['id'])
form = FormClass(request.POST, instance=instance)
else:
form = FormClass(request.POST)
if form.is_valid():
instance = form.save(commit=False)
if isinstance(form, ProjectLedgerForm):
current_user = request.user
account_profile = AccountProfile.objects.get(user=current_user)
instance.project_leader = account_profile.employee_information.name
instance.save()
return JsonResponse({"message": "保存成功"})
else:
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400)
elif request.method == 'GET':
if 'id' in request.GET:
try:
instance = ProjectLedger.objects.get(project_id=request.GET['id'])
form = FormClass(instance=instance)
except ProjectLedger.DoesNotExist:
raise Http404("对象不存在")
else:
form = FormClass()
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html})
else:
return JsonResponse({"message": "无效的请求方法"}, status=405)
@require_http_methods(["POST"])
@custom_permission_required('pjt_mgnt.delete_projectledger')
def proj_ledger_list_delete(request):
"""
基础数据-项目管理-项目台账-删除视图
"""
project_id = request.POST.get('id')
if project_id:
ProjectLedger.objects.filter(project_id=project_id).delete()
return JsonResponse({"message": "删除成功"})
else:
return JsonResponse({"message": "请求参数错误"}, status=400)
@custom_permission_required('pjt_mgnt.view_employeeprojectincomesettlement')
@permission_based_queryset('pjt_mgnt', 'EmployeeProjectIncomeSettlement', 'record_id', 'name', 'primary_department')
def emp_proj_income_list_view(request):
"""
基础数据-项目管理-项目组员收入结算表-列表视图
"""
# 声明查询集
query_set = request.query_set
# 获取查询参数
project_name = request.GET.get('project_name', '')
year_month = request.GET.get('year_month', '')
name = request.GET.get('name', '')
primary_department = request.GET.get('primary_department', '')
# 根据提供的参数进行筛选
if project_name:
query_set = query_set.filter(project_name__project_name__icontains=project_name)
if year_month:
query_set = query_set.filter(year_month__icontains=year_month)
if name:
query_set = query_set.filter(name__icontains=name)
if primary_department:
query_set = query_set.filter(primary_department=primary_department)
# 对查询结果进行分页每页10条记录
items = paginate_query_and_assign_numbers(
request=request,
queryset=query_set,
per_page=10
)
# 构建上下文查询参数字符串
query_params = '&project_name={}&year_month={}&name={}&primary_department={}'.format(project_name, year_month, name, primary_department)
# Excel上传模板
template_name = "项目管理-项目组员收入结算-Excel上传模板.xlsx"
# 构建上下文
context = {
"model_config": 'pjt_mgnt.EmployeeProjectIncomeSettlement',
"items": items,
"breadcrumb_list": [
{"title": "首页", "name": "index"},
{"title": "项目管理", "name": "index"},
{"title": "项目组员收入结算表", "name": "emp_proj_income_list"}
],
"filters": [
{"type": "text", "id": "project_name", "name": "project_name", "label": "项目名称",
"placeholder": "请输入项目名称"},
{"type": "text", "id": "year_month", "name": "year_month", "label": "年月", "placeholder": "请输入年月"},
primary_department_filter,
{"type": "text", "id": "name", "name": "name", "label": "姓名", "placeholder": "请输入姓名"}
],
"excel_upload_config": {
"template_name": template_name,
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
"parse_url": reverse("ep_common_parse"),
"save_url": reverse("save_excel_table_data")
},
"query_params": query_params,
"form_action_url": reverse('emp_proj_income_list'),
"modify_url": reverse("emp_proj_income_list_modify"),
"add_url": reverse("emp_proj_income_list_add"),
"delete_url": reverse("emp_proj_income_list_delete"),
"table_exclude_field_name": ['record_id'],
"add_button": True,
"report_excel_button": True,
"export_url": reverse("export_data"),
"import_excel_button": True
}
return render(request, 'emp_pj.html', context)
@custom_permission_required('pjt_mgnt.add_employeeprojectincomesettlement')
def emp_proj_income_list_add(request):
"""
基础数据-项目管理-项目组员收入结算表-添加视图
"""
if request.method == 'POST':
data = request.POST.copy()
if 'year_month' in data:
year_month_str = data['year_month']
try:
year_month_date = datetime.datetime.strptime(year_month_str, "%Y-%m").date()
data['year_month'] = year_month_date
except ValueError:
return JsonResponse({"message": "无效的日期格式"}, status=400)
form = EmployeeProjectIncomeSettlementForm(data)
if form.is_valid():
form.save()
return JsonResponse({"message": "添加成功"})
else:
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400)
elif request.method == 'GET':
form = EmployeeProjectIncomeSettlementForm()
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html})
else:
return JsonResponse({"message": "无效的请求方法"}, status=405)
@custom_permission_required('pjt_mgnt.change_employeeprojectincomesettlement')
def emp_proj_income_list_modify(request):
"""
基础数据-项目管理-项目组员收入结算表-修改视图
"""
if request.method == 'POST':
data = request.POST.copy()
if 'year_month' in data:
year_month_str = data['year_month']
try:
year_month_date = datetime.datetime.strptime(year_month_str, "%Y-%m").date()
data['year_month'] = year_month_date
except ValueError:
return JsonResponse({"message": "无效的日期格式"}, status=400)
if 'id' in request.POST:
instance = EmployeeProjectIncomeSettlement.objects.get(record_id=request.POST['id'])
form = EmployeeProjectIncomeSettlementForm(data, instance=instance)
else:
form = EmployeeProjectIncomeSettlementForm(data)
if form.is_valid():
form.save()
return JsonResponse({"message": "保存成功"})
else:
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400)
elif request.method == 'GET':
if 'id' in request.GET:
try:
instance = EmployeeProjectIncomeSettlement.objects.get(record_id=request.GET['id'])
form = EmployeeProjectIncomeSettlementForm(instance=instance)
form.fields['year_month'].initial = instance.year_month.strftime('%Y-%m')
except EmployeeProjectIncomeSettlement.DoesNotExist:
raise Http404("对象不存在")
else:
form = EmployeeProjectIncomeSettlementForm()
form_html = render_to_string('form_partial.html', {'form': form}, request)
return JsonResponse({"form_html": form_html})
else:
return JsonResponse({"message": "无效的请求方法"}, status=405)
@require_http_methods(["POST"])
@custom_permission_required('pjt_mgnt.delete_employeeprojectincomesettlement')
def emp_proj_income_list_delete(request):
"""
基础数据-项目管理-项目组员收入结算表-删除视图
"""
record_id = request.POST.get('id')
if record_id:
EmployeeProjectIncomeSettlement.objects.filter(record_id=record_id).delete()
return JsonResponse({"message": "删除成功"})
else:
return JsonResponse({"message": "请求参数错误"}, status=400)
def get_project_issues(request, project_id):
issues = ProjectIssuesLog.objects.filter(project_id=project_id)
issues_data = [
{
'issue_id': issue.issue_id,
'record_date': issue.record_date.strftime('%Y-%m-%d') if issue.record_date else None,
'description': issue.description,
'handler': issue.handler,
'reference': issue.reference,
'solution': issue.solution,
'decision_maker': issue.decision_maker,
'status': issue.get_status_display()
}
for issue in issues
]
return JsonResponse({'issues': issues_data})
def get_project_issue_detail(request, issue_id):
issue = get_object_or_404(ProjectIssuesLog, pk=issue_id)
issue_data = {
'issue_id': issue.issue_id,
'record_date': issue.record_date.strftime('%Y-%m-%d'),
'description': issue.description,
'handler': issue.handler,
'reference': issue.reference,
'solution': issue.solution,
'decision_maker': issue.decision_maker,
'status': issue.status,
}
return JsonResponse(issue_data)
@csrf_exempt
def add_project_issue(request):
form = ProjectIssuesLogForm(request.POST)
if form.is_valid():
form.save()
return JsonResponse({"message": "添加成功"})
else:
return JsonResponse({"errors": form.errors}, status=400)
@csrf_exempt
def edit_project_issue(request, issue_id):
issue = get_object_or_404(ProjectIssuesLog, pk=issue_id)
form = ProjectIssuesLogForm(request.POST, instance=issue)
if form.is_valid():
form.save()
return JsonResponse({"message": "修改成功"})
else:
return JsonResponse({"errors": form.errors}, status=400)
@csrf_exempt
def delete_project_issue(request, issue_id):
issue = get_object_or_404(ProjectIssuesLog, pk=issue_id)
issue.delete()
return JsonResponse({"message": "删除成功"})
def get_continued_detail(request, project_id):
project = get_object_or_404(ProjectLedger, pk=project_id)
primary_department = project.primary_department
data = {"project_id": project.project_id} # 公共数据
if primary_department in ['天信', '混改']:
continued_record = get_object_or_404(ChildProjectLedgerA, project_id=project)
data.update({
"project_type": continued_record.project_type,
"resource_party": continued_record.resource_party,
"cooperation_party": continued_record.cooperation_party,
"transaction_amount": continued_record.transaction_amount,
"target_amount": continued_record.target_amount,
})
elif primary_department == '艾力芬特':
continued_record = get_object_or_404(ChildProjectLedgerB, project_id=project)
data.update({
"project_type": continued_record.project_type,
"partner": continued_record.partner,
"start_interest_date": continued_record.start_interest_date,
"interest_payment_date": continued_record.interest_payment_date,
"number_of_people": continued_record.number_of_people,
"amount": continued_record.amount,
})
elif primary_department == '星河':
continued_record = get_object_or_404(ChildProjectLedgerC, project_id=project)
data.update({
"project_type": continued_record.project_type,
"resource_party": continued_record.resource_party,
"cooperation_party": continued_record.cooperation_party,
"service_period": continued_record.service_period,
})
elif primary_department == '星海':
continued_record = get_object_or_404(ChildProjectLedgerD, project_id=project)
data.update({
"project_type": continued_record.project_type,
"capital_demand_party": continued_record.capital_demand_party,
"capital_provider": continued_record.capital_provider,
"financing_method": continued_record.financing_method,
"target_amount": continued_record.target_amount,
"term": continued_record.term,
"nominal_rate": continued_record.nominal_rate,
"total_cost": continued_record.total_cost,
"trade_type": continued_record.trade_type,
"trade_entity": continued_record.trade_entity,
"trade_service_provider": continued_record.trade_service_provider,
"trade_variety": continued_record.trade_variety,
"demand_party": continued_record.demand_party,
"supply_party": continued_record.supply_party,
})
else:
return JsonResponse({"error": "无效的一级部门"}, status=400)
return JsonResponse(data)
@csrf_exempt
def edit_continued_detail(request, project_id):
project = get_object_or_404(ProjectLedger, pk=project_id)
primary_department = project.primary_department
if primary_department == '天信':
continued_record = get_object_or_404(ChildProjectLedgerA, project_id=project)
form = ChildProjectLedgerAForm(request.POST, instance=continued_record)
elif primary_department == '艾力芬特':
continued_record = get_object_or_404(ChildProjectLedgerB, project_id=project)
form = ChildProjectLedgerBForm(request.POST, instance=continued_record)
elif primary_department == '星河':
continued_record = get_object_or_404(ChildProjectLedgerC, project_id=project)
form = ChildProjectLedgerCForm(request.POST, instance=continued_record)
elif primary_department == '星海':
continued_record = get_object_or_404(ChildProjectLedgerD, project_id=project)
form = ChildProjectLedgerDForm(request.POST, instance=continued_record)
else:
return JsonResponse({"error": "无效的一级部门"}, status=400)
if form.is_valid():
form.save()
return JsonResponse({"message": "保存成功"})
else:
return JsonResponse({"errors": form.errors}, status=400)