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)