如何使用若依解决多选字段的问题——方案一

解决方案:可以使用若依自带的字典和复选框,并将类型改为varchar。

使用若依自带的字典管理和复选框组件,并将数据库字段类型设为VARCHAR来存储多个选中的值(例如用逗号分隔),是一个更简单且与若依框架原生功能紧密结合的方案。这样既能利用若依强大的字典管理和数据回显功能,也避免了直接处理JSON类型在导入导出时可能带来的麻烦。

下面是如何具体实现这个方案。

如何使用字典与复选框(VARCHAR字段) 🛠️

整个流程可以概括为:在数据库和实体类中定义VARCHAR字段 -> 在若依后台配置字典 -> 利用代码生成器生成前端代码 -> 微调前端组件。核心在于使用若依的字典来管理选项,并用复选框组件绑定字典值。

1. 数据库与实体类设计
  • 数据库字段:将 corresponding_field(对应领域) 和 textbook_features(教材特色) 的数据库类型设置为 VARCHAR,长度根据可能选择的选项数量设定(如 255)。这个字段将用于存储多个选项值,默认用逗号分隔,例如 “O00,O01,O02”。
  • 实体类字段:对应的实体类字段同样定义为 String 类型。
2. 配置系统字典

这是关键步骤,为你的多选选项创建数据源。

  1. 登录若依后台,进入 系统管理 -> 字典管理
  2. 新增字典类型
    • 例如,创建一个类型为 corresponding_field 的字典,描述为"对应领域"。
  3. 添加字典数据
    • 在该类型下,添加具体的选项。数据标签 是显示给用户看的(如"学前教育"),数据键值 是实际存储的(如"O00")。
    • 同样地,为"教材特色"创建相应的字典类型和数据。
3. 生成与调整前端代码

若依的代码生成器能为你生成基础的前后端CRUD代码,但需要你稍作调整以适应多选。

  • 生成代码:在使用若依的代码生成器时,对于 corresponding_fieldtextbook_features 这两个字段,在"字段信息"配置中,显示类型 建议先选择为"下拉框"(生成基础的字典绑定代码),字典类型 则填入你在第二步创建的字典类型(如corresponding_field)。
  • 修改Vue组件:生成的前端代码通常是单选的,你需要手动将模板中的 el-select 组件替换为 el-checkbox-groupel-checkbox
    1. 引入字典:在Vue组件的 <script> 部分,使用若依提供的 useDict 方法获取字典数据。
      // 假设在 setup 语法下
      import { useDict } from '@/utils/dict'
      const { corresponding_field, textbook_features } = useDict('corresponding_field', 'textbook_features')
      
    2. 修改模板:将表单和列表中的显示部分替换为复选框组。
      <!-- 在表单中 -->
      <el-form-item label="对应领域">
        <el-checkbox-group v-model="form.correspondingField">
          <el-checkbox v-for="dict in corresponding_field" :key="dict.value" :label="dict.value">
            {{ dict.label }}
          </el-checkbox>
        </el-checkbox-group>
      </el-form-item>
      
    3. 处理表格显示:在表格中,默认显示的是存储的逗号分隔的值(如"O00,O01"),不直观。你需要一个字典标签格式化方法,将这些值转换回对应的标签(如"学前教育,小学教育")。若依框架通常提供了类似 selectDictLabel 的方法或类似的格式化函数来实现这个转换。
      {
        field: 'correspondingField',
        title: '对应领域',
        formatter: function(value, row, index) {
          // 假设 formatDictLabels 是一个能将逗号分隔的值字符串转换为对应标签字符串的函数
          return formatDictLabels(corresponding_field, value);
        }
      }
      

两种方案对比 💡

为了让你更清楚地了解两种方案的优劣,可以参考下表:

特性JSON方案字典 + VARCHAR方案
数据结构化支持复杂结构,查询更灵活❌ 存储为简单字符串,查询处理不便
若依集成度❌ 需自定义转换器,集成度较低原生支持,与字典管理无缝结合
开发便利性❌ 实现相对复杂配置简单,符合若依常规用法
导入导出⚠️ 需额外处理JSON转换✅ 框架对字典值处理支持良好
适用场景数据结构复杂、需JSON查询的操作选项相对固定、以展示和CRUD为主的管理系统

一些补充建议

  • 数据一致性:使用VARCHAR存储逗号分隔值,其数据一致性的维护依赖于字典。如果字典值变更,历史存储的逗号分隔字符串不会自动更新。
  • 查询限制:若需基于这些多选字段进行复杂查询(如"查找包含’O00’和’O01’任意一个的所有记录"),VARCHAR方案需要编写特定的SQL(如使用FIND_IN_SETLIKE),而JSON方案在支持JSON查询的数据库中会更灵活。
  • 代码生成器利用:充分理解和利用若依的代码生成器可以大幅提高开发效率。 它不仅能生成后端代码,也能生成基础的前端Vue组件,你可以在其基础上进行修改。

总的来说,如果你的业务场景中这些多选字段主要用于基本的增删改查和展示,强烈推荐使用"字典 + VARCHAR + 复选框"的方案,它更贴合若依框架的设计,实现起来也更快捷。

// 原材料处置方式与其他说明 // 获取相关字段ID const sfzxFieldMark = formSdk.convertFieldNameToId("sfzx"); // 是否执行 const clkcsFieldMark = formSdk.convertFieldNameToId("clkcs"); // 材料库存数 const zzsFieldMark = formSdk.convertFieldNameToId("zzs"); // 在制数 const cpkcsFieldMark = formSdk.convertFieldNameToId("cpkcs"); // 成品库存数 const bzxyyFieldMark = formSdk.convertFieldNameToId("bzxyy"); // 不执行原因 const yclsfczFieldMark = formSdk.convertFieldNameToId("yclsfcz"); // 原材料是否处置 const yldd1FieldMark = formSdk.convertFieldNameToId("yldd1"); // 原料担当1 const yldd2FieldMark = formSdk.convertFieldNameToId("yldd2"); // 原料担当2 const lcpsfczFieldMark = formSdk.convertFieldNameToId("lcpsfcz"); // 量产品是否处置 const lcpsxzzbFieldMark = formSdk.convertFieldNameToId("lcpsxzzb"); // 量产品所需制造部 const lcpzzbpdd1FieldMark = formSdk.convertFieldNameToId("lcpzzbpdd1"); // 量产品制造部负责人 const xpsfczFieldMark = formSdk.convertFieldNameToId("xpsfcz"); // 新品是否处置 const xpsxzzbFieldMark = formSdk.convertFieldNameToId("xpsxzzb"); // 新品所需制造部 const xpzzbddFieldMark = formSdk.convertFieldNameToId("xpzzbdd"); // 新品制造部负责人 const xpyfbFieldMark = formSdk.convertFieldNameToId("xpyfb"); // 新品-研发部 const xpzbbFieldMark = formSdk.convertFieldNameToId("xpzbb"); // 新品-质保部 const cpbcpsfczFieldMark = formSdk.convertFieldNameToId("cpbcpsfcz"); // 成品(半成品)是否处置 const cpbcpdd1FieldMark = formSdk.convertFieldNameToId("cpbcpdd1"); // 成品(半成品)担当1 const cpbcpdd2FieldMark = formSdk.convertFieldNameToId("cpbcpdd2"); // 成品(半成品)担当2 const yclslqrFieldMark = formSdk.convertFieldNameToId("yclslqr"); // 实际数量确认 const yclczfsFieldMark = formSdk.convertFieldNameToId("yclczfs"); // 产品处置方式 const yclqtFieldMark = formSdk.convertFieldNameToId("yclqt"); // 其他处置方式 const yclwcrqFieldMark = formSdk.convertFieldNameToId("yclwcrq"); // 实际处置完成日期 const lcpzzybslqrFieldMark = formSdk.convertFieldNameToId("lcpzzybslqr"); // 量产品制造部数量确认 const lcpzzybczfsFieldMark = formSdk.convertFieldNameToId("lcpzzybczfs"); // 量产品制造部处置方式 const lcpzzybqtFieldMark = formSdk.convertFieldNameToId("lcpzzybqt"); // 量产品制造部其他 const lcpzzybwcrqFieldMark = formSdk.convertFieldNameToId("lcpzzybwcrq"); // 量产品制造部完成日期 // 修正重复定义问题,将量产品制造二部改为正确的命名 const lcpzzebslqrFieldMark = formSdk.convertFieldNameToId("lcpzzebslqr"); // 量产品制造二部数量确认 const lcpzzebczfsFieldMark = formSdk.convertFieldNameToId("lcpzzebczfs"); // 量产品制造二部处置方式 const lcpzzebqtFieldMark = formSdk.convertFieldNameToId("lcpzzebqt"); // 量产品制造二部其他 const lcpzzebwcrqFieldMark = formSdk.convertFieldNameToId("lcpzzebwcrq"); // 量产品制造二部完成日期 const lcpzzsbslqr1FieldMark = formSdk.convertFieldNameToId("lcpzzsbslqr1"); // 量产品制造三部数量确认 const lcpzzsbczfs1FieldMark = formSdk.convertFieldNameToId("lcpzzsbczfs1"); // 量产品制造三部处置方式 const lcpzzsbqt1FieldMark = formSdk.convertFieldNameToId("lcpzzsbqt1"); // 量产品制造三部其他 const lcpzzsbwcrq1FieldMark = formSdk.convertFieldNameToId("lcpzzsbwcrq1"); // 量产品制造三部完成日期 const lcpzzsbslqr2FieldMark = formSdk.convertFieldNameToId("lcpzzsbslqr2"); // 量产品制造四部数量确认 const lcpzzsbczfs2FieldMark = formSdk.convertFieldNameToId("lcpzzsbczfs2"); // 量产品制造四部处置方式 const lcpzzsbqt2FieldMark = formSdk.convertFieldNameToId("lcpzzsbqt2"); // 量产品制造四部其他 const lcpzzsbwcrq2FieldMark = formSdk.convertFieldNameToId("lcpzzsbwcrq2"); // 量产品制造四部完成日期 const xpzzybslqrFieldMark = formSdk.convertFieldNameToId("xpzzybslqr"); // 新品-制造部数量确认 const xpzzybczfsFieldMark = formSdk.convertFieldNameToId("xpzzybczfs"); // 新品-制造部处置方式 const xpzzybqtFieldMark = formSdk.convertFieldNameToId("xpzzybqt"); // 新品-制造部其他 const xpzzybwcrqFieldMark = formSdk.convertFieldNameToId("xpzzybwcrq"); // 新品-制造部完成日期 const xpzzebslqrFieldMark = formSdk.convertFieldNameToId("xpzzebslqr"); // 新品-制造二部数量确认 const xpzzebczfsFieldMark = formSdk.convertFieldNameToId("xpzzebczfs"); // 新品-制造二部处置方式 const xpzzebqtFieldMark = formSdk.convertFieldNameToId("xpzzebqt"); // 新品-制造二部其他 const xpzzebwcrqFieldMark = formSdk.convertFieldNameToId("xpzzebwcrq"); // 新品-制造二部完成日期 const xpzzsbslqr1FieldMark = formSdk.convertFieldNameToId("xpzzsbslqr1"); // 新品-制造三部数量确认 const xpzzsbczfsFieldMark = formSdk.convertFieldNameToId("xpzzsbczfs"); // 新品-制造三部处置方式 const xpzzsbqt1FieldMark = formSdk.convertFieldNameToId("xpzzsbqt1"); // 新品-制造三部其他 const xpzzsbwcrq1FieldMark = formSdk.convertFieldNameToId("xpzzsbwcrq1"); // 新品-制造三部完成日期 const xpzzsbslqr2FieldMark = formSdk.convertFieldNameToId("xpzzsbslqr2"); // 新品-制造四部数量确认 const xpzzsbqtFieldMark = formSdk.convertFieldNameToId("xpzzsbqt"); // 新品-制造四部其他 const xpzzsbwcrq2FieldMark = formSdk.convertFieldNameToId("xpzzsbwcrq2"); // 新品-制造四部完成日期 const xpFieldMark = formSdk.convertFieldNameToId("xp"); // 新品-制造四部处置方式 const sjslqrrrFieldMark = formSdk.convertFieldNameToId("sjslqrrr"); // 新品-制造四部数量确认 const cpczfsssFieldMark = formSdk.convertFieldNameToId("cpczfsss"); // 新品-制造四部其他 const yfbxpqtFieldMark = formSdk.convertFieldNameToId("yfbxpqt"); // 新品-制造四部完成日期 const sjczwcrq22FieldMark = formSdk.convertFieldNameToId("sjczwcrq22"); // 新品-制造四部处置方式 const xpzbbczfsFieldMark = formSdk.convertFieldNameToId("xpzbbczfs"); // 产品处置方式 const xpzbbqtFieldMark = formSdk.convertFieldNameToId("xpzbbqt"); // 其他处置方式 const xpzbbwcrqFieldMark = formSdk.convertFieldNameToId("xpzbbwcrq"); // 实际处置完成日期 const sjslqrFieldMark = formSdk.convertFieldNameToId("sjslqr"); // 实际数量确认 const cpczfsFieldMark = formSdk.convertFieldNameToId("cpczfs"); // 产品处置方式 const qtczfsFieldMark = formSdk.convertFieldNameToId("qtczfs"); // 其他处置方式 const sjczwcrqFieldMark = formSdk.convertFieldNameToId("sjczwcrq"); // 实际处置完成日期 // 定义viewAttr值(遵循系统规范) const REQUIRED_ATTR = 3; // 显示必填 const EDITABLE_ATTR = 2; // 显示可编辑 const HIDE_ATTR = 4; // 隐藏 // 优化:缓存字段状态,避免重复更新 const fieldStateCache = new Map(); // 处理依赖字段显隐和必填状态 // 当sourceField值为3时,targetField设为必填,否则隐藏 function handleDependentField(sourceField, targetField) { const sourceValue = formSdk.getFieldValue(sourceField) || ""; return { [targetField]: sourceValue === "3" ? REQUIRED_ATTR : HIDE_ATTR }; } // 初始加载时设置字段显隐状态 function setInitialVisibility() { const initialValue = formSdk.getFieldValue(sfzxFieldMark); updateFieldVisibility(initialValue); } // 辅助函数:批量更新字段状态 function updateFields(fieldUpdates) { const changes = {}; Object.entries(fieldUpdates).forEach(([field, attr]) => { // 只在状态变化时更新 if (fieldStateCache.get(field) !== attr) { changes[field] = { viewAttr: attr }; fieldStateCache.set(field, attr); } }); if (Object.keys(changes).length > 0) { formSdk.changeMoreField({}, changes); } } // 字段显隐控制逻辑 function updateFieldVisibility(sfzxValue) { // 获取所有依赖字段的值 const yclsfcz = formSdk.getFieldValue(yclsfczFieldMark) || ""; const lcpsfcz = formSdk.getFieldValue(lcpsfczFieldMark) || ""; const lcpsxzzb = formSdk.getFieldValue(lcpsxzzbFieldMark) || []; const xpsfcz = formSdk.getFieldValue(xpsfczFieldMark) || ""; const xpsxzzb = formSdk.getFieldValue(xpsxzzbFieldMark) || []; const cpbcpsfcz = formSdk.getFieldValue(cpbcpsfczFieldMark) || ""; // 处理字段,确保为数组 const lcpsxzzbValues = Array.isArray(lcpsxzzb) ? lcpsxzzb : [lcpsxzzb]; const xpsxzzbValues = Array.isArray(xpsxzzb) ? xpsxzzb : [xpsxzzb]; // 基础字段显隐控制 const baseUpdates = {}; if (sfzxValue === "1") { // 执行:隐藏不执行相关字段 baseUpdates[bzxyyFieldMark] = HIDE_ATTR; baseUpdates[clkcsFieldMark] = HIDE_ATTR; baseUpdates[zzsFieldMark] = HIDE_ATTR; baseUpdates[cpkcsFieldMark] = HIDE_ATTR; // 显示基础处置字段 baseUpdates[yclsfczFieldMark] = REQUIRED_ATTR; baseUpdates[lcpsfczFieldMark] = REQUIRED_ATTR; baseUpdates[xpsfczFieldMark] = REQUIRED_ATTR; baseUpdates[cpbcpsfczFieldMark] = REQUIRED_ATTR; } else if (sfzxValue === "0") { // 不执行:显示不执行相关字段,隐藏处置字段 baseUpdates[bzxyyFieldMark] = REQUIRED_ATTR; baseUpdates[clkcsFieldMark] = REQUIRED_ATTR; baseUpdates[zzsFieldMark] = REQUIRED_ATTR; baseUpdates[cpkcsFieldMark] = REQUIRED_ATTR; // 隐藏所有处置相关字段 baseUpdates[yclsfczFieldMark] = HIDE_ATTR; baseUpdates[yldd1FieldMark] = HIDE_ATTR; baseUpdates[yldd2FieldMark] = HIDE_ATTR; baseUpdates[lcpsfczFieldMark] = HIDE_ATTR; baseUpdates[lcpsxzzbFieldMark] = HIDE_ATTR; baseUpdates[lcpzzbpdd1FieldMark] = HIDE_ATTR; baseUpdates[xpsfczFieldMark] = HIDE_ATTR; baseUpdates[xpsxzzbFieldMark] = HIDE_ATTR; baseUpdates[xpzzbddFieldMark] = HIDE_ATTR; baseUpdates[xpyfbFieldMark] = HIDE_ATTR; baseUpdates[xpzbbFieldMark] = HIDE_ATTR; baseUpdates[cpbcpsfczFieldMark] = HIDE_ATTR; baseUpdates[cpbcpdd1FieldMark] = HIDE_ATTR; baseUpdates[cpbcpdd2FieldMark] = HIDE_ATTR; } // 原材料处置控制 const yclUpdates = {}; if (sfzxValue === "1") { if (yclsfcz === "1") { // 原材料需处置:显示相关字段 yclUpdates[yldd1FieldMark] = REQUIRED_ATTR; yclUpdates[yldd2FieldMark] = REQUIRED_ATTR; yclUpdates[yclslqrFieldMark] = REQUIRED_ATTR; yclUpdates[yclczfsFieldMark] = REQUIRED_ATTR; yclUpdates[yclwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当yclczfs为3时lcpzzybqt必填,否则隐藏 Object.assign(yclUpdates, handleDependentField(yclczfsFieldMark, lcpzzybqtFieldMark) ); } else { // 原材料不需处置:隐藏相关字段 yclUpdates[yldd1FieldMark] = HIDE_ATTR; yclUpdates[yldd2FieldMark] = HIDE_ATTR; yclUpdates[yclslqrFieldMark] = HIDE_ATTR; yclUpdates[yclczfsFieldMark] = HIDE_ATTR; yclUpdates[yclqtFieldMark] = HIDE_ATTR; yclUpdates[yclwcrqFieldMark] = HIDE_ATTR; yclUpdates[lcpzzybqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } } // 量产品处置控制 const lcpUpdates = {}; if (sfzxValue === "1") { if (lcpsfcz === "1") { // 量产品需处置:显示基础字段 lcpUpdates[lcpsxzzbFieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzbpdd1FieldMark] = REQUIRED_ATTR; // 制造部显示控制() const isDept0 = lcpsxzzbValues.includes("0"); const isDept1 = lcpsxzzbValues.includes("1"); const isDept2 = lcpsxzzbValues.includes("2"); const isDept3 = lcpsxzzbValues.includes("3"); // 制造部 if (isDept0) { lcpUpdates[lcpzzybslqrFieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzybczfsFieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzybwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当lcpzzybczfs为3时lcpzzebqt必填 Object.assign(lcpUpdates, handleDependentField(lcpzzybczfsFieldMark, lcpzzebqtFieldMark) ); } else { lcpUpdates[lcpzzybslqrFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybczfsFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybqtFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybwcrqFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 制造二部 if (isDept1) { lcpUpdates[lcpzzebslqrFieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzebczfsFieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzebwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当lcpzzebczfs为3时lcpzzsbqt1必填 Object.assign(lcpUpdates, handleDependentField(lcpzzebczfsFieldMark, lcpzzsbqt1FieldMark) ); } else { lcpUpdates[lcpzzebslqrFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebczfsFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebqtFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebwcrqFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt1FieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 制造三部 if (isDept2) { lcpUpdates[lcpzzsbslqr1FieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzsbczfs1FieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzsbwcrq1FieldMark] = REQUIRED_ATTR; // 应用依赖规则:当lcpzzsbczfs1为3时lcpzzsbqt2必填 Object.assign(lcpUpdates, handleDependentField(lcpzzsbczfs1FieldMark, lcpzzsbqt2FieldMark) ); } else { lcpUpdates[lcpzzsbslqr1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbczfs1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbwcrq1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt2FieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 制造四部 if (isDept3) { lcpUpdates[lcpzzsbslqr2FieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzsbczfs2FieldMark] = REQUIRED_ATTR; lcpUpdates[lcpzzsbwcrq2FieldMark] = REQUIRED_ATTR; // 应用依赖规则:当lcpzzsbczfs2为3时xpzzybqt必填 Object.assign(lcpUpdates, handleDependentField(lcpzzsbczfs2FieldMark, xpzzybqtFieldMark) ); } else { lcpUpdates[lcpzzsbslqr2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbczfs2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbwcrq2FieldMark] = HIDE_ATTR; lcpUpdates[xpzzybqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } } else { // 量产品不需处置:隐藏所有相关字段 lcpUpdates[lcpsxzzbFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzbpdd1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybslqrFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybczfsFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybqtFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzybwcrqFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebslqrFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebczfsFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebqtFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzebwcrqFieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbslqr1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbczfs1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbwcrq1FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbslqr2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbczfs2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbqt2FieldMark] = HIDE_ATTR; lcpUpdates[lcpzzsbwcrq2FieldMark] = HIDE_ATTR; lcpUpdates[xpzzybqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } } // 新品处置控制 const xpUpdates = {}; if (sfzxValue === "1") { if (xpsfcz === "1") { // 新品需处置:显示基础字段 xpUpdates[xpsxzzbFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzbddFieldMark] = REQUIRED_ATTR; xpUpdates[xpyfbFieldMark] = REQUIRED_ATTR; xpUpdates[xpzbbFieldMark] = REQUIRED_ATTR; // 制造部显示控制() const isDept0 = xpsxzzbValues.includes("0"); const isDept1 = xpsxzzbValues.includes("1"); const isDept2 = xpsxzzbValues.includes("2"); const isDept3 = xpsxzzbValues.includes("3"); // 新品制造部 if (isDept0) { xpUpdates[xpzzybslqrFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzybczfsFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzybwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当xpzzybczfs为3时xpzzebqt必填 Object.assign(xpUpdates, handleDependentField(xpzzybczfsFieldMark, xpzzebqtFieldMark) ); } else { xpUpdates[xpzzybslqrFieldMark] = HIDE_ATTR; xpUpdates[xpzzybczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzybqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzybwcrqFieldMark] = HIDE_ATTR; xpUpdates[xpzzebqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 新品制造二部 if (isDept1) { xpUpdates[xpzzebslqrFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzebczfsFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzebwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当xpzzebczfs为3时xpzzsbqt1必填 Object.assign(xpUpdates, handleDependentField(xpzzebczfsFieldMark, xpzzsbqt1FieldMark) ); } else { xpUpdates[xpzzebslqrFieldMark] = HIDE_ATTR; xpUpdates[xpzzebczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzebqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzebwcrqFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqt1FieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 新品制造三部 if (isDept2) { xpUpdates[xpzzsbslqr1FieldMark] = REQUIRED_ATTR; xpUpdates[xpzzsbczfsFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzsbwcrq1FieldMark] = REQUIRED_ATTR; // 应用依赖规则:当xpzzsbczfs为3时xpzzsbqt必填 Object.assign(xpUpdates, handleDependentField(xpzzsbczfsFieldMark, xpzzsbqtFieldMark) ); } else { xpUpdates[xpzzsbslqr1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqt1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbwcrq1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 新品制造四部 if (isDept3) { xpUpdates[xpzzsbslqr2FieldMark] = REQUIRED_ATTR; xpUpdates[xpFieldMark] = REQUIRED_ATTR; xpUpdates[xpzzsbwcrq2FieldMark] = REQUIRED_ATTR; // 应用依赖规则:当xp为3时yfbxpqt必填 Object.assign(xpUpdates, handleDependentField(xpFieldMark, yfbxpqtFieldMark) ); } else { xpUpdates[xpzzsbslqr2FieldMark] = HIDE_ATTR; xpUpdates[xpFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbwcrq2FieldMark] = HIDE_ATTR; xpUpdates[yfbxpqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } // 新品研发部相关 xpUpdates[sjslqrrrFieldMark] = REQUIRED_ATTR; xpUpdates[cpczfsssFieldMark] = REQUIRED_ATTR; xpUpdates[sjczwcrq22FieldMark] = REQUIRED_ATTR; // 应用依赖规则:当cpczfsss为3时yclqt必填 Object.assign(xpUpdates, handleDependentField(cpczfsssFieldMark, yclqtFieldMark) ); // 新品质保部相关 xpUpdates[xpzbbczfsFieldMark] = REQUIRED_ATTR; xpUpdates[xpzbbwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当xpzbbczfs为3时xpzbbqt必填 Object.assign(xpUpdates, handleDependentField(xpzbbczfsFieldMark, xpzbbqtFieldMark) ); } else { // 新品不需处置:隐藏所有相关字段 xpUpdates[xpsxzzbFieldMark] = HIDE_ATTR; xpUpdates[xpzzbddFieldMark] = HIDE_ATTR; xpUpdates[xpyfbFieldMark] = HIDE_ATTR; xpUpdates[xpzbbFieldMark] = HIDE_ATTR; xpUpdates[xpzzybslqrFieldMark] = HIDE_ATTR; xpUpdates[xpzzybczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzybqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzybwcrqFieldMark] = HIDE_ATTR; xpUpdates[xpzzebslqrFieldMark] = HIDE_ATTR; xpUpdates[xpzzebczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzebqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzebwcrqFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbslqr1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqt1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbwcrq1FieldMark] = HIDE_ATTR; xpUpdates[xpzzsbslqr2FieldMark] = HIDE_ATTR; xpUpdates[xpFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbqtFieldMark] = HIDE_ATTR; xpUpdates[xpzzsbwcrq2FieldMark] = HIDE_ATTR; xpUpdates[sjslqrrrFieldMark] = HIDE_ATTR; xpUpdates[cpczfsssFieldMark] = HIDE_ATTR; xpUpdates[yfbxpqtFieldMark] = HIDE_ATTR; xpUpdates[sjczwcrq22FieldMark] = HIDE_ATTR; xpUpdates[xpzbbczfsFieldMark] = HIDE_ATTR; xpUpdates[xpzbbqtFieldMark] = HIDE_ATTR; xpUpdates[xpzbbwcrqFieldMark] = HIDE_ATTR; xpUpdates[yclqtFieldMark] = HIDE_ATTR; // 确保依赖字段也隐藏 } } // 成品(半成品)处置控制 const cpbcpUpdates = {}; if (sfzxValue === "1") { if (cpbcpsfcz === "1") { // 成品需处置:显示相关字段 cpbcpUpdates[cpbcpdd1FieldMark] = REQUIRED_ATTR; cpbcpUpdates[cpbcpdd2FieldMark] = REQUIRED_ATTR; cpbcpUpdates[sjslqrFieldMark] = REQUIRED_ATTR; cpbcpUpdates[cpczfsFieldMark] = REQUIRED_ATTR; cpbcpUpdates[sjczwcrqFieldMark] = REQUIRED_ATTR; // 应用依赖规则:当cpczfs为3时qtczfs必填 Object.assign(cpbcpUpdates, handleDependentField(cpczfsFieldMark, qtczfsFieldMark) ); } else { // 成品不需处置:隐藏相关字段 cpbcpUpdates[cpbcpdd1FieldMark] = HIDE_ATTR; cpbcpUpdates[cpbcpdd2FieldMark] = HIDE_ATTR; cpbcpUpdates[sjslqrFieldMark] = HIDE_ATTR; cpbcpUpdates[cpczfsFieldMark] = HIDE_ATTR; cpbcpUpdates[qtczfsFieldMark] = HIDE_ATTR; cpbcpUpdates[sjczwcrqFieldMark] = HIDE_ATTR; } } // 合并所有更新并应用 updateFields({ ...baseUpdates, ...yclUpdates, ...lcpUpdates, ...xpUpdates, ...cpbcpUpdates }); } // 防抖处理,避免频繁更新 function debounce(func, wait = 50) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), wait); }; } // 统的事件处理函数 const handleFieldChange = debounce(() => { const currentSfzxValue = formSdk.getFieldValue(sfzxFieldMark); updateFieldVisibility(currentSfzxValue); }); // 需要监听的字段列表(包含所有影响显隐的字段) const fieldsToWatch = [ sfzxFieldMark, yclsfczFieldMark, yclczfsFieldMark, // 添加依赖源字段 lcpsfczFieldMark, lcpsxzzbFieldMark, lcpzzybczfsFieldMark, // 添加依赖源字段 lcpzzebczfsFieldMark, // 添加依赖源字段 lcpzzsbczfs1FieldMark, // 添加依赖源字段 lcpzzsbczfs2FieldMark, // 添加依赖源字段 xpsfczFieldMark, xpsxzzbFieldMark, xpzzybczfsFieldMark, // 添加依赖源字段 xpzzebczfsFieldMark, // 添加依赖源字段 xpzzsbczfsFieldMark, // 添加依赖源字段 xpFieldMark, // 添加依赖源字段 cpczfsssFieldMark, // 添加依赖源字段 xpzbbczfsFieldMark, // 添加依赖源字段 cpbcpsfczFieldMark, cpczfsFieldMark // 添加依赖源字段 ]; // 绑定所有相关字段的变更事件 fieldsToWatch.forEach(field => { try { formSdk.bindFieldChangeEvent( field, handleFieldChange, { scope: window.WeFormSDK.CHANGE_EVENT_SCOPE } ); } catch (error) { console.error(`绑定字段${field}变更事件失败:`, error); } }); // 页面加载时初始化显隐状态 setInitialVisibility(); // 表单就绪时再初始化次,确保状态正确 if (window.WeFormSDK) { window.WeFormSDK.ready(setInitialVisibility); } 这个字段的显示隐藏没有实现
09-24
【源码免费下载链接】:https://renmaiwang.cn/s/6gqq2 C#语言开发的简单学生信息管理系统知识点总结基于C#语言设计并实现了个简单的学生信息管理系统。该系统旨在为用户提供个高效便捷的学生信息管理工具。其主要功能包括:用户登录、添加和查询学生数据等核心操作。 系统运行环境要求为Windows操作系统,开发环境采用Visual Studio进行项目配置与代码编译。系统架构主要包含以下几个部分: 1. 登录界面设计:提供友好的登录界面,支持用户名和密码验证。 2. 数据库连接功能:通过ADO.NET技术实现对本地数据库的访问,并支持基本的数据操作。 3. 数据显示与编辑:使用DataGridView控件展示并管理学生数据信息。 系统开发过程主要包括以下几个步骤: 1. 登录界面功能模块设计:基于C#语言构建登录功能的类和事件处理机制。 2. 数据库操作实现:通过编写SQL语句完成学生数据的增删改查功能。 3. 数据显示与编辑实现:结合DataSet绑定技术,将数据库数据展示在DataGridView控件上。 系统开发过程中采用的主要技术和方法包括: 1. C#语言:作为主要编程语言,C#提供了丰富的语法结构和强大的类库支持。 2. Windows Forms界面设计框架:为系统提供友好的人机交互界面。 3. ADO.NET技术:实现对数据库的高效访问与数据操作。 本系统的开发成果表明,基于C#语言的简单学生信息管理系统能够满足基本的学生信息管理需求,并且具有良好的扩展性和维护性。该系统在教育信息化领域具有定的应用价值和推广潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值