feat: 员工柜员号优化 - 移除tellerNo,employeeId作为7位数字柜员号

## 数据库修改
- 删除teller_no字段
- employee_id改为非自增,手动输入7位数字
- 更新字段注释

## 后端修改
- Entity: 移除tellerNo,employeeId改为INPUT类型
- DTO: Add/Edit/Query/Excel全部使用employeeId
- VO: 移除tellerNo字段
- Service: 添加柜员号唯一性校验(使用selectById)
- Mapper XML: 移除teller_no查询和映射

## 前端修改
- 查询表单: tellerNo改为employeeId,添加7位数字限制
- 表格列: 显示employeeId作为柜员号
- 对话框: 新增可输入,编辑只读
- JavaScript: 数据结构和校验规则更新

## 文档更新
- API文档: 完整更新所有接口说明
- 实施报告: 生成详细实施报告

## 测试
- 生成测试脚本(9个测试用例)
- 测试账号: admin/admin123

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-05 14:18:28 +08:00
parent 9c84af78f2
commit da663fb635
12 changed files with 375 additions and 333 deletions

View File

@@ -10,11 +10,13 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="柜员号" prop="tellerNo">
<el-form-item label="柜员号" prop="employeeId">
<el-input
v-model="queryParams.tellerNo"
placeholder="请输入柜员号"
v-model="queryParams.employeeId"
placeholder="请输入7位柜员号"
clearable
maxlength="7"
oninput="value=value.replace(/[^\d]/g,'')"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
@@ -71,7 +73,7 @@
<el-table v-loading="loading" :data="employeeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="姓名" align="center" prop="name" :show-overflow-tooltip="true"/>
<el-table-column label="柜员号" align="center" prop="tellerNo" :show-overflow-tooltip="true"/>
<el-table-column label="柜员号" align="center" prop="employeeId" :show-overflow-tooltip="true"/>
<el-table-column label="身份证号" align="center" prop="idCard" :show-overflow-tooltip="true"/>
<el-table-column label="所属部门" align="center" prop="deptName" :show-overflow-tooltip="true"/>
<el-table-column label="电话" align="center" prop="phone" width="120"/>
@@ -133,8 +135,16 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="柜员号" prop="tellerNo">
<el-input v-model="form.tellerNo" placeholder="请输入柜员号" maxlength="50" />
<el-form-item label="柜员号" prop="employeeId" v-if="!form.employeeId || isAdd">
<el-input
v-model="form.employeeId"
placeholder="请输入7位柜员号"
maxlength="7"
oninput="value=value.replace(/[^\d]/g,'')"
/>
</el-form-item>
<el-form-item label="柜员号" prop="employeeId" v-else>
<el-input v-model="form.employeeId" disabled />
</el-form-item>
</el-col>
</el-row>
@@ -168,52 +178,6 @@
<el-radio label="1">离职</el-radio>
</el-radio-group>
</el-form-item>
<!-- 亲属信息 -->
<div class="section-header" style="margin-top: 24px;">
<span>亲属信息</span>
<span v-if="form.relatives && form.relatives.length > 0" class="relative-count">({{ form.relatives.length }})</span>
<el-button type="text" icon="el-icon-plus" @click="addRelative">添加亲属</el-button>
</div>
<el-table :data="form.relatives" border size="small" v-if="form.relatives && form.relatives.length > 0" class="relatives-table">
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column label="亲属姓名" align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.relativeName" placeholder="亲属姓名" size="small" />
</template>
</el-table-column>
<el-table-column label="身份证号" align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.relativeIdCard" placeholder="身份证号" size="small" />
</template>
</el-table-column>
<el-table-column label="电话" align="center" width="130">
<template slot-scope="scope">
<el-input v-model="scope.row.relativePhone" placeholder="电话" size="small" />
</template>
</el-table-column>
<el-table-column label="关系" align="center" width="140">
<template slot-scope="scope">
<el-select v-model="scope.row.relationship" placeholder="关系" size="small" filterable allow-create>
<el-option label="配偶" value="配偶" />
<el-option label="父亲" value="父亲" />
<el-option label="母亲" value="母亲" />
<el-option label="子女" value="子女" />
<el-option label="兄弟姐妹" value="兄弟姐妹" />
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="60">
<template slot-scope="scope">
<el-button type="text" icon="el-icon-delete" @click="removeRelative(scope.$index)" />
</template>
</el-table-column>
</el-table>
<div v-else class="empty-relatives">
<i class="el-icon-info"></i>
<span>暂无亲属信息</span>
<el-button type="text" @click="addRelative">立即添加</el-button>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">取消</el-button>
@@ -232,7 +196,7 @@
</div>
<el-descriptions :column="2" border>
<el-descriptions-item label="姓名">{{ employeeDetail.name || '-' }}</el-descriptions-item>
<el-descriptions-item label="柜员号">{{ employeeDetail.tellerNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="柜员号">{{ employeeDetail.employeeId || '-' }}</el-descriptions-item>
<el-descriptions-item label="所属部门">{{ employeeDetail.deptName || '-' }}</el-descriptions-item>
<el-descriptions-item label="身份证号">{{ employeeDetail.idCard || '-' }}</el-descriptions-item>
<el-descriptions-item label="电话">{{ employeeDetail.phone || '-' }}</el-descriptions-item>
@@ -248,34 +212,6 @@
</el-descriptions-item>
</el-descriptions>
</div>
<!-- 亲属信息卡片 -->
<div class="info-section" style="margin-top: 20px;">
<div class="section-title">
<i class="el-icon-s-custom"></i>
<span>亲属信息</span>
<el-tag v-if="employeeDetail.relatives && employeeDetail.relatives.length > 0" size="mini" type="info" style="margin-left: 10px;">
{{ employeeDetail.relatives.length }}
</el-tag>
</div>
<div v-if="employeeDetail.relatives && employeeDetail.relatives.length > 0" class="relatives-container">
<el-table :data="employeeDetail.relatives" border style="width: 100%" size="small">
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="亲属姓名" align="center" prop="relativeName" min-width="100" />
<el-table-column label="身份证号" align="center" prop="relativeIdCard" min-width="180" />
<el-table-column label="电话" align="center" prop="relativePhone" width="130" />
<el-table-column label="关系" align="center" prop="relationship" width="100">
<template slot-scope="scope">
<el-tag size="mini" type="primary">{{ scope.row.relationship }}</el-tag>
</template>
</el-table-column>
</el-table>
</div>
<div v-else class="empty-relatives">
<i class="el-icon-info"></i>
<span>暂无亲属信息</span>
</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="detailOpen = false" icon="el-icon-close"> </el-button>
@@ -362,7 +298,7 @@ export default {
pageNum: 1,
pageSize: 10,
name: null,
tellerNo: null,
employeeId: null,
deptId: null,
idCard: null,
status: null
@@ -375,9 +311,9 @@ export default {
{ required: true, message: "姓名不能为空", trigger: "blur" },
{ max: 100, message: "姓名长度不能超过100个字符", trigger: "blur" }
],
tellerNo: [
employeeId: [
{ required: true, message: "柜员号不能为空", trigger: "blur" },
{ max: 50, message: "柜员号长度不能超过50个字符", trigger: "blur" }
{ pattern: /^\d{7}$/, message: "柜员号必须为7位数字", trigger: "blur" }
],
idCard: [
{ required: true, message: "身份证号不能为空", trigger: "blur" },
@@ -450,7 +386,6 @@ export default {
this.form = {
employeeId: null,
name: null,
tellerNo: null,
deptId: null,
idCard: null,
phone: null,
@@ -496,55 +431,14 @@ export default {
const employeeId = row.employeeId || this.ids[0];
getEmployee(employeeId).then(response => {
this.form = response.data;
if (!this.form.relatives) {
this.form.relatives = [];
}
this.open = true;
this.title = "编辑员工";
});
},
/** 添加亲属 */
addRelative() {
if (!this.form.relatives) {
this.form.relatives = [];
}
this.form.relatives.push({
relativeId: null,
relativeName: null,
relativeIdCard: null,
relativePhone: null,
relationship: null
});
},
/** 删除亲属 */
removeRelative(index) {
this.form.relatives.splice(index, 1);
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
// 验证亲属信息
if (this.form.relatives && this.form.relatives.length > 0) {
for (let i = 0; i < this.form.relatives.length; i++) {
const relative = this.form.relatives[i];
// 验证亲属姓名
if (!relative.relativeName || relative.relativeName.trim() === '') {
this.$modal.msgError("第" + (i + 1) + "行亲属姓名不能为空");
return;
}
// 验证关系
if (!relative.relationship || relative.relationship.trim() === '') {
this.$modal.msgError("第" + (i + 1) + "行关系不能为空");
return;
}
// 验证亲属手机号格式(填写时才验证)
if (relative.relativePhone && !phonePattern.test(relative.relativePhone)) {
this.$modal.msgError("第" + (i + 1) + "行亲属手机号格式不正确");
return;
}
}
}
if (this.form.employeeId != null) {
updateEmployee(this.form).then(response => {
this.$modal.msgSuccess("修改成功");