Browse Source

Merge branch 'zx_saas_goods' into test

yuanliang 1 year ago
parent
commit
c201fdb991
29 changed files with 508 additions and 160 deletions
  1. 1 13
      mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SellOrderService.java
  3. 152 82
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  4. 11 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  5. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  6. 29 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  7. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  8. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  9. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  11. 1 1
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  12. 3 2
      mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java
  13. 5 4
      mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java
  14. 145 0
      mec-common/common-core/src/main/java/com/ym/mec/common/api/CommonResult.java
  15. 17 0
      mec-common/common-core/src/main/java/com/ym/mec/common/api/IErrorCode.java
  16. 28 0
      mec-common/common-core/src/main/java/com/ym/mec/common/api/ResultCode.java
  17. 2 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductQueryParamDto.java
  18. 4 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductCategoryDto.java
  19. 6 4
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  20. 22 10
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  21. 12 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  22. 10 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsSkuStockServiceImpl.java
  23. 3 0
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml
  24. 1 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/exception/GlobalExceptionHandler.java
  25. 1 1
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java
  26. 1 1
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java
  27. 2 2
      mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductSkuStockRecordMapper.xml
  28. 10 5
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  29. 1 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

+ 1 - 13
mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java

@@ -14,7 +14,6 @@ import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dto.BrandDto;
-import com.ym.mec.common.dto.ProductAttributeCategoryDto;
 import com.ym.mec.common.dto.ProductCategoryDto;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
@@ -124,18 +123,7 @@ public class GoodsController extends BaseController {
         }else if(StringUtils.isEmpty(employee.getOrganIdList())){
             return failed("用户所在分部异常");
         }
-        PageInfo<Goods> page = goodsService.queryPage(queryInfo);
-        List<Goods> rows = page.getRows();
-        if (!rows.isEmpty()) {
-            Map<String, String> brandIdNameMap = goodsService.queryGoodsBrandList().stream().collect(Collectors.toMap(next -> next.getId().toString(), BrandDto::getName));
-            Map<Integer, String> categoryIdNameMap = goodsService.queryGoodsCategoryList().stream().collect(Collectors.toMap(next -> next.getId().intValue(), ProductCategoryDto::getName));
-
-            for (Goods row : rows) {
-                row.setBrandName(brandIdNameMap.getOrDefault(row.getBrand(), row.getBrand()));
-                row.setGoodsCategoryName(categoryIdNameMap.getOrDefault(row.getGoodsCategoryId(), ""));
-            }
-        }
-        return succeed(page);
+        return succeed(goodsService.queryPage(queryInfo));
     }
 
     @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SellOrderService.java

@@ -81,4 +81,6 @@ public interface SellOrderService extends BaseService<Integer, SellOrder> {
     Map<String,BigDecimal> getSellAmount(String orderNo);
 
     List<OrderCreate.OrderItem> convertMallOrder(List<SellOrder> sellOrderList);
+
+    void syncSellOrder2Mall(List<SellOrder> sellOrders, StudentPaymentOrder studentPaymentOrder);
 }

+ 152 - 82
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -13,7 +13,6 @@ import com.ym.mec.biz.dal.dao.SellOrderDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
-import com.ym.mec.biz.dal.dto.SubjectGoodsDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.entity.GoodsSub;
@@ -48,6 +47,7 @@ import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
@@ -73,14 +73,9 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
 import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -298,7 +293,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 					throw new BizException("{}等商品还在销售中", goodsNames);
 				}
 			}
-			List<GoodsWrapper.GoodsSub> goodsSubs = queryGoodsSub(goodsId);
+			List<GoodsWrapper.GoodsSub> goodsSubs = queryGoodsSubByGoodId(goodsId);
 			if (!CollectionUtils.isEmpty(goodsSubs) && status == 1) {
 				long falseSize = goodsSubs.stream().map(GoodsWrapper.GoodsSub::getGoodsStatus).filter(Boolean.FALSE::equals).count();
 				if (falseSize > 0) {
@@ -319,7 +314,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		goodsDao.update(goods);
 	}
 
-	private List<GoodsWrapper.GoodsSub> queryGoodsSub(Integer goodsId) {
+	private List<GoodsWrapper.GoodsSub> queryGoodsSubByGoodId(Integer goodsId) {
 		// 从管乐迷商城组合的商品
 		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
 		queryWrapper.eq("goods_id_", goodsId);
@@ -327,7 +322,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if (goodsSubs.isEmpty()) {
 			return new ArrayList<>();
 		}
-		List<String> skuList = goodsSubs.stream().map(next -> next.getSku().toString()).distinct().collect(Collectors.toList());
+//		List<String> skuList = goodsSubs.stream().map(next -> next.getSku().toString()).distinct().collect(Collectors.toList());
 		List<GoodsWrapper.GoodsSub> goodsSubList = goodsSubs.stream().map(next -> {
 			GoodsWrapper.GoodsSub goodsSub = new GoodsWrapper.GoodsSub();
 			goodsSub.setId(next.getId());
@@ -338,13 +333,15 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 			goodsSub.setGoodsPrice(next.getGoodsPrice());
 			return goodsSub;
 		}).collect(Collectors.toList());
+		List<String> goodIdList = goodsSubs.stream().map(next -> next.getMallGoodsId().toString()).distinct().collect(Collectors.toList());
 		PmsProductQueryParamDto build = PmsProductQueryParamDto.builder()
-				.skuStockIds(String.join(",", skuList))
+				.productIds(String.join(",", goodIdList))
 				.pageSize(9999)
 				.pageNum(1).build();
 		build.setJson(JSON.toJSONString(build));
-		Map<Integer, PmsProductDto> map = mallFeignService.getProductList(build)
-				.getRows().stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, Function.identity()));
+		List<PmsProductDto> rows = mallFeignService.getProductList(build).getRows();
+		Map<Integer, PmsProductDto> map = rows.stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, Function.identity()));
+		Map<Long, List<PmsProductDto>> groupByGoodId = rows.stream().collect(Collectors.groupingBy(PmsProductDto::getGoodsId));
 		goodsSubList.forEach(next -> {
 			PmsProductDto dto = map.get(next.getSku());
 			if (dto != null) {
@@ -354,8 +351,11 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 				} else {
 					next.setGoodsStatus(dto.getPublishStatus() == 1);
 				}
-				next.setMallGoodsName(dto.getName());
-				next.setProductSn(dto.getProductSn());
+			}
+			if(groupByGoodId.containsKey(Long.valueOf(next.getMallGoodsId()))){
+				PmsProductDto dto1 =  groupByGoodId.get(Long.valueOf(next.getMallGoodsId())).get(0);
+				next.setMallGoodsName(dto1.getName());
+				next.setProductSn(dto1.getProductSn());
 			}
 		});
 		return goodsSubList;
@@ -381,6 +381,24 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
+	public PageInfo<Goods> queryPage(QueryInfo queryInfo) {
+		PageInfo<Goods> page = super.queryPage(queryInfo);
+
+		List<Goods> rows = page.getRows();
+		if (!rows.isEmpty()) {
+			Map<String, String> brandIdNameMap = this.queryGoodsBrandList().stream().collect(Collectors.toMap(next -> next.getId().toString(), BrandDto::getName));
+			List<ProductCategoryDto> productCategoryDtos = treeToList(this.queryGoodsCategoryList());
+			Map<Integer, String> categoryIdNameMap = productCategoryDtos.stream().collect(Collectors.toMap(next -> next.getId().intValue(), ProductCategoryDto::getName));
+
+			for (Goods row : rows) {
+				row.setBrandName(brandIdNameMap.getOrDefault(row.getBrand(), row.getBrand()));
+				row.setGoodsCategoryName(categoryIdNameMap.getOrDefault(row.getGoodsCategoryId(), ""));
+			}
+		}
+		return page;
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public List<Goods> importGoods(MultipartFile file, Integer operatorId) throws Exception {
 		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
@@ -596,8 +614,11 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		goodsCategoryQueryInfo.setDelFlag(YesOrNoEnum.NO);
 		goodsCategoryQueryInfo.setPage(1);
 		goodsCategoryQueryInfo.setRows(9999);
-		Map<String, Integer> categoryIdNameMap = goodsCategoryService.querySubjectGoods(goodsCategoryQueryInfo).getRows()
-				.stream().collect(Collectors.toMap(SubjectGoodsDto::getGoodsCategoryName, SubjectGoodsDto::getGoodsCategoryId));
+
+		List<ProductCategoryDto> categoryList = mallFeignService.listWithChildren();
+		List<ProductCategoryDto> allCategoryList = treeToList(categoryList);
+		Map<String, Long> categoryIdNameMap = allCategoryList
+				.stream().collect(Collectors.toMap(ProductCategoryDto::getName, ProductCategoryDto::getId));
 		Set<String> categoryNames = categoryIdNameMap.keySet();
 
 		// 查询员工机构
@@ -608,14 +629,14 @@ 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<Map<String, Object>> firstSheet = sheetsListMap.get(0);
+		List<Map<String, Object>> firstSheet = sheetsListMap.entrySet().iterator().next().getValue();
 		List<String> skuList = firstSheet.stream().map(next -> next.get("SKU").toString()).distinct().collect(Collectors.toList());
 
 		List<PmsProductDto> subGoods;
 		try {
 			// 查询SKU对应商品
 			PmsProductQueryParamDto dto = PmsProductQueryParamDto.builder()
-					.skuStockIds(String.join(",", skuList))
+					.skuStockCodes(String.join(",", skuList))
 					.pageNum(1)
 					.pageSize(9999)
 					.build();
@@ -625,11 +646,15 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 			errList.add("商城服务调用失败");
 			return getExportErrLogFile(errList);
 		}
-		Map<String, PmsProductDto>skuMap = subGoods.stream().collect(Collectors.toMap(next -> (next.getName() + "_" + next.getSkuCode()), Function.identity()));
+		Map<String, PmsProductDto> skuMap = new HashMap<>();
+		subGoods.forEach(next -> {
+			String key = next.getName() + "_" + next.getSkuCode();
+			if (!skuMap.containsKey(key)) { // 处理出现重复key问题
+				skuMap.put(key, next);
+			}
+		});
 
-//		List<GoodsWrapper.Goods> goodsList = new ArrayList<>();
 		List<JSONObject> jsonObjectList = new ArrayList<>();
-		Set<String> snSet = new HashSet<>();
 		for (Map.Entry<String, List<Map<String, Object>>> sheetData : sheetsListMap.entrySet()) {
 			List<Map<String, Object>> rows = sheetData.getValue();
 			if (rows.isEmpty()) {
@@ -638,26 +663,24 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 			Map<String, Object> firstRow = rows.get(0);
 			// 缺省字段
 			Set<String> templateFields = columns.keySet();
-			List<String> defaultField = templateFields.stream().filter(firstRow::containsKey).collect(Collectors.toList());
+			List<String> defaultField = templateFields.stream().filter(next->!firstRow.containsKey(next)).collect(Collectors.toList());
 			if (!defaultField.isEmpty()) {
 				errList.add("导入字段缺省:" + String.join(",", defaultField));
 				return getExportErrLogFile(errList);
 			}
 
-			String lineErrMsg = "第%s行存在错误:%s";
+			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++) {
+				JSONObject objectMap = new JSONObject();
 				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;
 				}
+				String subGoodsName = null;
+				String subGoodsSku = null;
 				List<String> lineErrList = new ArrayList<>();
 				for (Map.Entry<String, Object> entry : row.entrySet()) {
 					String fieldName = entry.getKey();
@@ -706,17 +729,17 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 						}
 					} else if ("type".equals(fieldCode)) {
 						String tempValue = value;
-						boolean match = Arrays.stream(GoodsType.values()).allMatch(next -> next.getDesc().equals(tempValue));
-						if (match) {
-							objectMap.put(fieldCode, value);
+						Optional<GoodsType> first = Arrays.stream(GoodsType.values()).filter(next -> next.getDesc().equals(tempValue)).findFirst();
+						if (first.isPresent()) {
+							objectMap.put(fieldCode, first.get().getCode());
 						} else {
 							lineErrList.add("字段‘" + fieldName + "’类型不支持");
 						}
 					} else if ("goodsCategoryName".equals(fieldCode)) {
 						if(categoryNames.contains(value)){
-							objectMap.put("goodsCategoryId", categoryIdNameMap.get(value));
+							objectMap.put("goodsCategoryId", categoryIdNameMap.get(value).intValue());
 						}else {
-							lineErrList.add("字段‘" + fieldName + "’类型不支持");
+							lineErrList.add("字段‘" + fieldName + "’不支持");
 						}
 					} else if ("educationShowOrganName".equals(fieldCode)
 							|| "courseFeeShowOrganName".equals(fieldCode)
@@ -746,7 +769,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 								objectMap.put("stock", dto.getStock());
 								objectMap.put("goodsStatus", dto.getPublishStatus()==1);
 							} else {
-								lineErrList.add("子商品‘" + value + "[" + subGoodsSku + "]’不存在");
+								lineErrList.add("子商品‘" + subGoodsName + "[" + subGoodsSku + "]’不存在");
 							}
 						}
 					} else if ("sku".equals(fieldCode)) {
@@ -760,7 +783,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 								objectMap.put("stock", dto.getStock());
 								objectMap.put("goodsStatus", dto.getPublishStatus()==1);
 							} else {
-								lineErrList.add("子商品‘" + value + "[" + subGoodsSku + "]’不存在");
+								lineErrList.add("子商品‘" + subGoodsName + "[" + subGoodsSku + "]’不存在");
 							}
 						}
 					} else if ("subGoodsPrice".equals(fieldCode)) {
@@ -798,7 +821,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 			return goods;
 		}).collect(Collectors.toList());
 
-		Map<String, List<GoodsWrapper.Goods>> goodsGroup = goodsList.stream().collect(Collectors.groupingBy(next -> next.getClass() + "_" + next.getSn()));
+		Map<String, List<GoodsWrapper.Goods>> goodsGroup = goodsList.stream().collect(Collectors.groupingBy(next -> next.getName() + "_" + next.getSn()));
 //
 //
 //		// 数据合并
@@ -1100,7 +1123,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 			goods.setFreeFeeShowOrganName(StringUtils.join(organizationDao.findByOrganIds(goods.getFreeFeeShowOrganId()),","));
 		}
 		GoodsWrapper.Goods detail = JSON.parseObject(JSON.toJSONString(goods), GoodsWrapper.Goods.class);
-		detail.setGoodsSubList(queryGoodsSub(goodsId));
+		detail.setGoodsSubList(queryGoodsSubByGoodId(goodsId));
 		return detail;
 	}
 
@@ -1208,34 +1231,57 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if (CollectionUtils.isEmpty(goodsSubs)) {
 			return true;
 		}
-		Map<Integer, Integer> stockMap = goodsSubStockModels.stream().collect(Collectors.toMap(GoodsSubStockModel::getSku, GoodsSubStockModel::getStock));
+//		Map<Integer, Integer> stockMap = goodsSubStockModels.stream().collect(Collectors.toMap(GoodsSubStockModel::getSku, GoodsSubStockModel::getStock));
 		List<Integer> goodIds = goodsSubs.stream().map(GoodsSub::getGoodsId).distinct().collect(Collectors.toList());
 		goodsDao.lockGoods(goodIds);
-		List<Goods> goodsList = goodsDao.findGoodsByIds(goodIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
-		Map<Integer, Integer> goodStockMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, Goods::getStockCount));
+//		List<Goods> goodsList = goodsDao.findGoodsByIds(goodIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+//		Map<Integer, Integer> goodStockMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, Goods::getStockCount));
+
+		queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("goods_id_", goodIds);
+		List<GoodsSub> allGoodsSubs = goodsSubMapper.selectList(queryWrapper);
+		List<String> allSkuIdList = allGoodsSubs.stream().map(next -> next.getSku().toString()).distinct().collect(Collectors.toList());
+		PmsProductQueryParamDto dto = new PmsProductQueryParamDto();
+		dto.setSkuStockIds(String.join(",", allSkuIdList));
+		dto.setPageNum(1);
+		dto.setPageSize(9999);
+		dto.setJson(JSON.toJSONString(dto));
+		Map<Integer, Integer> skuStockMap = mallFeignService.getProductList(dto).getRows().stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, PmsProductDto::getStock));
+		goodsSubStockModels.forEach(next-> skuStockMap.put(next.getSku(),next.getStock()));
 
-		List<Goods> updateGoods = new ArrayList<>();
-		for (GoodsSub goodsSub : goodsSubs) {
-			Integer goodsId = goodsSub.getGoodsId();
-			Integer stock = stockMap.get(goodsSub.getSku());
-			int updateStock = Math.min(goodStockMap.get(goodsId), stock);
+		Map<Integer, List<GoodsSub>> collect = allGoodsSubs.stream().collect(Collectors.groupingBy(GoodsSub::getGoodsId));
 
+		List<Goods> collect1 = collect.entrySet().stream().map(next -> {
 			Goods goods = new Goods();
-			goods.setId(goodsId);
-			goods.setStockCount(updateStock);
-			updateGoods.add(goods);
-		}
+			goods.setId(next.getKey());
+			Integer minStock = next.getValue().stream().map(o -> skuStockMap.getOrDefault(o.getSku(), 0)).min(Integer::compareTo).get();
+			goods.setStockCount(minStock);
+			return goods;
+		}).collect(Collectors.toList());
+
+
+//		List<Goods> updateGoods = new ArrayList<>();
+//		for (GoodsSub goodsSub : goodsSubs) {
+//			Integer goodsId = goodsSub.getGoodsId();
+//			Integer stock = stockMap.get(goodsSub.getSku());
+//			int updateStock = Math.min(goodStockMap.get(goodsId), stock);
+//
+//			Goods goods = new Goods();
+//			goods.setId(goodsId);
+//			goods.setStockCount(updateStock);
+//			updateGoods.add(goods);
+//		}
 		// 处理同一个商品,多个子商品同时更新库存,取最小的库存
-		Map<Integer, Optional<Goods>> collect = updateGoods.stream().collect(Collectors.groupingBy(Goods::getId, Collectors.minBy(Comparator.comparingInt(Goods::getStockCount))));
-		List<Goods> collect1 = collect.entrySet().stream().map(next -> {
-			if (next.getValue().isPresent()) {
-				Goods goods = new Goods();
-				goods.setId(next.getKey());
-				goods.setStockCount(next.getValue().get().getStockCount());
-				return goods;
-			}
-			return null;
-		}).filter(Objects::nonNull).collect(Collectors.toList());
+//		Map<Integer, Optional<Goods>> collect = updateGoods.stream().collect(Collectors.groupingBy(Goods::getId, Collectors.minBy(Comparator.comparingInt(Goods::getStockCount))));
+//		List<Goods> collect1 = collect2.entrySet().stream().map(next -> {
+//			if (next.getValue().isPresent()) {
+//				Goods goods = new Goods();
+//				goods.setId(next.getKey());
+//				goods.setStockCount(next.getValue().get().getStockCount());
+//				return goods;
+//			}
+//			return null;
+//		}).filter(Objects::nonNull).collect(Collectors.toList());
 		goodsDao.updateStock(collect1);
 		return true;
 	}
@@ -1255,32 +1301,56 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		return mallFeignService.listWithChildren();
 	}
 
-	private String getExportErrLogFile(List<String> errList){
+	private String getExportErrLogFile(List<String> errList) {
+		if (CollectionUtils.isEmpty(errList)) {
+			return null;
+		}
 
 		String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
 		String format = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
 		File file = new File(basePath + File.separator + "goods_group_import_err" + format + ".csv");
-		if (!file.getParentFile().exists()) {
-			file.getParentFile().mkdirs();
+		try {
+			if (!file.getParentFile().exists()) {
+				file.getParentFile().mkdirs();
+			}
+			file.createNewFile();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		try {
+			FileOutputStream out = new FileOutputStream(file);
+			byte[] uft8bom = {(byte) 0xef, (byte) 0xbb, (byte) 0xbf}; // 处理乱码
+			out.write(uft8bom);
+			BufferedWriter csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
+
+			for (String errMsg : errList) {
+				csvFileOutputStream.write(errMsg);
+				csvFileOutputStream.newLine();
+			}
+			csvFileOutputStream.flush();
+			csvFileOutputStream.close();
+			String folder = "daya/download/" + UploadUtil.getFileFloder();
+			return ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME).uploadFile(folder, file);
+		} catch (IOException e) {
+			e.printStackTrace();
 		}
-		OutputStream ouputStream = null;
-
-//		try {
-//			BufferedWriter output = new BufferedWriter(new FileWriter(file,true));//true 则追加写入text文本
-//			output.write("XH,VL");//表头 -> 对应下方write 写入数据的列数
-//			for(int i = 0;i<errList.size();i++) {//遍历写入数据
-//				output.write("\r\n");//换行
-//				//((CreateCSV)this.list.get(i)).row 这样写是因为this.list.get(i).row报错,所以先将this.list.get(i)转为class类的CreateCSV类型,再取对象中的属性
-//				output.write(((CreateCSV)this.list.get(i)).row + "," + ((CreateCSV)this.list.get(i)).value);
-//			}
-//			String folder = "daya/download/" + UploadUtil.getFileFloder();
-//			String url = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME).uploadFile(folder, file);
-//
-//			output.flush();
-//			output.close();
-//		}catch(IOException e) {
-//			e.printStackTrace();
-//		}
 		return "";
 	}
+
+	public List<ProductCategoryDto> treeToList(List<ProductCategoryDto> categoryList) {
+		if (categoryList.isEmpty()) {
+			return new ArrayList<>();
+		}
+		List<ProductCategoryDto> result = new ArrayList<>();
+		categoryList.forEach(next -> {
+			result.add(next);
+			String name = next.getName();
+			List<ProductCategoryDto> children = next.getChildren();
+			if (!CollectionUtils.isEmpty(children)) {
+				children.forEach(c -> c.setName(name + "/" + c.getName()));
+				result.addAll(children);
+			}
+		});
+		return result;
+	}
 }

+ 11 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -17,6 +17,7 @@ import com.ym.mec.biz.dal.page.MusicGroupPaymentCalenderQueryInfo;
 import com.ym.mec.biz.event.source.GroupEventSource;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.api.CommonResult;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dto.OrderCreate;
@@ -256,7 +257,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS) {
             List<MusicGroupPaymentCalender> list = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
             if (list.size() > 0) {
-                throw new BizException("创建失败,已经存在缴费信息");
+                //排除商品采购
+                if(list.stream().anyMatch(e -> e.getPaymentType() != GOODS_PURCHASE)){
+                    throw new BizException("创建失败,已经存在缴费信息");
+                }
             }
         }
         //进行中加学员拓展信息
@@ -1096,9 +1100,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                     }
                 }
                 orderCreate.setOrderItemList(orderItems);
-                boolean b = mallFeignService.productOrderCreate(orderCreate);
-                if (!b) {
-                    throw new BizException("同步商城订单失败");
+                CommonResult<Boolean> result = mallFeignService.productOrderCreate(orderCreate);
+                if (result.getCode() != 200) {
+                    throw new BizException("同步商城订单失败",result.getMessage());
                 }
             }
             for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
@@ -1514,9 +1518,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         //商品采购订单
         if(calender.getPaymentType() == GOODS_PURCHASE && address != null){
             //关闭商城订单
-            boolean b = mallFeignService.productUpdateOrderStatus(address.getOrderNo(), 4);
-            if (!b) {
-                throw new BizException("操作失败:关闭商城订单失败");
+            CommonResult<Boolean> result = mallFeignService.productUpdateOrderStatus(address.getOrderNo(), 4);
+            if (result.getCode() != 200) {
+                throw new BizException("操作失败:关闭商城订单失败",result.getMessage());
             }
         }
     }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java

@@ -17,8 +17,11 @@ import com.ym.mec.biz.dal.dto.ComplementGoodsDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.mapper.GoodsSubMapper;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.api.CommonResult;
 import com.ym.mec.common.dto.OrderCreate;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
+import com.ym.mec.mall.MallFeignService;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +73,8 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
     @Autowired
     private GoodsSubService goodsSubService;
+    @Autowired
+    private MallFeignService mallFeignService;
 
     @Override
     public BaseDAO<Integer, SellOrder> getDAO() {
@@ -544,6 +549,33 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
         return orderItems;
     }
 
+    @Override
+    public void syncSellOrder2Mall(List<SellOrder> sellOrders, StudentPaymentOrder studentPaymentOrder) {
+        List<OrderCreate.OrderItem> orderItems = this.convertMallOrder(sellOrders);
+        OrderCreate mallOrder = new OrderCreate();
+        mallOrder.setOrderItemList(orderItems);
+        mallOrder.setOrchestraId(studentPaymentOrder.getMusicGroupId());
+        mallOrder.setStatus(2);
+        mallOrder.setOrderNo(studentPaymentOrder.getOrderNo());
+        mallOrder.setTotalAmount(studentPaymentOrder.getExpectAmount());
+        String paymentBusinessChannel = studentPaymentOrder.getPaymentBusinessChannel();
+        if (StringUtils.endsWithIgnoreCase(paymentBusinessChannel, "wx_pub") ||
+                StringUtils.endsWithIgnoreCase(paymentBusinessChannel, "WECHAT") ||
+                StringUtils.endsWithIgnoreCase(paymentBusinessChannel, "WXPay")) {
+            mallOrder.setPayType(2);
+        } else {
+            mallOrder.setPayType(1);
+        }
+        mallOrder.setMemberId(studentPaymentOrder.getUserId().longValue());
+        mallOrder.setPlatformType("STUDENT");
+        mallOrder.setSourceType(1);
+
+        CommonResult<Boolean> result = mallFeignService.productOrderCreate(mallOrder);
+        if (result.getCode() != 200) {
+            throw new BizException("同步商城订单失败",result.getMessage());
+        }
+    }
+
     public Map<String, BigDecimal> calcSellAmount(StudentPaymentOrder order,BigDecimal cloudBalanceIncome,BigDecimal cloudIncome) {
         List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailDao.getOrderDetail(order.getId());
         //总余额支付

+ 29 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -6,9 +6,11 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.dto.OrderCreate;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.mall.MallFeignService;
 import com.ym.mec.util.collection.MapUtil;
 
 import org.apache.commons.collections.CollectionUtils;
@@ -17,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -29,49 +32,50 @@ import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 @Service
 public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long, StudentPaymentOrderDetail> implements StudentPaymentOrderDetailService {
 
-    @Autowired
+    @Resource
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-    @Autowired
+    @Resource
     private GoodsService goodsService;
-    @Autowired
+    @Resource
     private TeacherDao teacherDao;
-    @Autowired
+    @Resource
     private MusicGroupDao musicGroupDao;
-    @Autowired
+    @Resource
     private OrganizationDao organizationDao;
-    @Autowired
+    @Resource
     private MusicGroupPurchaseListDao musicGroupPurchaseListDao;
-    @Autowired
+    @Resource
     private StudentRegistrationDao studentRegistrationDao;
-    @Autowired
+    @Resource
     private SubjectDao subjectDao;
-    @Autowired
+    @Resource
     private SubjectChangeDao subjectChangeDao;
-    @Autowired
+    @Resource
     private StudentCourseFeeDetailDao studentCourseFeeDetailDao;
-    @Autowired
+    @Resource
     private SellOrderService sellOrderService;
-    @Autowired
+    @Resource
     private ActivityUserMapperService activityUserMapperService;
-    @Autowired
+    @Resource
     private StudentInstrumentService studentInstrumentService;
-    @Autowired
+    @Resource
     private CloudTeacherOrderService cloudTeacherOrderService;
-    @Autowired
+    @Resource
     private StudentPaymentOrderService studentPaymentOrderService;
-    @Autowired
+    @Resource
     private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
-    @Autowired
+    @Resource
     private ChargeTypeSubjectMapperDao chargeTypeSubjectMapperDao;
-    @Autowired
+    @Resource
     private StudentMusicCourseFeeService studentMusicCourseFeeService;
-    @Autowired
+    @Resource
     private MemberFeeSettingService memberFeeSettingService;
-    @Autowired
+    @Resource
     private MusicGroupPaymentCalenderMemberDao musicGroupPaymentCalenderMemberDao;
-
-    @Autowired
+    @Resource
     private ImUserFriendService imUserFriendService;
+    @Resource
+    private MallFeignService mallFeignService;
     @Override
     public BaseDAO<Long, StudentPaymentOrderDetail> getDAO() {
         return studentPaymentOrderDetailDao;
@@ -705,7 +709,9 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                 //获取分配的减免金额
                 couponRemitFee = couponRemitFee.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
             }
-            sellOrderService.addOrderDetail2SellOrder(allDetails, studentPaymentOrder, musicGroup, couponRemitFee);
+            List<SellOrder> sellOrders = sellOrderService.addOrderDetail2SellOrder(allDetails, studentPaymentOrder, musicGroup, couponRemitFee);
+            //同步销售订单到商城
+            sellOrderService.syncSellOrder2Mall(sellOrders,studentPaymentOrder);
         }
 
         //活动小课包处理

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1837,7 +1837,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             model.setSuccess(true);
         } catch (Exception e) {
             model.setSuccess(false);
-            e.printStackTrace();
+            logger.error("订单[{}]取消失败", order.getTransNo(), e);
         }
         return model;
     }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -14,6 +14,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.MusicGroupCalenderRefundPeriodService;
+import com.ym.mec.common.api.CommonResult;
 import com.ym.mec.common.dto.OrderCreate;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.tenant.TenantContextHolder;
@@ -340,9 +341,9 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
                     }
                     List<OrderCreate.OrderItem> items = sellOrderService.convertMallOrder(sellOrderList);
                     mallOrder.setOrderItemList(items);
-                    boolean b = mallFeignService.productOrderCreate(mallOrder);
-                    if (!b) {
-                        throw new BizException("同步商城订单失败");
+                    CommonResult<Boolean> result = mallFeignService.productOrderCreate(mallOrder);
+                    if (result.getCode() != 200) {
+                        throw new BizException("同步商城订单失败",result.getMessage());
                     }
                 }
             }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -1436,6 +1436,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 }
             }
             sellOrderService.batchInsert(sellOrderList);
+            sellOrderService.syncSellOrder2Mall(sellOrderList,orderByOrderNo);
         }
     }
 

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -1433,6 +1433,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 }
             }
             sellOrderService.batchInsert(sellOrderList);
+            sellOrderService.syncSellOrder2Mall(sellOrderList,order);
         }
         return sellOrderList;
     }

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -269,7 +269,7 @@
         </foreach>
     </update>
     <update id="updateShippedStatus">
-        update sell_order SET delivery_time_ = NOW() where order_no_
+        update sell_order SET delivery_time_ = NOW() where order_no_ IN
         <foreach collection="orderNos" item="orderNo" open="(" close=")" separator=",">
             #{orderNo}
         </foreach>

+ 3 - 2
mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.mall;
 
+import com.ym.mec.common.api.CommonResult;
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.common.dto.*;
 import com.ym.mec.common.page.PageInfo;
@@ -23,7 +24,7 @@ public interface MallFeignService {
 
     // 同步完成订单
     @PostMapping(value = "/open/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    boolean productOrderCreate(@RequestBody OrderCreate order) ;
+    CommonResult<Boolean> productOrderCreate(@RequestBody OrderCreate order) ;
 
     // 同步订单状态,
     /**
@@ -32,7 +33,7 @@ public interface MallFeignService {
      * @return status 订单状态  0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
      */
     @GetMapping(value = "/open/product/updateOrderStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    boolean productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status);
+    CommonResult<Boolean> productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status);
 
 
     //根据品牌名称分页获取品牌列表

+ 5 - 4
mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java

@@ -1,5 +1,6 @@
 package com.ym.mec.mall.fallback;
 
+import com.ym.mec.common.api.CommonResult;
 import com.ym.mec.common.dto.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.mall.MallFeignService;
@@ -17,8 +18,8 @@ public class MallFeignServiceFallback implements MallFeignService {
     }
 
     @Override
-    public boolean productOrderCreate(OrderCreate order) {
-        return false;
+    public CommonResult<Boolean> productOrderCreate(OrderCreate order) {
+        return null;
     }
 
     /**
@@ -28,8 +29,8 @@ public class MallFeignServiceFallback implements MallFeignService {
      * @param status 订单状态
      */
     @Override
-    public boolean productUpdateOrderStatus(String orderNo, Integer status) {
-        return false;
+    public CommonResult<Boolean> productUpdateOrderStatus(String orderNo, Integer status) {
+        return null;
     }
 
     @Override

+ 145 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/api/CommonResult.java

@@ -0,0 +1,145 @@
+package com.ym.mec.common.api;
+
+/**
+ * 通用返回对象
+ * Created by macro on 2019/4/19.
+ */
+public class CommonResult<T> {
+    /**
+     * 状态码
+     */
+    private long code;
+    /**
+     * 提示信息
+     */
+    private String message;
+    /**
+     * 数据封装
+     */
+    private T data;
+
+    private Object err;
+
+    protected CommonResult() {
+    }
+
+    protected CommonResult(long code, String message, T data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+
+
+    /**
+     * 成功返回结果
+     *
+     * @param data 获取的数据
+     */
+    public static <T> CommonResult<T> success(T data) {
+        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
+    }
+
+    /**
+     * 成功返回结果
+     *
+     * @param data 获取的数据
+     * @param  message 提示信息
+     */
+    public static <T> CommonResult<T> success(T data, String message) {
+        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
+    }
+
+    /**
+     * 失败返回结果
+     * @param errorCode 错误码
+     */
+    public static <T> CommonResult<T> failed(IErrorCode errorCode) {
+        return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
+    }
+
+    /**
+     * 失败返回结果
+     * @param errorCode 错误码
+     * @param message 错误信息
+     */
+    public static <T> CommonResult<T> failed(IErrorCode errorCode,String message) {
+        return new CommonResult<T>(errorCode.getCode(), message, null);
+    }
+
+    /**
+     * 失败返回结果
+     * @param message 提示信息
+     */
+    public static <T> CommonResult<T> failed(String message) {
+        return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
+    }
+
+    /**
+     * 失败返回结果
+     */
+    public static <T> CommonResult<T> failed() {
+        return failed(ResultCode.FAILED);
+    }
+
+    /**
+     * 参数验证失败返回结果
+     */
+    public static <T> CommonResult<T> validateFailed() {
+        return failed(ResultCode.VALIDATE_FAILED);
+    }
+
+    /**
+     * 参数验证失败返回结果
+     * @param message 提示信息
+     */
+    public static <T> CommonResult<T> validateFailed(String message) {
+        return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
+    }
+
+    /**
+     * 未登录返回结果
+     */
+    public static <T> CommonResult<T> unauthorized(T data) {
+        return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
+    }
+
+    /**
+     * 未授权返回结果
+     */
+    public static <T> CommonResult<T> forbidden(T data) {
+        return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
+    }
+
+    public long getCode() {
+        return code;
+    }
+
+    public void setCode(long code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public Object getErr() {
+        return err;
+    }
+
+    public void setErr(Object err) {
+        this.err = err;
+    }
+}

+ 17 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/api/IErrorCode.java

@@ -0,0 +1,17 @@
+package com.ym.mec.common.api;
+
+/**
+ * 常用API返回对象接口
+ * Created by macro on 2019/4/19.
+ */
+public interface IErrorCode {
+    /**
+     * 返回码
+     */
+    long getCode();
+
+    /**
+     * 返回信息
+     */
+    String getMessage();
+}

+ 28 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/api/ResultCode.java

@@ -0,0 +1,28 @@
+package com.ym.mec.common.api;
+
+/**
+ * 常用API返回对象
+ * Created by macro on 2019/4/19.
+ */
+public enum ResultCode implements IErrorCode {
+    SUCCESS(200, "操作成功"),
+    FAILED(500, "操作失败"),
+    VALIDATE_FAILED(404, "参数检验失败"),
+    UNAUTHORIZED(401, "暂未登录或token已经过期"),
+    FORBIDDEN(403, "没有相关权限");
+    private long code;
+    private String message;
+
+    private ResultCode(long code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public long getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

+ 2 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductQueryParamDto.java

@@ -16,6 +16,8 @@ import javax.validation.constraints.NotNull;
 public class PmsProductQueryParamDto {
     //skuId多个逗号隔开
     private String skuStockIds;
+    //skuCode多个逗号隔开
+    private String skuStockCodes;
     //上架状态
     private Integer publishStatus;
     //商品名称模糊关键字

+ 4 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductCategoryDto.java

@@ -3,6 +3,8 @@ package com.ym.mec.common.dto;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 @Data
 public class ProductCategoryDto {
@@ -12,4 +14,6 @@ public class ProductCategoryDto {
     private Long parentId;
 
     private String name;
+
+    private List<ProductCategoryDto> children = new ArrayList<>();
 }

+ 6 - 4
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java

@@ -99,14 +99,14 @@ public class OpenController {
      * @return String
      */
     @PostMapping(value = "/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<Boolean> productOrderCreate(@RequestBody OrderCreate order) {
+    public CommonResult<Boolean> productOrderCreate(@RequestBody OrderCreate order) {
 
         log.info("创建管乐迷订单:{}", JSON.toJSONString(order));
 
         orderService.mecProductOrderCreate(order);
 
 
-        return R.ok(true);
+        return CommonResult.success(true);
     }
 
 
@@ -117,10 +117,12 @@ public class OpenController {
      * @return status 订单状态  0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
      */
     @GetMapping(value = "/product/updateOrderStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public boolean productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status) {
+    public CommonResult<Boolean> productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status) {
         log.info("同步订单状态:{},{}", orderNo, status);
         // 已发货订单不可修改状态
-        return orderService.productUpdateOrderStatus(orderNo, status);
+        orderService.productUpdateOrderStatus(orderNo, status);
+
+        return CommonResult.success(true);
     }
 
     @PostMapping(value = "/product/list")

+ 22 - 10
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -201,7 +201,7 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                             count1 = 0;
                         } else {
                             count1 = count1 - stock;
-                            record.setInternalSaleStock(record.getInternalStock());
+                            record.setInternalSaleStock(skuStockRecord.getInternalStock());
                         }
                         updateList.add(record);
                     }
@@ -222,7 +222,7 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                             count1 = 0;
                         } else {
                             count1 = count1 - stock;
-                            record.setTaxSaleStock(record.getTaxStock());
+                            record.setTaxSaleStock(skuStockRecord.getTaxStock());
                         }
                         updateList.add(record);
                     }
@@ -242,8 +242,12 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
         // 订单号
         List<String> orderSnList = omsOrders.stream().map(OmsOrder::getOrderSn).collect(Collectors.toList());
-        HttpResponseResult httpResponseResult = webFeignService.updateShippedStatus(orderSnList);
-        if (httpResponseResult.getCode() != 200 && !httpResponseResult.getStatus()) {
+        try {
+            HttpResponseResult httpResponseResult = webFeignService.updateShippedStatus(orderSnList);
+            if (httpResponseResult.getCode() != 200 && !httpResponseResult.getStatus()) {
+                throw new BizException("发货通知失败");
+            }
+        } catch (Exception e) {
             throw new BizException("发货通知失败");
         }
 
@@ -261,10 +265,15 @@ public class OmsOrderServiceImpl implements OmsOrderService {
             stockModel.setStock(skuStock.getStock());
             return stockModel;
         }).collect(Collectors.toList());
-        HttpResponseResult<Boolean> booleanHttpResponseResult = webFeignService.goodsStockCountSynchronize(modelList);
-        if (booleanHttpResponseResult.getCode() != 200 && !booleanHttpResponseResult.getStatus()) {
+        try {
+            HttpResponseResult<Boolean> booleanHttpResponseResult = webFeignService.goodsStockCountSynchronize(modelList);
+            if (booleanHttpResponseResult.getCode() != 200 && !booleanHttpResponseResult.getStatus()) {
+                throw new BizException("库存同步失败");
+            }
+        }catch (Exception e) {
             throw new BizException("库存同步失败");
         }
+
     }
 
     @Override
@@ -701,11 +710,14 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         if (!CollectionUtils.isEmpty(orderItemList)) {
             omsOrderItemMapper.insertList(orderItemList);
         }
-        // skuId 数量 map
-        Map<Long, Integer> skuIdMap = orderItemList.stream().collect(Collectors.groupingBy(OmsOrderItem::getProductSkuId,Collectors.summingInt(OmsOrderItem::getProductQuantity)));
-
         // 如果订单状态是已发货,扣减库存
-        updateSkuStock( skuIdMap, Lists.newArrayList(detail.getId()));
+        if (order.getStatus() ==2 || order.getStatus() == 3) {
+
+            // skuId 数量 map
+            Map<Long, Integer> skuIdMap = orderItemList.stream().collect(Collectors.groupingBy(OmsOrderItem::getProductSkuId,Collectors.summingInt(OmsOrderItem::getProductQuantity)));
+
+            updateSkuStock(skuIdMap, Lists.newArrayList(detail.getId()));
+        }
     }
 
     @Override

+ 12 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java

@@ -286,6 +286,17 @@ public class PmsProductServiceImpl implements PmsProductService {
         List<PmsSkuStock> removeSkuList = oriStuList.stream().filter(item-> !updateSkuIds.contains(item.getId())).collect(Collectors.toList());
         handleSkuStockCode(insertSkuList,id);
         handleSkuStockCode(updateSkuList,id);
+
+        List<PmsSkuStock> adds= new ArrayList<>();
+        adds.addAll(insertSkuList);
+        adds.addAll(updateSkuList);
+
+        // 判断sku编码是否重复
+        List<String> skuCodes = adds.stream().map(PmsSkuStock::getSkuCode).collect(Collectors.toList());
+        long distinctCount = skuCodes.stream().distinct().count();
+        if (distinctCount != skuCodes.size()) {
+            throw new BizException("SKU编码重复");
+        }
         //新增sku
         if(CollUtil.isNotEmpty(insertSkuList)){
             relateAndInsertList(skuStockDao, insertSkuList, id);
@@ -301,6 +312,7 @@ public class PmsProductServiceImpl implements PmsProductService {
         }
         //修改sku
         if(CollUtil.isNotEmpty(updateSkuList)){
+
             for (PmsSkuStock pmsSkuStock : updateSkuList) {
                 pmsSkuStock.setLockStock(null);
                 skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);

+ 10 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsSkuStockServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
+import com.ym.mec.common.exception.BizException;
 import com.yonge.cooleshow.admin.dao.PmsSkuStockDao;
 import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
@@ -69,6 +70,15 @@ public class PmsSkuStockServiceImpl implements PmsSkuStockService {
 
     @Override
     public int update(Long pid, List<PmsSkuStock> skuStockList) {
+
+        // 判断sku code是否重复
+        // 判断sku编码是否重复
+        List<String> skuCodes = skuStockList.stream().map(PmsSkuStock::getSkuCode).collect(Collectors.toList());
+        long distinctCount = skuCodes.stream().distinct().count();
+        if (distinctCount != skuCodes.size()) {
+            throw new BizException("SKU编码重复");
+        }
+
         return skuStockDao.replaceList(skuStockList);
     }
 

+ 3 - 0
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml

@@ -136,6 +136,9 @@
             <if test="param.skuStockIds != null and param.skuStockIds != ''">
                 and find_in_set(t1.id,#{param.skuStockIds})
             </if>
+            <if test="param.skuStockCodes != null and param.skuStockCodes != ''">
+                and find_in_set(t1.sku_code,#{param.skuStockCodes})
+            </if>
             <if test="param.keyword != null and param.keyword != ''">
                 and (t.name like concat('%',#{param.keyword},'%') )
             </if>

+ 1 - 0
mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/exception/GlobalExceptionHandler.java

@@ -93,6 +93,7 @@ public class GlobalExceptionHandler {
     @ResponseBody
     @ExceptionHandler(value = BizException.class)
     public CommonResult handleBizException(BizException e) {
+        log.error("handleBizException ", e);
         return  CommonResult.failed(e.getMessage());
     }
 

+ 1 - 1
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java

@@ -29,7 +29,7 @@ public interface PmsProductSkuStockRecordMapper {
 
     int updateByPrimaryKey(PmsProductSkuStockRecord record);
 
-    void lockStock(@Param("stockRecordIds") List<Long> stockRecordIds);
+    int lockStock(@Param("stockRecordIds") List<Long> stockRecordIds);
 
     int updateByIdAndStockSelective( PmsProductSkuStockRecord pmsProductSkuStockRecord);
 }

+ 1 - 1
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java

@@ -58,7 +58,7 @@ public class OmsOrder implements Serializable {
     @ApiModelProperty(value = "支付方式:0->未支付;1->支付宝;2->微信")
     private Integer payType;
 
-    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单 2->学校订单")
+    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单 2->学校订单 ")
     private Integer sourceType;
 
     @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")

+ 2 - 2
mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductSkuStockRecordMapper.xml

@@ -314,9 +314,9 @@
     where id = #{id,jdbcType=BIGINT}
   </update>
 
-  <select id="lockStock" >
+  <select id="lockStock" resultType="java.lang.Integer">
     <!--@mbg.generated-->
-      select * from pms_product_sku_stock_record where
+      select count(1) from pms_product_sku_stock_record where
       id in
       <foreach collection="stockRecordIds" item="item" separator="," open="(" close=")">
         #{item}

+ 10 - 5
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -10,10 +10,7 @@ import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.CartPromotionItem;
-import com.yonge.cooleshow.portal.service.OmsCartItemService;
-import com.yonge.cooleshow.portal.service.OmsPromotionService;
-import com.yonge.cooleshow.portal.service.PmsPortalProductService;
-import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.cooleshow.portal.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -49,6 +46,9 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     @Autowired
     private PmsPortalProductService portalProductService;
 
+    @Autowired
+    private PortalBrandService portalBrandService;
+
     @Override
     public OmsCartItem add(OmsCartItem cartItem) {
         UmsMember currentMember;
@@ -85,7 +85,12 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             cartItem.setProductName(pmsProduct.getName());
             cartItem.setProductSubTitle(pmsProduct.getSubTitle());
             cartItem.setProductCategoryId(pmsProduct.getProductCategoryId());
-            cartItem.setProductBrand(pmsProduct.getName());
+            if (pmsProduct.getBrandId() != null) {
+                PmsBrand detail = portalBrandService.detail(pmsProduct.getBrandId());
+                if ( detail != null) {
+                    cartItem.setProductBrand(detail.getName());
+                }
+            }
             cartItem.setProductSn(pmsProduct.getProductSn());
             if (cartItem.getProductSkuId() != null) {
                 cartItem.setProductSkuCode(pmsSkuStock.getSkuCode());

+ 1 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -602,7 +602,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 if (!data.getSuccess()) {
                     throw new BizException("远程取消失败");
                 }
-                if (data.getStatus()) {
+                if (data.getStatus() !=null && data.getStatus()) {
                     LOG.info("订单支付成功,修改订单状态");
                     orderSuccess(cancelOrder, cancelOrder.getPayAmount(), data.getPayChannel());
                     return;