diff --git a/User/views.py b/User/views.py index abbfeb1..8805ba7 100644 --- a/User/views.py +++ b/User/views.py @@ -1659,7 +1659,10 @@ class approvalProcessing(APIView): # 检查当前是否已经是财务审核 if is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务": - # 财务部审核逻辑:财务部只需要一个人审核完即可完成 + # 财务部审核逻辑:如果只传了type和id,不传state,则默认为"已通过" + if not state: + state = "已通过" + if state == "已通过": approval.state = "已通过" seal_app.state = "已通过" @@ -1670,7 +1673,11 @@ class approvalProcessing(APIView): seal_app.save(update_fields=['state']) return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK) - # 使用统一的审核流程处理函数 + # 使用统一的审核流程处理函数(与付款申请、报销申请逻辑一样) + # 非财务查看时,state参数是必填的 + if not state: + return Response({'status': 'error', 'message': '缺少参数state(审核状态:已通过/未通过)', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + from User.utils import process_approval_flow current_approver = approval.personincharge is_completed, error = process_approval_flow( @@ -2190,6 +2197,7 @@ class ApprovalStatusCheck(APIView): def post(self, request, *args, **kwargs): """ 查询待办的审核状态,判断是否已经审核完全通过 + 财务部查看时,自动将状态从"已抄送财务"更新为"已通过",使其从待办列表中移除 :param request: :param args: :param kwargs: @@ -2197,6 +2205,7 @@ class ApprovalStatusCheck(APIView): """ type = request.data.get('type') id = request.data.get('id') + token = request.META.get('token') if not all([type, id]): return Response({'status': 'error', 'message': '缺少参数type或id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) @@ -2206,6 +2215,24 @@ class ApprovalStatusCheck(APIView): except Approval.DoesNotExist: return Response({'status': 'error', 'message': '审批记录不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + # 获取当前用户信息,判断是否是财务部人员 + is_finance_view = False + if token: + try: + current_user = User.objects.prefetch_related('department').get(token=token, is_deleted=False) + user_departments = current_user.department.values_list('username', flat=True) + user_department_names = list(user_departments) + is_finance_user = '财务部' in user_department_names + + # 如果是财务部人员,且当前审批状态是"已抄送财务",则自动标记为已查看(已通过) + if is_finance_user and is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务": + is_finance_view = True + # 自动将状态更新为"已通过" + approval.state = "已通过" + approval.save(update_fields=['state']) + except User.DoesNotExist: + pass + # 获取业务记录状态 business_state = None is_approved = False @@ -2217,6 +2244,7 @@ class ApprovalStatusCheck(APIView): income = Income.objects.get(id=approval.user_id, is_deleted=False) business_state = income.state is_approved = (income.state == "已通过") + # 如果财务查看,且业务记录状态还是"已通过"(之前已经是已通过),保持状态不变 except Income.DoesNotExist: pass elif type == "开票": @@ -2225,6 +2253,12 @@ class ApprovalStatusCheck(APIView): invoice = Invoice.objects.get(id=approval.user_id, is_deleted=False) business_state = invoice.state is_approved = (invoice.state == "已通过") + # 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态 + if is_finance_view and invoice.state != "已通过": + invoice.state = "已通过" + invoice.save(update_fields=['state']) + business_state = "已通过" + is_approved = True except Invoice.DoesNotExist: pass elif type == "付款申请": @@ -2233,6 +2267,12 @@ class ApprovalStatusCheck(APIView): payment = Payment.objects.get(id=approval.user_id, is_deleted=False) business_state = payment.state is_approved = (payment.state == "已通过") + # 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态 + if is_finance_view and payment.state != "已通过": + payment.state = "已通过" + payment.save(update_fields=['state']) + business_state = "已通过" + is_approved = True except Payment.DoesNotExist: pass elif type == "报销申请": @@ -2241,6 +2281,12 @@ class ApprovalStatusCheck(APIView): reimbursement = Reimbursement.objects.get(id=approval.user_id, is_deleted=False) business_state = reimbursement.state is_approved = (reimbursement.state == "已完成") + # 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态 + if is_finance_view and reimbursement.state != "已通过": + reimbursement.state = "已通过" + reimbursement.save(update_fields=['state']) + business_state = "已通过" + is_approved = True except Reimbursement.DoesNotExist: pass elif type == "案件管理": @@ -2249,8 +2295,28 @@ class ApprovalStatusCheck(APIView): case = Case.objects.get(id=approval.user_id, is_deleted=False) business_state = case.state is_approved = (case.state == "已通过") + # 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态 + if is_finance_view and case.state != "已通过": + case.state = "已通过" + case.save(update_fields=['state']) + business_state = "已通过" + is_approved = True except Case.DoesNotExist: pass + elif type == "申请用印": + from business.models import SealApplication + try: + seal_app = SealApplication.objects.get(id=approval.user_id, is_deleted=False) + business_state = seal_app.state + is_approved = (seal_app.state == "已通过") + # 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态 + if is_finance_view and seal_app.state != "已通过": + seal_app.state = "已通过" + seal_app.save(update_fields=['state']) + business_state = "已通过" + is_approved = True + except SealApplication.DoesNotExist: + pass # 可以根据需要添加其他类型 except Exception as e: import logging @@ -2265,7 +2331,8 @@ class ApprovalStatusCheck(APIView): 'approval_state': approval.state, 'business_state': business_state, 'is_approved': is_approved, # 是否已经审核完全通过 - 'type': type + 'type': type, + 'auto_marked_as_viewed': is_finance_view # 是否已自动标记为已查看 } }, status=status.HTTP_200_OK) diff --git a/business/views.py b/business/views.py index 409428e..bf9f400 100644 --- a/business/views.py +++ b/business/views.py @@ -2198,7 +2198,11 @@ class Application(APIView): """ token = request.META.get('token') Printingpurpose = request.data.get('Printingpurpose') + # 案件编号(前端可不传),后端自动同步为“合同号” + # 兼容:仍支持直接传 CaseNumber(即合同号) CaseNumber = request.data.get('CaseNumber') + case_id = request.data.get('case_id') + project_id = request.data.get('project_id') Reason = request.data.get('Reason') seal_number = request.data.get('seal_number') seal_type = request.data.get('seal_type') @@ -2212,9 +2216,35 @@ class Application(APIView): now = datetime.now() date_str = now.strftime('%Y-%m-%d') user = User.objects.get(token=token, is_deleted=False) + + # 自动查询合同号写入 CaseNumber(案件编号) + # 优先级:case_id > project_id > CaseNumber(兼容旧传参) + contract_no = None + if case_id: + try: + case = Case.objects.select_related('project').get(id=case_id, is_deleted=False) + contract_no = case.contract_no or (case.project.ContractNo if case.project else None) + except Case.DoesNotExist: + return Response({'status': 'error', 'message': '案件不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + elif project_id: + try: + project = ProjectRegistration.objects.get(id=project_id, is_deleted=False) + contract_no = project.ContractNo + except ProjectRegistration.DoesNotExist: + return Response({'status': 'error', 'message': '立项登记不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + else: + contract_no = CaseNumber + + if not contract_no: + return Response({ + 'status': 'error', + 'message': '缺少案件信息:请传 case_id 或 project_id 以自动获取合同号,或直接传 CaseNumber(合同号)', + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) + sea = SealApplication.objects.create( Printingpurpose=Printingpurpose, - CaseNumber=CaseNumber, + CaseNumber=contract_no, Reason=Reason, seal_number=seal_number, seal_type=seal_type, @@ -2230,7 +2260,7 @@ class Application(APIView): team_name=team_name, approvers=approvers, title=user.username + "申请用印", - content=user.username + "在" + date_str + "申请用印,用印事由:" + Reason + ",盖章份数:" + seal_number + "盖着类型:" + seal_type, + content=user.username + "在" + date_str + "申请用印,合同编号:" + str(contract_no) + ",用印事由:" + Reason + ",盖章份数:" + seal_number + "盖着类型:" + seal_type, approval_type="申请用印", user_id=sea.id, business_record=sea, @@ -2308,7 +2338,10 @@ class EditApplication(APIView): """ id = request.data.get('id') Printingpurpose = request.data.get('Printingpurpose') + # 案件编号(合同号):支持前端直接传,也支持通过 case_id/project_id 自动同步 CaseNumber = request.data.get('CaseNumber') + case_id = request.data.get('case_id') + project_id = request.data.get('project_id') Reason = request.data.get('Reason') seal_number = request.data.get('seal_number') seal_type = request.data.get('seal_type') @@ -2329,8 +2362,25 @@ class EditApplication(APIView): if Printingpurpose: app.Printingpurpose = Printingpurpose app.save(update_fields=['Printingpurpose']) - if CaseNumber: - app.CaseNumber = CaseNumber + # 优先通过 case_id / project_id 自动同步合同号 + contract_no = None + if case_id: + try: + case = Case.objects.select_related('project').get(id=case_id, is_deleted=False) + contract_no = case.contract_no or (case.project.ContractNo if case.project else None) + except Case.DoesNotExist: + return Response({'status': 'error', 'message': '案件不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + elif project_id: + try: + project = ProjectRegistration.objects.get(id=project_id, is_deleted=False) + contract_no = project.ContractNo + except ProjectRegistration.DoesNotExist: + return Response({'status': 'error', 'message': '立项登记不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + elif CaseNumber: + contract_no = CaseNumber + + if contract_no: + app.CaseNumber = contract_no app.save(update_fields=['CaseNumber']) if Reason: app.Reason = Reason @@ -2354,7 +2404,7 @@ class EditApplication(APIView): team_name=team_name, approvers=approvers, title=app.username + "申请用印重新编辑", - content=app.username + "在" + date_str + "申请用印,用印事由:" + ( + content=app.username + "在" + date_str + "申请用印,合同编号:" + str(contract_no or app.CaseNumber) + ",用印事由:" + ( Reason or app.Reason) + ",盖章份数:" + (seal_number or app.seal_number) + "盖着类型:" + ( seal_type or app.seal_type), approval_type="申请用印",