fix(hrm): 修复部门负责人配置功能,优化部门关联逻辑

1. 修复员工部门ID优先使用自定义字段而非用户绑定部门的逻辑
2. 新增部门负责人弹窗配置功能,支持直接编辑部门负责人、联系方式
3. 调整部门关联查询的JOIN条件,使用COALESCE正确获取部门ID
4. 为无负责人的部门标签添加点击阻止冒泡,避免触发树节点展开
This commit is contained in:
2026-07-08 15:36:36 +08:00
parent af404a66aa
commit 970f7979a5
2 changed files with 78 additions and 7 deletions

View File

@@ -51,13 +51,15 @@
<sql id="selectVo"> <sql id="selectVo">
SELECT SELECT
e.emp_id, e.user_id, e.emp_no, e.emp_name, e.gender, e.mobile, e.email, e.id_no, e.emp_id, e.user_id, e.emp_no, e.emp_name, e.gender, e.mobile, e.email, e.id_no,
e.hire_date, e.employment_type, e.status, su.dept_id, e.post_id, e.remark, e.hire_date, e.employment_type, e.status,
COALESCE(e.dept_id, su.dept_id) AS dept_id,
e.post_id, e.remark,
e.create_by, e.create_time, e.update_by, e.update_time, e.create_by, e.create_time, e.update_by, e.update_time,
d.dept_name, d.dept_name,
p.post_name p.post_name
FROM hrm_employee e FROM hrm_employee e
left join sys_user su on su.user_id = e.user_id LEFT JOIN sys_user su ON su.user_id = e.user_id
LEFT JOIN sys_dept d ON su.dept_id = d.dept_id AND d.del_flag = 0 LEFT JOIN sys_dept d ON d.dept_id = COALESCE(e.dept_id, su.dept_id) AND d.del_flag = 0
LEFT JOIN sys_post p ON e.post_id = p.post_id LEFT JOIN sys_post p ON e.post_id = p.post_id
WHERE e.del_flag = 0 WHERE e.del_flag = 0
</sql> </sql>

View File

@@ -18,7 +18,7 @@
<span v-if="node.data.leader" class="leader-tag"> <span v-if="node.data.leader" class="leader-tag">
({{ node.data.leader }}) ({{ node.data.leader }})
</span> </span>
<span v-else class="leader-tag" style="color: red;" @click="goDept"> <span v-else class="leader-tag" style="color: red; cursor: pointer;" @click.stop="handleConfigLeader(node.data)">
请配置负责人 请配置负责人
</span> </span>
</span> </span>
@@ -75,6 +75,29 @@
</el-card> </el-card>
</div> </div>
<!-- 配置部门负责人弹窗 -->
<el-dialog :title="'配置部门负责人 - ' + deptForm.deptName" :visible.sync="deptDialogVisible" width="450px"
append-to-body>
<el-form ref="deptFormRef" :model="deptForm" :rules="deptRules" label-width="100px" size="small">
<el-form-item label="部门名称">
<el-input :value="deptForm.deptName" disabled />
</el-form-item>
<el-form-item label="负责人" prop="leader">
<el-input v-model="deptForm.leader" placeholder="请输入负责人姓名" clearable />
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="deptForm.phone" placeholder="请输入联系电话" clearable maxlength="11" />
</el-form-item>
<el-form-item label="邮箱">
<el-input v-model="deptForm.email" placeholder="请输入邮箱地址" clearable />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="deptDialogVisible = false">取消</el-button>
<el-button type="primary" :loading="deptSubmitting" @click="handleDeptSubmit">确定</el-button>
</div>
</el-dialog>
<!-- Add/Edit Dialog --> <!-- Add/Edit Dialog -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="700px" append-to-body> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="700px" append-to-body>
<el-form ref="empFormRef" :model="empForm" :rules="empRules" label-width="100px" size="small"> <el-form ref="empFormRef" :model="empForm" :rules="empRules" label-width="100px" size="small">
@@ -165,7 +188,7 @@
</template> </template>
<script> <script>
import { listDept } from '@/api/system/dept' import { listDept, updateDept } from '@/api/system/dept'
import { listPost } from '@/api/system/post' import { listPost } from '@/api/system/post'
import { selectUser } from '@/api/system/user' import { selectUser } from '@/api/system/user'
import { listEmployee, addEmployee, updateEmployee, delEmployee } from '@/api/hrm/employee' import { listEmployee, addEmployee, updateEmployee, delEmployee } from '@/api/hrm/employee'
@@ -201,6 +224,22 @@ export default {
deptId: [{ required: true, message: '请选择主部门', trigger: 'change' }], deptId: [{ required: true, message: '请选择主部门', trigger: 'change' }],
postId: [{ required: true, message: '请选择主岗位', trigger: 'change' }], postId: [{ required: true, message: '请选择主岗位', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }] status: [{ required: true, message: '请选择状态', trigger: 'change' }]
},
// 部门负责人配置
deptDialogVisible: false,
deptSubmitting: false,
deptForm: {
deptId: undefined,
deptName: '',
leader: '',
phone: '',
email: '',
parentId: undefined,
orderNum: 0,
status: '0'
},
deptRules: {
leader: [{ required: true, message: '请输入负责人姓名', trigger: 'blur' }]
} }
} }
}, },
@@ -218,8 +257,38 @@ export default {
this.deptLoading = false this.deptLoading = false
}) })
}, },
goDept() { // 点击"请配置负责人",弹出对话框直接编辑部门负责人
this.$router.push('/renshi/dept') handleConfigLeader(data) {
this.deptForm = {
deptId: data.deptId,
deptName: data.deptName,
leader: data.leader || '',
phone: data.phone || '',
email: data.email || '',
parentId: data.parentId,
orderNum: data.orderNum || 0,
status: data.status || '0'
}
this.deptDialogVisible = true
this.$nextTick(() => {
if (this.$refs.deptFormRef) {
this.$refs.deptFormRef.clearValidate()
}
})
},
// 提交部门负责人配置
handleDeptSubmit() {
this.$refs.deptFormRef.validate(valid => {
if (!valid) return
this.deptSubmitting = true
updateDept(this.deptForm).then(() => {
this.$message.success('部门负责人配置成功')
this.deptDialogVisible = false
this.loadDeptTree()
}).finally(() => {
this.deptSubmitting = false
})
})
}, },
buildTree(list) { buildTree(list) {
const map = {} const map = {}