浏览代码

Merge remote-tracking branch 'origin/zx_saas_goods' into zx_saas_goods

zouxuan 1 年之前
父节点
当前提交
0b1aa540af
共有 24 个文件被更改,包括 524 次插入27 次删除
  1. 37 2
      mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java
  2. 8 3
      mec-application/src/main/java/com/ym/mec/web/controller/ImportController.java
  3. 19 0
      mec-application/src/main/resources/columnMapper.ini
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java
  5. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java
  7. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/GoodsWrapper.java
  8. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java
  9. 165 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  10. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  11. 3 0
      mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml
  12. 19 4
      mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java
  13. 16 3
      mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java
  14. 1 1
      mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java
  15. 13 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/BrandDto.java
  16. 12 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductAttributeCategoryDto.java
  17. 15 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductCategoryDto.java
  18. 21 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsProductSkuStockRecordController.java
  19. 38 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  20. 6 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductSkuStockRecordService.java
  21. 67 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  22. 17 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductSkuStockRecordServiceImpl.java
  23. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java
  24. 38 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductSkuStockRecordMapper.xml

+ 37 - 2
mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java

@@ -13,16 +13,25 @@ import com.ym.mec.biz.service.GoodsCategoryService;
 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.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @RequestMapping("${app-config.url.web:}/goods")
 @Api(tags = "商品(教材、辅件)服务")
@@ -112,7 +121,15 @@ public class GoodsController extends BaseController {
         }else if(StringUtils.isEmpty(employee.getOrganIdList())){
             return failed("用户所在分部异常");
         }
-        return succeed(goodsService.queryPage(queryInfo));
+        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));
+            for (Goods row : rows) {
+                row.setBrandName(brandIdNameMap.getOrDefault(row.getBrand(), row.getBrand()));
+            }
+        }
+        return succeed(page);
     }
 
     @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")
@@ -130,4 +147,22 @@ public class GoodsController extends BaseController {
         return succeed(goodsService.queryGoodsSubByPage(query));
 
     }
+
+    @ApiOperation(value = "查询商品类型")
+    @GetMapping("/queryGoodsTypeList")
+    public Object queryGoodsTypeList() {
+        return succeed(goodsService.queryGoodsTypeList());
+    }
+
+    @ApiOperation(value = "查询商品分类")
+    @GetMapping("/queryGoodsCategoryList")
+    public Object queryGoodsCategoryList() {
+        return succeed(goodsService.queryGoodsCategoryList());
+    }
+
+    @ApiOperation(value = "查询商品品牌")
+    @GetMapping("/queryGoodsBrandList")
+    public Object queryGoodsBrandList() {
+        return succeed(goodsService.queryGoodsBrandList());
+    }
 }

+ 8 - 3
mec-application/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -69,9 +69,14 @@ public class ImportController extends BaseController {
 
     @ApiOperation(value = "导入商品")
     @PostMapping(value = "goodsV2")
-    @PreAuthorize("@pcs.hasPermissions('import/goodsV2')")
-    public HttpResponseResult<List<Goods>> importGoodsV2(@RequestParam("file") MultipartFile file) throws Exception {
-        return succeed(goodsService.importGoodsV2(file, sysUserService.getUserId()));
+//    @PreAuthorize("@pcs.hasPermissions('import/goodsV2')")
+    public HttpResponseResult<String> importGoodsV2(@RequestParam("file") MultipartFile file) throws Exception {
+        String errFile = goodsService.importGoodsV2(file, sysUserService.getUserId());
+        if (StringUtils.isEmpty(errFile)) {
+            return succeed();
+        } else {
+            return failed(errFile);
+        }
     }
 
     @ApiOperation(value = "导入财务支出")

+ 19 - 0
mec-application/src/main/resources/columnMapper.ini

@@ -14,6 +14,25 @@
 商品描述 = brief
 商品详情 = desc
 
+[组合商品导入模板]
+组合商品名称 = name
+组合商品货号 = sn
+组合商品市场价 = marketPrice
+组合商品零售价 = discountPrice
+组合商品团购价 = groupPurchasePrice
+组合商品品牌 = brand
+组合商品类型 = type
+组合商品分类 = goodsCategoryName
+组合商品型号 = specification
+移动端可用分部 = educationShowOrganName
+课程收费团可用分部 = courseFeeShowOrganName
+会员收费乐团可售分部 = memberFeeShowOrganName
+免费乐团可售分部 = freeFeeShowOrganName
+乐器置换可售分部 = replacementShowOrganName
+
+组合商品描述 = brief
+组合商品详情 = desc
+组合商品图片 = image
 
 [财务支出导入模板]
 财务流程编号 = financialProcessNo

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java

@@ -189,6 +189,8 @@ public class Goods {
 
 	private String childOrganCostPrice;
 
+	private String brandName;
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -4,6 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     GOODS("GOODS","商品导入模板"),
+    GOODS_GROUP("GOODS_GROUP","组合商品导入模板"),
     ROUTE_ORDER("ROUTE_ORDER","财务管理导入模板"),
     FINANCIAL_EXPENDITURE("FINANCIAL_EXPENDITURE","财务支出导入模板"),
     REDEMPTIONCODE("REDEMPTION_CODE", "兑换码分配模板表"),

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java

@@ -52,6 +52,9 @@ public class GoodsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "此参数为1则不按分部查询")
     private Integer noOrganSearch;
 
+    @ApiModelProperty(value = "品牌ID")
+    private String brandId;
+
     private Integer subjectId;
 
     public Integer getNoOrganSearch() {
@@ -173,4 +176,12 @@ public class GoodsQueryInfo extends QueryInfo {
 	public void setFreeFeeShowOrganId(String freeFeeShowOrganId) {
 		this.freeFeeShowOrganId = freeFeeShowOrganId;
 	}
+
+    public String getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(String brandId) {
+        this.brandId = brandId;
+    }
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/GoodsWrapper.java

@@ -13,6 +13,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 public class GoodsWrapper {
@@ -91,7 +92,7 @@ public class GoodsWrapper {
         private String memo;
 
         @ApiModelProperty(value = "发布时间")
-        private java.util.Date publishTime;
+        private Date publishTime;
 
         @ApiModelProperty(value = "附件商品列表编号(用逗号分开)")
         private String complementGoodsIdList;

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java

@@ -4,7 +4,9 @@ import java.util.List;
 
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
+import com.ym.mec.common.dto.BrandDto;
 import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.ProductCategoryDto;
 import com.ym.mec.common.entity.GoodsSubModel;
 import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.page.PageInfo;
@@ -81,9 +83,9 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * 导入组合商品
      * @param file 文件
      * @param userId 导入人信息
-     * @return 商品列表
+     * @return 失败时的回执文件路径
      */
-    List<Goods> importGoodsV2(MultipartFile file, Integer userId);
+    String importGoodsV2(MultipartFile file, Integer userId) throws Exception;
 
 
     /**
@@ -152,4 +154,10 @@ public interface GoodsService extends BaseService<Integer, Goods> {
     Boolean goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList);
 
     Boolean goodsStockCountSynchronize(List<GoodsSubStockModel> goodsSubStockModels);
+
+    List<ProductCategoryDto> queryGoodsTypeList();
+
+    List<BrandDto> queryGoodsBrandList();
+
+    Object queryGoodsCategoryList();
 }

+ 165 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -4,30 +4,47 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dao.GoodsDao;
+import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+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.ComplementGoodsDto;
 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;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.SellOrder;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.AccountType;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.SellStatus;
+import com.ym.mec.biz.dal.enums.StockType;
+import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.mapper.GoodsSubMapper;
+import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
 import com.ym.mec.biz.dal.page.GoodsQuery;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
 import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.GoodsCategoryService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.dto.BrandDto;
 import com.ym.mec.common.dto.PmsProductDto;
 import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.dto.ProductCategoryDto;
 import com.ym.mec.common.entity.GoodsSubModel;
 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;
@@ -36,8 +53,8 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.ini.IniFileUtil;
-
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.slf4j.Logger;
@@ -88,6 +105,9 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 
 	@Autowired
 	private GoodsSubMapper goodsSubMapper;
+
+	@Autowired
+	private GoodsCategoryService goodsCategoryService;
 	@Override
 	public BaseDAO<Integer, Goods> getDAO() {
 		return goodsDao;
@@ -548,8 +568,131 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 
+	@Transactional(rollbackFor = Exception.class)
 	@Override
-	public List<Goods> importGoodsV2(MultipartFile file, Integer userId) {
+	public String importGoodsV2(MultipartFile file, Integer userId) throws Exception {
+		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+		if (sheetsListMap.values().isEmpty()) {
+			return "";
+		}
+
+		// 查询商品分类
+		GoodsCategoryQueryInfo goodsCategoryQueryInfo = new GoodsCategoryQueryInfo();
+		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));
+		Set<String> categoryNames = categoryIdNameMap.keySet();
+
+		// 查询员工机构
+		Map<String, Integer> orgNameIdMap = organizationDao.findAllOrgans(TenantContextHolder.getTenantId()).stream()
+				.collect(Collectors.toMap(Organization::getName, Organization::getId));
+
+
+		InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+		Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.GOODS_GROUP.getMsg());
+
+		List<String> errors = new ArrayList<>();
+		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;
+			}
+			Map<String, Object> firstRow = rows.get(0);
+			// 缺省字段
+			Set<String> templateFields = columns.keySet();
+			List<String> defaultField = templateFields.stream().filter(firstRow::containsKey).collect(Collectors.toList());
+			if (!defaultField.isEmpty()) {
+				errors.add("导入字段缺省:" + String.join(",", defaultField));
+				break;
+			}
+
+			String lineErrMsg = "第%行存在错误:";
+			List<String> errList = new ArrayList<>();
+			Map<String,String> fieldTypeMap = new HashMap<>();
+			GoodsWrapper.Goods beforeGoods = null;
+			for (int i = 0; i < rows.size(); i++) {
+				GoodsWrapper.Goods goods = new GoodsWrapper.Goods();
+				Map<String, Object> row = rows.get(i);
+				if (row.size() == 0) {
+					continue;
+				}
+				for (Map.Entry<String, Object> entry : row.entrySet()) {
+					String fieldName = entry.getKey();
+					if (!templateFields.contains(fieldName)) {
+						continue;
+					}
+					String fieldCode = columns.get(fieldName);
+					String value = entry.getValue().toString();
+					if (beforeGoods == null) {
+
+					}
+					if (beforeGoods == null && StringUtils.isEmpty(value)) {
+						errList.add("字段‘" + fieldName + "’为空");
+						continue;
+					}
+					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 + "’不能为负数");
+							} else {
+//								ReflectionUtil.invoke(goods, "set" + fieldCode.substring(0, 1).toUpperCase() + fieldCode.substring(1), new Class[]{BigDecimal.class}, new Object[] {marketPrice});
+							}
+						} else {
+							errList.add("字段‘" + fieldName + "’类型错误");
+						}
+					} else if ("type".equals(fieldCode)) {
+						boolean match = Arrays.stream(GoodsType.values()).allMatch(next -> next.getDesc().equals(value));
+						if (match) {
+							goods.setType(GoodsType.valueOf(value));
+						} else {
+							errList.add("字段‘" + fieldName + "’类型不支持");
+						}
+					} else if ("goodsCategoryName".equals(fieldCode)) {
+						if(categoryNames.contains(value)){
+							goods.setGoodsCategoryId(categoryIdNameMap.get(value));
+						}else {
+							errList.add("字段‘" + fieldName + "’类型不支持");
+						}
+					} else if ("educationShowOrganName".equals(fieldCode)
+							|| "courseFeeShowOrganName".equals(fieldCode)
+							|| "memberFeeShowOrganName".equals(fieldCode)
+							|| "freeFeeShowOrganName".equals(fieldCode)
+							|| "replacementShowOrganName".equals(fieldCode)
+					) {
+						List<String> orgIds = new ArrayList<>();
+						for (String orgName : value.split(",")) {
+							if (!orgNameIdMap.containsKey(orgName)) {
+								errList.add("字段‘" + 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)});
+					}
+
+					beforeGoods = JSON.parseObject(JSON.toJSONString(goods),GoodsWrapper.Goods.class);
+				}
+
+
+			}
+
+
+
+
+		}
+
+		if (goodsList.isEmpty()) {
+			throw new BizException("未解析到文件");
+		}
 		return null;
 	}
 
@@ -954,4 +1097,19 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		goodsDao.updateStock(updateGoods);
 		return true;
 	}
+
+	@Override
+	public List<ProductCategoryDto> queryGoodsTypeList() {
+		return mallFeignService.listWithChildren();
+	}
+
+	@Override
+	public List<BrandDto> queryGoodsBrandList() {
+		return mallFeignService.getList();
+	}
+
+	@Override
+	public Object queryGoodsCategoryList() {
+		return null;
+	}
 }

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

@@ -1050,7 +1050,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                 String orderNo = idGeneratorService.generatorId("payment") + "";
                 address.setOrderNo(orderNo);
                 orderCreate.setOrderNo(orderNo);
-                orderCreate.setOrchestraId(musicGroup.getId());
+//                orderCreate.setOrchestraId(musicGroup.getId());
                 orderCreate.setMemberId(musicGroup.getSchoolId().longValue());
                 orderCreate.setTotalAmount(calender.getCurrentTotalAmount());
                 orderCreate.setOrderFormType("MEC");

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -363,6 +363,9 @@
             <if test="replacementShowOrganId!=null and replacementShowOrganId!=''">
                 AND INTE_ARRAY(#{replacementShowOrganId},g.replacement_show_organ_id_)
             </if>
+            <if test="brandId != null and brandId != ''">
+                AND g.brand_ = #{brandId}
+            </if>
             <if test="noOrganSearch == null">
                 <if test="organId != null and organId != ''">
                     AND INTE_ARRAY (#{organId},CONCAT_WS(',',

+ 19 - 4
mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java

@@ -3,15 +3,15 @@ package com.ym.mec.mall;
 import com.baomidou.mybatisplus.extension.api.R;
 import com.baomidou.mybatisplus.extension.enums.ApiErrorCode;
 import com.ym.mec.common.config.FeignConfiguration;
-import com.ym.mec.common.dto.OrderCreate;
-import com.ym.mec.common.dto.PmsProductDto;
-import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.dto.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.mall.fallback.MallFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @FeignClient(name = "${app-config.open-feign.mall-server.name:mall-server}",
 		contextId = "MallFeignService",
 		url = "${app-config.open-feign.mall-server.url:}",
@@ -33,7 +33,22 @@ public interface MallFeignService {
      * @param orderNo 订单编号
      * @return status 订单状态  0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
      */
-    @GetMapping(value = "/product/updateOrderStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @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);
 
+
+    //根据品牌名称分页获取品牌列表
+    @RequestMapping(value = "/open/brand/list", method = RequestMethod.GET)
+    List<BrandDto> getList();
+
+
+    // 查询所有一级分类及子分类
+    @RequestMapping(value = "/open/productCategory/list/withChildren", method = RequestMethod.GET)
+    @ResponseBody
+    List<ProductCategoryDto> listWithChildren();
+
+
+//    @ApiOperation("分页获取所有商品属性分类")
+    @RequestMapping(value = "/open/productAttribute/category/list", method = RequestMethod.GET)
+    List<ProductAttributeCategoryDto> getProductAttributeCategoryList();
 }

+ 16 - 3
mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java

@@ -1,8 +1,6 @@
 package com.ym.mec.mall.fallback;
 
-import com.ym.mec.common.dto.OrderCreate;
-import com.ym.mec.common.dto.PmsProductDto;
-import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.dto.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.mall.MallFeignService;
 import org.springframework.stereotype.Component;
@@ -34,5 +32,20 @@ public class MallFeignServiceFallback implements MallFeignService {
         return false;
     }
 
+    @Override
+    public List<BrandDto> getList() {
+        return null;
+    }
+
+    @Override
+    public List<ProductCategoryDto> listWithChildren() {
+        return null;
+    }
+
+    @Override
+    public List<ProductAttributeCategoryDto> getProductAttributeCategoryList() {
+        return null;
+    }
+
 
 }

+ 1 - 1
mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java

@@ -41,7 +41,7 @@ public class AuditLogInterceptor extends HandlerInterceptorAdapter {
 
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
-        syncSaveLog(request, handler);
+//        syncSaveLog(request, handler);
     }
 
     public void syncSaveLog(HttpServletRequest request, Object handler) {

+ 13 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/BrandDto.java

@@ -0,0 +1,13 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+@Data
+public class BrandDto {
+
+    // 品牌ID
+    private Long id;
+
+    // 品牌名称
+    private String name;
+}

+ 12 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductAttributeCategoryDto.java

@@ -0,0 +1,12 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+@Data
+public class ProductAttributeCategoryDto {
+//    @ApiModelProperty("商品类型ID")
+    private Long id;
+
+//    @ApiModelProperty("名称")
+    private String name;
+}

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

@@ -0,0 +1,15 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProductCategoryDto {
+
+    private Long id;
+
+    private Long parentId;
+
+    private String name;
+}

+ 21 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsProductSkuStockRecordController.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -60,4 +61,24 @@ public class PmsProductSkuStockRecordController {
             return CommonResult.failed();
         }
     }
+
+
+    @ApiOperation("新增商品库存入库记录")
+    @RequestMapping(value = "/update", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult update(@RequestBody @Validated PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return CommonResult.failed(ResultCode.FORBIDDEN, "请登录");
+        }
+        pmsProductSkuStockRecord.setCreateBy(sysUser.getId().longValue());
+        pmsProductSkuStockRecord.setCreateTime(new Date());
+        int count = pmsProductSkuStockRecordService.update(pmsProductSkuStockRecord);
+        if (count > 0) {
+            return CommonResult.success(count);
+        } else {
+            return CommonResult.failed();
+        }
+    }
 }

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

@@ -5,11 +5,13 @@ import com.ym.mec.common.dto.PmsProductDto;
 import com.ym.mec.common.dto.PmsProductQueryParamDto;
 import com.ym.mec.common.page.PageInfo;
 import com.yonge.cooleshow.admin.controller.OmsOrderReturnApplyController;
-import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
-import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.admin.dto.PmsProductCategoryWithChildrenItem;
+import com.yonge.cooleshow.admin.service.*;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.model.PmsBrand;
+import com.yonge.cooleshow.mbg.model.PmsProductAttributeCategory;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.redisson.api.RLock;
@@ -47,6 +49,15 @@ public class OpenController {
     @Autowired
     private PmsProductService productService;
 
+    @Autowired
+    private PmsBrandService brandService;
+
+    @Autowired
+    private PmsProductCategoryService productCategoryService;
+
+    @Autowired
+    private PmsProductAttributeCategoryService productAttributeCategoryService;
+
     private static final Logger log = LoggerFactory.getLogger(OmsOrderReturnApplyController.class);
 
     @ApiOperation("完成退货测试接口")
@@ -87,4 +98,29 @@ public class OpenController {
         return pageInfo;
 
     }
+
+
+    @ApiOperation(value = "根据品牌名称分页获取品牌列表")
+    @RequestMapping(value = "/brand/list", method = RequestMethod.GET)
+    @ResponseBody
+    public List<PmsBrand> getList() {
+        List<PmsBrand> brandList = brandService.listBrand("", 1, 9999);
+        return brandList;
+    }
+
+    @ApiOperation("查询所有一级分类及子分类")
+    @RequestMapping(value = "/productCategory/list/withChildren", method = RequestMethod.GET)
+    @ResponseBody
+    public List<PmsProductCategoryWithChildrenItem> listWithChildren() {
+        List<PmsProductCategoryWithChildrenItem> list = productCategoryService.listWithChildren();
+        return list;
+    }
+
+
+    @ApiOperation("分页获取所有商品属性分类")
+    @RequestMapping(value = "productAttribute/category/list", method = RequestMethod.GET)
+    public List<PmsProductAttributeCategory> getProductAttributeCategoryList() {
+        List<PmsProductAttributeCategory> productAttributeCategoryList = productAttributeCategoryService.getList(1, 99999);
+        return productAttributeCategoryList;
+    }
 }

+ 6 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductSkuStockRecordService.java

@@ -30,4 +30,10 @@ public interface PmsProductSkuStockRecordService {
      *
      */
     int create(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord);
+
+    /**
+     * 修改
+     *
+     */
+    int update(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord);
 }

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

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.admin.dto.PmsProductResult;
 import com.yonge.cooleshow.admin.service.PmsBrandService;
 import com.yonge.cooleshow.admin.service.PmsProductCategoryService;
 import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
 import org.slf4j.Logger;
@@ -141,7 +142,72 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public PmsProductResult getUpdateInfo(Long id) {
-        return productDao.getUpdateInfo(id);
+        PmsProductResult updateInfo = productDao.getUpdateInfo(id);
+        updateProductStock(Collections.singletonList(updateInfo));
+        updateProductSkuStock(updateInfo.getSkuStockList());
+
+        return updateInfo;
+    }
+
+
+
+    public List<PmsSkuStock> updateProductSkuStock(List<PmsSkuStock> skuStocks) {
+        if (CollectionUtils.isEmpty(skuStocks)) {
+            return new ArrayList<>();
+        }
+        // 从进货清单中 获取剩余库存数量
+        List<Long> productIds = skuStocks.stream().map(PmsSkuStock::getProductId).distinct().collect(Collectors.toList());
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+        // Convert to map
+        Map<Long, Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>>> map = skuStockStocks.stream()
+            .collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId, Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getId)));
+
+        // Merge
+        for (PmsSkuStock skuStock : skuStocks) {
+            Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStock = map.get(skuStock.getProductId());
+            if (!CollectionUtils.isEmpty(skuStockStock)) {
+                List<PmsSkuStockDto.PmsSkuStockStock> pmsSkuStockStocks = skuStockStock.get(skuStock.getId());
+                if (CollectionUtils.isEmpty(pmsSkuStockStocks)) {
+                    skuStock.setLockStock(0);
+                    skuStock.setStock(0);
+                    continue;
+                }
+                skuStock.setStock(pmsSkuStockStocks.stream().mapToInt(item -> item.getInternalStock() + item.getTaxStock()).sum());
+                skuStock.setLockStock(0);
+            }
+
+        }
+        return skuStocks;
+    }
+
+    public List<PmsProduct> updateProductStock(List<PmsProduct> pmsProducts) {
+        if (CollectionUtils.isEmpty(pmsProducts)) {
+            return new ArrayList<>();
+        }
+        // 从进货清单中 获取剩余库存数量
+        List<Long> productIds = pmsProducts.stream().map(PmsProduct::getId).collect(Collectors.toList());
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+        // Convert to map
+        Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStockMap = skuStockStocks.stream().collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId));
+
+        // Merge
+        for (PmsProduct pmsProduct : pmsProducts) {
+            List<PmsSkuStockDto.PmsSkuStockStock> skuStockStock = skuStockStockMap.get(pmsProduct.getId());
+            if (!CollectionUtils.isEmpty(skuStockStock)) {
+                pmsProduct.setStock(skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getInternalStock).sum() + skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getTaxStock).sum());
+                pmsProduct.setLockStock(0);
+            } else {
+                pmsProduct.setStock(0);
+                pmsProduct.setLockStock(0);
+            }
+        }
+        return pmsProducts;
     }
 
     @Override

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

@@ -113,4 +113,21 @@ public class PmsProductSkuStockRecordServiceImpl implements PmsProductSkuStockRe
 
         return 1;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int update(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+        // 没有扣减过库存的记录才能修改
+        if (pmsProductSkuStockRecord.getId() == null) {
+            throw new BizException("批次号不能为空");
+        }
+        int i = pmsProductSkuStockRecordMapper.updateByIdAndStockSelective(JSON.parseObject(JSON.toJSONString(pmsProductSkuStockRecord), PmsProductSkuStockRecord.class));
+        if (i > 0) {
+            // 同步库存数据
+            omsOrderService.syncSkuStock(Lists.newArrayList(pmsProductSkuStockRecord.getProductSkuId()));
+        } else {
+            throw new BizException("修改失败");
+        }
+        return i;
+    }
 }

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

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

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

@@ -323,4 +323,42 @@
       </foreach>
       for update
     </select>
+
+  <update id="updateByIdAndStockSelective">
+      <!--@mbg.generated-->
+      update pms_product_sku_stock_record
+      <set>
+          <if test="productId != null">
+              product_id = #{productId,jdbcType=BIGINT},
+          </if>
+          <if test="productSkuId != null">
+              product_sku_id = #{productSkuId,jdbcType=BIGINT},
+          </if>
+          <if test="selectProductSn != null and selectProductSn != ''">
+              select_product_sn = #{selectProductSn,jdbcType=VARCHAR},
+          </if>
+          <if test="internalStock != null">
+              internal_stock = #{internalStock,jdbcType=INTEGER},
+          </if>
+          <if test="internalSaleStock != null">
+              internal_sale_stock = #{internalSaleStock,jdbcType=INTEGER},
+          </if>
+          <if test="taxStock != null">
+              tax_stock = #{taxStock,jdbcType=INTEGER},
+          </if>
+          <if test="taxSaleStock != null">
+              tax_sale_stock = #{taxSaleStock,jdbcType=INTEGER},
+          </if>
+          <if test="price != null">
+              price = #{price,jdbcType=DECIMAL},
+          </if>
+          <if test="createTime != null">
+              create_time = #{createTime,jdbcType=TIMESTAMP},
+          </if>
+          <if test="createBy != null">
+              create_by = #{createBy,jdbcType=BIGINT},
+          </if>
+      </set>
+      where id = #{id,jdbcType=BIGINT} and internal_sale_stock = 0 and tax_sale_stock = 0
+    </update>
 </mapper>