From 9f1060f71ce97c2461f780b3ac716064c3cb857c Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Wed, 15 Jul 2026 17:20:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E5=88=99=E7=AE=A1=E7=90=86=E5=89=8D=E7=AB=AF=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/base/codegen/index.ts | 81 +++++++ .../src/router/routes/modules/base.ts | 15 ++ .../src/views/base/codegen/data.ts | 226 ++++++++++++++++++ .../src/views/base/codegen/index.vue | 175 ++++++++++++++ .../src/views/base/codegen/modules/form.vue | 103 ++++++++ 5 files changed, 600 insertions(+) create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/router/routes/modules/base.ts create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts new file mode 100644 index 00000000..eb012932 --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts @@ -0,0 +1,81 @@ +import { requestClient } from '#/api/request'; + +export namespace BaseCodeRuleApi { + /** 分段配置 */ + export interface SegmentConfig { + type: 'PREFIX' | 'DATE' | 'SEQUENCE'; + /** PREFIX 段:固定值 */ + value?: string; + /** DATE 段:日期格式 */ + format?: string; + /** SEQUENCE 段:重置维度 */ + resetBy?: 'DAY' | 'MONTH' | 'YEAR' | 'GLOBAL'; + /** SEQUENCE 段:起始值 */ + startAt?: number; + /** SEQUENCE 段:补位长度 */ + paddingLen?: number; + /** SEQUENCE 段:补位字符 */ + paddingChar?: string; + /** SEQUENCE 段:最大值上限 */ + maxValue?: number; + } + + /** 编码规则 */ + export interface CodeRule { + id?: number; + ruleName: string; + ruleCode: string; + segments: SegmentConfig[]; + separator?: string; + letterCase?: number; + totalLength?: number; + seqStrategy?: string; + status?: number; + remark?: string; + createTime?: string; + } +} + +/** 查询编码规则分页 */ +export async function getCodeRulePage(params: { + pageNo: number; + pageSize: number; + ruleName?: string; + ruleCode?: string; + status?: number; + createTime?: string[]; +}) { + return requestClient.get<{ + list: BaseCodeRuleApi.CodeRule[]; + total: number; + }>('/base/code-rule/page', { params }); +} + +/** 查询编码规则详情 */ +export async function getCodeRule(id: number) { + return requestClient.get( + `/base/code-rule/get?id=${id}`, + ); +} + +/** 查询编码规则精简列表(下拉选项) */ +export async function getSimpleCodeRuleList() { + return requestClient.get( + '/base/code-rule/simple-list', + ); +} + +/** 新增编码规则 */ +export async function createCodeRule(data: BaseCodeRuleApi.CodeRule) { + return requestClient.post('/base/code-rule/create', data); +} + +/** 修改编码规则 */ +export async function updateCodeRule(data: BaseCodeRuleApi.CodeRule) { + return requestClient.put('/base/code-rule/update', data); +} + +/** 删除编码规则 */ +export async function deleteCodeRule(id: number) { + return requestClient.delete(`/base/code-rule/delete?id=${id}`); +} diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/router/routes/modules/base.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/router/routes/modules/base.ts new file mode 100644 index 00000000..ba465dd3 --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/router/routes/modules/base.ts @@ -0,0 +1,15 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/base/code-rule', + component: () => import('#/views/base/codegen/index.vue'), + name: 'BaseCodeRule', + meta: { + title: '编码规则', + icon: 'ant-design:barcode-outlined', + }, + }, +]; + +export default routes; diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts new file mode 100644 index 00000000..c79735dd --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts @@ -0,0 +1,226 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { BaseCodeRuleApi } from '#/api/base/codegen'; + +import { getRangePickerDefaultProps } from '#/utils'; + +/** 字母大小写选项 */ +const LETTER_CASE_OPTIONS = [ + { label: '原样', value: 0 }, + { label: '全大写', value: 1 }, + { label: '全小写', value: 2 }, +]; + +/** 序号策略选项 */ +const SEQ_STRATEGY_OPTIONS = [ + { label: '号段预分配', value: 'segment' }, + { label: '分布式锁实时', value: 'lock' }, +]; + +/** 状态选项 */ +const STATUS_OPTIONS = [ + { label: '启用', value: 0 }, + { label: '禁用', value: 1 }, +]; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'ruleName', + label: '规则名称', + rules: 'required', + component: 'Input', + componentProps: { + placeholder: '请输入规则名称', + }, + }, + { + fieldName: 'ruleCode', + label: '规则编码', + rules: 'required', + component: 'Input', + componentProps: { + placeholder: '请输入规则编码(唯一标识)', + }, + }, + { + fieldName: 'segments', + label: '分段配置', + rules: 'required', + component: 'Textarea', + componentProps: { + placeholder: + 'JSON数组格式,例如:\n[{"type":"PREFIX","value":"ORD"},{"type":"DATE","format":"yyyyMMdd"},{"type":"SEQUENCE","resetBy":"DAY","startAt":1,"paddingLen":4,"paddingChar":"0","maxValue":9999}]', + rows: 6, + }, + help: 'JSON数组格式。type: PREFIX/DATE/SEQUENCE', + }, + { + fieldName: 'separator', + label: '分隔符', + component: 'Input', + componentProps: { + placeholder: '如 -、/、_,留空则不使用分隔符', + }, + }, + { + fieldName: 'letterCase', + label: '字母大小写', + component: 'RadioGroup', + componentProps: { + options: LETTER_CASE_OPTIONS, + buttonStyle: 'solid', + optionType: 'button', + }, + }, + { + fieldName: 'totalLength', + label: '总长度约束', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '0 表示不限制', + }, + }, + { + fieldName: 'seqStrategy', + label: '序号策略', + component: 'RadioGroup', + componentProps: { + options: SEQ_STRATEGY_OPTIONS, + buttonStyle: 'solid', + optionType: 'button', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: STATUS_OPTIONS, + buttonStyle: 'solid', + optionType: 'button', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'ruleName', + label: '规则名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入规则名称', + }, + }, + { + fieldName: 'ruleCode', + label: '规则编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入规则编码', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + placeholder: '请选择', + options: STATUS_OPTIONS, + }, + }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { type: 'checkbox', width: 40 }, + { + field: 'ruleName', + title: '规则名称', + minWidth: 160, + }, + { + field: 'ruleCode', + title: '规则编码', + minWidth: 160, + }, + { + field: 'segmentConfig', + title: '分段配置', + minWidth: 200, + formatter: ({ cellValue }: { cellValue: BaseCodeRuleApi.SegmentConfig[] }) => { + if (!cellValue || cellValue.length === 0) return '-'; + return cellValue.map((s) => s.type).join(' + '); + }, + }, + { + field: 'separator', + title: '分隔符', + minWidth: 80, + formatter: ({ cellValue }: { cellValue: string }) => cellValue || '-', + }, + { + field: 'seqStrategy', + title: '序号策略', + minWidth: 120, + formatter: ({ cellValue }: { cellValue: string }) => + cellValue === 'lock' ? '分布式锁实时' : '号段预分配', + }, + { + field: 'status', + title: '状态', + minWidth: 80, + formatter: ({ cellValue }: { cellValue: number }) => + cellValue === 0 ? '启用' : '禁用', + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue new file mode 100644 index 00000000..8a9b5679 --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue @@ -0,0 +1,175 @@ + + + diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue new file mode 100644 index 00000000..1ed0251b --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue @@ -0,0 +1,103 @@ + + +