zlwu 11 hónapja
szülő
commit
6ca85a1b15

+ 21 - 16
mobile/src/pages/workStudy/apply.vue

@@ -202,6 +202,7 @@ import {
     updateApplication,
     getApplicationDetail,
 } from '@/api/workStudy.js';
+import { getDict } from '@/common/dict.js';
 
 export default {
     name: 'WorkStudyApply',
@@ -231,20 +232,14 @@ export default {
                 remark: '',
             },
 
-            // 家庭经济情况选项(与web端保持一致)
-            familyStatusOptions: [
-                { value: '特困', label: '特困' },
-                { value: '贫困', label: '贫困' },
-                { value: '一般', label: '一般' },
-                { value: '良好', label: '良好' },
-            ],
+            // 家庭经济情况选项(字典:jcbt_family_economy_status)
+            familyStatusOptions: [],
 
             // 家庭经济情况选择器相关
             showFamilyStatusPicker: false,
             familyStatusIndex: [0],
-            // uview-ui 2.x 单列选择器:使用纯字符串数组(二维)最稳定
-            // 格式:[[字符串1, 字符串2, ...]] - 外层数组表示列,内层数组表示选项
-            familyStatusColumns: [['特困', '贫困', '一般', '良好']],
+            // uview-ui 2.x 单列选择器:使用纯字符串数组(二维)
+            familyStatusColumns: [[]],
 
             // 加载状态
             loading: false,
@@ -277,6 +272,17 @@ export default {
     },
 
     methods: {
+        async loadFamilyDict() {
+            try {
+                const dictData = await getDict('jcbt_family_economy_status');
+                this.familyStatusOptions = Array.isArray(dictData) ? dictData : [];
+                this.familyStatusColumns = [this.familyStatusOptions.map(item => item.label)];
+            } catch (e) {
+                const fallback = ['特困', '贫困', '一般', '良好'];
+                this.familyStatusOptions = fallback.map(v => ({ value: v, label: v }));
+                this.familyStatusColumns = [fallback];
+            }
+        },
         // 返回上一页
         goBack() {
             uni.navigateBack();
@@ -292,13 +298,12 @@ export default {
             console.log('e.value:', e.value); // 例如:['贫困']
             console.log('e.indexs:', e.indexs); // 例如:[1]
 
-            // 单列选择器,取第一列的值
+            // 单列选择器,取第一列的值,并根据label反查字典的value
             if (e && e.value && Array.isArray(e.value) && e.value.length > 0) {
                 const selectedValue = e.value[0]; // 直接获取字符串,如 "贫困"
-                console.log('选中的值:', selectedValue);
-
-                // 直接赋值
-                this.formData.familyFinancialStatus = selectedValue;
+                const match = this.familyStatusOptions.find(opt => opt.label === selectedValue);
+                // 若找到匹配,用字典value,否则用label兜底
+                this.formData.familyFinancialStatus = match ? (match.value || match.label) : selectedValue;
 
                 // 更新索引用于回显
                 if (e.indexs && Array.isArray(e.indexs)) {
@@ -324,7 +329,7 @@ export default {
 
             try {
                 // 并行加载数据
-                const promises = [this.loadPositionData(), this.loadStudentInfo()];
+                const promises = [this.loadPositionData(), this.loadStudentInfo(), this.loadFamilyDict()];
 
                 await Promise.all(promises);
 

+ 33 - 16
mobile/src/pages/workStudy/index.vue

@@ -297,6 +297,7 @@ import {
     getCurrentStudentInfo,
     getStudentApplicationStatusList,
 } from '@/api/workStudy.js';
+import { getDict } from '@/common/dict.js';
 
 export default {
     name: 'WorkStudyIndex',
@@ -316,22 +317,9 @@ export default {
             scopeText: '',
             statusText: '',
 
-            // 选择器选项
-            scopeOptions: [
-                [
-                    { label: '全部', value: '' },
-                    { label: '本学院', value: 'COLLEGE' },
-                    { label: '全校', value: 'UNIVERSITY' },
-                ],
-            ],
-            statusOptions: [
-                [
-                    { label: '全部', value: '' },
-                    { label: '已发布', value: 'PUBLISHED' },
-                    { label: '招录中', value: 'RECRUITING' },
-                    { label: '已暂停', value: 'SUSPENDED' },
-                ],
-            ],
+            // 选择器选项(字典)
+            scopeOptions: [[]],
+            statusOptions: [[]],
 
             // 查询参数
             queryParams: {
@@ -412,6 +400,8 @@ export default {
                 await this.loadStudentInfo();
                 // 获取学生申请状态列表
                 await this.loadStudentApplications();
+                // 加载筛选字典
+                await this.loadFilterDicts();
                 // 加载岗位列表
                 await this.loadPositionList(true);
             } catch (error) {
@@ -422,6 +412,33 @@ export default {
                 });
             }
         },
+        // 加载筛选字典
+        async loadFilterDicts() {
+            try {
+                const [scopeDict, statusDict] = await Promise.all([
+                    getDict('jcbt_position_scope'),
+                    getDict('jcbt_position_status'),
+                ]);
+                const scope = Array.isArray(scopeDict) ? scopeDict : [];
+                const status = Array.isArray(statusDict) ? statusDict : [];
+                // 转换为u-picker二维数组格式
+                this.scopeOptions = [[{ label: '全部', value: '' }, ...scope]];
+                this.statusOptions = [[{ label: '全部', value: '' }, ...status]];
+            } catch (e) {
+                // 保底:维持现状但不报错
+                this.scopeOptions = [[
+                    { label: '全部', value: '' },
+                    { label: '本学院', value: 'COLLEGE' },
+                    { label: '全校', value: 'UNIVERSITY' },
+                ]];
+                this.statusOptions = [[
+                    { label: '全部', value: '' },
+                    { label: '已发布', value: 'PUBLISHED' },
+                    { label: '招录中', value: 'RECRUITING' },
+                    { label: '已暂停', value: 'SUSPENDED' },
+                ]];
+            }
+        },
 
         // 获取学生信息
         async loadStudentInfo() {

+ 9 - 13
web/src/views/cw/evaluation/components/MonitoringDialog.vue

@@ -177,9 +177,7 @@
                     placeholder="请选择"
                     style="width: 100%"
                   >
-                    <el-option label="产出指标" value="产出指标" />
-                    <el-option label="效益指标" value="效益指标" />
-                    <el-option label="满意度指标" value="满意度指标" />
+                    <el-option v-for="dict in cw_indicator_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </template>
               </el-table-column>
@@ -192,19 +190,13 @@
                     style="width: 100%"
                   >
                     <template v-if="scope.row.level1Indicator === '产出指标'">
-                      <el-option label="数量指标" value="数量指标" />
-                      <el-option label="质量指标" value="质量指标" />
-                      <el-option label="时效指标" value="时效指标" />
-                      <el-option label="成本指标" value="成本指标" />
+                      <el-option v-for="dict in cw_output_indicator_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                     </template>
                     <template v-else-if="scope.row.level1Indicator === '效益指标'">
-                      <el-option label="经济效益指标" value="经济效益指标" />
-                      <el-option label="社会效益指标" value="社会效益指标" />
-                      <el-option label="生态效益指标" value="生态效益指标" />
-                      <el-option label="可持续性指标" value="可持续性指标" />
+                      <el-option v-for="dict in cw_benefit_indicator_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                     </template>
                     <template v-else-if="scope.row.level1Indicator === '满意度指标'">
-                      <el-option label="服务对象满意度指标" value="服务对象满意度指标" />
+                      <el-option v-for="dict in cw_satisfaction_indicator_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                     </template>
                   </el-select>
                 </template>
@@ -294,12 +286,16 @@
 </template>
 
 <script setup lang="ts" name="MonitoringDialog">
-import { ref, reactive, computed, getCurrentInstance, ComponentInternalInstance } from 'vue'
+import { ref, reactive, computed, getCurrentInstance, ComponentInternalInstance, toRefs } from 'vue'
 import type { FormInstance, FormRules } from 'element-plus'
 import { getEvaluation, listPerformanceMonitoring, getPerformanceMonitoring, addPerformanceMonitoring, updatePerformanceMonitoring, delPerformanceMonitoring } from '@/api/cw/performanceEvaluation'
 import type { PerformanceMonitoringForm } from '@/api/cw/performanceEvaluation'
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
+// 字典
+const { cw_indicator_type, cw_output_indicator_type, cw_benefit_indicator_type, cw_satisfaction_indicator_type } = toRefs<any>(
+  proxy?.useDict('cw_indicator_type', 'cw_output_indicator_type', 'cw_benefit_indicator_type', 'cw_satisfaction_indicator_type') || {}
+)
 
 // ========== 对话框状态 ==========
 const dialogVisible = ref(false)

+ 5 - 8
web/src/views/cw/evaluation/index.vue

@@ -19,19 +19,14 @@
               <el-col :span="6">
       <el-form-item label="自评状态" prop="evaluationStatus">
                   <el-select v-model="queryParams.evaluationStatus" placeholder="请选择自评状态" clearable style="width: 100%">
-          <el-option label="草稿" value="draft" />
-          <el-option label="已提交" value="submitted" />
-          <el-option label="已审核" value="approved" />
+          <el-option v-for="dict in cw_evaluation_status" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
               </el-col>
               <el-col :span="6">
       <el-form-item label="自评等级" prop="selfEvaluationLevel">
                   <el-select v-model="queryParams.selfEvaluationLevel" placeholder="请选择自评等级" clearable style="width: 100%">
-          <el-option label="优秀" value="优秀" />
-          <el-option label="良好" value="良好" />
-          <el-option label="合格" value="合格" />
-          <el-option label="不合格" value="不合格" />
+          <el-option v-for="dict in cw_evaluation_level" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
               </el-col>
@@ -228,7 +223,9 @@ import MonitoringDialog from './components/MonitoringDialog.vue'
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
 
 // 加载字典数据
-const { cw_evaluation_status } = toRefs<any>(proxy?.useDict('cw_evaluation_status') || {})
+const { cw_evaluation_status, cw_evaluation_level } = toRefs<any>(
+  proxy?.useDict('cw_evaluation_status', 'cw_evaluation_level') || {}
+)
 
 const evaluationList = ref<CwProjectPerformanceSelfEvaluationVO[]>([])
 const loading = ref(true)

+ 6 - 10
web/src/views/cw/monitoringManagement/index.vue

@@ -24,9 +24,7 @@
               <el-col :span="6">
                 <el-form-item label="自评状态" prop="evaluationStatus">
                   <el-select v-model="queryParams.evaluationStatus" placeholder="请选择自评状态" clearable style="width: 100%">
-                    <el-option label="草稿" value="draft" />
-                    <el-option label="已提交" value="submitted" />
-                    <el-option label="已审核" value="approved" />
+                    <el-option v-for="dict in cw_evaluation_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -35,18 +33,14 @@
               <el-col :span="6">
                 <el-form-item label="自评等级" prop="selfEvaluationLevel">
                   <el-select v-model="queryParams.selfEvaluationLevel" placeholder="请选择自评等级" clearable style="width: 100%">
-                    <el-option label="优秀" value="优秀" />
-                    <el-option label="良好" value="良好" />
-                    <el-option label="合格" value="合格" />
-                    <el-option label="不合格" value="不合格" />
+                    <el-option v-for="dict in cw_evaluation_level" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="6">
                 <el-form-item label="锁定状态" prop="isLocked">
                   <el-select v-model="queryParams.isLocked" placeholder="请选择锁定状态" clearable style="width: 100%">
-                    <el-option label="未锁定" :value="0" />
-                    <el-option label="已锁定" :value="1" />
+                    <el-option v-for="dict in cw_lock_status" :key="dict.value" :label="dict.label" :value="Number(dict.value)" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -227,7 +221,9 @@ import TableForm from '../evaluation/table-form.vue'
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
 
 // 加载字典数据
-const { cw_evaluation_status } = toRefs<any>(proxy?.useDict('cw_evaluation_status') || {})
+const { cw_evaluation_status, cw_evaluation_level, cw_lock_status } = toRefs<any>(
+  proxy?.useDict('cw_evaluation_status', 'cw_evaluation_level', 'cw_lock_status') || {}
+)
 
 const evaluationList = ref<CwProjectPerformanceSelfEvaluationVO[]>([])
 const loading = ref(true)

+ 13 - 26
web/src/views/jcbt/poverty/Application/index.vue

@@ -99,21 +99,14 @@
               <el-col :span="6">
                 <el-form-item label="学年" prop="academicYear">
                   <el-select v-model="queryParams.academicYear" placeholder="请选择学年" clearable style="width: 100%">
-                    <el-option label="2024-2025" value="2024-2025" />
-                    <el-option label="2023-2024" value="2023-2024" />
-                    <el-option label="2022-2023" value="2022-2023" />
+                    <el-option v-for="dict in jcbt_academic_year" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="6">
                 <el-form-item label="申请状态" prop="status">
                   <el-select v-model="queryParams.status" placeholder="请选择申请状态" clearable style="width: 100%">
-                    <el-option label="草稿" value="DRAFT" />
-                    <el-option label="已提交" value="SUBMITTED" />
-                    <el-option label="审核中" value="REVIEWING" />
-                    <el-option label="已通过" value="APPROVED" />
-                    <el-option label="已拒绝" value="REJECTED" />
-                    <el-option label="已撤回" value="WITHDRAWN" />
+                    <el-option v-for="dict in jcbt_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -138,8 +131,7 @@
               <el-col :span="6">
                 <el-form-item label="申请资助类型" prop="assistanceTypeIds">
                   <el-select v-model="queryParams.assistanceTypeIds" placeholder="请选择申请资助类型" clearable style="width: 100%">
-                    <el-option label="浙江省学生资助" value="1" />
-                    <el-option label="杭州第一技师学院学生资助" value="2" />
+                    <el-option v-for="dict in jcbt_assistance_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -295,9 +287,7 @@
           <el-col :span="12">
             <el-form-item label="学年" prop="academicYear">
               <el-select v-model="form.academicYear" placeholder="请选择学年" style="width: 100%">
-                <el-option label="2024-2025" value="2024-2025" />
-                <el-option label="2023-2024" value="2023-2024" />
-                <el-option label="2022-2023" value="2022-2023" />
+                <el-option v-for="dict in jcbt_academic_year" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -379,8 +369,7 @@
           <el-col :span="12">
             <el-form-item label="申请资助类型" prop="assistanceTypeIds">
               <el-select v-model="form.assistanceTypeIds" placeholder="请选择申请资助类型" style="width: 100%" @change="handleAssistanceTypeChange">
-                <el-option label="浙江省学生资助" value="1" />
-                <el-option label="杭州第一技师学院学生资助" value="2" />
+                <el-option v-for="dict in jcbt_assistance_type" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -390,9 +379,7 @@
         </el-row>
         <el-form-item label="家庭经济情况" prop="familyEconomyStatus">
           <el-select v-model="form.familyEconomyStatus" placeholder="请选择家庭经济情况" style="width: 100%">
-            <el-option label="特别困难" value="特别困难" />
-            <el-option label="困难" value="困难" />
-            <el-option label="一般困难" value="一般困难" />
+            <el-option v-for="dict in jcbt_family_economy_status" :key="dict.value" :label="dict.label" :value="dict.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="家庭情况摘要" prop="familyEconomySummary">
@@ -575,6 +562,11 @@ import { ElMessageBox, ElMessage } from 'element-plus';
 // 数据定义
 const { proxy } = getCurrentInstance();
 
+// 字典:资助类型、家庭经济情况
+const { jcbt_assistance_type, jcbt_family_economy_status, jcbt_academic_year, jcbt_status } = toRefs<any>(
+  proxy?.useDict('jcbt_assistance_type', 'jcbt_family_economy_status', 'jcbt_academic_year', 'jcbt_status') || {}
+);
+
 // 表单 ref
 const applicationFormRef = ref();
 const queryFormRef = ref();
@@ -813,13 +805,8 @@ function handleRecognitionTypeChange(value) {
 
 /** 处理申请资助类型选择变化 */
 function handleAssistanceTypeChange(value) {
-  if (value === '1') {
-    form.value.assistanceTypeNames = '浙江省学生资助';
-  } else if (value === '2') {
-    form.value.assistanceTypeNames = '杭州第一技师学院学生资助';
-  } else {
-    form.value.assistanceTypeNames = null;
-  }
+  const selected = (jcbt_assistance_type?.value || []).find((item: any) => item.value === value);
+  form.value.assistanceTypeNames = selected ? selected.label : null;
 }
 
 /** 表单重置 */

+ 7 - 15
web/src/views/rs/overseas/index.vue

@@ -578,8 +578,7 @@
               <el-col :span="12">
                 <el-form-item label="性别" prop="gender">
                   <el-select v-model="applicationForm.gender" placeholder="请选择性别" style="width: 100%">
-                    <el-option label="男" value="0" />
-                    <el-option label="女" value="1" />
+                    <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -602,19 +601,7 @@
               <el-col :span="12">
                 <el-form-item label="政治面貌" prop="politicalStatus">
                   <el-select v-model="applicationForm.politicalStatus" placeholder="请选择政治面貌" style="width: 100%">
-                    <el-option label="中共党员" value="1" />
-                    <el-option label="中共预备党员" value="2" />
-                    <el-option label="共青团员" value="3" />
-                    <el-option label="民革党员" value="4" />
-                    <el-option label="民盟盟员" value="5" />
-                    <el-option label="民建会员" value="6" />
-                    <el-option label="民进会员" value="7" />
-                    <el-option label="农工党党员" value="8" />
-                    <el-option label="致公党党员" value="9" />
-                    <el-option label="九三学社社员" value="10" />
-                    <el-option label="台盟盟员" value="11" />
-                    <el-option label="无党派人士" value="12" />
-                    <el-option label="群众" value="13" />
+                    <el-option v-for="dict in xg_political_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -1416,6 +1403,11 @@ import { cancelProcessApply } from '@/api/workflow/instance';
 const { proxy } = getCurrentInstance() as any;
 const userStore = useUserStore();
 
+// 字典:性别、政治面貌
+const { sys_user_sex, xg_political_status } = toRefs<any>(
+  proxy?.useDict('sys_user_sex', 'xg_political_status') || {}
+);
+
 // 表单引用
 const applicationFormRef = ref<any>(null);
 const applicationQueryForm = ref<any>(null);

+ 6 - 3
web/src/views/rs/overseas/itinerary-change-approval.vue

@@ -149,8 +149,7 @@
                       <el-col :span="6">
                         <el-form-item label="审批状态" prop="status">
                           <el-select v-model="recordQueryParams.status" placeholder="请选择审批状态" clearable style="width: 100%">
-                            <el-option label="已通过" value="1" />
-                            <el-option label="已拒绝" value="2" />
+                            <el-option v-for="dict in rs_approval_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                           </el-select>
                         </el-form-item>
                       </el-col>
@@ -293,7 +292,7 @@
 </template>
 
 <script setup lang="ts" name="ItineraryChangeApproval">
-import { ref, reactive, toRefs, onMounted } from 'vue';
+import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { useRouter } from 'vue-router';
 import animate from '@/animate';
@@ -311,6 +310,10 @@ import SignaturePad from '@/components/SignaturePad/index.vue';
 
 // ==================== 响应式数据 ====================
 
+const { proxy } = getCurrentInstance() as any;
+// 字典:审批状态
+const { rs_approval_status } = toRefs<any>(proxy?.useDict('rs_approval_status') || {});
+
 const router = useRouter();
 const pendingQueryFormRef = ref();
 const recordQueryFormRef = ref();

+ 7 - 20
web/src/views/rs/overseas/overseas-form.vue

@@ -123,8 +123,7 @@
             <el-col :span="12">
               <el-form-item label="性别" prop="gender">
                 <el-select v-model="applicationForm.gender" placeholder="请选择性别" style="width: 100%">
-                  <el-option label="男" value="0" />
-                  <el-option label="女" value="1" />
+                  <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -147,19 +146,7 @@
             <el-col :span="12">
               <el-form-item label="政治面貌" prop="politicalStatus">
                 <el-select v-model="applicationForm.politicalStatus" placeholder="请选择政治面貌" style="width: 100%">
-                  <el-option label="中共党员" value="1" />
-                  <el-option label="中共预备党员" value="2" />
-                  <el-option label="共青团员" value="3" />
-                  <el-option label="民革党员" value="4" />
-                  <el-option label="民盟盟员" value="5" />
-                  <el-option label="民建会员" value="6" />
-                  <el-option label="民进会员" value="7" />
-                  <el-option label="农工党党员" value="8" />
-                  <el-option label="致公党党员" value="9" />
-                  <el-option label="九三学社社员" value="10" />
-                  <el-option label="台盟盟员" value="11" />
-                  <el-option label="无党派人士" value="12" />
-                  <el-option label="群众" value="13" />
+                  <el-option v-for="dict in xg_political_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -217,11 +204,7 @@
             <el-col :span="12">
               <el-form-item label="人员类别" prop="personnelCategory">
                 <el-select v-model="applicationForm.personnelCategory" placeholder="请选择人员类别" style="width: 100%">
-                  <el-option label="教学人员" value="教学人员" />
-                  <el-option label="管理人员" value="管理人员" />
-                  <el-option label="教辅人员" value="教辅人员" />
-                  <el-option label="工勤人员" value="工勤人员" />
-                  <el-option label="其他人员" value="其他" />
+                  <el-option v-for="dict in rs_personnel_category" :key="dict.value" :label="dict.label" :value="dict.value" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -419,6 +402,10 @@ const { proxy } = getCurrentInstance();
 const route = useRoute();
 const router = useRouter();
 
+// 字典:性别、政治面貌、人员类别
+const { sys_user_sex, xg_political_status, rs_personnel_category } = toRefs<any>(
+  proxy?.useDict('sys_user_sex', 'xg_political_status', 'rs_personnel_category') || {}
+);
 // 响应式数据
 const loading = ref(false);
 const formLoading = ref(false);

+ 7 - 18
web/src/views/rs/training/index.vue

@@ -310,7 +310,7 @@
         </el-form-item>
         <el-form-item label="课程类别" prop="category">
           <el-select v-model="courseForm.category" placeholder="请选择课程类别" style="width: 100%">
-            <el-option v-for="dict in categoryOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+            <el-option v-for="dict in rs_training_category" :key="dict.value" :label="dict.label" :value="dict.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="开始时间" prop="startTime">
@@ -1090,15 +1090,10 @@ const trainingSubTab = ref('application'); // 默认显示培训申请选项卡
 const isInitialized = ref(false);
 const isDataLoaded = ref(false);
 
-// 课程类别选项
-const categoryOptions = ref([
-  { value: 'skill', label: '技能培训' },
-  { value: 'management', label: '管理培训' },
-  { value: 'tech', label: '技术培训' },
-  { value: 'safety', label: '安全培训' },
-  { value: 'law', label: '法规培训' },
-  { value: 'other', label: '其他培训' }
-]);
+// 课程类别选项改为字典
+const { rs_training_category, rs_training_application_status } = toRefs<any>(
+  proxy?.useDict('rs_training_category', 'rs_training_application_status') || {}
+);
 
 // 课程状态选项(计算型)
 const getCourseStatusType = (row: CourseVO): string => {
@@ -1214,14 +1209,8 @@ const applicationQueryParams = reactive({
   params: {}
 });
 
-// 申请状态选项
-const applicationStatusOptions = [
-  { value: '0', label: '待审核', type: 'warning' },
-  { value: '1', label: '已通过', type: 'success' },
-  { value: '2', label: '已拒绝', type: 'danger' },
-  { value: '3', label: '已取消', type: 'info' },
-  { value: '4', label: '已完成', type: 'success' }
-];
+// 申请状态选项改为字典
+const applicationStatusOptions = rs_training_application_status;
 
 // 教师列表数据
 const teacherList = ref<

+ 4 - 3
web/src/views/xg/xgss/holidayStay/holidayStay/index-sg.vue

@@ -18,8 +18,7 @@
                 </el-form-item>
                 <el-form-item label="状态" prop="status">
                   <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
-                    <el-option label="有效" value="valid" />
-                    <el-option label="失效" value="invalid" />
+                    <el-option v-for="dict in xg_holiday_stay_status" :key="dict.value" :label="dict.label" :value="dict.value" />
                   </el-select>
                 </el-form-item>
                 <!-- <el-form-item label="学号" prop="studentNo">
@@ -802,7 +801,9 @@ import {
 } from '@/api/xg/xgss/holidayStay/holidayStay/types-sg';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { xg_holiday_type, xg_stay_reason_type, sys_yesno } = toRefs<any>(proxy?.useDict('xg_holiday_type', 'xg_stay_reason_type', 'sys_yesno'));
+const { xg_holiday_type, xg_stay_reason_type, sys_yesno, xg_holiday_stay_status } = toRefs<any>(
+  proxy?.useDict('xg_holiday_type', 'xg_stay_reason_type', 'sys_yesno', 'xg_holiday_stay_status')
+);
 
 // 用户store - 用于获取当前登录用户信息,实现权限控制
 const userStore = useUserStore();

+ 10 - 13
web/src/views/zsjy/internship/msgmanage/components/ChangeDialog.vue

@@ -23,12 +23,10 @@
         <el-col :span="24">
           <div class="form-section-title">新实习信息</div>
         </el-col>
-        <el-col :span="12">
+      <el-col :span="12">
           <el-form-item label="实习状态" prop="internshipStatus">
             <el-select v-model="form.internshipStatus" placeholder="请选择实习状态" style="width: 100%">
-              <el-option label="进行中" value="1" />
-              <el-option label="已完成" value="2" />
-              <el-option label="中断" value="3" />
+              <el-option v-for="dict in zsjy_internship_status" :key="dict.value" :label="dict.label" :value="dict.value" />
             </el-select>
           </el-form-item>
         </el-col>
@@ -65,11 +63,7 @@
         <el-col :span="12">
           <el-form-item label="单位规模" prop="companyScale">
             <el-select v-model="form.companyScale" placeholder="请选择单位规模" clearable style="width: 100%">
-              <el-option label="20人以下" value="1" />
-              <el-option label="20-99人" value="2" />
-              <el-option label="100-499人" value="3" />
-              <el-option label="500-999人" value="4" />
-              <el-option label="1000人以上" value="5" />
+              <el-option v-for="dict in zsjy_company_scale" :key="dict.value" :label="dict.label" :value="dict.value" />
             </el-select>
           </el-form-item>
         </el-col>
@@ -150,9 +144,7 @@
         <el-col :span="12">
           <el-form-item label="住宿类型" prop="accommodationType">
             <el-select v-model="form.accommodationType" placeholder="请选择住宿类型" clearable style="width: 100%">
-              <el-option label="公司提供" value="1" />
-              <el-option label="自行租房" value="2" />
-              <el-option label="其他" value="3" />
+              <el-option v-for="dict in zsjy_accommodation_type" :key="dict.value" :label="dict.label" :value="dict.value" />
             </el-select>
           </el-form-item>
         </el-col>
@@ -195,7 +187,7 @@
 </template>
 
 <script setup lang="ts" name="ChangeDialog">
-import { ref, watch, reactive } from 'vue';
+import { ref, watch, reactive, getCurrentInstance, toRefs } from 'vue';
 import { ElMessage } from 'element-plus';
 import { changeInternshipInfo, getInternshipInfo } from '@/api/zsjy/internship';
 import type { InternshipInfoChangeBO, InternshipInfoVO } from '@/api/zsjy/types';
@@ -215,6 +207,11 @@ const emit = defineEmits(['update:modelValue', 'success']);
 const visible = ref(false);
 const submitLoading = ref(false);
 const formRef = ref<FormInstance>();
+// 字典
+const { proxy } = getCurrentInstance() as any;
+const { zsjy_internship_status, zsjy_company_scale, zsjy_accommodation_type } = toRefs<any>(
+  proxy?.useDict('zsjy_internship_status', 'zsjy_company_scale', 'zsjy_accommodation_type') || {}
+);
 
 // 表单数据
 const form = reactive<InternshipInfoChangeBO>({