diff --git a/User/views.py b/User/views.py index 305ab31..ceb998b 100644 --- a/User/views.py +++ b/User/views.py @@ -1386,36 +1386,7 @@ class approvalProcessing(APIView): except Payment.DoesNotExist: return Response({'status': 'error', 'message': '付款申请记录不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - # 检查支付方式 - payment_type = getattr(payment, 'payment_type', '律所支付') - - # 如果是律所支付,且当前是律所负责人审批 - if payment_type == "律所支付" and not is_finance_personincharge(approval.personincharge): - # 律所负责人审批 - if not state: - return Response({'status': 'error', 'message': '缺少参数state(审核状态:已通过/未通过)', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - - if state == "已通过": - # 律所负责人同意后,抄送给财务部负责人 - from User.utils import get_finance_personincharge_value - finance_personincharge = get_finance_personincharge_value() - approval.personincharge = finance_personincharge - approval.state = "已抄送财务" - approval.content = approval.content + ",已抄送财务部" - approval.save(update_fields=['personincharge', 'state', 'content']) - - payment.state = "已通过" - payment.save(update_fields=['state']) - return Response({'message': '处理成功,已抄送财务', 'code': 0}, status=status.HTTP_200_OK) - else: - # 律所负责人不同意 - approval.state = "未通过" - approval.save(update_fields=['state']) - payment.state = "未通过" - payment.save(update_fields=['state']) - return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK) - - # 如果是财务审核(自己账户支付或律所支付已到财务阶段) + # 检查当前是否已经是财务审核 if is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务": # 财务部审核逻辑:如果只传了type和id,不传state,则默认为"已通过" if not state: @@ -1431,7 +1402,8 @@ class approvalProcessing(APIView): approval.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) diff --git a/finance/views.py b/finance/views.py index d5d75f5..22eb24c 100644 --- a/finance/views.py +++ b/finance/views.py @@ -1974,11 +1974,12 @@ class PaymentRequest(APIView): 4、收款方名称 5、收款方银行账号 6、收款方开户行 - 7、申请人 + 7、申请人(通过token自动获取) 8、支付说明 - 抄送逻辑: - - 如果是律所支付:抄送给律所负责人审批,生成待办,律所负责人同意后抄送给财务部负责人 - - 如果是自己账户支付:直接抄送财务负责人 + 9、审批人(可选,多人团队时需要) + 审批逻辑和离职逻辑一样: + - 个人团队(personal/独立律师):不触发审批,直接抄送财务 + - 团队(team/团队律师):需要审批,按顺序依次审批,最后抄送财务 :param request: :param args: :param kwargs: @@ -1990,9 +1991,11 @@ class PaymentRequest(APIView): payee_name = request.data.get('payee_name') # 收款方名称 payee_account = request.data.get('payee_account') # 收款方银行账号 payee_bank = request.data.get('payee_bank') # 收款方开户行 - applicant = request.data.get('applicant') # 申请人 payment_description = request.data.get('payment_description') # 支付说明 - payment_type = request.data.get('payment_type', '律所支付') # 支付方式:律所支付/自己账户支付 + approvers = request.data.get('approvers') # 审核人列表(可选,多人团队时需要,推荐:用户ID数组如[1,2,3],兼容:用户名数组) + # 兼容旧接口:如果传了 personincharge,转换为 approvers + personincharge = request.data.get('personincharge') + approvers = normalize_approvers_param(approvers, personincharge) # 兼容旧字段 reason = request.data.get('reason') or payment_reason @@ -2000,8 +2003,8 @@ class PaymentRequest(APIView): bankcard = request.data.get('bankcard') or payee_account BankName = request.data.get('BankName') or payee_bank - # 必填字段验证 - if not all([payment_reason or reason, amount, payee_name or payee, payee_account or bankcard, payee_bank or BankName, applicant, payment_description]): + # 必填字段验证(申请人通过token获取,不需要验证) + if not all([payment_reason or reason, amount, payee_name or payee, payee_account or bankcard, payee_bank or BankName, payment_description]): missing_params = [] if not (payment_reason or reason): missing_params.append('payment_reason(付款事由)') @@ -2013,8 +2016,6 @@ class PaymentRequest(APIView): missing_params.append('payee_account(收款方银行账号)') if not (payee_bank or BankName): missing_params.append('payee_bank(收款方开户行)') - if not applicant: - missing_params.append('applicant(申请人)') if not payment_description: missing_params.append('payment_description(支付说明)') return Response({ @@ -2023,17 +2024,33 @@ class PaymentRequest(APIView): 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) + # 从token获取申请人 + token = request.META.get('token') + try: + applicant_user = User.objects.get(token=token, is_deleted=False) + applicant = applicant_user.username + except User.DoesNotExist: + return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, + status=status.HTTP_401_UNAUTHORIZED) + from datetime import datetime now = datetime.now() date_string = now.strftime("%Y-%m-%d") # 获取申请人的团队信息 - team_name = None - try: - applicant_user = User.objects.get(username=applicant, is_deleted=False) - team_name = applicant_user.team - except User.DoesNotExist: - return Response({'status': 'error', 'message': '申请人不存在', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + team_name = applicant_user.team + team = None + if team_name: + from User.models import Team + try: + team = Team.objects.get(name=team_name, is_deleted=False) + except Team.DoesNotExist: + # 如果团队不存在,默认按团队类型处理(需要审批) + pass + + # 根据团队类型决定初始状态 + # 如果是团队类型且需要审核,状态为"审核中";否则为"已通过"(直接抄送财务) + initial_state = "审核中" if (team and team.team_type == 'team') else "已通过" # 创建付款申请记录 pay = Payment.objects.create( @@ -2047,7 +2064,7 @@ class PaymentRequest(APIView): payment_description=payment_description, payment_type=payment_type, submit_tiem=date_string, - state="审核中", + state=initial_state, # 兼容旧字段 reason=reason or payment_reason, payee=payee or payee_name, @@ -2069,45 +2086,27 @@ class PaymentRequest(APIView): content_parts.insert(3, f"付款日期:{times}") content = ",".join(content_parts) - # 根据支付方式决定审批流程 - from User.utils import get_finance_personincharge_value, get_law_firm_leader - from User.models import Approval - - if payment_type == "律所支付": - # 律所支付:先抄送给律所负责人审批 - law_firm_leader = get_law_firm_leader(team_name) - if not law_firm_leader: - return Response({ - 'status': 'error', - 'message': '无法找到律所负责人,请检查团队配置或管委会角色', - 'code': 1 - }, status=status.HTTP_400_BAD_REQUEST) - - approval = Approval.objects.create( - title=applicant + "提交付款申请", - content=content, - times=date_string, - personincharge=law_firm_leader, - state="审核中", - type="付款申请", - user_id=str(pay.id) - ) - pay.state = "审核中" - pay.save(update_fields=['state']) - else: - # 自己账户支付:直接抄送财务负责人 - finance_personincharge = get_finance_personincharge_value() - approval = Approval.objects.create( - title=applicant + "提交付款申请", - content=content, - times=date_string, - personincharge=finance_personincharge, - state="已抄送财务", - type="付款申请", - user_id=str(pay.id) - ) - pay.state = "已通过" # 自己账户支付直接通过 - pay.save(update_fields=['state']) + # 使用统一的审核流程函数(与离职逻辑一样) + from User.utils import create_approval_with_team_logic + + approval, approvers_order_json, needs_approval = create_approval_with_team_logic( + team_name=team_name, + approvers=approvers, + title=applicant + "提交付款申请", + content=content, + approval_type="付款申请", + user_id=str(pay.id), + business_record=pay, + today=date_string + ) + + # 如果返回None且需要审核,说明缺少审核人 + if approval is None and needs_approval: + return Response({ + 'status': 'error', + 'message': build_missing_approvers_message(team_name, approvers), + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) # 记录操作日志 new_data = { @@ -2137,7 +2136,10 @@ class PaymentRequest(APIView): 'data': { 'id': pay.id, 'state': pay.state, - 'approval_id': approval.id if approval else None + 'approval_id': approval.id if approval else None, + 'needs_approval': team is None or team.team_type != 'personal', # 是否需要审批(前端用这个字段判断是团队还是个人) + 'team_type': team.team_type if team else None, # 团队类型:personal/team(前端用这个字段判断) + 'team_name': team_name # 团队名称 } }, status=status.HTTP_200_OK)