[关闭]
@buoge 2017-09-28T11:29:39.000000Z 字数 2776 阅读 1013

Sku选项可用判断

模型算法


判断前提

判断过程

  1. 假设当前的选项有如下几个:
    A:a1 a2 a3
    B:b1 b2 b3
    C:c1 c2 c3

2.假设当前选 a1,b2:

 2.1.获取当前选中 a1,b2 作为 select option
 2.2.使用select option和需要判断可用的项组成MatchOption,
     使用MatchOption对所有sku进行匹配,
     有任一sku匹配到此Option组合,则表示待判断的Option是可用的
 2.3. MatchOption如果包含了已经选中的项,需要把已经选中项提出:
     * 判断 a 选项 a2 可用时:
       match option(A:a1;B:b2;A:a2)去除已选中的A:a1后为:A:a1;B:b2;
     * 判断 b 选项 b1 可用时:
       match option(A:a1;B:b2;B:b1)去除已选中B:b2为:A:a1;B:b1;
     * 可以匹配到canbuy ture else false

3. 特殊情况:如果当前选项只有一个值,那么这个值默认选中

这部分是 Android 判断部分的代码

public void updateValueCanUseInOption(long confirmGroupID) {

    List<ConfirmOptionWrapper> modelList = getModelList();

    // 获取当前有哪些选中项
    List<ConfirmOptionWrapper> currentItemOptionList = getModelList(confirmGroupID);

    // optionWraper 的option 和 optionValWraper中的option内存地址不一样,没有currentSelectVal
    Map<String, String> selOptionKSMap = getSelectOptionsKKVMap(currentItemOptionList, confirmGroupID);

    Set<String> matchOptionSet = new HashSet<String>();

    for (ConfirmOptionWrapper optionWrapper : modelList) {
        if (!optionWrapper.isOptionTxt() && !optionWrapper.isOptionImg()) {
            continue;
        }
        if (CollectionsUtil.isListBlank(optionWrapper.optionValueWrappers)) {
            continue;
        }
        for (ConfirmOptionValueWrapper optionValueWrapper : optionWrapper.optionValueWrappers) {

            // 该选项是选中的item不用做可用判断,待判断item和点击触发的item不处于统一组时不做处理
            if (optionValueWrapper == optionWrapper.tmpSelecValWrapper || optionWrapper.confirmGroupID != confirmGroupID) {
                continue;
            }
            // 带判断item重置为默认
            optionValueWrapper.isCanBuy = false;
            matchOptionSet.clear();

            // 默认把选中Map中的KVSet赋值到MatchSet中
            for (Map.Entry<String, String> entry : selOptionKSMap.entrySet()) {
                matchOptionSet.add(entry.getValue());
            }
            //LogUtils.i("====== selOptionSet  is " + matchOptionSet.toString());

            // 假如是匹配是当前Option在mactch set 中去除当前option 和 Vaule,得到匹配中的 matchOptionSetPre
            String optionKeyStr = optionValueWrapper.getOptionValKeyStr();
            if (selOptionKSMap.containsKey(optionKeyStr)) {
                String currentSelOption = selOptionKSMap.get(optionKeyStr);
                matchOptionSet.remove(currentSelOption);
            }
            //LogUtils.i("====== selOptionSet After Filter is " + matchOptionSet.toString());

            // 由得到匹配中的selectOptionKVSet和判断项组成mactchSet
            String currentOptionKVStr = optionValueWrapper.getOptionValKVStr();
            matchOptionSet.add(currentOptionKVStr);
            //LogUtils.i("====== matchOptionSet is " + matchOptionSet.toString());
            // skuMap中假如有任一sku 的option set 匹配mactchset 则返回可用,循环判断每一个项
            optionValueWrapper.isCanBuy = isOptionSetCanMatchInSkuMap(matchOptionSet,optionWrapper);
            //  LogUtils.w("=====" + optionValueWrapper.optionValue.value + ":" +optionValueWrapper.optionValue.opNameId + ":" +optionValueWrapper.optionValue.opValueId +" wrapper.isCanBuy is :" + optionValueWrapper.isCanBuy);
        }
    } // end: ConfirmOptionWrapper optionWrapper : modelList
}

扩展阅读:Sku 多维属性状态判断算法: http://blog.jobbole.com/109138/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注