From 98b1a0affd69bbe63223c21fdd2c404e8bedfccb Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期三, 20 五月 2020 17:25:08 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/div' into 2.1.2 --- fanli/src/main/java/com/yeshi/fanli/service/impl/goods/CommonTemplateContentServiceImpl.java | 456 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 425 insertions(+), 31 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/goods/CommonTemplateContentServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/goods/CommonTemplateContentServiceImpl.java index 6f3792c..f016c1f 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/impl/goods/CommonTemplateContentServiceImpl.java +++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/goods/CommonTemplateContentServiceImpl.java @@ -3,7 +3,9 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @@ -15,19 +17,45 @@ import com.yeshi.fanli.dto.common.CommonContentTypeEnum; import com.yeshi.fanli.dto.dataoke.DaTaoKeGoodsResult; import com.yeshi.fanli.entity.bus.clazz.GoodsClass; +import com.yeshi.fanli.entity.bus.lable.QualityFactory; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; +import com.yeshi.fanli.entity.taobao.TaobaoMeterial; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; +import com.yeshi.fanli.exception.taobao.TaoKeApiException; +import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.service.inter.goods.CommonTemplateContentService; -import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailService; +import com.yeshi.fanli.service.inter.lable.QualityGoodsService; +import com.yeshi.fanli.service.inter.lable.TaoKeGoodsService; +import com.yeshi.fanli.service.inter.order.config.HongBaoManageService; +import com.yeshi.fanli.service.inter.taobao.TaoBaoGoodsUpdateService; +import com.yeshi.fanli.service.inter.taobao.TaobaoMeterialService; +import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailV2Service; +import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.dataoke.DaTaoKeApiUtil; import com.yeshi.fanli.util.taobao.DaTaoKeUtil; import com.yeshi.fanli.util.taobao.TaoBaoUtil; +import com.yeshi.fanli.util.taobao.TaoKeApiUtil; @Service public class CommonTemplateContentServiceImpl implements CommonTemplateContentService { @Resource - private DaTaoKeGoodsDetailService daTaoKeGoodsDetailService; + private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service; + + @Resource + private TaobaoMeterialService taobaoMeterialService; + + @Resource + private TaoKeGoodsService taoKeGoodsService; + + @Resource + private HongBaoManageService hongBaoManageService; + + @Resource + private QualityGoodsService qualityGoodsService; + + @Resource + private TaoBaoGoodsUpdateService taoBaoGoodsUpdateService; private static List<CommonContentNav> getCommonNav() { List<CommonContentNav> navList = new ArrayList<>(); @@ -65,28 +93,30 @@ navList.add(new CommonContentNav(gc.getId() + "", gc.getName())); } } else if (type == CommonContentTypeEnum.chaoSheng) { - navList.add(new CommonContentNav("1", "5%~10%杩斿埄")); - navList.add(new CommonContentNav("2", "10%~20%杩斿埄")); - navList.add(new CommonContentNav("3", "20%~30%杩斿埄")); - navList.add(new CommonContentNav("4", "30%~40%杩斿埄")); - navList.add(new CommonContentNav("5", "40%浠ヤ笂杩斿埄")); + navList.add(new CommonContentNav("1", "1-5鍏冭繑鍒�")); + navList.add(new CommonContentNav("2", "5-10鍏冭繑鍒� ")); + navList.add(new CommonContentNav("3", "10-15鍏冭繑鍒�")); + navList.add(new CommonContentNav("4", "15-20鍏冭繑鍒�")); + navList.add(new CommonContentNav("5", "20鍏冧互涓婅繑鍒�")); } else if (type == CommonContentTypeEnum.haoQuan) { - navList.add(new CommonContentNav("1", "5~10鍏冨埜")); - navList.add(new CommonContentNav("2", "10~30鍏冨埜")); - navList.add(new CommonContentNav("3", "30~50鍏冨埜")); - navList.add(new CommonContentNav("4", "50鍏冧互涓婂埜")); + navList.add(new CommonContentNav("1", "1-5鍏冨埜")); + navList.add(new CommonContentNav("2", "5-10鍏冨埜")); + navList.add(new CommonContentNav("3", "10-20鍏冨埜")); + navList.add(new CommonContentNav("4", "20-30鍏冨埜")); + navList.add(new CommonContentNav("5", "30-50鍏冨埜")); + navList.add(new CommonContentNav("6", "50鍏冧互涓婂埜")); } else if (type == CommonContentTypeEnum.juJia) { navList = getCommonNav(); } else if (type == CommonContentTypeEnum.meiShi) { navList = getCommonNav(); } else if (type == CommonContentTypeEnum.muYin) { navList.add(new CommonContentNav("1", "绮鹃��")); - navList.add(new CommonContentNav("2", "澶囧瓡")); - navList.add(new CommonContentNav("3", "0~6鏈�")); - navList.add(new CommonContentNav("4", "7~12鏈�")); - navList.add(new CommonContentNav("5", "1~3宀�")); - navList.add(new CommonContentNav("6", "4~6宀�")); - navList.add(new CommonContentNav("7", "7~12宀�")); + navList.add(new CommonContentNav("澶囧瓡", "澶囧瓡")); + navList.add(new CommonContentNav("0鑷�6涓湀", "0~6鏈�")); + navList.add(new CommonContentNav("7鑷�12涓湀", "7~12鏈�")); + navList.add(new CommonContentNav("1鑷�3宀�", "1~3宀�")); + navList.add(new CommonContentNav("4鑷�6宀�", "4~6宀�")); + navList.add(new CommonContentNav("7鑷�12宀�", "7~12宀�")); } else if (type == CommonContentTypeEnum.reMai) { navList = getCommonNav(); } else if (type == CommonContentTypeEnum.chuanYiDaPei) { @@ -103,6 +133,10 @@ navList = getCommonNav(); } else if (type == CommonContentTypeEnum.qiCheHuWai) { navList = getCommonNav(); + } else if (type == CommonContentTypeEnum.chaoPinReMai) { + navList = getCommonNav(); + } else if (type == CommonContentTypeEnum.mianDan) { + navList = new ArrayList<>(); } return navList; @@ -111,40 +145,94 @@ @Cacheable(value = "commonContentCache", key = "#type+'-'+#cid+'-'+#page+'-'+#pageSize") @Override public CommonContentResult getContentList(CommonContentTypeEnum type, String cid, int page, int pageSize) { + CommonContentResult result = null; if (type == CommonContentTypeEnum._9k9) { - return get9K9Content(cid, page, pageSize); + result = get9K9Content(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.juJia) { + result = getJuJiaShengHuoContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.muYin) { + result = getMuYinJingXuanContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.meiShi) { + result = getYouXuanMeiShiContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.chuanYiDaPei) { - return getChuanYiDaPeiContent(cid, page, pageSize); + result = getChuanYiDaPeiContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.meiZhuangGehu) { - return getMeiZhuangGeHuContent(cid, page, pageSize); + result = getMeiZhuangGeHuContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.jingPinXieBao) { - return getJingPinXieBaoContent(cid, page, pageSize); + result = getJingPinXieBaoContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.chaoNanReMai) { - return getChaoNanReMaiContent(cid, page, pageSize); + result = getChaoNanReMaiContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.shuMaShouJi) { - return getShuMaShouJiContent(cid, page, pageSize); + result = getShuMaShouJiContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.yunDongKuXie) { - return getYunDongKuXieContent(cid, page, pageSize); + result = getYunDongKuXieContent(cid, page, pageSize); } else if (type == CommonContentTypeEnum.qiCheHuWai) { - return getQiCheHuWaiContent(cid, page, pageSize); + result = getQiCheHuWaiContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.chaoPinReMai) { + result = getChaoPinReMaiContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.chaoSheng) { + result = getCaoShengContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.haoQuan) { + result = getHaoQuanContent(cid, page, pageSize); + } else if (type == CommonContentTypeEnum.mianDan) { + result = getMianDanContent(page, pageSize); } - return null; + + if (result != null) {// 鍟嗗搧淇℃伅杩囨护 + List<TaoBaoGoodsBrief> goodsList = taoBaoGoodsUpdateService + .filterImportantTaoBaoGoods(result.getGoodsList()); + result.setGoodsList(goodsList); + } + + return result; } + /** + * 9蹇�9鍖呴偖 + * + * @param cid + * @param page + * @param pageSize + * @return + */ private CommonContentResult get9K9Content(String cid, int page, int pageSize) { + if (pageSize == 20) + pageSize = 50; + DaTaoKeGoodsResult result = null; if ("-1".equalsIgnoreCase(cid)) { - result = DaTaoKeApiUtil.search("", null, null, new BigDecimal("10"), page, pageSize, + result = DaTaoKeApiUtil.getGoodsList("", null, null, new BigDecimal("10"), null, page, pageSize, DaTaoKeApiUtil.SORT_DEFAULT); + if (result == null || result.getGoodsList() == null || result.getGoodsList().size() == 0) { + result = new DaTaoKeGoodsResult(); + result.setGoodsList( + daTaoKeGoodsDetailV2Service.listByMaxPrice(null, new BigDecimal("10"), null, page, pageSize)); + result.setTotalCount(daTaoKeGoodsDetailV2Service.countByMaxPrice(null, new BigDecimal("10"))); + } + } else if ("0".equalsIgnoreCase(cid)) { - result = DaTaoKeApiUtil.search("", null, null, new BigDecimal("10"), page, pageSize, + result = DaTaoKeApiUtil.getGoodsList("", null, null, new BigDecimal("10"), null, page, pageSize, DaTaoKeApiUtil.SORT_CREATETIME); + if (result == null || result.getGoodsList() == null || result.getGoodsList().size() == 0) { + result = new DaTaoKeGoodsResult(); + result.setGoodsList(daTaoKeGoodsDetailV2Service.listByMaxPrice(null, new BigDecimal("10"), "createTime", + page, pageSize)); + result.setTotalCount(daTaoKeGoodsDetailV2Service.countByMaxPrice(null, new BigDecimal("10"))); + } } else { List<Integer> cidList = new ArrayList<>(); cidList.add(Integer.parseInt(cid)); - result = DaTaoKeApiUtil.search("", cidList, null, new BigDecimal("10"), page, pageSize, + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, new BigDecimal("10"), null, page, pageSize, DaTaoKeApiUtil.SORT_DEFAULT); + + if (result == null || result.getGoodsList() == null || result.getGoodsList().size() == 0) { + result = new DaTaoKeGoodsResult(); + result.setGoodsList(daTaoKeGoodsDetailV2Service.listByMaxPrice(Integer.parseInt(cid), + new BigDecimal("10"), null, page, pageSize)); + result.setTotalCount( + daTaoKeGoodsDetailV2Service.countByMaxPrice(Integer.parseInt(cid), new BigDecimal("10"))); + } } List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); @@ -156,6 +244,257 @@ goodsList.add(TaoBaoUtil.convert(detail)); } return new CommonContentResult(goodsList, count); + } + + /** + * 瓒呯骇鐪侀挶 + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getCaoShengContent(String cid, int page, int pageSize) { + pageSize = Constant.PAGE_SIZE; + Integer startAmount = null; + Integer endAmount = null; + + if (cid.equalsIgnoreCase(1 + "")) { + startAmount = 1; + endAmount = 5; + } else if (cid.equalsIgnoreCase(2 + "")) { + startAmount = 5; + endAmount = 10; + } else if (cid.equalsIgnoreCase(3 + "")) { + startAmount = 10; + endAmount = 15; + } else if (cid.equalsIgnoreCase(4 + "")) { + startAmount = 15; + endAmount = 20; + } else if (cid.equalsIgnoreCase(5 + "")) { + startAmount = 20; + endAmount = 10000; + } + + double tkRate = 20.00; + + BigDecimal proportion = hongBaoManageService.getFanLiRate(); + List<QualityFactory> listQuery = qualityGoodsService.listQueryByRebateAmount((page - 1) * pageSize, pageSize, + proportion.toString(), startAmount, endAmount, tkRate); + + long count = qualityGoodsService.countQueryByRebateAmount(proportion.toString(), startAmount, endAmount, + tkRate); + + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + // 閬嶅巻鍒楄〃鏁版嵁 + if (listQuery != null) + for (QualityFactory quality : listQuery) { + TaoBaoGoodsBrief taoBaoGoodsBrief = quality.getTaoBaoGoodsBrief(); + if (taoBaoGoodsBrief == null) { + continue; + } + + int biz30day = taoBaoGoodsBrief.getBiz30day(); + if (biz30day >= 10000) { + double sales = biz30day; + String salesCountMidea = String.format("%.1f", sales / 10000); + taoBaoGoodsBrief.setSalesCount(salesCountMidea + "涓�"); + } else { + taoBaoGoodsBrief.setSalesCount(biz30day + ""); + } + goodsList.add(taoBaoGoodsBrief); + } + return new CommonContentResult(goodsList, count); + } + + /** + * 楂橀濂藉埜 + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getHaoQuanContent(String cid, int page, int pageSize) { + pageSize = Constant.PAGE_SIZE; + + Integer startAmount = null; + Integer endAmount = null; + + if (cid.equalsIgnoreCase(1 + "")) { + startAmount = 1; + endAmount = 5; + } else if (cid.equalsIgnoreCase(2 + "")) { + startAmount = 5; + endAmount = 10; + } else if (cid.equalsIgnoreCase(3 + "")) { + startAmount = 10; + endAmount = 20; + } else if (cid.equalsIgnoreCase(4 + "")) { + startAmount = 20; + endAmount = 30; + } else if (cid.equalsIgnoreCase(5 + "")) { + startAmount = 30; + endAmount = 50; + } else if (cid.equalsIgnoreCase(6 + "")) { + startAmount = 50; + endAmount = 10000; + } + + Integer startPropor = 20; + + List<QualityFactory> listQuery = qualityGoodsService.listQueryByCouponAmount((page - 1) * pageSize, pageSize, + startAmount, endAmount, startPropor); + + long count = qualityGoodsService.countQueryByCouponAmount(startAmount, endAmount, startPropor); + + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + + // 閬嶅巻鍒楄〃鏁版嵁 + + for (QualityFactory selectionGoods : listQuery) { + + TaoBaoGoodsBrief taoBaoGoodsBrief = selectionGoods.getTaoBaoGoodsBrief(); + + if (taoBaoGoodsBrief == null) { + continue; + } + + int biz30day = taoBaoGoodsBrief.getBiz30day(); + if (biz30day >= 10000) { + double sales = biz30day; + String salesCountMidea = String.format("%.1f", sales / 10000); + taoBaoGoodsBrief.setSalesCount(salesCountMidea + "涓�"); + } else { + taoBaoGoodsBrief.setSalesCount(biz30day + ""); + } + goodsList.add(taoBaoGoodsBrief); + } + return new CommonContentResult(goodsList, count); + } + + /** + * 灞呭鐢熸椿 + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getJuJiaShengHuoContent(String cid, int page, int pageSize) { + DaTaoKeGoodsResult result = null; + List<Integer> cidList = new ArrayList<>(); + cidList.add(4);// 灞呭鐢熸椿 + int sort = getCommonSort(cid); + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, null, null, page, pageSize, sort); + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + long count = 0; + if (result != null) { + count = result.getTotalCount(); + if (result.getGoodsList() != null) + for (DaTaoKeDetailV2 detail : result.getGoodsList()) + goodsList.add(TaoBaoUtil.convert(detail)); + } + return new CommonContentResult(goodsList, count); + } + + /** + * 浼橀�夌編椋� + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getYouXuanMeiShiContent(String cid, int page, int pageSize) { + DaTaoKeGoodsResult result = null; + List<Integer> cidList = new ArrayList<>(); + cidList.add(6);// 缇庨 + int sort = getCommonSort(cid); + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, null, null, page, pageSize, sort); + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + long count = 0; + if (result != null) { + count = result.getTotalCount(); + if (result.getGoodsList() != null) + for (DaTaoKeDetailV2 detail : result.getGoodsList()) + goodsList.add(TaoBaoUtil.convert(detail)); + } + return new CommonContentResult(goodsList, count); + } + + /** + * 娼搧鐑崠 + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getChaoPinReMaiContent(String cid, int page, int pageSize) { + DaTaoKeGoodsResult result = null; + + int sort = getCommonSort(cid); + result = DaTaoKeApiUtil.search("娼�", null, null, null, page, pageSize, sort); + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + long count = 0; + if (result != null) { + count = result.getTotalCount(); + if (result.getGoodsList() != null) + for (DaTaoKeDetailV2 detail : result.getGoodsList()) + goodsList.add(TaoBaoUtil.convert(detail)); + } + return new CommonContentResult(goodsList, count); + } + + /** + * 鑾峰彇姣嶅┐绮鹃�� + * + * @param cid + * @param page + * @param pageSize + * @return + */ + private CommonContentResult getMuYinJingXuanContent(String cid, int page, int pageSize) { + DaTaoKeGoodsResult result = null; + if ("1".equalsIgnoreCase(cid)) {// 澶ф窐瀹㈡暟鎹� + List<Integer> cidList = new ArrayList<>(); + cidList.add(2);// 姣嶅┐ + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, null, null, page, pageSize, + DaTaoKeApiUtil.SORT_DEFAULT); + + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + long count = 0; + if (result != null) { + count = result.getTotalCount(); + if (result.getGoodsList() != null) + for (DaTaoKeDetailV2 detail : result.getGoodsList()) + goodsList.add(TaoBaoUtil.convert(detail)); + } + return new CommonContentResult(goodsList, count); + + } else {// + List<TaobaoMeterial> taobaoMeterials = taobaoMeterialService.selectByClassNameAndSuperNameCache("姣嶅┐_" + cid, + "姣嶅┐涓婚"); + + if (taobaoMeterials == null || taobaoMeterials.size() == 0) { + return null; + } + + TaobaoMeterial meterial = taobaoMeterials.get(0); + Integer materialId = meterial.getMaterialId(); + if (materialId != null) { + List<TaoBaoGoodsBrief> listBrands = new ArrayList<>(); + try { + listBrands = taoKeGoodsService.listByMaterial(materialId, page, pageSize); + } catch (Exception e) { + e.printStackTrace(); + } + return new CommonContentResult(listBrands, 1000); + } + return new CommonContentResult(new ArrayList<>(), 0); + } + } /** @@ -171,7 +510,8 @@ List<Integer> cidList = new ArrayList<>(); cidList.add(1);// 濂宠 int sort = getCommonSort(cid); - result = DaTaoKeApiUtil.search("鍐呰。 濂�", cidList, null, null, page, pageSize, sort); + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, null, null, page, pageSize, sort); + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); long count = 0; if (result != null) { @@ -331,7 +671,7 @@ cidList.add(7); cidList.add(13); int sort = getCommonSort(cid); - result = DaTaoKeApiUtil.search("", null, null, null, page, pageSize, sort); + result = DaTaoKeApiUtil.getGoodsList("", cidList, null, null, null, page, pageSize, sort); DaTaoKeGoodsResult result1 = DaTaoKeApiUtil.search("杩愬姩 鐢�", cidList, null, null, page, pageSize, sort); List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); long count = 0; @@ -348,4 +688,58 @@ return new CommonContentResult(goodsList, count); } + /** + * 鑾峰彇鍏嶅崟鍟嗗搧 + * + * @return + */ + private CommonContentResult getMianDanContent(int page, int pageSize) { + CommonContentResult result = new CommonContentResult(); + List<QualityFactory> listQuery = qualityGoodsService.listFreeGoods((page - 1) * pageSize, pageSize); + long count = qualityGoodsService.countFreeGoods(); + result.setCount(count); + List<Long> listGid = new ArrayList<Long>(); + List<TaoBaoGoodsBrief> goodsList = new ArrayList<>(); + for (QualityFactory qualityFactory : listQuery) { + TaoBaoGoodsBrief taoBaoGoodsBrief = qualityFactory.getTaoBaoGoodsBrief(); + if (taoBaoGoodsBrief == null) { + continue; + } + listGid.add(taoBaoGoodsBrief.getAuctionId()); + goodsList.add(taoBaoGoodsBrief); + } + // 鍘绘帀宸茬粡涓嶅湪鍞殑鍟嗗搧 + List<TaoBaoGoodsBrief> listTaoKeGoods = null; + try { + listTaoKeGoods = TaoKeApiUtil.getBatchGoodsInfo(listGid); + } catch (TaoKeApiException e) { + e.printStackTrace(); + } catch (TaobaoGoodsDownException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + Map<Long, TaoBaoGoodsBrief> goodsMap = new HashMap<>(); + if (listTaoKeGoods != null) + for (TaoBaoGoodsBrief goods : listTaoKeGoods) + goodsMap.put(goods.getAuctionId(), goods); + for (int i = 0; i < goodsList.size(); i++) { + if (goodsMap.get(goodsList.get(i).getAuctionId()) == null) { + goodsList.remove(i--); + } + } + // 杩囨护鍩烘湰鍟嗗搧淇℃伅 + goodsList = taoBaoGoodsUpdateService.filterImportantTaoBaoGoods(goodsList); + + for (int i = 0; i < goodsList.size(); i++) { + TaoBaoGoodsBrief goods = goodsList.get(i); + BigDecimal price = TaoBaoUtil.getAfterUseCouplePrice(goods); + if (price.compareTo(new BigDecimal(10)) >= 0) { + goodsList.remove(i--); + } + } + result.setGoodsList(goodsList); + return result; + } + } -- Gitblit v1.8.0