|
@@ -571,8 +571,10 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public String importGoodsV2(MultipartFile file, Integer userId) throws Exception {
|
|
|
+ List<String> errList = new ArrayList<>();
|
|
|
Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
|
|
|
if (sheetsListMap.values().isEmpty()) {
|
|
|
+ errList.add("excel未解析到数据");
|
|
|
return "";
|
|
|
}
|
|
|
|
|
@@ -593,10 +595,26 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
|
|
|
Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.GOODS_GROUP.getMsg());
|
|
|
|
|
|
- List<String> errors = new ArrayList<>();
|
|
|
+ List<Map<String, Object>> firstSheet = sheetsListMap.get(0);
|
|
|
+ List<String> skuList = firstSheet.stream().map(next -> next.get("SKU").toString()).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
+ List<PmsProductDto> subGoods = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ // 查询SKU对应商品
|
|
|
+ PmsProductQueryParamDto dto = PmsProductQueryParamDto.builder()
|
|
|
+ .skuStockIds(String.join(",", skuList))
|
|
|
+ .pageNum(1)
|
|
|
+ .pageSize(9999)
|
|
|
+ .build();
|
|
|
+ dto.setJson(JSON.toJSONString(dto));
|
|
|
+ subGoods.addAll(mallFeignService.getProductList(dto).getRows());
|
|
|
+ } catch (Exception e) {
|
|
|
+ errList.add("商城服务调用失败");
|
|
|
+ }
|
|
|
+ Map<String, PmsProductDto>skuMap = subGoods.stream().collect(Collectors.toMap(next -> (next.getName() + "_" + next.getSkuCode()), Function.identity()));
|
|
|
+
|
|
|
List<GoodsWrapper.Goods> goodsList = new ArrayList<>();
|
|
|
for (Map.Entry<String, List<Map<String, Object>>> sheetData : sheetsListMap.entrySet()) {
|
|
|
- LinkedHashMap<Integer, List<String>> errMap = new LinkedHashMap<>();
|
|
|
List<Map<String, Object>> rows = sheetData.getValue();
|
|
|
if (rows.isEmpty()) {
|
|
|
continue;
|
|
@@ -606,16 +624,20 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
Set<String> templateFields = columns.keySet();
|
|
|
List<String> defaultField = templateFields.stream().filter(firstRow::containsKey).collect(Collectors.toList());
|
|
|
if (!defaultField.isEmpty()) {
|
|
|
- errors.add("导入字段缺省:" + String.join(",", defaultField));
|
|
|
+ errList.add("导入字段缺省:" + String.join(",", defaultField));
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- String lineErrMsg = "第%行存在错误:";
|
|
|
- List<String> errList = new ArrayList<>();
|
|
|
- Map<String,String> fieldTypeMap = new HashMap<>();
|
|
|
- GoodsWrapper.Goods beforeGoods = null;
|
|
|
+ String lineErrMsg = "第%s行存在错误:%s";
|
|
|
+ Map<String, String> beforeGoods = new HashMap<>();
|
|
|
+
|
|
|
+ JSONObject objectMap = new JSONObject();
|
|
|
+ String subGoodsName = null;
|
|
|
+ String subGoodsSku = null;
|
|
|
for (int i = 0; i < rows.size(); i++) {
|
|
|
+ int rowNum = i + 2;
|
|
|
GoodsWrapper.Goods goods = new GoodsWrapper.Goods();
|
|
|
+ GoodsWrapper.GoodsSub goodsSub = new GoodsWrapper.GoodsSub();
|
|
|
Map<String, Object> row = rows.get(i);
|
|
|
if (row.size() == 0) {
|
|
|
continue;
|
|
@@ -627,38 +649,48 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
}
|
|
|
String fieldCode = columns.get(fieldName);
|
|
|
String value = entry.getValue().toString();
|
|
|
- if (beforeGoods == null) {
|
|
|
|
|
|
- }
|
|
|
- if (beforeGoods == null && StringUtils.isEmpty(value)) {
|
|
|
- errList.add("字段‘" + fieldName + "’为空");
|
|
|
- continue;
|
|
|
+ // 非子商品字段为空,往上一行获取值
|
|
|
+ if (StringUtils.isEmpty(value)) {
|
|
|
+ if ("subGoodsName".equals(fieldCode) || "sku".equals(fieldCode) || "subGoodsPrice".equals(fieldCode)) {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’为空"));
|
|
|
+ } else {
|
|
|
+ if (!beforeGoods.containsKey(fieldCode)) {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’为空"));
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ value = beforeGoods.get(fieldCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ beforeGoods.put(fieldCode, value);
|
|
|
}
|
|
|
if ("marketPrice".equals(fieldCode)
|
|
|
|| "discountPrice".equals(fieldCode)
|
|
|
|| "groupPurchasePrice".equals(fieldCode)) {
|
|
|
if (NumberUtils.isNumber(value)) {
|
|
|
- BigDecimal marketPrice = new BigDecimal(value);
|
|
|
- if (BigDecimal.ZERO.compareTo(marketPrice) > 0) {
|
|
|
- errList.add("字段‘" + fieldName + "’不能为负数");
|
|
|
+ BigDecimal prize = new BigDecimal(value);
|
|
|
+ if (BigDecimal.ZERO.compareTo(prize) > 0) {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’不能为负数"));
|
|
|
} else {
|
|
|
-// ReflectionUtil.invoke(goods, "set" + fieldCode.substring(0, 1).toUpperCase() + fieldCode.substring(1), new Class[]{BigDecimal.class}, new Object[] {marketPrice});
|
|
|
+ objectMap.put(fieldCode, value);
|
|
|
}
|
|
|
} else {
|
|
|
- errList.add("字段‘" + fieldName + "’类型错误");
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型错误"));
|
|
|
}
|
|
|
} else if ("type".equals(fieldCode)) {
|
|
|
- boolean match = Arrays.stream(GoodsType.values()).allMatch(next -> next.getDesc().equals(value));
|
|
|
+ String tempValue = value;
|
|
|
+ boolean match = Arrays.stream(GoodsType.values()).allMatch(next -> next.getDesc().equals(tempValue));
|
|
|
if (match) {
|
|
|
- goods.setType(GoodsType.valueOf(value));
|
|
|
+ objectMap.put(fieldCode, value);
|
|
|
} else {
|
|
|
- errList.add("字段‘" + fieldName + "’类型不支持");
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型不支持"));
|
|
|
}
|
|
|
} else if ("goodsCategoryName".equals(fieldCode)) {
|
|
|
if(categoryNames.contains(value)){
|
|
|
- goods.setGoodsCategoryId(categoryIdNameMap.get(value));
|
|
|
+ objectMap.put("goodsCategoryId", categoryIdNameMap.get(value));
|
|
|
}else {
|
|
|
- errList.add("字段‘" + fieldName + "’类型不支持");
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型不支持"));
|
|
|
}
|
|
|
} else if ("educationShowOrganName".equals(fieldCode)
|
|
|
|| "courseFeeShowOrganName".equals(fieldCode)
|
|
@@ -669,30 +701,104 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
List<String> orgIds = new ArrayList<>();
|
|
|
for (String orgName : value.split(",")) {
|
|
|
if (!orgNameIdMap.containsKey(orgName)) {
|
|
|
- errList.add("字段‘" + fieldName + "’分部‘" + value + "’不支持");
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’:‘" + value + "’分部不支持"));
|
|
|
} else {
|
|
|
orgIds.add(orgNameIdMap.get(orgName).toString());
|
|
|
}
|
|
|
}
|
|
|
- String valueField = fieldCode.replaceAll("Name", "Id");
|
|
|
- valueField = "set" + valueField.substring(0, 1).toUpperCase() + valueField.substring(1);
|
|
|
-// ReflectionUtil.invoke(goods, valueField, new Class[]{String.class}, new Object[]{String.join("", value)});
|
|
|
+ String join = String.join(",", orgIds);
|
|
|
+ String fieldKey = fieldCode.replaceAll("Name", "Id");
|
|
|
+ objectMap.put(fieldKey, join);
|
|
|
+// if("educationShowOrganName".equals(fieldCode)){
|
|
|
+// goods.setEducationShowOrganId(join);
|
|
|
+// }else if("courseFeeShowOrganName".equals(fieldCode)){
|
|
|
+// goods.setCourseFeeShowOrganId(join);
|
|
|
+// }else if("memberFeeShowOrganName".equals(fieldCode)){
|
|
|
+// goods.setMemberFeeShowOrganId(join);
|
|
|
+// }else if("freeFeeShowOrganName".equals(fieldCode)){
|
|
|
+// goods.setFreeFeeShowOrganId(join);
|
|
|
+// }else if("replacementShowOrganName".equals(fieldCode)){
|
|
|
+// goods.setReplacementShowOrganId(join);
|
|
|
+// }
|
|
|
+ } else if ("subGoodsName".equals(fieldCode)) {
|
|
|
+ subGoodsName = value;
|
|
|
+ if (StringUtils.isNotEmpty(subGoodsSku)) {
|
|
|
+ String key = subGoodsName + "_" + subGoodsSku;
|
|
|
+ if (skuMap.containsKey(key)) {
|
|
|
+ PmsProductDto dto = skuMap.get(key);
|
|
|
+ objectMap.put("mallGoodsId", dto.getGoodsId().intValue());
|
|
|
+ objectMap.put("sku", dto.getSkuStockId());
|
|
|
+ objectMap.put("stock", dto.getStock());
|
|
|
+ objectMap.put("goodsStatus", dto.getPublishStatus()==1);
|
|
|
+ } else {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "子商品‘" + value + "[" + subGoodsSku + "]’不存在"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if ("sku".equals(fieldCode)) {
|
|
|
+ subGoodsSku = value;
|
|
|
+ if (StringUtils.isNotEmpty(subGoodsName)) {
|
|
|
+ String key = subGoodsName + "_" + subGoodsSku;
|
|
|
+ if (skuMap.containsKey(key)) {
|
|
|
+ PmsProductDto dto = skuMap.get(key);
|
|
|
+ objectMap.put("mallGoodsId", dto.getGoodsId().intValue());
|
|
|
+ objectMap.put("sku", dto.getSkuStockId());
|
|
|
+ objectMap.put("stock", dto.getStock());
|
|
|
+ objectMap.put("goodsStatus", dto.getPublishStatus()==1);
|
|
|
+ } else {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "子商品‘" + value + "[" + subGoodsSku + "]’不存在"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if ("subGoodsPrice".equals(fieldCode)) {
|
|
|
+ BigDecimal subGoodsPrice = new BigDecimal(value);
|
|
|
+ if (BigDecimal.ZERO.compareTo(subGoodsPrice) > 0) {
|
|
|
+ errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’不能为负数"));
|
|
|
+ }
|
|
|
+ goodsSub.setGoodsPrice(subGoodsPrice);
|
|
|
+ } else {
|
|
|
+ objectMap.put(fieldCode, value);
|
|
|
}
|
|
|
-
|
|
|
- beforeGoods = JSON.parseObject(JSON.toJSONString(goods),GoodsWrapper.Goods.class);
|
|
|
}
|
|
|
+ goods.setGoodsSubList(Collections.singletonList(goodsSub));
|
|
|
+ goodsList.add(goods);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ if (goodsList.isEmpty()) {
|
|
|
+ errList.add("未解析到数据");
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ if (!errList.isEmpty()) {
|
|
|
+ // 存在错误信息,添加错误日志文件返回
|
|
|
+ return "";
|
|
|
+ }
|
|
|
|
|
|
+ Map<String, List<GoodsWrapper.Goods>> goodsGroup = goodsList.stream().collect(Collectors.groupingBy(next -> next.getName() + "_" + next.getSn()));
|
|
|
|
|
|
|
|
|
+ // 数据合并
|
|
|
+ Map<Integer, Integer> skuIdMap = subGoods.stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, PmsProductDto::getStock));
|
|
|
|
|
|
- }
|
|
|
+ goodsGroup.forEach((key, value) -> {
|
|
|
+ GoodsWrapper.Goods good = value.get(0);
|
|
|
+ List<GoodsWrapper.GoodsSub> goodsSubList = value.stream().map(GoodsWrapper.Goods::getGoodsSubList).flatMap(Collection::stream).collect(Collectors.toList());
|
|
|
+ Integer stock = goodsSubList.stream().map(next -> skuIdMap.get(next.getSku())).min(Integer::compareTo).orElse(0);
|
|
|
|
|
|
- if (goodsList.isEmpty()) {
|
|
|
- throw new BizException("未解析到文件");
|
|
|
- }
|
|
|
+ Goods goods = JSON.parseObject(JSON.toJSONString(good), Goods.class);
|
|
|
+ goods.setStatus(YesOrNoEnum.NO);
|
|
|
+ goods.setStockCount(stock);
|
|
|
+ this.insert(goods);
|
|
|
+
|
|
|
+ List<GoodsSub> subList = goodsSubList.stream().map(next -> {
|
|
|
+ GoodsSub sub = new GoodsSub();
|
|
|
+ sub.setGoodsId(goods.getId());
|
|
|
+ sub.setMallGoodsId(next.getMallGoodsId());
|
|
|
+ sub.setSku(next.getSku());
|
|
|
+ sub.setGoodsStatus(next.getGoodsStatus());
|
|
|
+ sub.setGoodsPrice(next.getGoodsPrice());
|
|
|
+ return sub;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ goodsSubMapper.saveBatch(subList);
|
|
|
+ });
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -1110,6 +1216,6 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
|
|
|
@Override
|
|
|
public Object queryGoodsCategoryList() {
|
|
|
- return null;
|
|
|
+ return mallFeignService.getProductAttributeCategoryList();
|
|
|
}
|
|
|
}
|