一、引言
在電商交易領域,管理類目作為業務責權劃分、統籌、管理核心載體,隨着業務複雜性的提高,其規則調整頻率從最初的 1 次 / 季度到多次 / 季度,三級類目的規則複雜度也呈指數級上升。傳統依賴數倉底層更新的方式暴露出三大痛點:
- 行業無法自主、快速調管理類目;
- 業務管理類目規則調整,不支持校驗類目覆蓋範圍是否有重複/遺漏,延長交付週期;
- 規則變更成功後、下游系統響應滯後,無法及時應用最新類目規則。
本文將從技術視角解析 “管理類目配置線上化” 項目如何通過全鏈路技術驅動,將規則迭代週期縮短至 1-2 天。
二、業務痛點與技術挑戰:為什麼需要線上化?
2.1 效率瓶頸:手工流程與
高頻迭代的矛盾
問題場景:業務方需線下通過數倉提報規則變更,經數倉開發、測試、BI需要花費大量精力校驗確認,一次類目變更需 3-4 周左右時間才能上線生效,上線時間無法保證。
技術瓶頸:數倉離線同步週期長(T+1),規則校驗依賴人工梳理,無法應對 “商品類目量級激增”。
2.2 質量風險:規則複雜度與
校驗能力的失衡
典型問題:當前的管理類目映射規則,依賴業務收集提報,但從實際操作看管理三級類目映射規則提報質量較差(主要原因為:業務無法及時校驗提報規則是否準確,是否窮舉完善,是否完全無交叉),存在大量重複 / 遺漏風險。
2.3 系統耦合:底層變更對
下游應用的多米諾效應
連鎖影響:管理類目規則變更會需同步更新交易後台、智能運營系統、商運關係工作台等多下游系統,如無法及時同步,可能會影響下游應用如商運關係工作台的員工分工範圍的準確性,影響商家找人、資質審批等場景應用。
三、技術方案:從架構設計到核心模塊拆解
3.1 分層架構:解耦業務與數據鏈路
3.2 核心模塊技術實現
規則生命週期管理: 規則操作流程
提交管理類目唯一性校驗規則
新增:id為空,則為新增
刪除:當前db數據不在提交保存列表中
更新:名稱或是否兜底類目或規則改變則發生更新【其中如果只有名稱改變則只觸發審批,不需等待數據校驗,業務規則校驗邏輯為將所有規則包含id,按照順序排序拼接之後結果是否相等】
多級類目查詢
構建管理類目樹
/**
* 構建管理類目樹
*/
public List<ManagementCategoryDTO> buildTree(List<ManagementCategoryEntity> managementCategoryEntities) {
Map<Long, ManagementCategoryDTO> managementCategoryMap = new HashMap<>();
for (ManagementCategoryEntity category : managementCategoryEntities) {
ManagementCategoryDTO managementCategoryDTO = ManagementCategoryMapping.convertEntity2DTO(category);
managementCategoryMap.put(category.getId(), managementCategoryDTO);
}
// 找到根節點
List<ManagementCategoryDTO> rootNodes = new ArrayList<>();
for (ManagementCategoryDTO categoryNameDTO : managementCategoryMap.values()) {
//管理一級類目 parentId是0
if (Objects.equals(categoryNameDTO.getLevel(), ManagementCategoryLevelEnum.FIRST.getId()) && Objects.equals(categoryNameDTO.getParentId(), 0L)) {
rootNodes.add(categoryNameDTO);
}
}
// 構建樹結構
for (ManagementCategoryDTO node : managementCategoryMap.values()) {
if (node.getLevel() > ManagementCategoryLevelEnum.FIRST.getId()) {
ManagementCategoryDTO parentNode = managementCategoryMap.get(node.getParentId());
if (parentNode != null) {
parentNode.getItems().add(node);
}
}
}
return rootNodes;
}
填充管理類目規則
/**
* 填充規則信息
*/
private void populateRuleData
(List<ManagementCategoryDTO> managementCategoryDTOS, List<ManagementCategoryRuleEntity> managementCategoryRuleEntities) {
if (CollectionUtils.isEmpty(managementCategoryDTOS) || CollectionUtils.isEmpty(managementCategoryRuleEntities)) {
return;
}
List<ManagementCategoryRuleDTO> managementCategoryRuleDTOS =managementCategoryMapping.convertRuleEntities2DTOS(managementCategoryRuleEntities);
// 將規則集合按 categoryId 分組
Map<Long, List<ManagementCategoryRuleDTO>> rulesByCategoryIdMap = managementCategoryRuleDTOS.stream()
.collect(Collectors.groupingBy(ManagementCategoryRuleDTO::getCategoryId));
// 遞歸填充規則到樹結構
fillRulesRecursively(managementCategoryDTOS, rulesByCategoryIdMap);
}
/**
* 遞歸填充規則到樹結構
*/
private static void fillRulesRecursively
(List<ManagementCategoryDTO> managementCategoryDTOS, Map<Long, List<ManagementCategoryRuleDTO>> rulesByCategoryIdMap) {
if (CollectionUtils.isEmpty(managementCategoryDTOS) || MapUtils.isEmpty(rulesByCategoryIdMap)) {
return;
}
for (ManagementCategoryDTO node : managementCategoryDTOS) {
// 獲取當前節點對應的規則列表
List<ManagementCategoryRuleDTO> rules = rulesByCategoryIdMap.getOrDefault(node.getId(), new ArrayList<>());
node.setRules(rules);
// 遞歸處理子節點
fillRulesRecursively(node.getItems(), rulesByCategoryIdMap);
}
}
狀態機驅動:管理類目生命週期管理
超時機制 :基於時間閾值的流程阻塞保護
其中,為防止長時間運營處於待確認規則狀態,造成其他規則阻塞規則修改,定時判斷待確認規則狀態持續時間,當時間超過xxx時間之後,則將待確認狀態改為長時間未操作,放棄變更狀態,並飛書通知規則修改人。
管理類目狀態變化級聯傳播策略
類目生效和失效狀態為級聯操作。規則如下:
- 管理二級類目有草稿狀態時,不允許下掛三級類目的編輯;
- 管理三級類目有草稿狀態時,不允許對應二級類目的規則編輯;
- 類目生效失效狀態為級聯操作,上層修改下層級聯修改狀態,如果下層管理類目存在草稿狀態,則自動更改為放棄更改狀態。
規則變更校驗邏輯
當一次提交,可能出現的情況如下。一次提交可能會產生多個草稿,對應多個審批流程。
新增管理類目規則:
- 一級管理類目可以直接新增(點擊新增一級管理類目)
- 二級管理類目和三級管理類目不可同時新增
- 三級管理類目需要在已有二級類目基礎上新增
只有名稱修改觸發直接審批,有規則修改需要等待數倉計算結果之後,運營提交發起審批。
交互通知中心:飛書卡片推送
- 變更規則數據計算結果依賴數倉kafka計算結果回調。
- 基於飛書卡片推送數倉計算結果,回調提交審批和放棄變更事件。
飛書卡片:
卡片結果
卡片操作結果
審批流程:多維度權限控制與飛書集成
提交審批的四種情況:
- 名稱修改
- 一級類目新增
- 管理類目規則修改
- 生效失效變更
審批通過,將草稿內容更新到管理類目表中,將管理類目設置為生效中。
審批駁回,清空草稿內容。
審批人分配機制:多草稿並行審批方案
一次提交可能會產生多個草稿,對應多個審批流程。
審批邏輯
public Map<String, List<String>> buildApprover(
ManagementCategoryDraftEntity draftEntity,
Map<Long, Set<String>> catAuditorMap,
Map<String, String> userIdOpenIdMap,
Integer hasApprover) {
Map<String, List<String>> nodeApprover = new HashMap<>();
// 無審批人模式,直接查詢超級管理員
if (!Objects.equals(hasApprover, ManagementCategoryUtils.HAS_APPROVER_YES)) {
nodeApprover.put(ManagementCategoryApprovalField.NODE_SUPER_ADMIN_AUDIT,
queryApproverList(0L, catAuditorMap, userIdOpenIdMap));
return nodeApprover;
}
Integer level = draftEntity.getLevel();
Integer draftType = draftEntity.getType();
boolean isEditOperation = ManagementCategoryDraftTypeEnum.isEditOp(draftType);
// 動態構建審批鏈(支持N級類目)
List<Integer> approvalChain = buildApprovalChain(level);
for (int i = 0; i < approvalChain.size(); i++) {
int currentLevel = approvalChain.get(i);
Long categoryId = getCategoryIdByLevel(draftEntity, currentLevel);
// 生成節點名稱(如:NODE_LEVEL2_ADMIN_AUDIT)
String nodeKey = String.format(
ManagementCategoryApprovalField.NODE_LEVEL_X_ADMIN_AUDIT_TEMPLATE,
currentLevel
);
// 編輯操作且當前層級等於提交層級時,添加本級審批人 【新增的管理類目沒有還沒有對應的審批人】
if (isEditOperation && currentLevel == level) {
addApprover(nodeApprover, nodeKey, categoryId, catAuditorMap, userIdOpenIdMap);
}
// 非本級審批人(上級層級)
if (currentLevel != level) {
addApprover(nodeApprover, nodeKey, categoryId, catAuditorMap, userIdOpenIdMap);
}
}
return nodeApprover;
}
private List<Integer> buildApprovalChain(Integer level) {
List<Integer> approvalChain = new ArrayList<>();
if (level == 3) {
approvalChain.add(2); // 管二審批人
approvalChain.add(1); // 管一審批人
} else if (level == 2) {
approvalChain.add(2); // 管二審批人
approvalChain.add(1); // 管一審批人
} else if (level == 1) {
approvalChain.add(1); // 管一審批人
approvalChain.add(0); // 超管
}
return approvalChain;
}
3.3 數據模型設計
3.4 數倉計算邏輯
同步數據方式
方案一:
每次修改規則之後通過調用SQL觸發離線計算
優勢:通過SQL調用觸發計算,失效性較高
劣勢:ODPS 資源峯值消耗與SQL腳本耦合問題
- 因為整個規則修改是三級類目維度,如果同時幾十幾百個類目觸發規則改變,會同時觸發幾十幾百個離線任務。同時需要大量ODPS 資源;
- 調用SQL方式需要把當前規則修改和計算邏輯的SQL一起調用計算。
方案二:
優勢:同時只會產生一次規則計算
劣勢:實時性受限於離線計算週期
- 實時性取決於離線規則計算的定時任務配置和離線數據同步頻率,實時性不如直接調用SQL性能好
- 不重不漏為當前所有變更規則維度
技術決策:常態化迭代下的最優解
考慮到管理類目規則平均變更頻率不高,且變更時間點較為集中(非緊急場景佔比 90%),故選擇定時任務方案實現:
- 資源利用率提升:ODPS 計算資源消耗降低 80%,避免批量變更時數百個任務同時觸發的資源峯值;
- 完整性保障:通過全量維度掃描確保規則校驗無遺漏,較 SQL 觸發方案提升 20% 校驗覆蓋率;
- 可維護性優化:減少 SQL 腳本與業務邏輯的強耦合,維護成本降低 80%。
數據取數邏輯
生效中規則計算
草稿+生效中規格計算
如果是新增管理類目,直接參與計算。
如果是刪除管理類目,需要將該刪除草稿中對應的生效管理類目排除掉。
如果是更新:需要將草稿中的管理類目和規則替換生效中對應的管理類目和規則。
數倉實現
數據流程圖
四、項目成果與技術價值
預期效率提升:從 “周級” 到 “日級” 的跨越
- 管理一級 / 二級類目變更開發零成本,無需額外人力投入
- 管理三級類目變更相關人力成本降低 100%,無需額外投入開發資源
- 規則上線週期壓縮超 90%,僅需 1 - 2 天即可完成上線
質量保障:自動化校驗替代人工梳理
- 規則重複 / 遺漏檢測由人工梳理->自動化計算
- 下游感知管理類目規則變更由人工通知->實時感知
技術沉澱:規則模型化能力
沉澱管理類目規則配置模型,支持未來四級、五級多級管理類目快速適配。
五、總結
未來優化方向:
- 規則衝突預警:基於AI預測高風險規則變更,提前觸發校驗
- 接入flink做到實時計算管理類目和對應商品關係
技術重構的本質是 “釋放業務創造力”
管理類目配置線上化項目的核心價值,不僅在於技術層面的效率提升,更在於通過自動化工具鏈,讓業務方從 “規則提報的執行者” 轉變為 “業務策略的設計者”。當技術架構能夠快速響應業務迭代時,企業才能在電商領域的高頻競爭中保持創新活力。
往期回顧
- 大模型如何革新搜索相關性?智能升級讓搜索更“懂你”|得物技術
- RAG—Chunking策略實戰|得物技術
- 告別數據無序:得物數據研發與管理平台的破局之路
- 從一次啓動失敗深入剖析:Spring循環依賴的真相|得物技術
- Apex AI輔助編碼助手的設計和實踐|得物技術
文 /維山
關注得物技術,每週更新技術乾貨
要是覺得文章對你有幫助的話,歡迎評論轉發點贊~
未經得物技術許可嚴禁轉載,否則依法追究法律責任。