yourname 5 tháng trước cách đây
mục cha
commit
ea0fb431f4
2 tập tin đã thay đổi với 407 bổ sung0 xóa
  1. 346 0
      docs/db.md
  2. 61 0
      src/client/admin/components/ExcelToJson/constants.ts

+ 346 - 0
docs/db.md

@@ -0,0 +1,346 @@
+```sql
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for excel_templates
+-- ----------------------------
+DROP TABLE IF EXISTS `excel_templates`;
+CREATE TABLE `excel_templates`  (
+  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
+  `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称',
+  `template_key` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板唯一标识键',
+  `template_config` json NOT NULL COMMENT 'Excel模板配置(存储header配置、字段映射规则等)',
+  `created_by` int NOT NULL COMMENT '创建人ID(关联member_auth_users.id)',
+  `is_deleted` int NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
+  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_template_key`(`template_key`) USING BTREE COMMENT '模板唯一键索引',
+  INDEX `idx_created_by`(`created_by`) USING BTREE COMMENT '创建人索引'
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci 
+COMMENT='Excel模板配置表' 
+ROW_FORMAT = Dynamic;
+
+
+-- 向 excel_templates 表插入默认的Excel模板配置
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '默认Excel模板', 
+  'default_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 5,
+        "orderNumberRow": 2,
+        "orderNumberCol": 3,
+        "dataStartRow": 6,
+        "endMarker": "订单统计数据:",
+        "sheetName": "五金清单",
+        "exportFields": ["订单号", "序号", "名称", "颜色", "长度", "宽度", "数量", "单位", "工艺说明"],
+        "fieldMappings": {
+          "序号": "index",
+          "名称": "name",
+          "颜色": "color",
+          "长度": "length",
+          "宽度": "width",
+          "数量": "quantity",
+          "单位": "unit",
+          "工艺说明": "processDescription",
+          "订单号": "orderNumber"
+        },
+        "requiredFields": ["名称", "数量"]
+      },
+      {
+        "headerRowIndex": 5,
+        "orderNumberRow": 2,
+        "orderNumberCol": 3,
+        "dataStartRow": 6,
+        "endMarker": "拆单签名",
+        "sheetName": "灯带",
+        "exportFields": ["订单号", "序号", "名称", "型号", "规格", "数量", "单位", "柜号"],
+        "fieldMappings": {
+          "序号": "index",
+          "名称": "name",
+          "型号": "model",
+          "规格": "specification",
+          "数量": "quantity",
+          "单位": "unit",
+          "柜号": "cabinetNumber",
+          "订单号": "orderNumber"
+        },
+        "requiredFields": ["名称", "型号", "数量"]
+      },
+      {
+        "headerRowIndex": 3,
+        "orderNumberRow": 1,
+        "orderNumberCol": 1,
+        "dataStartRow": 4,
+        "endMarker": "备注:",
+        "sheetName": "统计",
+        "exportFields": ["序号", "封边条颜色", "封边条规格", "单位(米)", "备注"],
+        "fieldMappings": {
+          "序号": "index",
+          "封边条颜色": "color",
+          "封边条规格": "specification",
+          "单位(米)": "unit",
+          "备注": "remark"
+        },
+        "requiredFields": ["封边条颜色", "封边条规格"]
+      },
+      {
+        "headerRowIndex": 9,
+        "orderNumberRow": 7,
+        "orderNumberCol": 3,
+        "dataStartRow": 10,
+        "endMarker": "合计数量:",
+        "sheetName": "外购单",
+        "exportFields": ["订单号", "序号", "柜名", "材料名称", "长(高)", "宽", "厚(深)", "单位", "数量", "门铰位置", "单价", "金额", "备注", "分类"],
+        "fieldMappings": {
+          "订单号": "orderNumber",
+          "序号": "index",
+          "柜名": "cabinetName",
+          "材料名称": "materialName",
+          "长(高)": "length",
+          "宽": "width",
+          "厚(深)": "depth",
+          "单位": "unit",
+          "数量": "quantity",
+          "门铰位置": "hingePosition",
+          "单价": "unitPrice",
+          "金额": "amount",
+          "备注": "remark",
+          "分类": "category"
+        },
+        "requiredFields": ["材料名称", "数量"]
+      },
+      {
+        "headerRowIndex": 4,
+        "orderNumberRow": 3,
+        "orderNumberCol": 1,
+        "dataStartRow": 5,
+        "endMarker": "<数据区域结束>",
+        "sheetName": "包装数据",
+        "exportFields": ["订单号", "序号", "名称", "部件代码", "颜色", "长度", "宽度", "厚度", "数量", "平方数", "开料长度", "开料宽度", "开料厚度", "备注", "正面条码", "反面条码"],
+        "fieldMappings": {
+          "订单号": "orderNumber",
+          "序号": "index",
+          "名称": "name",
+          "部件代码": "componentCode",
+          "颜色": "color",
+          "长度": "length",
+          "宽度": "width",
+          "厚度": "thickness",
+          "数量": "quantity",
+          "平方数": "square",
+          "开料长度": "cuttingLength",
+          "开料宽度": "cuttingWidth",
+          "开料厚度": "cuttingThickness",
+          "备注": "remark",
+          "正面条码": "frontBarcode",
+          "反面条码": "backBarcode"
+        },
+        "requiredFields": ["名称", "颜色", "数量"],
+        "isMultiTable": true,
+        "multiTableHeaderOffset": 4,
+        "multiTableDataOffset": 1,
+        "multiTableOrderNumberOffset": -1
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+);
+
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '五金清单模板', 
+  'hardware_list_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 5,
+        "orderNumberRow": 2,
+        "orderNumberCol": 3,
+        "dataStartRow": 6,
+        "endMarker": "订单统计数据:",
+        "sheetName": "五金清单",
+        "exportFields": ["订单号", "序号", "名称", "颜色", "长度", "宽度", "数量", "单位", "工艺说明"],
+        "fieldMappings": {
+          "序号": "index",
+          "名称": "name",
+          "颜色": "color",
+          "长度": "length",
+          "宽度": "width",
+          "数量": "quantity",
+          "单位": "unit",
+          "工艺说明": "processDescription",
+          "订单号": "orderNumber"
+        },
+        "requiredFields": ["名称", "数量"]
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+);
+
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '灯带模板', 
+  'light_band_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 5,
+        "orderNumberRow": 2,
+        "orderNumberCol": 3,
+        "dataStartRow": 6,
+        "endMarker": "拆单签名",
+        "sheetName": "灯带",
+        "exportFields": ["订单号", "序号", "名称", "型号", "规格", "数量", "单位", "柜号"],
+        "fieldMappings": {
+          "序号": "index",
+          "名称": "name",
+          "型号": "model",
+          "规格": "specification",
+          "数量": "quantity",
+          "单位": "unit",
+          "柜号": "cabinetNumber",
+          "订单号": "orderNumber"
+        },
+        "requiredFields": ["名称", "型号", "数量"]
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+);
+
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '统计模板', 
+  'statistics_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 3,
+        "orderNumberRow": 1,
+        "orderNumberCol": 1,
+        "dataStartRow": 4,
+        "endMarker": "备注:",
+        "sheetName": "统计",
+        "exportFields": ["序号", "封边条颜色", "封边条规格", "单位(米)", "备注"],
+        "fieldMappings": {
+          "序号": "index",
+          "封边条颜色": "color",
+          "封边条规格": "specification",
+          "单位(米)": "unit",
+          "备注": "remark"
+        },
+        "requiredFields": ["封边条颜色", "封边条规格"]
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+);
+
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '外购单模板', 
+  'purchase_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 9,
+        "orderNumberRow": 7,
+        "orderNumberCol": 3,
+        "dataStartRow": 10,
+        "endMarker": "合计数量:",
+        "sheetName": "外购单",
+        "exportFields": ["订单号", "序号", "柜名", "材料名称", "长(高)", "宽", "厚(深)", "单位", "数量", "门铰位置", "单价", "金额", "备注", "分类"],
+        "fieldMappings": {
+          "订单号": "orderNumber",
+          "序号": "index",
+          "柜名": "cabinetName",
+          "材料名称": "materialName",
+          "长(高)": "length",
+          "宽": "width",
+          "厚(深)": "depth",
+          "单位": "unit",
+          "数量": "quantity",
+          "门铰位置": "hingePosition",
+          "单价": "unitPrice",
+          "金额": "amount",
+          "备注": "remark",
+          "分类": "category"
+        },
+        "requiredFields": ["材料名称", "数量"]
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+);
+
+INSERT INTO `excel_templates` 
+(`template_name`, `template_key`, `template_config`, `created_by`) 
+VALUES 
+(
+  '包装数据模板', 
+  'packaging_template', 
+  '{
+    "sheets": [
+      {
+        "headerRowIndex": 4,
+        "orderNumberRow": 3,
+        "orderNumberCol": 1,
+        "dataStartRow": 5,
+        "endMarker": "<数据区域结束>",
+        "sheetName": "包装数据",
+        "exportFields": ["订单号", "序号", "名称", "部件代码", "颜色", "长度", "宽度", "厚度", "数量", "平方数", "开料长度", "开料宽度", "开料厚度", "备注", "正面条码", "反面条码"],
+        "fieldMappings": {
+          "订单号": "orderNumber",
+          "序号": "index",
+          "名称": "name",
+          "部件代码": "componentCode",
+          "颜色": "color",
+          "长度": "length",
+          "宽度": "width",
+          "厚度": "thickness",
+          "数量": "quantity",
+          "平方数": "square",
+          "开料长度": "cuttingLength",
+          "开料宽度": "cuttingWidth",
+          "开料厚度": "cuttingThickness",
+          "备注": "remark",
+          "正面条码": "frontBarcode",
+          "反面条码": "backBarcode"
+        },
+        "requiredFields": ["名称", "颜色", "数量"],
+        "isMultiTable": true,
+        "multiTableHeaderOffset": 4,
+        "multiTableDataOffset": 1,
+        "multiTableOrderNumberOffset": -1
+      }
+    ],
+    "activeSheetIndex": 0
+  }',
+  1
+); 
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+```

+ 61 - 0
src/client/admin/components/ExcelToJson/constants.ts

@@ -0,0 +1,61 @@
+// shared/types/constants.ts
+export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE'] as const;
+
+export const CONTENT_TYPES = {
+  JSON: 'application/json',
+  FORM: 'application/x-www-form-urlencoded',
+  MULTIPART: 'multipart/form-data'
+} as const;
+
+export const DEFAULT_SHEET_CONFIG = {
+  headerRowIndex: 1,
+  orderNumberRow: 1,
+  orderNumberCol: 1,
+  dataStartRow: 2,
+  endMarker: '',
+  sheetName: 'Sheet1',
+  exportFields: [],
+  fieldMappings: {},
+  requiredFields: [],
+  isMultiTable: false,
+  multiTableHeaderOffset: 2,
+  multiTableDataOffset: 1,
+  multiTableOrderNumberOffset: -1
+} as const;
+
+export const VIEW_MODES = {
+  TABLE: 'table',
+  JSON: 'json'
+} as const;
+
+export const API_STATUS = {
+  SUCCESS: 200,
+  BAD_REQUEST: 400,
+  UNAUTHORIZED: 401,
+  FORBIDDEN: 403,
+  NOT_FOUND: 404,
+  SERVER_ERROR: 500
+} as const;
+
+export const ERROR_CODES = {
+  VALIDATION_ERROR: 'VALIDATION.ERROR',
+  AUTH_ERROR: 'AUTH.ERROR',
+  NOT_FOUND: 'NOT_FOUND',
+  SERVER_ERROR: 'SERVER.ERROR'
+} as const;
+
+// 数据库表名
+export const EXCEL_TEMPLATE_TABLE = 'excel_templates';
+
+// 模板必填字段
+export const EXCEL_TEMPLATE_REQUIRED_FIELDS = [
+  'template_name',
+  'template_key',
+  'template_config'
+] as const;
+
+// 删除状态
+export const DELETE_STATUS = {
+  NORMAL: 0,
+  DELETED: 1
+} as const;