“1024人事工作流修改1.0版本”
This commit is contained in:
1 parent
2f2e303781
commit
13cabfcb6c
236 files changed
+2510
-59666
No files matched your search
@@ -92,6 +92,10 @@ export interface OverseasApplicationVO {
|
||||
politicalStatusText?: string;
|
||||
administrativeLevelText?: string;
|
||||
personnelCategoryText?: string;
|
||||
// 工作流相关字段
|
||||
approvalStatus?: string; // 工作流审批状态:draft/waiting/finish/back/cancel
|
||||
approvalStatusText?: string; // 工作流审批状态文本
|
||||
taskId?: string; // 当前待办任务ID(用于审批跳转)
|
||||
}
|
||||
|
||||
// 出国申请表单类型
|
||||
@@ -144,6 +148,8 @@ export interface OverseasApplicationForm {
|
||||
accommodationPlan?: string;
|
||||
transportationPlan?: string;
|
||||
applicantRemark?: string;
|
||||
// 工作流相关字段
|
||||
approvalStatus?: string; // 工作流审批状态
|
||||
}
|
||||
|
||||
// 审批请求类型
|
||||
@@ -179,6 +185,7 @@ export interface OverseasRecordVO {
|
||||
applicantName: string;
|
||||
department: string;
|
||||
position: string;
|
||||
positionText?: string; // 职务文本(用于显示)
|
||||
contactPhone: string;
|
||||
contactEmail: string;
|
||||
purpose: string;
|
||||
|
||||
@@ -1,291 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 党籍保留查询参数
|
||||
export interface PartyRetentionQuery extends PageQuery {
|
||||
/** 申请人姓名 */
|
||||
name?: string
|
||||
/** 身份证号 */
|
||||
idNumber?: string
|
||||
/** 工作部门 */
|
||||
department?: string
|
||||
/** 目的地 */
|
||||
destination?: string
|
||||
/** 申请状态 */
|
||||
status?: string
|
||||
/** 申请时间开始 */
|
||||
applicationTimeStart?: string
|
||||
/** 申请时间结束 */
|
||||
applicationTimeEnd?: string
|
||||
}
|
||||
|
||||
// 党籍保留历史查询参数(实际使用与 PartyRetentionQuery 相同的字段)
|
||||
export interface PartyRetentionHistoryQuery extends PageQuery {
|
||||
/** 申请人姓名 */
|
||||
name?: string
|
||||
/** 目的地 */
|
||||
destination?: string
|
||||
/** 状态(后端会强制设置为'2'只查询已通过的记录) */
|
||||
status?: string
|
||||
}
|
||||
|
||||
// 党籍保留VO
|
||||
export interface PartyRetentionVO {
|
||||
/** 保留ID */
|
||||
retentionId: string
|
||||
/** 申请人姓名 */
|
||||
name: string
|
||||
/** 性别 */
|
||||
gender: string
|
||||
/** 身份证号 */
|
||||
idNumber: string
|
||||
/** 工作部门 */
|
||||
department: string
|
||||
/** 配偶姓名 */
|
||||
spouse?: string
|
||||
/** 亲属姓名(探望对象) */
|
||||
relativeName?: string
|
||||
/** 目的地 */
|
||||
destination: string
|
||||
/** 出国目的 */
|
||||
purpose: string
|
||||
/** 出国开始时间 */
|
||||
travelStartDate: string
|
||||
/** 出国结束时间 */
|
||||
travelEndDate: string
|
||||
/** 停留天数 */
|
||||
stayDays: number
|
||||
/** 费用自理 */
|
||||
selfFunded: string
|
||||
/** 党支部 */
|
||||
partyBranch: string
|
||||
/** 申请日期 */
|
||||
applicationDate: string
|
||||
/** 申请状态 */
|
||||
status: string
|
||||
/** 申请状态文本 */
|
||||
statusText: string
|
||||
/** 申请时间 */
|
||||
applicationTime: string
|
||||
/** 创建时间 */
|
||||
createTime: string
|
||||
/** 更新时间 */
|
||||
updateTime: string
|
||||
}
|
||||
|
||||
// 党籍保留历史VO
|
||||
export interface PartyRetentionHistoryVO {
|
||||
/** 历史ID */
|
||||
historyId: string
|
||||
/** 申请人姓名 */
|
||||
applicantName: string
|
||||
/** 出国原因 */
|
||||
travelReason: string
|
||||
/** 目的地 */
|
||||
destination: string
|
||||
/** 保留开始时间 */
|
||||
retentionStartDate: string
|
||||
/** 保留结束时间 */
|
||||
retentionEndDate: string
|
||||
/** 完成状态 */
|
||||
completionStatus: string
|
||||
/** 完成状态文本 */
|
||||
completionStatusText: string
|
||||
/** 创建时间 */
|
||||
createTime: string
|
||||
}
|
||||
|
||||
// 党籍保留表单
|
||||
export interface PartyRetentionForm {
|
||||
/** 保留ID */
|
||||
retentionId?: string
|
||||
/** 申请人姓名 */
|
||||
name: string
|
||||
/** 配偶姓名 */
|
||||
spouse?: string
|
||||
/** 亲属姓名(探望对象) */
|
||||
relativeName?: string
|
||||
/** 目的地 */
|
||||
destination: string
|
||||
/** 出国目的 */
|
||||
purpose: string
|
||||
/** 出国时间范围 */
|
||||
travelPeriod?: string[]
|
||||
/** 出国开始时间 */
|
||||
travelStartDate?: string
|
||||
/** 出国结束时间 */
|
||||
travelEndDate?: string
|
||||
/** 停留天数 */
|
||||
stayDays: number
|
||||
/** 费用自理 */
|
||||
selfFunded: string
|
||||
/** 党支部 */
|
||||
partyBranch: string
|
||||
/** 申请日期 */
|
||||
applicationDate: string
|
||||
/** 请求批准内容 */
|
||||
requestApproval?: string
|
||||
/** 最终批准内容 */
|
||||
finalApproval?: string
|
||||
}
|
||||
|
||||
// 查询党籍保留列表
|
||||
export function getPartyRetentionList(query: PartyRetentionQuery) {
|
||||
return request({
|
||||
url: '/rs/party/retention/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询党籍保留详细
|
||||
export function getPartyRetention(retentionId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/' + retentionId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增党籍保留
|
||||
export function addPartyRetention(data: PartyRetentionForm) {
|
||||
return request({
|
||||
url: '/rs/party/retention',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改党籍保留
|
||||
export function updatePartyRetention(data: PartyRetentionForm) {
|
||||
return request({
|
||||
url: '/rs/party/retention',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除党籍保留
|
||||
export function delPartyRetention(retentionId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/' + retentionId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 提交党籍保留申请
|
||||
export function submitPartyRetention(data: { retentionId: string }) {
|
||||
return request({
|
||||
url: '/rs/party/retention/submit/' + data.retentionId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
// 撤回党籍保留申请
|
||||
export function cancelPartyRetention(retentionId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/withdraw/' + retentionId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增并提交党籍保留申请
|
||||
export function addAndSubmitPartyRetention(data: PartyRetentionForm) {
|
||||
return request({
|
||||
url: '/rs/party/retention/saveAndSubmit',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 导出党籍保留列表
|
||||
export function exportPartyRetention(query: PartyRetentionQuery) {
|
||||
return request({
|
||||
url: '/rs/party/retention/export',
|
||||
method: 'post',
|
||||
data: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询党籍保留历史列表
|
||||
export function getPartyRetentionHistoryList(query: PartyRetentionHistoryQuery) {
|
||||
return request({
|
||||
url: '/rs/party/retention/history/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询党籍保留历史详细
|
||||
export function getPartyRetentionHistory(historyId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/history/' + historyId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 修改党籍保留历史
|
||||
export function updatePartyRetentionHistory(data: any) {
|
||||
return request({
|
||||
url: '/rs/party/retention/history',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 导出党籍保留历史
|
||||
export function exportPartyRetentionHistory(query: PartyRetentionHistoryQuery) {
|
||||
return request({
|
||||
url: '/rs/party/retention/history/export',
|
||||
method: 'post',
|
||||
data: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
|
||||
// 党籍保留审批查询参数
|
||||
export interface PartyRetentionApprovalQuery extends PageQuery {
|
||||
/** 申请人姓名 */
|
||||
name?: string
|
||||
/** 身份证号 */
|
||||
idNumber?: string
|
||||
/** 工作部门 */
|
||||
department?: string
|
||||
/** 目的地 */
|
||||
destination?: string
|
||||
/** 审批状态 */
|
||||
status?: string
|
||||
}
|
||||
|
||||
// 审批请求参数
|
||||
export interface ApprovalRequest {
|
||||
/** 保留ID */
|
||||
retentionId: string
|
||||
/** 审批意见 */
|
||||
approvalOpinion: string
|
||||
/** 是否通过 */
|
||||
approved: boolean
|
||||
}
|
||||
|
||||
// 查询待审批党籍保留列表
|
||||
export function getPendingPartyRetentionList(query: PartyRetentionApprovalQuery) {
|
||||
return request({
|
||||
url: '/rs/party/retention/list',
|
||||
method: 'get',
|
||||
params: {
|
||||
...query,
|
||||
status: '1' // 只查询待审批状态
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 审批党籍保留
|
||||
export function approvePartyRetention(data: ApprovalRequest) {
|
||||
return request({
|
||||
url: `/rs/party/retention/approve/${data.retentionId}`,
|
||||
method: 'put',
|
||||
params: {
|
||||
approvalOpinion: data.approvalOpinion,
|
||||
approved: data.approved
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1,390 +0,0 @@
|
||||
# 党籍保留API路径修正完成报告
|
||||
|
||||
## 📋 问题概述
|
||||
|
||||
**发现时间**: 2025-10-08
|
||||
**问题现象**:
|
||||
- 点击"保存并提交"按钮提示保存失败
|
||||
- 浏览器F12 Network显示:`HTTP 405 - Request method 'POST' is not supported`
|
||||
|
||||
**问题根源**: 前端API路径与后端Controller接口路径不匹配
|
||||
|
||||
---
|
||||
|
||||
## 🔍 问题分析
|
||||
|
||||
### HTTP 405错误解释
|
||||
- **405 Method Not Allowed**: 请求方法不被允许
|
||||
- **常见原因**:
|
||||
1. 前端请求路径错误,导致匹配到不支持该方法的接口
|
||||
2. 前端请求方法与后端定义的方法不一致
|
||||
3. 路径参数传递方式不正确
|
||||
|
||||
### 具体问题定位
|
||||
通过对比前后端代码,发现以下3个接口存在路径或方法不匹配:
|
||||
|
||||
| 功能 | 前端路径/方法 | 后端路径/方法 | 状态 |
|
||||
|------|--------------|--------------|------|
|
||||
| 保存并提交 | `/addAndSubmit` POST | `/saveAndSubmit` POST | ❌ 路径错误 |
|
||||
| 提交申请 | `/submit` POST + Body | `/submit/{retentionId}` PUT + Path | ❌ 方法和参数错误 |
|
||||
| 撤回申请 | `/cancel/{retentionId}` PUT | `/withdraw/{retentionId}` PUT | ❌ 路径错误 |
|
||||
|
||||
---
|
||||
|
||||
## ✅ 修正内容
|
||||
|
||||
### 1. 保存并提交接口修正
|
||||
|
||||
**文件**: `web/src/api/rs/party-membership-retention.ts`
|
||||
|
||||
**修改前**:
|
||||
```typescript
|
||||
// 新增并提交党籍保留申请
|
||||
export function addAndSubmitPartyRetention(data: PartyRetentionForm) {
|
||||
return request({
|
||||
url: '/rs/party/retention/addAndSubmit', // ❌ 错误路径
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**修改后**:
|
||||
```typescript
|
||||
// 新增并提交党籍保留申请
|
||||
export function addAndSubmitPartyRetention(data: PartyRetentionForm) {
|
||||
return request({
|
||||
url: '/rs/party/retention/saveAndSubmit', // ✅ 正确路径
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**后端接口**:
|
||||
```java
|
||||
@PostMapping("/saveAndSubmit")
|
||||
public R<Void> saveAndSubmit(@Validated(AddGroup.class) @RequestBody RsPartyMembershipRetentionBo bo)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 提交申请接口修正
|
||||
|
||||
**文件**: `web/src/api/rs/party-membership-retention.ts`
|
||||
|
||||
**修改前**:
|
||||
```typescript
|
||||
// 提交党籍保留申请
|
||||
export function submitPartyRetention(data: { retentionId: string }) {
|
||||
return request({
|
||||
url: '/rs/party/retention/submit', // ❌ 缺少路径参数
|
||||
method: 'post', // ❌ 错误方法
|
||||
data: data // ❌ 应该用路径参数
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**修改后**:
|
||||
```typescript
|
||||
// 提交党籍保留申请
|
||||
export function submitPartyRetention(data: { retentionId: string }) {
|
||||
return request({
|
||||
url: '/rs/party/retention/submit/' + data.retentionId, // ✅ 添加路径参数
|
||||
method: 'put' // ✅ 改为PUT方法
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**后端接口**:
|
||||
```java
|
||||
@PutMapping("/submit/{retentionId}")
|
||||
public R<Void> submit(@NotNull(message = "主键不能为空") @PathVariable Long retentionId)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 撤回申请接口修正
|
||||
|
||||
**文件**: `web/src/api/rs/party-membership-retention.ts`
|
||||
|
||||
**修改前**:
|
||||
```typescript
|
||||
// 撤回党籍保留申请
|
||||
export function cancelPartyRetention(retentionId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/cancel/' + retentionId, // ❌ 错误路径
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**修改后**:
|
||||
```typescript
|
||||
// 撤回党籍保留申请
|
||||
export function cancelPartyRetention(retentionId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/withdraw/' + retentionId, // ✅ 正确路径
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**后端接口**:
|
||||
```java
|
||||
@PutMapping("/withdraw/{retentionId}")
|
||||
public R<Void> withdraw(@NotNull(message = "主键不能为空") @PathVariable Long retentionId)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 完整的前后端接口对照表
|
||||
|
||||
### 党籍保留主接口
|
||||
|
||||
| 序号 | 功能 | 前端方法 | 前端路径 | HTTP方法 | 后端路径 | 后端方法 | 状态 |
|
||||
|------|------|---------|---------|---------|---------|---------|------|
|
||||
| 1 | 查询列表 | `getPartyRetentionList` | `/list` | GET | `/list` | `list()` | ✅ 一致 |
|
||||
| 2 | 查询详情 | `getPartyRetention` | `/{retentionId}` | GET | `/{retentionId}` | `getInfo()` | ✅ 一致 |
|
||||
| 3 | 根据登记ID查询 | - | - | - | `/registration/{registrationId}` | `getByRegistrationId()` | ⚠️ 前端未实现 |
|
||||
| 4 | 根据申请ID查询 | - | - | - | `/application/{applicationId}` | `getByApplicationId()` | ⚠️ 前端未实现 |
|
||||
| 5 | 新增保留 | `addPartyRetention` | `/` | POST | `/` | `add()` | ✅ 一致 |
|
||||
| 6 | 保存并提交 | `addAndSubmitPartyRetention` | `/saveAndSubmit` | POST | `/saveAndSubmit` | `saveAndSubmit()` | ✅ 已修正 |
|
||||
| 7 | 修改保留 | `updatePartyRetention` | `/` | PUT | `/` | `edit()` | ✅ 一致 |
|
||||
| 8 | 删除保留 | `delPartyRetention` | `/{retentionId}` | DELETE | `/{retentionIds}` | `remove()` | ✅ 一致 |
|
||||
| 9 | 提交申请 | `submitPartyRetention` | `/submit/{retentionId}` | PUT | `/submit/{retentionId}` | `submit()` | ✅ 已修正 |
|
||||
| 10 | 撤回申请 | `cancelPartyRetention` | `/withdraw/{retentionId}` | PUT | `/withdraw/{retentionId}` | `withdraw()` | ✅ 已修正 |
|
||||
| 11 | 审批申请 | - | - | - | `/approve/{retentionId}` | `approve()` | ⚠️ 前端未实现 |
|
||||
| 12 | 导出列表 | `exportPartyRetention` | `/export` | POST | `/export` | `export()` | ✅ 一致 |
|
||||
|
||||
### 党籍保留历史接口
|
||||
|
||||
| 序号 | 功能 | 前端方法 | 前端路径 | HTTP方法 | 后端路径 | 后端方法 | 状态 |
|
||||
|------|------|---------|---------|---------|---------|---------|------|
|
||||
| 1 | 查询历史列表 | `getPartyRetentionHistoryList` | `/history/list` | GET | `/history/list` | `listHistory()` | ✅ 一致 |
|
||||
| 2 | 查询历史详情 | `getPartyRetentionHistory` | `/history/{historyId}` | GET | `/history/{historyId}` | `getHistoryInfo()` | ✅ 一致 |
|
||||
| 3 | 修改历史 | `updatePartyRetentionHistory` | `/history` | PUT | `/history` | `editHistory()` | ✅ 一致 |
|
||||
| 4 | 导出历史 | `exportPartyRetentionHistory` | `/history/export` | POST | `/history/export` | `exportHistory()` | ✅ 一致 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 REST API规范总结
|
||||
|
||||
### RESTful API设计原则
|
||||
|
||||
| HTTP方法 | 操作 | 路径示例 | 说明 |
|
||||
|---------|------|---------|------|
|
||||
| GET | 查询 | `/list`, `/{id}` | 幂等操作,不修改数据 |
|
||||
| POST | 新增 | `/`, `/saveAndSubmit` | 创建新资源 |
|
||||
| PUT | 修改 | `/`, `/{id}`, `/submit/{id}` | 更新资源(幂等) |
|
||||
| DELETE | 删除 | `/{id}`, `/{ids}` | 删除资源(幂等) |
|
||||
|
||||
### 参数传递方式
|
||||
|
||||
| 参数类型 | 使用场景 | 前端写法 | 后端注解 |
|
||||
|---------|---------|---------|---------|
|
||||
| 路径参数 | 资源ID | `url: '/api/{id}'` | `@PathVariable Long id` |
|
||||
| 查询参数 | 过滤条件 | `params: { name, status }` | `@RequestParam` 或 直接接收Query对象 |
|
||||
| 请求体 | 复杂对象 | `data: formData` | `@RequestBody FormBO bo` |
|
||||
|
||||
### 本次修正的重点
|
||||
|
||||
1. **路径命名统一**: `saveAndSubmit` 而不是 `addAndSubmit`
|
||||
2. **方法类型匹配**: 修改/提交/撤回操作使用 `PUT` 方法
|
||||
3. **参数位置正确**:
|
||||
- 资源ID应该放在路径中:`/submit/{retentionId}`
|
||||
- 复杂对象放在请求体中:`@RequestBody Bo bo`
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 待补充的功能
|
||||
|
||||
### 前端缺失的接口(建议补充)
|
||||
|
||||
#### 1. 根据登记ID查询党籍保留
|
||||
```typescript
|
||||
// 根据登记ID查询党籍保留
|
||||
export function getPartyRetentionByRegistrationId(registrationId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/registration/' + registrationId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**使用场景**: 从出国登记页面跳转到党籍保留页面,自动加载对应的党籍保留信息
|
||||
|
||||
#### 2. 根据申请ID查询党籍保留
|
||||
```typescript
|
||||
// 根据申请ID查询党籍保留
|
||||
export function getPartyRetentionByApplicationId(applicationId: string) {
|
||||
return request({
|
||||
url: '/rs/party/retention/application/' + applicationId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**使用场景**: 从出国申请页面跳转到党籍保留页面,自动加载对应的党籍保留信息
|
||||
|
||||
#### 3. 审批党籍保留申请
|
||||
```typescript
|
||||
// 审批党籍保留申请
|
||||
export function approvePartyRetention(data: {
|
||||
retentionId: string
|
||||
approvalOpinion: string
|
||||
approved: boolean
|
||||
}) {
|
||||
return request({
|
||||
url: '/rs/party/retention/approve/' + data.retentionId,
|
||||
method: 'put',
|
||||
params: {
|
||||
approvalOpinion: data.approvalOpinion,
|
||||
approved: data.approved
|
||||
}
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
**使用场景**: 管理员审批党籍保留申请
|
||||
|
||||
---
|
||||
|
||||
## ✅ 测试清单
|
||||
|
||||
### 基础功能测试
|
||||
- [ ] 1. 查看党籍保留列表
|
||||
- [ ] 2. 查看党籍保留详情
|
||||
- [ ] 3. 新增党籍保留(仅保存草稿)
|
||||
- [ ] 4. 新增并提交党籍保留(保存+提交)✅ **已修正**
|
||||
- [ ] 5. 编辑草稿状态的党籍保留
|
||||
- [ ] 6. 删除草稿状态的党籍保留
|
||||
- [ ] 7. 提交草稿状态的党籍保留 ✅ **已修正**
|
||||
- [ ] 8. 撤回已提交的党籍保留 ✅ **已修正**
|
||||
- [ ] 9. 导出党籍保留列表
|
||||
|
||||
### 历史记录功能测试
|
||||
- [ ] 1. 查看党籍保留历史列表
|
||||
- [ ] 2. 查看党籍保留历史详情
|
||||
- [ ] 3. 编辑党籍保留历史
|
||||
- [ ] 4. 导出党籍保留历史
|
||||
|
||||
### 关联查询测试(待实现)
|
||||
- [ ] 1. 根据登记ID查询党籍保留
|
||||
- [ ] 2. 根据申请ID查询党籍保留
|
||||
|
||||
### 审批功能测试(待实现)
|
||||
- [ ] 1. 审批通过党籍保留申请
|
||||
- [ ] 2. 审批拒绝党籍保留申请
|
||||
|
||||
---
|
||||
|
||||
## 🚀 部署和测试步骤
|
||||
|
||||
### 1. 前端热更新(开发环境)
|
||||
```bash
|
||||
# 开发环境无需重启,Vite会自动热更新
|
||||
# 保存文件后刷新浏览器即可
|
||||
```
|
||||
|
||||
### 2. 清除浏览器缓存
|
||||
- 按 `Ctrl + Shift + Delete`(Windows)或 `Cmd + Shift + Delete`(Mac)
|
||||
- 选择"缓存的图像和文件"
|
||||
- 点击"清除数据"
|
||||
|
||||
### 3. 刷新页面测试
|
||||
1. 访问"人事管理 → 出国党籍保留"菜单
|
||||
2. 点击"党籍保留"选项卡
|
||||
3. 点击"新增登记"按钮
|
||||
4. 填写表单
|
||||
5. 点击"保存并提交"按钮
|
||||
6. 预期结果:✅ 提示"保存并提交成功"
|
||||
|
||||
### 4. 测试其他修正的接口
|
||||
- **提交功能**: 保存草稿后,点击"提交"按钮
|
||||
- **撤回功能**: 已提交状态,点击"撤回"按钮
|
||||
|
||||
---
|
||||
|
||||
## 📝 修正统计
|
||||
|
||||
### 修正文件
|
||||
- **文件**: `web/src/api/rs/party-membership-retention.ts`
|
||||
- **修正接口数量**: 3个
|
||||
- `addAndSubmitPartyRetention` - 路径修正
|
||||
- `submitPartyRetention` - 路径+方法修正
|
||||
- `cancelPartyRetention` - 路径修正
|
||||
|
||||
### 修正代码行数
|
||||
- **修改行数**: 9行
|
||||
- **工作量**: 约20分钟
|
||||
|
||||
---
|
||||
|
||||
## 💡 经验总结
|
||||
|
||||
### 1. 前后端接口对接规范
|
||||
- ✅ **统一命名**: 前后端接口路径和方法名保持一致
|
||||
- ✅ **REST规范**: 严格遵循RESTful API设计规范
|
||||
- ✅ **参数位置**: 明确区分路径参数、查询参数、请求体
|
||||
- ✅ **文档同步**: 前后端接口文档实时同步
|
||||
|
||||
### 2. 接口调试技巧
|
||||
- 🔍 **F12 Network**: 查看请求路径、方法、参数
|
||||
- 🔍 **Preview/Response**: 查看错误信息和响应数据
|
||||
- 🔍 **Headers**: 确认Content-Type、Token等请求头
|
||||
- 🔍 **对比代码**: 前端API文件 vs 后端Controller文件
|
||||
|
||||
### 3. 常见HTTP状态码
|
||||
| 状态码 | 说明 | 可能原因 |
|
||||
|--------|------|---------|
|
||||
| 200 | 成功 | 请求正常处理 |
|
||||
| 400 | 请求错误 | 参数格式错误、校验失败 |
|
||||
| 401 | 未授权 | Token过期或无效 |
|
||||
| 403 | 禁止访问 | 无权限 |
|
||||
| 404 | 未找到 | 路径错误 |
|
||||
| 405 | 方法不允许 | HTTP方法错误或路径错误 |
|
||||
| 500 | 服务器错误 | 后端代码异常 |
|
||||
|
||||
### 4. 防范措施
|
||||
- ✅ 使用TypeScript类型定义,避免参数错误
|
||||
- ✅ 编写接口对照文档,前后端统一维护
|
||||
- ✅ 使用API测试工具(Postman/Apifox)先验证后端接口
|
||||
- ✅ 前端开发时对照后端Controller逐一核对
|
||||
|
||||
---
|
||||
|
||||
## 📞 后续工作
|
||||
|
||||
### 立即可测试
|
||||
1. ✅ 测试"保存并提交"功能
|
||||
2. ✅ 测试"提交申请"功能
|
||||
3. ✅ 测试"撤回申请"功能
|
||||
|
||||
### 建议补充
|
||||
1. ⏳ 补充"根据登记ID/申请ID查询"前端接口
|
||||
2. ⏳ 实现"审批"功能的前端界面和API
|
||||
3. ⏳ 编写完整的API接口文档
|
||||
4. ⏳ 编写自动化测试脚本
|
||||
|
||||
---
|
||||
|
||||
## ✅ 完成确认
|
||||
|
||||
- [x] ✅ 定位问题原因(HTTP 405错误)
|
||||
- [x] ✅ 修正"保存并提交"接口路径
|
||||
- [x] ✅ 修正"提交申请"接口路径和方法
|
||||
- [x] ✅ 修正"撤回申请"接口路径
|
||||
- [x] ✅ 生成前后端接口对照表
|
||||
- [x] ✅ 编写修正说明文档
|
||||
- [ ] ⏳ 执行功能测试
|
||||
- [ ] ⏳ 补充缺失的前端接口
|
||||
|
||||
---
|
||||
|
||||
**状态**: 🎉 **API路径修正已完成!可以进行功能测试!**
|
||||
|
||||
**修正人**: weizzzz
|
||||
**完成时间**: 2025-10-08
|
||||
**版本**: v1.0
|
||||
|
||||
Reference in new issue
Block a user