diff --git a/API接口文档.md b/API接口文档.md index 89b83b1..4702d8f 100644 --- a/API接口文档.md +++ b/API接口文档.md @@ -1300,6 +1300,8 @@ ``` #### 3.1.2 离职财务登记 + +##### 3.1.2.1 创建离职登记 - **URL**: `/finance/user-departure` - **方法**: `POST` - **功能**: 离职财务登记。如果用户有案件(作为承办人员),需要先转移案件才能完成离职登记 @@ -1340,6 +1342,77 @@ } ``` +##### 3.1.2.2 离职登记列表查询 +- **URL**: `/finance/user-departure-detail` +- **方法**: `POST` +- **功能**: 查询离职登记列表,支持分页和筛选 +- **请求参数**: + - `page` (integer, 必填): 页码 + - `per_page` (integer, 必填): 每页数量 + - `username` (string, 可选): 用户名(模糊搜索) + - `times` (string, 可选): 开始时间(格式:YYYY-MM-DD) + - `end_time` (string, 可选): 结束时间(格式:YYYY-MM-DD) + - `state` (string, 可选): 审批状态("审核中"、"已通过"、"未通过") +- **响应示例**: +```json +{ + "message": "查询成功", + "total": 50, + "data": [ + { + "id": 1, + "title": "张三离职财务登记", + "content": "张三在2025-01-01办理离职登记", + "times": "2025-01-01", + "completeTiem": null, + "personincharge": "李四", + "state": "审核中", + "type": "离职财务登记", + "user_id": "1", + "user_info": { + "id": 1, + "username": "张三", + "account": "zhangsan", + "position": "律师", + "Dateofdeparture": "2025-01-01", + "state": "已离职" + } + } + ], + "code": 0 +} +``` + +##### 3.1.2.3 编辑离职登记 +- **URL**: `/finance/editUserDeparture` +- **方法**: `POST` +- **功能**: 编辑离职登记信息 +- **请求参数**: + - `id` (integer, 必填): 审批记录ID + - `Dateofdeparture` (string, 可选): 离职时间(格式:YYYY-MM-DD) + - `personincharge` (string, 可选): 负责人 +- **响应示例**: +```json +{ + "message": "编辑成功", + "code": 0 +} +``` + +##### 3.1.2.4 删除离职登记 +- **URL**: `/finance/deleteUserDeparture` +- **方法**: `POST` +- **功能**: 删除离职登记记录,并恢复用户状态为"在职",清空离职时间 +- **请求参数**: + - `id` (integer, 必填): 审批记录ID +- **响应示例**: +```json +{ + "message": "删除成功,用户状态已恢复为\"在职\"", + "code": 0 +} +``` + ### 3.2 开票管理 #### 3.2.1 创建开票申请 diff --git a/finance/urls.py b/finance/urls.py index 04aa24a..193c560 100644 --- a/finance/urls.py +++ b/finance/urls.py @@ -1,9 +1,12 @@ -from .views import UserRegister,UserDeparture,issueAnInvoice,issueAnInvoiceDetail,confirm,loan,PaymentRequest,reimbursement,confirmdisplay,loandisplay,PaymentDisplay,reimbursementdetail,Change,ChangeDetail,EditInvoice,DeleteInvoice,EditIncome,DeleteIncome,EditAccounts,DeleteAccounts,EditPayment,DeletePayment,EditReimbursement,DeleteReimbursement,EditBonusChange,DeleteBonusChange +from .views import UserRegister,UserDeparture,UserDepartureDetail,EditUserDeparture,DeleteUserDeparture,issueAnInvoice,issueAnInvoiceDetail,confirm,loan,PaymentRequest,reimbursement,confirmdisplay,loandisplay,PaymentDisplay,reimbursementdetail,Change,ChangeDetail,EditInvoice,DeleteInvoice,EditIncome,DeleteIncome,EditAccounts,DeleteAccounts,EditPayment,DeletePayment,EditReimbursement,DeleteReimbursement,EditBonusChange,DeleteBonusChange from django.urls import path urlpatterns = [ path("user-register", UserRegister.as_view(), name="user-register/"), path("user-departure", UserDeparture.as_view(), name="user-departure/"), + path("user-departure-detail", UserDepartureDetail.as_view(), name="user-departure-detail/"), + path("editUserDeparture", EditUserDeparture.as_view(), name="editUserDeparture/"), + path("deleteUserDeparture", DeleteUserDeparture.as_view(), name="deleteUserDeparture/"), path("issue-invoice", issueAnInvoice.as_view(), name="issue-invoice/"), path('issue-Detail', issueAnInvoiceDetail.as_view(), name="issue-Detail/"), path('editInvoice', EditInvoice.as_view(), name="editInvoice/"), diff --git a/finance/views.py b/finance/views.py index e43f818..6805fd5 100644 --- a/finance/views.py +++ b/finance/views.py @@ -1117,3 +1117,181 @@ class UserDeparture(APIView): } }, status=status.HTTP_200_OK) + +class UserDepartureDetail(APIView): + def post(self, request, *args, **kwargs): + """ + 离职登记列表查询 + :param request: + :param args: + :param kwargs: + :return: + """ + page = request.data.get('page') + per_page = request.data.get('per_page') + username = request.data.get('username') # 用户名搜索 + times = request.data.get('times') # 开始时间 + end_time = request.data.get('end_time') # 结束时间 + state = request.data.get('state') # 审批状态 + + if not all([page, per_page]): + return Response({'status': 'error', 'message': '缺少参数:页码和每页数量不能为空', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + # 查询离职财务登记的审批记录 + Q_obj = Q(type="离职财务登记") + + if username: + Q_obj &= Q(title__icontains=username) | Q(content__icontains=username) + if times and end_time: + Q_obj &= Q(times__gte=times) & Q(times__lte=end_time) + if state: + Q_obj &= Q(state=state) + + approvals = Approval.objects.filter(Q_obj).order_by('-id') + total = len(approvals) + + paginator = Paginator(approvals, per_page) + try: + user_agents_page = paginator.page(page) + except PageNotAnInteger: + user_agents_page = paginator.page(1) + except EmptyPage: + user_agents_page = paginator.page(paginator.num_pages) + + data = [] + for approval in user_agents_page.object_list: + # 获取用户信息 + try: + user = User.objects.get(id=int(approval.user_id)) + user_info = { + 'id': user.id, + 'username': user.username, + 'account': user.account, + 'position': user.position, + 'Dateofdeparture': user.Dateofdeparture.strftime("%Y-%m-%d") if user.Dateofdeparture else None, + 'state': user.state + } + except (User.DoesNotExist, ValueError): + user_info = { + 'id': None, + 'username': '用户不存在', + 'account': '', + 'position': '', + 'Dateofdeparture': None, + 'state': '' + } + + item = { + 'id': approval.id, + 'title': approval.title, + 'content': approval.content, + 'times': approval.times.strftime("%Y-%m-%d") if approval.times else None, + 'completeTiem': approval.completeTiem.strftime("%Y-%m-%d") if approval.completeTiem else None, + 'personincharge': approval.personincharge, + 'state': approval.state, + 'type': approval.type, + 'user_id': approval.user_id, + 'user_info': user_info + } + data.append(item) + + return Response({ + 'message': '查询成功', + 'total': total, + 'data': data, + 'code': 0 + }, status=status.HTTP_200_OK) + + +class EditUserDeparture(APIView): + def post(self, request, *args, **kwargs): + """ + 编辑离职登记 + :param request: + :param args: + :param kwargs: + :return: + """ + id = request.data.get('id') # 审批记录ID + Dateofdeparture = request.data.get('Dateofdeparture') # 离职时间 + personincharge = request.data.get('personincharge') # 负责人 + + if not id: + return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + try: + approval = Approval.objects.get(id=id, type="离职财务登记") + except Approval.DoesNotExist: + return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + + # 获取用户信息 + try: + user = User.objects.get(id=int(approval.user_id)) + except (User.DoesNotExist, ValueError): + return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + + update_fields_list = [] + approval_update_fields = [] + + # 更新离职时间 + if Dateofdeparture: + try: + Dateofdepartures = datetime.datetime.strptime(Dateofdeparture, "%Y-%m-%d") + user.Dateofdeparture = Dateofdepartures + update_fields_list.append('Dateofdeparture') + # 更新审批记录内容 + approval.content = user.username + "在" + Dateofdeparture + "办理离职登记" + approval_update_fields.append('content') + except ValueError: + return Response({'status': 'error', 'message': '离职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + # 更新负责人 + if personincharge: + approval.personincharge = personincharge + approval_update_fields.append('personincharge') + + # 保存更新 + if update_fields_list: + user.save(update_fields=update_fields_list) + if approval_update_fields: + approval.save(update_fields=approval_update_fields) + + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) + + +class DeleteUserDeparture(APIView): + def post(self, request, *args, **kwargs): + """ + 删除离职登记 + 删除离职登记记录,并恢复用户状态为"在职",清空离职时间 + :param request: + :param args: + :param kwargs: + :return: + """ + id = request.data.get('id') # 审批记录ID + + if not id: + return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) + + try: + approval = Approval.objects.get(id=id, type="离职财务登记") + except Approval.DoesNotExist: + return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + + # 获取用户信息 + try: + user = User.objects.get(id=int(approval.user_id)) + except (User.DoesNotExist, ValueError): + return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) + + # 恢复用户状态 + user.state = "在职" + user.Dateofdeparture = None + user.save(update_fields=['state', 'Dateofdeparture']) + + # 删除审批记录 + approval.delete() + + return Response({'message': '删除成功,用户状态已恢复为"在职"', 'code': 0}, status=status.HTTP_200_OK) +