|
|
@@ -11,7 +11,15 @@
|
|
|
<el-input v-model="query.employee" clearable style="width: 140px" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="技能编码">
|
|
|
- <el-input v-model="query.skillNo" clearable style="width: 140px" />
|
|
|
+ <el-select
|
|
|
+ v-model="query.skillNo"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ placeholder="请选择技能编码"
|
|
|
+ style="width: 220px"
|
|
|
+ >
|
|
|
+ <el-option v-for="opt in skillOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="loadList">查询</el-button>
|
|
|
@@ -23,7 +31,11 @@
|
|
|
<el-table :data="rows" v-loading="loading" border stripe max-height="calc(100vh - 260px)">
|
|
|
<el-table-column prop="employee" label="人员编号" width="140" show-overflow-tooltip />
|
|
|
<el-table-column prop="site" label="工作组" width="120" show-overflow-tooltip />
|
|
|
- <el-table-column prop="skillNo" label="技能编码" width="140" show-overflow-tooltip />
|
|
|
+ <el-table-column label="技能编码" width="180" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ {{ skillNoDisplay(row.skillNo) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="skillLevel" label="技能等级" width="110" show-overflow-tooltip />
|
|
|
<el-table-column prop="efficiencyCoefficient" label="生产效率" width="110" align="right" />
|
|
|
<el-table-column prop="domain" label="工厂域" width="120" show-overflow-tooltip />
|
|
|
@@ -62,7 +74,9 @@
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="技能编码" prop="skillNo">
|
|
|
- <el-input v-model="form.skillNo" />
|
|
|
+ <el-select v-model="form.skillNo" filterable clearable placeholder="请选择技能编码" style="width: 100%">
|
|
|
+ <el-option v-for="opt in skillOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
@@ -100,7 +114,17 @@ import { computed, onMounted, reactive, ref, watch } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
|
import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
|
|
|
import AidopDemoShell from '../../components/AidopDemoShell.vue';
|
|
|
-import { s0MfgEmpSkillsApi, type S0EmpSkillsUpsert } from '../api/s0ManufacturingApi';
|
|
|
+import {
|
|
|
+ s0MfgEmpSkillsApi,
|
|
|
+ s0MfgPersonSkillsApi,
|
|
|
+ type S0EmpSkillsUpsert,
|
|
|
+ type S0PersonSkillOptionRow,
|
|
|
+} from '../api/s0ManufacturingApi';
|
|
|
+
|
|
|
+const PERSON_SKILL_SCOPE = {
|
|
|
+ companyRefId: '1329900200001',
|
|
|
+ factoryRefId: '1329900200002',
|
|
|
+} as const;
|
|
|
|
|
|
const route = useRoute();
|
|
|
const pageTitle = computed(() => (route.meta?.title as string) || '人员技能维护');
|
|
|
@@ -138,10 +162,35 @@ const form = reactive({
|
|
|
|
|
|
const rules: FormRules = {
|
|
|
employee: [{ required: true, message: '请填写人员编号', trigger: 'blur' }],
|
|
|
- skillNo: [{ required: true, message: '请填写技能编码', trigger: 'blur' }],
|
|
|
+ skillNo: [{ required: true, message: '请选择技能编码', trigger: 'change' }],
|
|
|
domain: [{ required: true, message: '请填写工厂域', trigger: 'blur' }],
|
|
|
};
|
|
|
|
|
|
+const skillOptions = ref<S0PersonSkillOptionRow[]>([]);
|
|
|
+const skillLabelMap = computed(() => {
|
|
|
+ const map = new Map<string, string>();
|
|
|
+ for (const opt of skillOptions.value) map.set(opt.value, opt.label);
|
|
|
+ return map;
|
|
|
+});
|
|
|
+function skillNoDisplay(code: string | null | undefined): string {
|
|
|
+ if (!code) return '';
|
|
|
+ return skillLabelMap.value.get(code) ?? code;
|
|
|
+}
|
|
|
+
|
|
|
+async function loadSkillOptions() {
|
|
|
+ try {
|
|
|
+ const list = await s0MfgPersonSkillsApi.options({
|
|
|
+ companyRefId: PERSON_SKILL_SCOPE.companyRefId,
|
|
|
+ factoryRefId: PERSON_SKILL_SCOPE.factoryRefId,
|
|
|
+ isEnabled: true,
|
|
|
+ limit: 100,
|
|
|
+ });
|
|
|
+ skillOptions.value = Array.isArray(list) ? list : [];
|
|
|
+ } catch {
|
|
|
+ skillOptions.value = [];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
async function loadList() {
|
|
|
loading.value = true;
|
|
|
try {
|
|
|
@@ -252,7 +301,7 @@ function onDelete(row: Row) {
|
|
|
}
|
|
|
|
|
|
onMounted(async () => {
|
|
|
- await loadList();
|
|
|
+ await Promise.all([loadList(), loadSkillOptions()]);
|
|
|
});
|
|
|
</script>
|
|
|
|