欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

程序实现 初步实现 ItemUtil.java package zzz.study.utils;/** * Creat

点击: 次  来源:宝鼎软件 时间:2018-01-10

原文出处: 琴水玉

本文内容来自真实的事情案例,因其转换略巨大,且有必然意义,故记录之。

问题

给定一个JSON串

{
    "item:s_id:18006666": "1024",
    "item:s_id:18008888": "1024",
    "item:g_id:18006666": "6666",
    "item:g_id:18008888": "8888",
    "item:num:18008888": "8",
    "item:num:18006666": "6",
    "item:item_core_id:18006666": "9876666",
    "item:item_core_id:18008888": "9878888",
    "item:order_no:18006666": "E20171013174712025",
    "item:order_no:18008888": "E20171013174712025",
    "item:id:18008888": "18008888",
    "item:id:18006666": "18006666",
    
    "item_core:num:9878888": "8",
    "item_core:num:9876666": "6",
    "item_core:id:9876666": "9876666",
    "item_core:id:9878888": "9878888",

    "item_price:item_id:1000": "9876666",
    "item_price:item_id:2000": "9878888",
    "item_price:price:1000": "100",
    "item_price:price:2000": "200",
    "item_price:id:2000": "2000",
    "item_price:id:1000": "1000",

    "item_price_change_log:id:1111": "1111",
    "item_price_change_log:id:2222": "2222",
    "item_price_change_log:item_id:1111": "9876666",
    "item_price_change_log:item_id:2222": "9878888",
    "item_price_change_log:detail:1111": "haha1111",
    "item_price_change_log:detail:2222": "haha2222",
    "item_price_change_log:id:3333": "3333",
    "item_price_change_log:id:4444": "4444",
    "item_price_change_log:item_id:3333": "9876666",
    "item_price_change_log:item_id:4444": "9878888",
    "item_price_change_log:detail:3333": "haha3333",
    "item_price_change_log:detail:4444": "haha4444"
}

这是一个订单的两个商品的根基信息、价值信息以及计价改观信息,是从DB里的布局获取到的记录。为了企业保密性,昆山软件开发,对表、字段以及值做了简化的非凡处理惩罚。方针是将这个订单的各个商品的信息聚合在一起。 即获得:

{1024_E20171013174712025_18006666={item:id=18006666, item_price:price=100, item_price:id=1000, item_price_change_log:id=[3333, 1111], item_core:num=6, item:g_id=6666, item:item_core_id=9876666, item_price:item_id=9876666, item:order_no=E20171013174712025, item_core:id=9876666, item_price_change_log:item_id=[9876666, 9876666], item:s_id=1024, item:num=6, item_price_change_log:detail=[haha3333, haha1111]}, 1024_E20171013174712025_18008888={item:id=18008888, item_price:price=200, item_price:id=2000, item_price_change_log:id=[2222, 4444], item_core:num=8, item:g_id=8888, item:item_core_id=9878888, item_price:item_id=9878888, item:order_no=E20171013174712025, item_price_change_log:item_id=[9878888, 9878888], item:s_id=1024, item_core:id=9878888, item:num=8, item_price_change_log:detail=[haha2222, haha4444]}}

细心的读者会发明,一个商品 item 对应一个 item_core, 一个 item_price ,劳务派遣管理系统,大概对应多个 item_price_change_log 。这三个表都是通过 item:item_core_id 来关联的,在 item 表是 item:item_core_id 字段, 在 item_price 表是 item_price:item_id 字段, 在 item_price_change_log 表是 item_price_change_log:item_id 字段。

提示

根基思路是:

STEP1: 对付含有表 item, item_core, item_price, item_price_change_log 数据的指定JSON,构建一个总的 itemIndexMap[table:id, Map[table:field, value]],个中 key 是 table:id, value 是一个 valMap, valMap 的键是 table:field, 值是对应的最后头的值。 table: 作为名字空间的前缀,是为了制止差异表之间的ID和field彼此重合包围。 见要领 buildItemIndexMap 的实现。

STEP2: 从 itemIndexMap 构建 item:id 与 item:item_core_id 的映射 itemCoreId2originItemIdMap;在实际应用中, originItemId 为 oldItemId (item:id), itemCoreId 为 newItemId (item:item_core_id);

STEP3: 对付每一个 [table:id, Map[table:field, value]], 通过 itemCoreId2originItemIdMap 拿到对应的 originitemId , 然后利用 originitemId 为键替换itemIndexMap中对应的 item_core:id, item_price:id, item_price_change_log:id,将具有沟通的 originItemId 的差异的 Map[table:field, value] 举办归并后,添加到新的newItemIndexMap 中。

措施实现

劈头实现

ItemUtil.java

package zzz.study.utils;

/**
 * Created by shuqin on 17/11/10.
 */

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static zzz.study.utils.NewMapUtil.merge;

/**
 * Created by shuqin on 17/10/23.
 */
public class ItemUtil {

  private static Logger logger = LoggerFactory.getLogger(ItemUtil.class);

  /**
   * 构建一个订单的所有商等第此外信息以及映射
   * @param multiItemInfoMapForOneOrder 一个订单下多个商品的信息
   * @return 一个订单的所有商等第此外信息以及映射
   *
   * key 是 sID + order_no + item_id ; item_id 对应 item.id, 对应 item_core.item_core_id
   */
  public static Map<String, Map<String,Object>> buildFinalOrderItemMap(Map<String,String> multiItemInfoMapForOneOrder) {
    try {
      return mergeOrderItemMap(buildItemIndexMap(multiItemInfoMapForOneOrder));
    } catch (Exception ex) {
      logger.error("failed to buildFinalOrderItemMap for: " + multiItemInfoMapForOneOrder, ex);
      return new HashMap<>();
    }

  }

  /**
   * 构建一个订单的所有商等第此外信息以及映射
   * @param itemInfoMap 商等第此外信息
   * @return 一个订单的所有商品的信息
   *
   * NOTE: itemInfoMap 是对应一个订单的所有商品的信息的映射,不要传多个订单的信息进来,大概反复
   *
   * key = table:table_unique_id , value = map [ table:field, value ]
   *
   * eg. map [ item:goods_type:1800888 = 0 , item:num:1800888 = 8 ]
   *     will be transformed into map[item:1800888 = map[item:goods_type=0 , item:num=8]]
   */
  public static Map<String,Map<String,String>> buildItemIndexMap(Map<String, String> itemInfoMap) {
    Map<String, Map<String,String>> itemIndexMap = new HashMap<>();

    itemInfoMap.forEach(
        (key, value) -> {
          String[] keyparts = key.split(":");

          // 只思量三段式 tablename:field:id
          if (keyparts != null && keyparts.length == 3) {
            String table = keyparts[0];
            String field = keyparts[1];
            String index = keyparts[2];

            String indexKey = table+ ":" + index;
            String fieldKey = table+":"+field;
            if (itemIndexMap.get(indexKey) == null) {
              itemIndexMap.put(indexKey, new HashMap<>());
            }
            itemIndexMap.get(indexKey).put(fieldKey, String.valueOf(value));
          }
        }
    );

    return itemIndexMap;
  }

  /**
   * 聚合一个订单下的所有商品信息
   * @param itemIndexMap 一个订单所有商品的信息映射
   * @return 一个订单下的所有商品信息
   *
   * key 是 sID + order_no + item_id ; item_id 对应 item.id, item_core.item_core_id
   */
  private static Map<String, Map<String,Object>> mergeOrderItemMap(Map<String, Map<String,String>> itemIndexMap) {

    if (itemIndexMap == null || itemIndexMap.isEmpty()) {
      return new HashMap<>();
    }

    // Map[oldItemId, newItemId]
    Map<String,String> old2newItemIdMap = new HashMap<>();
    Map<String,String> new2oldItemIdMap = new HashMap<>();

    Set<Map.Entry<String,Map<String,String>>> entries = itemIndexMap.entrySet();
    String orderNo = "";
    String sID = "";
    for (Map.Entry<String,Map<String,String>> entry: entries) {
      String indexKey = entry.getKey();
      Map<String,String> value = entry.getValue();

      if (indexKey.startsWith("item:")) {
        old2newItemIdMap.put(indexKey, value.get("item:item_core_id"));
        new2oldItemIdMap.put(value.get("item:item_core_id"), indexKey);
        orderNo = value.get("item:order_no");
        sID = value.get("item:s_id");
      }
    }

    Map<String, Map<String,Object>> newItemIndexMap = new HashMap<>();

    for (Map.Entry<String,Map<String,String>> entry: entries) {
      String indexKey = entry.getKey();
      Map<String,String> value = entry.getValue();

      if (indexKey.startsWith("item:")) {
        if (newItemIndexMap.get(indexKey) == null) {
          newItemIndexMap.put(indexKey, new HashMap<>());
        }
        newItemIndexMap.get(indexKey).putAll(value);
      }
      else if (indexKey.startsWith("item_core:")) {
        String itemCoreId = indexKey.split(":")[1];
        String oldItemId = new2oldItemIdMap.get(itemCoreId);
        if (newItemIndexMap.get(oldItemId) == null) {
          newItemIndexMap.put(oldItemId, new HashMap<>());
        }
        newItemIndexMap.get(oldItemId).putAll(value);
      }
      else if (indexKey.startsWith("item_price:")) {
        // item_price 与 item_id 一对一干系
        String itemCoreId = itemIndexMap.get(indexKey).get("item_price:item_id");
        String oldItemId = new2oldItemIdMap.get(itemCoreId);
        if (newItemIndexMap.get(oldItemId) == null) {
          newItemIndexMap.put(oldItemId, new HashMap<>());
        }
        newItemIndexMap.get(oldItemId).putAll(value);
      }
      else if (indexKey.startsWith("item_price_change_log:")) {
        // item_price_change_log 与 item_id 多对一干系
        String itemCoreId = itemIndexMap.get(indexKey).get("item_price_change_log:item_id");
        String oldItemId = new2oldItemIdMap.get(itemCoreId);
        if (newItemIndexMap.get(oldItemId) == null) {
          newItemIndexMap.put(oldItemId, new HashMap<>());
        }
        Map<String,Object> srcMap = newItemIndexMap.get(oldItemId);
        newItemIndexMap.get(oldItemId).putAll(merge(srcMap, value));
      }

    }

    return buildFinalOrderItemMap(newItemIndexMap, old2newItemIdMap, orderNo, sID);

  }


  /**
   * 构建最终的订单商品信息
   * @param itemIndexMap 商品信息
   * @param old2newItemIdMap 新老itemId映射
   * @param orderNo 订单号
   * @param sID 店肆号
   * @return 订单商品扩展信息
   */
  private static Map<String, Map<String,Object>> buildFinalOrderItemMap(Map<String, Map<String,Object>> itemIndexMap,
                                                                        Map<String,String> old2newItemIdMap,
                                                                        String orderNo, String sID) {
    Map<String, Map<String,Object>> finalResult = new HashMap<>();

    Set<Map.Entry<String,Map<String,Object>>> entries = itemIndexMap.entrySet();

    for (Map.Entry<String,Map<String,Object>> entry: entries) {
      String indexKey = entry.getKey();
      Map<String,Object> value = entry.getValue();

      String itemId = indexKey.split(":")[1];

      String itemKey = sID + "_" + orderNo + "_" + itemId;
      finalResult.put(itemKey, value);
    }
    return finalResult;
  }

}