package com.bgy.autosale.helpers; import android.util.Log; import com.bgy.autosale.App; import com.bgy.autosale.Constant; import com.bgy.autosale.R; import com.bgy.autosale.entitys.DishesBean; import com.bgy.autosale.entitys.MakeIceCreamBean; import com.bgy.autosale.entitys.ResponseBean; import com.bgy.autosale.entitys.SpecBean; import com.bgy.autosale.entitys.SpecCategoryBean; import com.bgy.autosale.ui.operator.fragments.PriceFragment; import com.bgy.autosale.utils.SPUtils; import com.orhanobut.hawk.Hawk; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; /** * Created by cjx on 2020-04-24 * 说明: */ public class OrderHelper { private static final String TAG = "OrderHelper"; private static volatile OrderHelper helper; private ArrayList orderList; private DishesBean dishesBean; public static OrderHelper getInstance() { if (helper == null) { synchronized (OrderHelper.class) { if (helper == null) { helper = new OrderHelper(); } } } return helper; } private OrderHelper() { orderList = new ArrayList<>(); } public void init(DishesBean dishesBean) { this.dishesBean = dishesBean; orderList.clear(); } ///////////////////////////////////////// ////// ↓↓↓ 本地订单 ↓↓↓ /////// ///////////////////////////////////////// public ResponseBean addOrder(List currentDishesSpec, boolean checkStock) { int buyCount = 0; for (DishesBean order : orderList) { buyCount += order.buyCount; } int maxCount = Constant.STOCK_WARING_MAX_COUNT; int reduceCount = 1; if (checkStock && buyCount >= maxCount) { return new ResponseBean<>(false, 0, App.app.getString(R.string.buy_too_much)); } if (checkStock) { for (SpecBean specBean : currentDishesSpec) { if (specBean.stock > -1 && specBean.stock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), specBean.name)); } } if (dishesBean.cupStock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), App.app.getString(R.string.material_cup))); } if (dishesBean.flavorStock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), App.app.getString(R.string.material_milk))); } for (SpecBean specBean : currentDishesSpec) { if (specBean.stock > 0) { specBean.stock = specBean.stock - reduceCount; } } } String specTag = getSpecTag(currentDishesSpec); ResponseBean result = new ResponseBean<>(true, -1, null); int index = 0; for (DishesBean orderItem : orderList) { if (specTag.equals(orderItem.selectTag)) { orderItem.buyCount = orderItem.buyCount + 1; break; } index++; } if (orderList.size() == index) { DishesBean db = new DishesBean(); db.id = dishesBean.id; db.price = dishesBean.price; db.buyCount = 1; db.extra = dishesBean.extra; db.selectSpecBeans.addAll(currentDishesSpec); db.selectTag = specTag; db.specCategoryBeans = dishesBean.specCategoryBeans; orderList.add(db); result.extra = true; } else { result.extra = false; } if (checkStock) { dishesBean.cupStock = dishesBean.cupStock - reduceCount; dishesBean.flavorStock = dishesBean.flavorStock - reduceCount; } result.data = index; return result; } public ResponseBean addOrderOnlyForWechat(List currentDishesSpec, boolean checkStock) { int buyCount = 0; for (DishesBean order : orderList) { buyCount += order.buyCount; } int maxCount = Constant.STOCK_WARING_MAX_COUNT; int reduceCount = 1; if (checkStock && buyCount >= maxCount) { return new ResponseBean<>(false, 1, App.app.getString(R.string.buy_too_much)); } if (checkStock) { for (SpecBean specBean : currentDishesSpec) { if (specBean.stock > -1 && specBean.stock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), specBean.name)); } } if (dishesBean.cupStock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), App.app.getString(R.string.material_cup))); } if (dishesBean.flavorStock < reduceCount) { return new ResponseBean<>(false, 0, String.format(App.app.getString(R.string.spec_stock_empty), App.app.getString(R.string.material_milk))); } for (SpecBean specBean : currentDishesSpec) { if (specBean.stock > 0) { specBean.stock = specBean.stock - reduceCount; } } } String specTag = getSpecTag(currentDishesSpec); ResponseBean result = new ResponseBean<>(true, -1, null); int index = 0; for (DishesBean orderItem : orderList) { if (specTag.equals(orderItem.selectTag)) { orderItem.buyCount = orderItem.buyCount + 1; break; } index++; } if (orderList.size() == index) { DishesBean db = new DishesBean(); db.id = dishesBean.id; db.price = dishesBean.price; db.buyCount = 1; db.extra = dishesBean.extra; db.selectSpecBeans.addAll(currentDishesSpec); db.selectTag = specTag; db.specCategoryBeans = dishesBean.specCategoryBeans; orderList.add(db); result.extra = true; } else { result.extra = false; } if (checkStock) { dishesBean.cupStock = dishesBean.cupStock - reduceCount; dishesBean.flavorStock = dishesBean.flavorStock - reduceCount; } result.data = index; return result; } public boolean reduceOrder(List selectSpecs, DishesBean orderItem) { int reduceCount = 1; for (SpecBean select : selectSpecs) { for (SpecCategoryBean category : dishesBean.specCategoryBeans) { for (SpecBean sb : category.specBeans) { if (sb.id.equals(select.id) && sb.stock != -1) { sb.stock += reduceCount; break; } } } } dishesBean.cupStock += reduceCount; dishesBean.flavorStock += reduceCount; if (orderItem.buyCount == 1) { orderList.remove(orderItem); return true; } else { orderItem.buyCount = orderItem.buyCount - 1; return false; } } public DishesBean getOrderItem(List selectSpecs) { String specTag = getSpecTag(selectSpecs); DishesBean orderItem = null; for (DishesBean item : orderList) { if (specTag.equals(item.selectTag)) { orderItem = item; break; } } return orderItem; } public ArrayList getOrderList() { return orderList; } public LinkedList generateMakingIceCream() { LinkedList iceCreamOrders = new LinkedList<>(); for (DishesBean dishesBean : orderList) { for (int i = 0; i < dishesBean.buyCount; i++) { StringBuilder iceCreamName = new StringBuilder(18); MakeIceCreamBean detail = new MakeIceCreamBean(null, null, dishesBean.id); detail.specs = dishesBean.selectSpecBeans; detail.makeCodes = new int[]{1, 0, 0}; ArrayList sauceSpecs = new ArrayList<>(3); ArrayList kernelSpecs = new ArrayList<>(3); for (SpecBean spec : dishesBean.selectSpecBeans) { if (DishesBean.SPEC_CATEGORY_SAUCE.equals(spec.categoryCode)) { sauceSpecs.add(spec); } else if (DishesBean.SPEC_CATEGORY_KERNEL.equals(spec.categoryCode)) { kernelSpecs.add(spec); } } detail.makeCodes[1] = generateMakingIceCreamCode(sauceSpecs, iceCreamName); detail.makeCodes[2] = generateMakingIceCreamCode(kernelSpecs, iceCreamName); int nameLength = iceCreamName.length(); if (nameLength == 0) { // detail.iceCreamName = App.app.getString(R.string.flavor_original); detail.iceCreamName = dishesBean.name; } else if (nameLength > 6) { detail.iceCreamName = App.app.getString(R.string.flavor_multi); } else { detail.iceCreamName = iceCreamName.toString(); } iceCreamOrders.add(detail); Log.d(TAG, "generateMakingIceCream:1 "+detail.makeCodes[1]); Log.d(TAG, "generateMakingIceCream:2 "+detail.makeCodes[2]); } } return iceCreamOrders; } public void clearOrder() { for (DishesBean orderItem : orderList) { ArrayList selectSpecs = orderItem.selectSpecBeans; for (SpecBean select : selectSpecs) { for (SpecCategoryBean category : dishesBean.specCategoryBeans) { for (SpecBean sb : category.specBeans) { if (sb.id.equals(select.id) && sb.stock != -1) { sb.stock += orderItem.buyCount; break; } } } } dishesBean.cupStock = dishesBean.cupStock + orderItem.buyCount; dishesBean.flavorStock += orderItem.buyCount; } orderList.clear(); } private String getSpecTag(List saveSelectBeans) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < saveSelectBeans.size(); i++) { SpecBean addBean = saveSelectBeans.get(i); if (i == saveSelectBeans.size() - 1) { stringBuilder.append(addBean.name); } else { stringBuilder.append(addBean.name).append("_"); } } if (stringBuilder.length() == 0) { return dishesBean.name; } ArrayList list= Hawk.get("PRICEBEAN"); // return stringBuilder.toString()/* + App.app.getString(R.string.ice_cream)*/; return stringBuilder.toString()+ SPUtils.getInstance(App.app).getString(PriceFragment.ProductAbout.nameKey[0], App.app.getString(PriceFragment.ProductAbout.defaultName[0])); } ///////////////////////////////////////// ////// ↑↑↑ 本地订单 ↑↑↑ /////// ///////////////////////////////////////// public int generateMakingIceCreamCode(ArrayList specs, StringBuilder iceCreamName) { Collections.sort(specs, new Comparator() { @Override public int compare(SpecBean o1, SpecBean o2) { int code1 = o1.code; int code2 = o2.code; if (code1 > code2) { return 1; } else if (code1 == code2) { return 0; } else { return -1; } } }); StringBuilder codeStr = new StringBuilder(3); for (SpecBean sb : specs) { int code = sb.code; codeStr.append(code); if (iceCreamName != null) { if (sb.name.length() > 2) { iceCreamName.append(sb.name.substring(0, 2)); } else { iceCreamName.append(sb.name); } } } int code = 0; switch (codeStr.toString()) { case "1": code = 1; break; case "2": code = 2; break; case "3": code = 3; break; case "12": code = 4; break; case "13": code = 5; break; case "23": code = 6; break; case "123": code = 7; break; } return code; } private ArrayList parserMakeIceCeamCode(int code, String specCategory) { ArrayList list = new ArrayList<>(3); switch (code) { case 1: case 2: case 3: list.add(new SpecBean(code, specCategory)); break; case 4: list.add(new SpecBean(1, specCategory)); list.add(new SpecBean(2, specCategory)); break; case 5: list.add(new SpecBean(1, specCategory)); list.add(new SpecBean(3, specCategory)); break; case 6: list.add(new SpecBean(2, specCategory)); list.add(new SpecBean(3, specCategory)); break; case 7: list.add(new SpecBean(1, specCategory)); list.add(new SpecBean(2, specCategory)); list.add(new SpecBean(3, specCategory)); break; } return list; } public int[] parserMakeIceCreamCode(int code) { int[] src; switch (code) { case 1: case 2: case 3: src = new int[]{0, 0, 0}; src[code - 1] = 1; break; case 4: src = new int[]{1, 1, 0}; break; case 5: src = new int[]{1, 0, 1}; break; case 6: src = new int[]{0, 1, 1}; break; case 7: src = new int[]{1, 1, 1}; break; default: src = new int[]{0, 0, 0}; break; } return src; } }