# 编码规则模块 **Repository Path**: ruovea-component/codingrule-module ## Basic Information - **Project Name**: 编码规则模块 - **Description**: 编码规则模块 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-22 - **Last Updated**: 2026-10-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # @ruovea/codingrule 编码规则模块,以 **pnpm 源码包** 形式提供给各宿主项目复用。 - **不打 dist、不发 npm**——exports 直指 `./src/*`,由宿主 Vite 编译 - **依赖注入解耦**——request / auth / i18n 由宿主装配时注入 - **零侵入**——包内不含 `/@/` 等宿主别名引用,可独立运行,不绑定特定宿主 --- ## 一、目录结构 ``` src/ ├─ index.ts # 入口:导出 CodingRulePlugin + API + 类型 ├─ plugin.ts # Vue install(校验必填项 / provide / mergeLocaleMessage) ├─ context.ts # InjectionKey + useCodingRuleContext() ├─ types.ts # CodingRulePluginOptions ├─ routes.ts # 1 条静态路由(可选使用) ├─ api/ │ ├─ index.ts # 9 个 API 函数 │ ├─ http.ts # request 注入点 │ ├─ endpoints.ts # URL 前缀(可覆盖) │ └─ codingRule.ts # 编码规则 CRUD + 生成流水号(支持 inputChar)+ 生成记录分页查询 ├─ i18n/locales/ # 6 语言(en / fr-fr / ja-jp / vi-vn / zh-cn / zh-tw) ├─ components/ │ ├─ searchExpand.vue # 搜索区展开/收起按钮 │ └─ codingRuleSNInput.vue # 单据编码输入框 + SN 取号按钮(自包含) ├─ composables/ │ ├─ useSearchExpand.ts # 搜索区展开/收起状态 │ └─ useCodingRuleSN.ts # 取号逻辑(可复用于自定义 UI) └─ views/codingRule/ ├─ index.vue # 编码规则列表页(展示最大长度/是否补齐列;生成编码弹窗可传 inputChar;「生成记录」弹窗查看 BasCodingRuleRecord) └─ component/editCodingRule.vue # 新增/编辑弹窗(规则明细展示精简表格,新增/编辑走独立弹窗表单) ``` --- ## 二、宿主接入 ### 2.1 安装 宿主 `package.json` 用 `link:` 协议指向本仓库: ```json { "dependencies": { "@ruovea/codingrule": "link:../../codingrule-module/packages/codingrule" } } ``` ```bash cd && pnpm install # 包内依赖 cd <宿主> && pnpm install # 建立 link ``` > ⚠️ `link:` 方式下包的真实路径在宿主根目录之外,宿主 `vite.config.ts` 必须显式 dedupe,否则包内 `import 'element-plus'` 会解析失败: > > ```ts > resolve: { > alias, > dedupe: ['vue', 'element-plus', 'vue-i18n', 'axios'], > }, > ``` ### 2.2 装配插件 ```ts // plugins/codingrule.ts import type { App } from 'vue'; import { CodingRulePlugin } from '@ruovea/codingrule'; import request from '/@/utils/request'; import { auth } from '/@/utils/authFunction'; import { i18n } from '/@/i18n/index'; export function setupCodingRule(app: App) { app.use(CodingRulePlugin, { request: request as any, auth, i18n: i18n as any, }); } ``` ```ts // main.ts import { setupCodingRule } from '/@/plugins/codingrule'; // ... app.use(pinia) 之后 setupCodingRule(app); ``` --- ## 三、CodingRulePluginOptions 说明 | 字段 | 必填 | 说明 | |---|---|---| | `request` | ✅ | 宿主 axios 实例(已配 baseURL / token / 拦截器) | | `auth` | ➖ | `(code: string) => boolean`,按钮权限校验,缺省 `() => true` | | `i18n` | ➖ | 宿主 vue-i18n 实例(用于 mergeLocaleMessage) | | `endpoints` | ➖ | 覆盖 API URL 前缀(见下方 Endpoints 章节) | | `registerI18n` | ➖ | 是否自动 merge i18n,默认 `true` | > 与 article 模块不同,codingrule **无需注入宿主组件**,所有 UI 均使用 element-plus 自包含。 ### i18n 注入约定 包内视图使用 `message.codingrule.xxx` / `message.router.codingRule` 格式的 key。插件 merge 时同时注册到顶层和 `message` 层,兼容宿主两级结构。 --- ## 四、Endpoints 说明 ```ts interface CodingRuleEndpoints { basCodingRulePages: '/BasCodingRule/Pages' basCodingRuleData: '/BasCodingRule/Data' basCodingRuleList: '/BasCodingRule/List' basCodingRuleAdd: '/BasCodingRule/AddData' basCodingRuleUpdate: '/BasCodingRule/UpdateData' basCodingRuleDelete: '/BasCodingRule/DeleteData' basCodingRuleDeleteBatch: '/BasCodingRule/DeleteBatch' basCodingRuleSN: '/BasCodingRule/SN' basCodingRuleRecordPages: '/BasCodingRuleRecord/Pages' } ``` > `basCodingRuleSN` 对应后端 `BasCodingRuleService.GetSNAsync(code, inputChar)`,实际请求为 `GET /BasCodingRule/SN/{code}?inputChar=xxx`。 --- ## 五、权限编码清单 | 编码 | 位置 | 说明 | |---|---|---| | `codingRule:add` | 编码规则列表 | 新增按钮 | | `codingRule:edit` | 编码规则列表 | 编辑按钮 | | `codingRule:delete` | 编码规则列表 | 删除按钮 | | `codingRule:sn` | 编码规则列表 | 生成编码按钮 | --- ## 六、单据编码取号控件 业务编辑页需要「单据编码输入框 + SN 取号按钮」时,直接用包内自包含组件,不要在各页面重复实现 `generateNo`。 ### 6.1 组件 `CodingRuleSNInput` ```vue ``` ```ts import CodingRuleSNInput from '@ruovea/codingrule/components/codingRuleSNInput.vue'; const snRef = ref(); const openDialog = (row: any) => { state.ruleForm = JSON.parse(JSON.stringify(row)); state.isShowDialog = true; // drawer 内容惰性渲染(rendered 为 true 才挂载 body slot),需等一帧再取号 if (!state.ruleForm.no) nextTick(() => snRef.value?.generate()); }; ``` | 属性 | 类型 | 说明 | |---|---|---| | `modelValue` | `string` | 单号,配合 `v-model` | | `code` | `string` | 编码规则编码(必填),如 `PO` / `SO` / `IN` / `OUT` / `RT` / `MOR` / `DOC` | | `disabled` | `boolean` | 只读 + 禁用取号按钮(编辑态通常传 `id > 0`) | | `placeholder` | `string` | 占位文案,缺省取 `message.codingrule.pleaseEnterCode` | | `inputChar` | `string` | 动态字符:作 `InputChar` 分段内容,或作按字符循环的分组 key | | `buttonText` | `string` | 取号按钮文案,默认 `SN`,可传「生成」「取号」等 | | 事件 | 说明 | |---|---| | `update:modelValue` | 单号变化 | | `generated` | 取号成功,参数为新单号 | | `generated-failed` | 取号失败(组件内已弹错误提示) | 暴露方法:`generate(inputChar?)`(手动取号,返回 `Promise`;不传时用 prop 上的 `inputChar`)、`loading`。 ### 6.2 关于 `inputChar` 对应后端 `BasCodingRuleService.GetSNAsync(code, inputChar)` 的第二个参数,语义双用: - 「输入字符」分段(`InputChar`)的取值,原样拼进编码; - 流水号 `cycleMethod=10`(按传入字符循环)时的分桶 key,不同值各自独立计数。 两者并存时同一字符串同时承担两种用途。改传不同 `inputChar` 会切换分桶并从起始值重新累计。 **组件不校验 `inputChar` 空值**:若规则含 `InputChar` 分段但调用方未传,后端会拼出空段,前端不做拦截,由业务方自行保证。 每次取号都会推进服务端流水号,不要做防抖 / 节流封装。 ### 6.3 逻辑复用 `useCodingRuleSN` 需要自定义 UI 时只复用逻辑,不引入组件: ```ts import { useCodingRuleSN } from '@ruovea/codingrule'; const { loading, generate } = useCodingRuleSN(); const no = await generate('SO', 'B01'); ``` > `generate()` 内部失败时会用包内 i18n 弹一次错误提示,宿主不要再叠加一次 `ElMessage.error`。 --- ## 七、路由 | path | name | keepAlive | 说明 | |---|---|---|---| | `/business/codingRule` | codingRule | ✅ | 编码规则列表 | > 路由 `meta.title` 使用硬编码中文 `'编码规则'`,菜单国际化通过包内 locale 文件的 `router.codingRule` 键实现(插件 merge 后 `t('router.codingRule')` 可命中)。 --- ## 八、License MIT