Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

init_defaults.go 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. package tables
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "git.x2erp.com/qdy/go-base/logger"
  6. "git.x2erp.com/qdy/go-db/factory/database"
  7. )
  8. // 默认值函数类型
  9. type DefaultValueFunc func(*database.DBFactory) error
  10. // 默认值注册表
  11. var defaultValueRegistrations []DefaultValueFunc
  12. // RegisterDefaultValues 注册默认值函数
  13. func RegisterDefaultValues(fn DefaultValueFunc) {
  14. defaultValueRegistrations = append(defaultValueRegistrations, fn)
  15. }
  16. // RegisterAllDefaults 注册所有默认值
  17. func RegisterAllDefaults(dbFactory *database.DBFactory) error {
  18. if dbFactory == nil {
  19. return fmt.Errorf("数据库工厂为空")
  20. }
  21. for _, fn := range defaultValueRegistrations {
  22. if err := fn(dbFactory); err != nil {
  23. return err
  24. }
  25. }
  26. logger.Info("所有默认值注册完成")
  27. return nil
  28. }
  29. // init 注册内置的默认值函数
  30. func init() {
  31. RegisterDefaultValues(registerStoreDimensionDefaults)
  32. RegisterDefaultValues(registerProductDimensionDefaults)
  33. RegisterDefaultValues(registerCompanyDimensionDefaults)
  34. }
  35. // 注册维度表默认值(兼容旧版本)
  36. func RegisterDimensionDefaults(dbFactory *database.DBFactory) error {
  37. return RegisterAllDefaults(dbFactory)
  38. }
  39. // 注册店铺维度默认值
  40. func registerStoreDimensionDefaults(dbFactory *database.DBFactory) error {
  41. dimensions := []MasterStoreDimension{
  42. // 维度1: 经营权模式 (Business Model)
  43. {
  44. ID: generateID("business_model", "DIR"),
  45. Type: "business_model",
  46. Code: "DIR",
  47. Name: "直营店",
  48. Description: "品牌方全资拥有,完全控制",
  49. SortOrder: 1,
  50. },
  51. {
  52. ID: generateID("business_model", "FRC"),
  53. Type: "business_model",
  54. Code: "FRC",
  55. Name: "特许加盟店",
  56. Description: "加盟商投资,品牌授权经营",
  57. SortOrder: 2,
  58. },
  59. {
  60. ID: generateID("business_model", "DSP"),
  61. Type: "business_model",
  62. Code: "DSP",
  63. Name: "经销商店",
  64. Description: "区域买断式经销",
  65. SortOrder: 3,
  66. },
  67. {
  68. ID: generateID("business_model", "CON"),
  69. Type: "business_model",
  70. Code: "CON",
  71. Name: "联营店/寄售店",
  72. Description: "品牌供货,联营方提供场地和人员",
  73. SortOrder: 4,
  74. },
  75. {
  76. ID: generateID("business_model", "WHL"),
  77. Type: "business_model",
  78. Code: "WHL",
  79. Name: "批发客户",
  80. Description: "B2B批发,无零售店面",
  81. SortOrder: 5,
  82. },
  83. {
  84. ID: generateID("business_model", "COR"),
  85. Type: "business_model",
  86. Code: "COR",
  87. Name: "公司内购店",
  88. Description: "企业内部销售点",
  89. SortOrder: 6,
  90. },
  91. // 维度2: 店铺定位 (Store Tier)
  92. {
  93. ID: generateID("store_tier", "FLA"),
  94. Type: "store_tier",
  95. Code: "FLA",
  96. Name: "旗舰店",
  97. Description: "核心商圈,全品类,品牌形象展示",
  98. SortOrder: 1,
  99. ExtraProperties: toJSON(map[string]interface{}{
  100. "min_area": 200.0,
  101. "max_area": 500.0,
  102. }),
  103. },
  104. {
  105. ID: generateID("store_tier", "IMG"),
  106. Type: "store_tier",
  107. Code: "IMG",
  108. Name: "形象店",
  109. Description: "主要商圈,完整品类,标准形象",
  110. SortOrder: 2,
  111. ExtraProperties: toJSON(map[string]interface{}{
  112. "min_area": 120.0,
  113. "max_area": 250.0,
  114. }),
  115. },
  116. {
  117. ID: generateID("store_tier", "PRI"),
  118. Type: "store_tier",
  119. Code: "PRI",
  120. Name: "主力店",
  121. Description: "区域中心,全系列产品",
  122. SortOrder: 3,
  123. ExtraProperties: toJSON(map[string]interface{}{
  124. "min_area": 80.0,
  125. "max_area": 150.0,
  126. }),
  127. },
  128. {
  129. ID: generateID("store_tier", "SEC"),
  130. Type: "store_tier",
  131. Code: "SEC",
  132. Name: "标准店",
  133. Description: "社区/二级商圈,主打系列",
  134. SortOrder: 4,
  135. ExtraProperties: toJSON(map[string]interface{}{
  136. "min_area": 50.0,
  137. "max_area": 100.0,
  138. }),
  139. },
  140. {
  141. ID: generateID("store_tier", "OUT"),
  142. Type: "store_tier",
  143. Code: "OUT",
  144. Name: "奥莱店",
  145. Description: "奥特莱斯商圈,过季品/特供品",
  146. SortOrder: 5,
  147. ExtraProperties: toJSON(map[string]interface{}{
  148. "min_area": 100.0,
  149. "max_area": 300.0,
  150. }),
  151. },
  152. {
  153. ID: generateID("store_tier", "POP"),
  154. Type: "store_tier",
  155. Code: "POP",
  156. Name: "快闪店",
  157. Description: "临时性,营销活动驱动",
  158. SortOrder: 6,
  159. ExtraProperties: toJSON(map[string]interface{}{
  160. "min_area": 30.0,
  161. "max_area": 80.0,
  162. "temporary": true,
  163. }),
  164. },
  165. // 维度3: 零售业态 (Retail Format)
  166. {
  167. ID: generateID("retail_format", "FSS"),
  168. Type: "retail_format",
  169. Code: "FSS",
  170. Name: "独立街铺",
  171. Description: "临街独立店面",
  172. SortOrder: 1,
  173. ExtraProperties: toJSON(map[string]interface{}{
  174. "business_hours_type": "STREET",
  175. }),
  176. },
  177. {
  178. ID: generateID("retail_format", "DPM"),
  179. Type: "retail_format",
  180. Code: "DPM",
  181. Name: "百货专柜",
  182. Description: "百货公司内专柜",
  183. SortOrder: 2,
  184. ExtraProperties: toJSON(map[string]interface{}{
  185. "business_hours_type": "DEPARTMENT_STORE",
  186. }),
  187. },
  188. {
  189. ID: generateID("retail_format", "SMC"),
  190. Type: "retail_format",
  191. Code: "SMC",
  192. Name: "购物中心店",
  193. Description: "购物中心内店铺",
  194. SortOrder: 3,
  195. ExtraProperties: toJSON(map[string]interface{}{
  196. "business_hours_type": "MALL",
  197. }),
  198. },
  199. {
  200. ID: generateID("retail_format", "AIR"),
  201. Type: "retail_format",
  202. Code: "AIR",
  203. Name: "机场店",
  204. Description: "机场航站楼内",
  205. SortOrder: 4,
  206. ExtraProperties: toJSON(map[string]interface{}{
  207. "business_hours_type": "AIRPORT",
  208. }),
  209. },
  210. {
  211. ID: generateID("retail_format", "TRS"),
  212. Type: "retail_format",
  213. Code: "TRS",
  214. Name: "交通枢纽店",
  215. Description: "高铁站/地铁站内",
  216. SortOrder: 5,
  217. ExtraProperties: toJSON(map[string]interface{}{
  218. "business_hours_type": "TRANSPORT_HUB",
  219. }),
  220. },
  221. {
  222. ID: generateID("retail_format", "RES"),
  223. Type: "retail_format",
  224. Code: "RES",
  225. Name: "度假区店",
  226. Description: "旅游度假区内",
  227. SortOrder: 6,
  228. ExtraProperties: toJSON(map[string]interface{}{
  229. "business_hours_type": "RESORT",
  230. }),
  231. },
  232. {
  233. ID: generateID("retail_format", "HOS"),
  234. Type: "retail_format",
  235. Code: "HOS",
  236. Name: "酒店店",
  237. Description: "高端酒店内",
  238. SortOrder: 7,
  239. ExtraProperties: toJSON(map[string]interface{}{
  240. "business_hours_type": "HOTEL",
  241. }),
  242. },
  243. // 维度4: 市场层级 (Market Tier)
  244. {
  245. ID: generateID("market_tier", "T0"),
  246. Type: "market_tier",
  247. Code: "T0",
  248. Name: "超一线城市",
  249. Description: "纽约、伦敦、东京、上海、北京",
  250. SortOrder: 1,
  251. },
  252. {
  253. ID: generateID("market_tier", "T1"),
  254. Type: "market_tier",
  255. Code: "T1",
  256. Name: "一线城市",
  257. Description: "深圳、广州、巴黎、米兰",
  258. SortOrder: 2,
  259. },
  260. {
  261. ID: generateID("market_tier", "T2"),
  262. Type: "market_tier",
  263. Code: "T2",
  264. Name: "二线城市",
  265. Description: "成都、杭州、南京",
  266. SortOrder: 3,
  267. },
  268. {
  269. ID: generateID("market_tier", "T3"),
  270. Type: "market_tier",
  271. Code: "T3",
  272. Name: "三线城市",
  273. Description: "无锡、宁波、佛山",
  274. SortOrder: 4,
  275. },
  276. {
  277. ID: generateID("market_tier", "T4"),
  278. Type: "market_tier",
  279. Code: "T4",
  280. Name: "四线及以下",
  281. Description: "其他地级市及县城",
  282. SortOrder: 5,
  283. },
  284. // 维度5: 销售模式 (Sales Channel)
  285. {
  286. ID: generateID("sales_channel", "OFF"),
  287. Type: "sales_channel",
  288. Code: "OFF",
  289. Name: "线下实体",
  290. Description: "所有实体店铺",
  291. SortOrder: 1,
  292. },
  293. {
  294. ID: generateID("sales_channel", "ECC"),
  295. Type: "sales_channel",
  296. Code: "ECC",
  297. Name: "平台电商",
  298. Description: "天猫、京东、亚马逊",
  299. SortOrder: 2,
  300. },
  301. {
  302. ID: generateID("sales_channel", "DTC"),
  303. Type: "sales_channel",
  304. Code: "DTC",
  305. Name: "品牌直营电商",
  306. Description: "官网、官方APP",
  307. SortOrder: 3,
  308. },
  309. {
  310. ID: generateID("sales_channel", "SOC"),
  311. Type: "sales_channel",
  312. Code: "SOC",
  313. Name: "社交电商",
  314. Description: "抖音、小红书、Instagram",
  315. SortOrder: 4,
  316. },
  317. {
  318. ID: generateID("sales_channel", "LEC"),
  319. Type: "sales_channel",
  320. Code: "LEC",
  321. Name: "直播电商",
  322. Description: "淘宝直播、抖音直播",
  323. SortOrder: 5,
  324. },
  325. // 区域维度 (Region) - 示例数据,实际应该从业务系统同步
  326. {
  327. ID: generateID("region", "CN"),
  328. Type: "region",
  329. Code: "CN",
  330. Name: "中国",
  331. Description: "中华人民共和国",
  332. SortOrder: 1,
  333. ExtraProperties: toJSON(map[string]interface{}{
  334. "level": 1,
  335. }),
  336. },
  337. {
  338. ID: generateID("region", "CN-BJ"),
  339. Type: "region",
  340. Code: "BJ",
  341. Name: "北京",
  342. Description: "北京市",
  343. SortOrder: 2,
  344. ExtraProperties: toJSON(map[string]interface{}{
  345. "parent_id": generateID("region", "CN"),
  346. "level": 3,
  347. }),
  348. },
  349. {
  350. ID: generateID("region", "CN-SH"),
  351. Type: "region",
  352. Code: "SH",
  353. Name: "上海",
  354. Description: "上海市",
  355. SortOrder: 3,
  356. ExtraProperties: toJSON(map[string]interface{}{
  357. "parent_id": generateID("region", "CN"),
  358. "level": 3,
  359. }),
  360. },
  361. }
  362. // 批量插入数据
  363. for _, dim := range dimensions {
  364. if err := insertOrUpdateStoreDimension(dbFactory, dim); err != nil {
  365. logger.Warn("插入店铺维度数据失败: type=%s, code=%s, error=%v", dim.Type, dim.Code, err)
  366. // 继续插入其他数据
  367. }
  368. }
  369. logger.Info("店铺维度默认值注册完成,共 %d 条记录", len(dimensions))
  370. return nil
  371. }
  372. // 注册商品维度默认值
  373. func registerProductDimensionDefaults(dbFactory *database.DBFactory) error {
  374. // 商品维度示例数据
  375. dimensions := []MasterProductDimension{
  376. // 商品大类示例
  377. {
  378. ID: generateID("category_major", "CLOTHING"),
  379. Type: "category_major",
  380. Code: "CLOTHING",
  381. Name: "服装",
  382. Description: "服装类商品",
  383. SortOrder: 1,
  384. },
  385. {
  386. ID: generateID("category_major", "SHOES"),
  387. Type: "category_major",
  388. Code: "SHOES",
  389. Name: "鞋类",
  390. Description: "鞋类商品",
  391. SortOrder: 2,
  392. },
  393. {
  394. ID: generateID("category_major", "ACCESSORIES"),
  395. Type: "category_major",
  396. Code: "ACCESSORIES",
  397. Name: "配饰",
  398. Description: "配饰类商品",
  399. SortOrder: 3,
  400. },
  401. // 季节示例
  402. {
  403. ID: generateID("season", "SS"),
  404. Type: "season",
  405. Code: "SS",
  406. Name: "春夏",
  407. Description: "春季和夏季",
  408. SortOrder: 1,
  409. },
  410. {
  411. ID: generateID("season", "FW"),
  412. Type: "season",
  413. Code: "FW",
  414. Name: "秋冬",
  415. Description: "秋季和冬季",
  416. SortOrder: 2,
  417. },
  418. // 波段示例
  419. {
  420. ID: generateID("wave", "W1"),
  421. Type: "wave",
  422. Code: "W1",
  423. Name: "第一波段",
  424. Description: "第一波段商品",
  425. SortOrder: 1,
  426. },
  427. {
  428. ID: generateID("wave", "W2"),
  429. Type: "wave",
  430. Code: "W2",
  431. Name: "第二波段",
  432. Description: "第二波段商品",
  433. SortOrder: 2,
  434. },
  435. // 面料示例
  436. {
  437. ID: generateID("fabric", "COTTON"),
  438. Type: "fabric",
  439. Code: "COTTON",
  440. Name: "棉",
  441. Description: "棉质面料",
  442. SortOrder: 1,
  443. },
  444. {
  445. ID: generateID("fabric", "POLYESTER"),
  446. Type: "fabric",
  447. Code: "POLYESTER",
  448. Name: "涤纶",
  449. Description: "涤纶面料",
  450. SortOrder: 2,
  451. },
  452. {
  453. ID: generateID("fabric", "WOOL"),
  454. Type: "fabric",
  455. Code: "WOOL",
  456. Name: "羊毛",
  457. Description: "羊毛面料",
  458. SortOrder: 3,
  459. },
  460. // 颜色色系示例
  461. {
  462. ID: generateID("color_family", "RED"),
  463. Type: "color_family",
  464. Code: "RED",
  465. Name: "红色系",
  466. Description: "红色系列",
  467. SortOrder: 1,
  468. },
  469. {
  470. ID: generateID("color_family", "BLUE"),
  471. Type: "color_family",
  472. Code: "BLUE",
  473. Name: "蓝色系",
  474. Description: "蓝色系列",
  475. SortOrder: 2,
  476. },
  477. {
  478. ID: generateID("color_family", "BLACK"),
  479. Type: "color_family",
  480. Code: "BLACK",
  481. Name: "黑色系",
  482. Description: "黑色系列",
  483. SortOrder: 3,
  484. },
  485. // 尺码组示例
  486. {
  487. ID: generateID("size_group", "XS-S"),
  488. Type: "size_group",
  489. Code: "XS-S",
  490. Name: "超小-小号",
  491. Description: "超小号到小号",
  492. SortOrder: 1,
  493. },
  494. {
  495. ID: generateID("size_group", "M-L"),
  496. Type: "size_group",
  497. Code: "M-L",
  498. Name: "中号-大号",
  499. Description: "中号到大号",
  500. SortOrder: 2,
  501. },
  502. {
  503. ID: generateID("size_group", "XL-XXL"),
  504. Type: "size_group",
  505. Code: "XL-XXL",
  506. Name: "加大-特大号",
  507. Description: "加大号到特大号",
  508. SortOrder: 3,
  509. },
  510. }
  511. // 批量插入数据
  512. for _, dim := range dimensions {
  513. if err := insertOrUpdateProductDimension(dbFactory, dim); err != nil {
  514. logger.Warn("插入商品维度数据失败: type=%s, code=%s, error=%v", dim.Type, dim.Code, err)
  515. // 继续插入其他数据
  516. }
  517. }
  518. logger.Info("商品维度默认值注册完成,共 %d 条记录", len(dimensions))
  519. return nil
  520. }
  521. // 插入或更新店铺维度数据
  522. func insertOrUpdateStoreDimension(dbFactory *database.DBFactory, dim MasterStoreDimension) error {
  523. db := dbFactory.GetDB()
  524. if db == nil {
  525. return fmt.Errorf("数据库连接为空")
  526. }
  527. // 使用ON DUPLICATE KEY UPDATE逻辑
  528. // 注意:这里假设使用MySQL方言
  529. query := `INSERT INTO master_store_dimension (id, type, code, name, description, sort_order, extra_properties, created_at, updated_at)
  530. VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW())
  531. ON DUPLICATE KEY UPDATE
  532. name = VALUES(name),
  533. description = VALUES(description),
  534. sort_order = VALUES(sort_order),
  535. extra_properties = VALUES(extra_properties),
  536. updated_at = NOW()`
  537. _, err := db.Exec(query, dim.ID, dim.Type, dim.Code, dim.Name, dim.Description, dim.SortOrder, dim.ExtraProperties)
  538. return err
  539. }
  540. // 插入或更新商品维度数据
  541. func insertOrUpdateProductDimension(dbFactory *database.DBFactory, dim MasterProductDimension) error {
  542. db := dbFactory.GetDB()
  543. if db == nil {
  544. return fmt.Errorf("数据库连接为空")
  545. }
  546. query := `INSERT INTO master_product_dimension (id, type, code, name, description, sort_order, created_at, updated_at)
  547. VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())
  548. ON DUPLICATE KEY UPDATE
  549. name = VALUES(name),
  550. description = VALUES(description),
  551. sort_order = VALUES(sort_order),
  552. updated_at = NOW()`
  553. _, err := db.Exec(query, dim.ID, dim.Type, dim.Code, dim.Name, dim.Description, dim.SortOrder)
  554. return err
  555. }
  556. // 生成ID
  557. func generateID(dimType, code string) string {
  558. return fmt.Sprintf("%s_%s", dimType, code)
  559. }
  560. // 转换为JSON字符串
  561. func toJSON(data map[string]interface{}) string {
  562. if data == nil {
  563. return "{}"
  564. }
  565. jsonBytes, err := json.Marshal(data)
  566. if err != nil {
  567. return "{}"
  568. }
  569. return string(jsonBytes)
  570. }
  571. // ============================
  572. // 默认值注册使用示例
  573. // ============================
  574. // 示例:为主数据表注册默认值(如果需要)
  575. // func registerProductDefaults(dbFactory *database.DBFactory) error {
  576. // // 示例:插入一些默认的商品分类数据
  577. // // 注意:实际应用中,主数据通常从ERP系统同步,不需要默认值
  578. // return nil
  579. // }
  580. //
  581. // 在包的init()函数中注册:
  582. // func init() {
  583. // RegisterDefaultValues(registerProductDefaults)
  584. // }
  585. // 注意:要为其他表添加默认值,请遵循以下步骤:
  586. // 1. 在任意表文件中定义一个函数:func myTableDefaults(dbFactory *database.DBFactory) error
  587. // 2. 在函数的init()中调用RegisterDefaultValues注册该函数
  588. // 3. 确保函数在包初始化时被注册(init()函数会自动执行)
  589. // 4. 在应用启动时调用tables.RegisterAllDefaults(dbFactory)执行所有注册
  590. // 注册公司维度默认值
  591. func registerCompanyDimensionDefaults(dbFactory *database.DBFactory) error {
  592. if dbFactory == nil {
  593. return fmt.Errorf("数据库工厂为空")
  594. }
  595. dimensions := []MasterCompanyDimension{
  596. // 公司类型维度
  597. {
  598. ID: generateID("company_type", "SUPPLIER"),
  599. Type: "company_type",
  600. Code: "SUPPLIER",
  601. Name: "供应商",
  602. Description: "商品供应商,提供采购商品",
  603. SortOrder: 1,
  604. },
  605. {
  606. ID: generateID("company_type", "SUBSIDIARY"),
  607. Type: "company_type",
  608. Code: "SUBSIDIARY",
  609. Name: "子公司",
  610. Description: "集团下属子公司",
  611. SortOrder: 2,
  612. },
  613. {
  614. ID: generateID("company_type", "AGENT"),
  615. Type: "company_type",
  616. Code: "AGENT",
  617. Name: "代理商",
  618. Description: "品牌代理商,负责区域销售",
  619. SortOrder: 3,
  620. },
  621. {
  622. ID: generateID("company_type", "WHOLESALER"),
  623. Type: "company_type",
  624. Code: "WHOLESALER",
  625. Name: "批发商",
  626. Description: "批发销售商,批量采购销售",
  627. SortOrder: 4,
  628. },
  629. {
  630. ID: generateID("company_type", "GROUP"),
  631. Type: "company_type",
  632. Code: "GROUP",
  633. Name: "集团",
  634. Description: "集团公司总部",
  635. SortOrder: 5,
  636. },
  637. {
  638. ID: generateID("company_type", "FRANCHISEE"),
  639. Type: "company_type",
  640. Code: "FRANCHISEE",
  641. Name: "加盟商",
  642. Description: "品牌加盟商",
  643. SortOrder: 6,
  644. },
  645. {
  646. ID: generateID("company_type", "CUSTOMER"),
  647. Type: "company_type",
  648. Code: "CUSTOMER",
  649. Name: "客户",
  650. Description: "终端客户",
  651. SortOrder: 7,
  652. },
  653. {
  654. ID: generateID("company_type", "LOGISTICS"),
  655. Type: "company_type",
  656. Code: "LOGISTICS",
  657. Name: "物流商",
  658. Description: "物流运输服务商",
  659. SortOrder: 8,
  660. },
  661. }
  662. for _, dimension := range dimensions {
  663. query := `INSERT INTO master_company_dimension (id, type, code, name, description, sort_order, extra_properties, created_at, updated_at)
  664. VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW())
  665. ON DUPLICATE KEY UPDATE name = VALUES(name), description = VALUES(description), sort_order = VALUES(sort_order), extra_properties = VALUES(extra_properties), updated_at = NOW()`
  666. if _, err := dbFactory.GetDB().Exec(query,
  667. dimension.ID,
  668. dimension.Type,
  669. dimension.Code,
  670. dimension.Name,
  671. dimension.Description,
  672. dimension.SortOrder,
  673. dimension.ExtraProperties,
  674. ); err != nil {
  675. return fmt.Errorf("插入公司维度数据失败: %v", err)
  676. }
  677. }
  678. logger.Info("公司维度默认值注册完成")
  679. return nil
  680. }