Преглед на файлове

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

zouxuan преди 1 година
родител
ревизия
af161a5010
променени са 25 файла, в които са добавени 446 реда и са изтрити 51 реда
  1. 13 3
      mec-application/src/main/java/com/ym/mec/web/controller/APIController.java
  2. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/GoodsSubMapper.java
  4. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java
  5. 42 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  6. 37 29
      mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml
  7. 8 0
      mec-biz/src/main/resources/config/mybatis/GoodsSubMapper.xml
  8. 6 1
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  9. 6 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  10. 13 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubModel.java
  11. 82 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/ExportController.java
  12. 3 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsSkuStockController.java
  13. 4 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsSkuStockDao.java
  14. 3 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductService.java
  15. 2 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsSkuStockService.java
  16. 12 3
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  17. 15 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductSkuStockRecordServiceImpl.java
  18. 32 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsSkuStockServiceImpl.java
  19. 15 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductSkuStockRecordWrapper.java
  20. 37 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductWrapper.java
  21. 79 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsSkuStockWrapper.java
  22. 5 3
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml
  23. 6 0
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductSkuStockRecordDao.xml
  24. 14 0
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsSkuStockDao.xml
  25. 2 2
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java

+ 13 - 3
mec-application/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -9,7 +9,9 @@ import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.impl.GoodsServiceImpl;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.GoodsSubModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -58,6 +60,9 @@ public class APIController extends BaseController {
 	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
+	@Autowired
+	private GoodsService goodsService;
+
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId,Integer tenantId) {
 		// 添加用户现金账户
@@ -146,14 +151,14 @@ public class APIController extends BaseController {
 	// 商城订单优惠券金额
 	@PostMapping("/couponAmount")
 	public HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model) {
-			return succeed(studentPaymentOrderService.couponAmount(model));
+		return succeed(studentPaymentOrderService.couponAmount(model));
 	}
 
 	// 商城保存订单详情数据
 	@PostMapping("/mallSaveOrderInfo")
 	public HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model) {
-			studentPaymentOrderService.mallSaveOrderInfo(model);
-			return succeed();
+		studentPaymentOrderService.mallSaveOrderInfo(model);
+		return succeed();
 	}
 
 	// 商城支付成功/失败修改订单状态
@@ -229,4 +234,9 @@ public class APIController extends BaseController {
 
 		return succeed(balance);
 	}
+
+	@PostMapping("/api/goodsStatusSynchronize")
+	public HttpResponseResult<Boolean> goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList) {
+		return succeed(goodsService.goodsStatusSynchronize(goodsSubModelList));
+	}
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java

@@ -202,4 +202,7 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
     BigDecimal getOrganCostPrice(@Param("complementGoodsIdList") String complementGoodsIdList);
 
     List<Goods> exportGoods(Map<String, Object> params);
+
+    void updateStatus(@Param("goodIdList") List<Integer> goodIdList, @Param("status") Boolean status);
+
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/GoodsSubMapper.java

@@ -16,4 +16,6 @@ public interface GoodsSubMapper extends BaseMapper<GoodsSub> {
 
 
     void saveBatch(@Param("goodsSubs") List<GoodsSub> goodsSubs);
+
+    void updateStatus(@Param("goodsSubList") List<Integer> goodsSubIdList, @Param("status") Boolean status);
 }

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

@@ -5,6 +5,7 @@ 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.PmsProductDto;
+import com.ym.mec.common.entity.GoodsSubModel;
 import com.ym.mec.common.page.PageInfo;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -129,12 +130,14 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * @return
      */
     GoodsWrapper.Goods getDetail(Integer goodsId);
-    
+
     List<Goods> getGoodsWithLocked(String goodsIds);
-    
+
     int batchUpdate(List<Goods> goodsList);
 
     void updateGoods(GoodsWrapper.Goods goods);
 
     PageInfo<PmsProductDto> queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query);
+
+    Boolean goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList);
 }

+ 42 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -22,9 +22,11 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dto.PmsProductDto;
 import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.entity.GoodsSubModel;
 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;
@@ -34,6 +36,7 @@ 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.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.slf4j.Logger;
@@ -55,10 +58,11 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implements GoodsService {
 	private static final Logger LOGGER = LoggerFactory.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
-	
+
 	@Autowired
 	private GoodsDao goodsDao;
 	@Autowired
@@ -824,8 +828,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		update(goodsInfo);
 	}
 
-    @Override
-    public PageInfo<PmsProductDto> queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query) {
+	@Override
+	public PageInfo<PmsProductDto> queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query) {
 		PmsProductQueryParamDto dto = PmsProductQueryParamDto.builder()
 				.publishStatus(query.getPublishStatus())
 				.keyword(query.getKeyword())
@@ -838,4 +842,39 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 				.build();
 		return mallFeignService.getProductList(dto);
 	}
+
+	@Transactional
+	@Override
+	public Boolean goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList) {
+		if (CollectionUtils.isEmpty(goodsSubModelList)) {
+			return false;
+		}
+		log.info("开始同步商品状态:" + JSON.toJSONString(goodsSubModelList));
+		List<Integer> goodIds = goodsSubModelList.stream().map(GoodsSubModel::getMallGoodsId).distinct().collect(Collectors.toList());
+		List<Integer> skus = goodsSubModelList.stream().map(GoodsSubModel::getSku).distinct().collect(Collectors.toList());
+		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("goods_id_", goodIds)
+				.in("sku_", skus);
+		List<GoodsSub> goodsSubs = goodsSubMapper.selectList(queryWrapper);
+		if (CollectionUtils.isEmpty(goodsSubs)) {
+			return true;
+		}
+		Map<String, Boolean> keyStatusMap = goodsSubModelList.stream().collect(Collectors.toMap(next -> next.getMallGoodsId() + "_" + next.getSku(), GoodsSubModel::getGoodsStatus));
+		Set<String> keys = keyStatusMap.keySet();
+		goodsSubs.removeIf(next -> !keys.contains(next.getMallGoodsId() + "_" + next.getSku()));
+		if (CollectionUtils.isEmpty(goodsSubs)) {
+			return true;
+		}
+		log.info("开始同步商品状态:0/" + goodsSubs.size());
+		List<GoodsSub> goodsSubList = goodsSubs.stream().peek(next -> next.setGoodsStatus(keyStatusMap.get(next.getMallGoodsId() + "_" + next.getSku()))).collect(Collectors.toList());
+		// 下架的商品
+		List<GoodsSub> downGoods = goodsSubList.stream().filter(next -> Boolean.FALSE.equals(next.getGoodsStatus())).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(downGoods)){
+			List<Integer> goodIdList = downGoods.stream().map(GoodsSub::getGoodsId).distinct().collect(Collectors.toList());
+			goodsDao.updateStatus(goodIdList, false);
+		}
+		Map<Boolean, List<Integer>> listMap = goodsSubList.stream().collect(Collectors.groupingBy(GoodsSub::getGoodsStatus, Collectors.mapping(next -> next.getId(), Collectors.toList())));
+		listMap.forEach((key, values) -> goodsSubMapper.updateStatus(values, key));
+		return true;
+	}
 }

+ 37 - 29
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -58,34 +58,34 @@
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="Goods" useCache="false" flushCache="true">
-		SELECT * FROM goods g
-		WHERE g.id_ = #{id}
-	</select>
+        SELECT * FROM goods g
+        WHERE g.id_ = #{id}
+    </select>
 
     <select id="lock" resultMap="Goods" useCache="false" flushCache="true">
-		SELECT * FROM goods WHERE id_ = #{goodsId} LOCK IN SHARE MODE
-	</select>
+        SELECT * FROM goods WHERE id_ = #{goodsId} LOCK IN SHARE MODE
+    </select>
 
     <!-- 全查询 -->
     <select id="findAll" resultMap="Goods">
-		SELECT * FROM goods where tenant_id_ = #{tenantId} ORDER BY id_
-	</select>
+        SELECT * FROM goods where tenant_id_ = #{tenantId} ORDER BY id_
+    </select>
 
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Goods" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO goods
         (goods_category_id_,sn_,name_,brand_,specification_,image_,stock_count_,tax_stock_count_,sell_count_,market_price_,
-        discount_price_,group_purchase_price_,brief_,desc_,is_new_,is_top_,status_,memo_,publish_time_,
-        complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,stock_warning_,stock_type_
+         discount_price_,group_purchase_price_,brief_,desc_,is_new_,is_top_,status_,memo_,publish_time_,
+         complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,stock_warning_,stock_type_
             ,student_show_organ_id_,education_show_organ_id_,replacement_show_organ_id_,course_fee_show_organ_id_,
          member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
         VALUES(#{goodsCategoryId},#{sn},#{name},#{brand},#{specification},#{image},#{stockCount},#{taxStockCount},#{sellCount},#{marketPrice},
-        #{discountPrice},#{groupPurchasePrice},#{brief},#{desc},
-        #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isTop,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{memo},#{publishTime},#{complementGoodsIdList},now(),now(),#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{agreeCostPrice},
-        #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{studentShowOrganId},#{educationShowOrganId},#{replacementShowOrganId},#{courseFeeShowOrganId},
+               #{discountPrice},#{groupPurchasePrice},#{brief},#{desc},
+               #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isTop,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{memo},#{publishTime},#{complementGoodsIdList},now(),now(),#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{agreeCostPrice},
+               #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{studentShowOrganId},#{educationShowOrganId},#{replacementShowOrganId},#{courseFeeShowOrganId},
                #{memberFeeShowOrganId},#{freeFeeShowOrganId},#{tenantId},#{organCostPrice})
     </insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
@@ -94,7 +94,7 @@
         discount_price_,group_purchase_price_,brief_,desc_,update_time_,create_time_,type_,agree_cost_price_,sn_,
         stock_count_,tax_stock_count_,stock_warning_,stock_type_
         ,student_show_organ_id_,education_show_organ_id_,replacement_show_organ_id_,course_fee_show_organ_id_,
-         member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
+        member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
         VALUES
         <foreach collection="list" separator="," item="goods">
             (#{goods.goodsCategoryId},#{goods.name},#{goods.brand},#{goods.specification},#{goods.image},#{goods.marketPrice},
@@ -104,7 +104,7 @@
             #{goods.stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{goods.studentShowOrganId},#{goods.educationShowOrganId},#{goods.replacementShowOrganId},
-             #{goods.courseFeeShowOrganId},#{goods.memberFeeShowOrganId},#{goods.freeFeeShowOrganId},#{goods.tenantId},#{goods.organCostPrice}
+            #{goods.courseFeeShowOrganId},#{goods.memberFeeShowOrganId},#{goods.freeFeeShowOrganId},#{goods.tenantId},#{goods.organCostPrice}
             )
         </foreach>
     </insert>
@@ -112,12 +112,12 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.Goods">
         UPDATE goods
         <set>
-                student_show_organ_id_ = #{studentShowOrganId},
-                education_show_organ_id_ = #{educationShowOrganId},
-                replacement_show_organ_id_ = #{replacementShowOrganId},
-                course_fee_show_organ_id_ = #{courseFeeShowOrganId},
-                member_fee_show_organ_id_ = #{memberFeeShowOrganId},
-                free_fee_show_organ_id_ = #{freeFeeShowOrganId},
+            student_show_organ_id_ = #{studentShowOrganId},
+            education_show_organ_id_ = #{educationShowOrganId},
+            replacement_show_organ_id_ = #{replacementShowOrganId},
+            course_fee_show_organ_id_ = #{courseFeeShowOrganId},
+            member_fee_show_organ_id_ = #{memberFeeShowOrganId},
+            free_fee_show_organ_id_ = #{freeFeeShowOrganId},
             <if test="agreeCostPrice != null">
                 agree_cost_price_ = #{agreeCostPrice},
             </if>
@@ -193,7 +193,7 @@
             <if test="stockType != null">
                 stock_type_ = #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
-                update_time_ = NOW()
+            update_time_ = NOW()
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -295,7 +295,7 @@
                 <if test="goods.stockType != null">
                     stock_type_ = #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 </if>
-                    update_time_ = NOW()
+                update_time_ = NOW()
             </set>
             WHERE id_ = #{goods.id} and tenant_id_ = #{goods.tenantId}
         </foreach>
@@ -303,8 +303,8 @@
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
-		DELETE FROM goods WHERE id_ = #{id}
-	</delete>
+        DELETE FROM goods WHERE id_ = #{id}
+    </delete>
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="Goods" parameterType="map">
@@ -323,7 +323,7 @@
 
     <sql id="queryGoodsPageSql">
         <where>
-        	g.tenant_id_ = #{tenantId}
+            g.tenant_id_ = #{tenantId}
             <if test="goodsCategoryId != null">
                 AND g.goods_category_id_ = #{goodsCategoryId}
             </if>
@@ -388,7 +388,7 @@
 
     <sql id="queryOrganIdSql">
         <where>
-                AND g.status_ != 0 and g.tenant_id_ = #{goodsQuery.tenantId}
+            AND g.status_ != 0 and g.tenant_id_ = #{goodsQuery.tenantId}
             <if test="goodsQuery.subjectId != null">
                 AND sgm.subject_id_ = #{goodsQuery.subjectId}
             </if>
@@ -515,7 +515,7 @@
 
     <select id="getGoodsInfo" resultMap="Goods">
         SELECT g.*,gc.name_ goods_category_name_ FROM goods g
-        LEFT JOIN goods_category gc on g.goods_category_id_ = gc.id_
+                                                          LEFT JOIN goods_category gc on g.goods_category_id_ = gc.id_
         WHERE g.id_=#{id}
     </select>
 
@@ -585,4 +585,12 @@
             </if>
         </where>
     </sql>
+
+    <update id="updateStatus">
+        update goods set status_= #{status}
+        where id_ in
+        <foreach collection="goodIdList" separator="," open="(" close=")" item="item">
+            #{item}
+        </foreach>
+    </update>
 </mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/GoodsSubMapper.xml

@@ -8,4 +8,12 @@
             item.goodsId,item.mallGoodsId,item.sku,item.goodsStatus,item.goodsPrice
         </foreach>
     </insert>
+
+    <update id="updateStatus">
+        update goods_sub set goods_status_ = #{status}
+        where id_ in
+        <foreach collection="goodsSubIdList" separator="," open="(" close=")" item="item">
+            #{item}
+        </foreach>
+    </update>
 </mapper>

+ 6 - 1
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.web;
 
 import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.entity.GoodsSubModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -41,7 +42,7 @@ public interface WebFeignService {
 	String getTenantConfigValue(@RequestParam("tenantId") Integer tenantId, @RequestParam("paramName") String paramName);
 
 	@PostMapping(value = "api/queryVipPracticeGroups")
-    Boolean queryVipPracticeGroups();
+	Boolean queryVipPracticeGroups();
 
 	@GetMapping(value = "/hfMerchantConfig/queryByTenantId")
 	HttpResponseResult<HfMerchantConfig> queryByTenantId(@RequestParam("payerName") String payerName,@RequestParam("id") Integer id);
@@ -82,4 +83,8 @@ public interface WebFeignService {
 	// 商城获取 收货状态
 	@PostMapping("/api/balance")
 	HttpResponseResult<BigDecimal> balance(@RequestParam("userId") Long userId);
+
+	// 商城商品状态更新,同步商品状态
+	@PostMapping("/api/goodsStatusSynchronize")
+	HttpResponseResult<Boolean> goodsStatusSynchronize(@RequestBody List<GoodsSubModel> goodsSubModelList);
 }

+ 6 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.fallback;
 
+import com.ym.mec.common.entity.GoodsSubModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -109,4 +110,9 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<BigDecimal> balance(Long userId) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<Boolean> goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList) {
+		return null;
+	}
 }

+ 13 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubModel.java

@@ -0,0 +1,13 @@
+package com.ym.mec.common.entity;
+
+import lombok.Data;
+
+@Data
+public class GoodsSubModel {
+
+    private Integer mallGoodsId;
+
+    private Integer sku;
+
+    private Boolean goodsStatus;
+}

+ 82 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/ExportController.java

@@ -2,22 +2,33 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.admin.dao.PmsSkuStockDao;
 import com.yonge.cooleshow.admin.dto.OmsOrderQueryParam;
 import com.yonge.cooleshow.admin.dto.OrderDetailVo;
+import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.admin.service.PmsProductService;
 import com.yonge.cooleshow.admin.service.PmsProductSkuStockRecordService;
 import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.admin.wrapper.PmsProductWrapper;
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @Api(tags = "数据导出服务")
@@ -28,6 +39,13 @@ public class ExportController {
 
     @Autowired
     private PmsProductSkuStockRecordService pmsProductSkuStockRecordService;
+
+    @Autowired
+    private PmsProductService productService;
+
+    @Autowired
+    private PmsSkuStockDao skuStockDao;
+
     @ApiOperation("订单详情")
     @RequestMapping(value = "/orderDetail", method = RequestMethod.POST)
     public void orderDetail(@RequestBody OmsOrderQueryParam queryParam, HttpServletResponse response) throws IOException {
@@ -58,4 +76,68 @@ public class ExportController {
             .sheet("商品库存入库记录").doWrite(productList);
     }
 
+
+    @ApiOperation("商品库存导出")
+    @RequestMapping(value = "/productExport", method = RequestMethod.GET)
+    @ResponseBody
+    public void productExport(PmsProductQueryParam productQueryParam, HttpServletResponse response) throws IOException {
+        List<PmsProduct> productList = productService.list(productQueryParam, 99999, 1);
+
+        List<PmsProductWrapper.PmsProductExport> list = JSON.parseArray(JSON.toJSONString(productList), PmsProductWrapper.PmsProductExport.class);
+        if (!CollectionUtils.isEmpty(list)) {
+            List<Long> productIds = list.stream().map(PmsProductWrapper.PmsProductExport::getId).collect(Collectors.toList());
+
+            // 计算库存数据
+            List<PmsSkuStockWrapper.PmsSkuStockStock> skuStockStocks = skuStockDao.getSkuStockByProductIds(productIds);
+
+            // Convert to map
+            Map<Long, List<PmsSkuStockWrapper.PmsSkuStockStock>> skuStockStockMap = skuStockStocks.stream().collect(Collectors.groupingBy(PmsSkuStockWrapper.PmsSkuStockStock::getProductId));
+
+            // Merge
+            for (PmsProductWrapper.PmsProductExport pmsProductExport : list) {
+                List<PmsSkuStockWrapper.PmsSkuStockStock> skuStockStock = skuStockStockMap.get(pmsProductExport.getId());
+                if (!CollectionUtils.isEmpty(skuStockStock)) {
+                    pmsProductExport.setInternalStock(skuStockStock.stream().mapToInt(PmsSkuStockWrapper.PmsSkuStockStock::getInternalStock).sum());
+                    pmsProductExport.setTaxStock(skuStockStock.stream().mapToInt(PmsSkuStockWrapper.PmsSkuStockStock::getTaxStock).sum());
+                }
+            }
+        }
+
+
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=商品库存导出.xlsx");
+        EasyExcel.write(response.getOutputStream(), PmsProductWrapper.PmsProductExport.class)
+            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+            .sheet("商品库存导出").doWrite(list);
+    }
+
+
+    @ApiOperation("商品进货清单导出")
+    @RequestMapping(value = "/productStockRecordExport", method = RequestMethod.GET)
+    @ResponseBody
+    public void productStockRecordExport(PmsProductQueryParam productQueryParam, HttpServletResponse response) throws IOException {
+        List<PmsProduct> productList = productService.list(productQueryParam, 99999, 1);
+
+
+        PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query = new PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery();
+        query.setPageSize(99999);
+        // id 集合
+        List<Long> productIds = productList.stream().map(PmsProduct::getId).collect(Collectors.toList());
+        query.setProductIds(productIds);
+        List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> productRecordList = pmsProductSkuStockRecordService.list(query);
+
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=商品进货清单导出.xlsx");
+        EasyExcel.write(response.getOutputStream(), PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord.class)
+            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+            .sheet("商品进货清单导出").doWrite(productRecordList);
+    }
 }

+ 3 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsSkuStockController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.admin.service.PmsSkuStockService;
@@ -25,8 +26,8 @@ public class PmsSkuStockController {
     @ApiOperation("根据商品ID及sku编码模糊搜索sku库存")
     @RequestMapping(value = "/{pid}", method = RequestMethod.GET)
     @ResponseBody
-    public CommonResult<List<PmsSkuStock>> getList(@PathVariable Long pid, @RequestParam(value = "keyword",required = false) String keyword) {
-        List<PmsSkuStock> skuStockList = skuStockService.getList(pid, keyword);
+    public CommonResult<List<PmsSkuStockWrapper.PmsSkuStock>> getList(@PathVariable Long pid, @RequestParam(value = "keyword",required = false) String keyword) {
+        List<PmsSkuStockWrapper.PmsSkuStock> skuStockList = skuStockService.getList(pid, keyword);
         return CommonResult.success(skuStockList);
     }
     @ApiOperation("批量更新sku库存信息")

+ 4 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsSkuStockDao.java

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.admin.dao;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -19,4 +21,6 @@ public interface PmsSkuStockDao {
      * 批量插入或替换操作
      */
     int replaceList(@Param("list")List<PmsSkuStock> skuStockList);
+
+    List<PmsSkuStockWrapper.PmsSkuStockStock> getSkuStockByProductIds(@Param("productIds") List<Long> productIds);
 }

+ 3 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductService.java

@@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品管理Service
@@ -87,4 +88,6 @@ public interface PmsProductService {
      * @return
      */
     HomeStatistical countProductShowStatus();
+
+    Map<Long, PmsProduct> getMapByIds(List<Long> productIds);
 }

+ 2 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsSkuStockService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.service;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -14,7 +15,7 @@ public interface PmsSkuStockService {
     /**
      * 根据产品id和skuCode关键字模糊搜索
      */
-    List<PmsSkuStock> getList(Long pid, String keyword);
+    List<PmsSkuStockWrapper.PmsSkuStock> getList(Long pid, String keyword);
 
     /**
      * 批量更新商品库存信息

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

@@ -22,9 +22,7 @@ import org.springframework.util.StringUtils;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -314,6 +312,17 @@ public class PmsProductServiceImpl implements PmsProductService {
         return productDao.selectProductShowStatusCount();
     }
 
+    @Override
+    public Map<Long, PmsProduct> getMapByIds(List<Long> productIds) {
+        if (CollectionUtils.isEmpty(productIds)) {
+            return new HashMap<>();
+        }
+        PmsProductExample example = new PmsProductExample();
+        example.createCriteria().andIdIn(productIds);
+        List<PmsProduct> pmsProducts = productMapper.selectByExample(example);
+        return pmsProducts.stream().collect(Collectors.toMap(PmsProduct::getId, pmsProduct -> pmsProduct));
+    }
+
     /**
      * 建立和插入关系表操作
      *

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

@@ -41,6 +41,10 @@ public class PmsProductSkuStockRecordServiceImpl implements PmsProductSkuStockRe
 
     @Autowired
     private PmsProductMapper pmsProductMapper;
+
+    @Autowired
+    private PmsProductService pmsProductService;
+
     /**
      * 列表分页
      *
@@ -55,12 +59,23 @@ public class PmsProductSkuStockRecordServiceImpl implements PmsProductSkuStockRe
         }
         // sku id 集合
         List<Long> skuIds = list.stream().map(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord::getProductSkuId).distinct().collect(Collectors.toList());
+
+        // 商品ID 集合
+        List<Long> productIds = list.stream().map(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord::getProductId).distinct().collect(Collectors.toList());
+        // 获取商品信息
+        Map<Long, PmsProduct> productMap = pmsProductService.getMapByIds(productIds);
+
         Map<Long, PmsSkuStock> skuStockMap = skuStockService.getMapByIds(skuIds);
         list.forEach(item -> {
             PmsSkuStock skuStock = skuStockMap.get(item.getProductSkuId());
             if (skuStock != null) {
                 item.setProductSkuCode(skuStock.getSkuCode());
             }
+            PmsProduct pmsProduct = productMap.get(item.getProductId());
+            if (pmsProduct != null) {
+                item.setProductName(pmsProduct.getName());
+                item.setProductSn(pmsProduct.getProductSn());
+            }
         });
 
         return list;

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

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.admin.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.admin.dao.PmsSkuStockDao;
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.mbg.model.PmsSkuStockExample;
@@ -10,6 +13,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,13 +31,39 @@ public class PmsSkuStockServiceImpl implements PmsSkuStockService {
     private PmsSkuStockDao skuStockDao;
 
     @Override
-    public List<PmsSkuStock> getList(Long pid, String keyword) {
+    public List<PmsSkuStockWrapper.PmsSkuStock> getList(Long pid, String keyword) {
         PmsSkuStockExample example = new PmsSkuStockExample();
         PmsSkuStockExample.Criteria criteria = example.createCriteria().andProductIdEqualTo(pid);
         if (!StringUtils.isEmpty(keyword)) {
             criteria.andSkuCodeLike("%" + keyword + "%");
         }
-        return skuStockMapper.selectByExample(example);
+        List<PmsSkuStock> pmsSkuStocks = skuStockMapper.selectByExample(example);
+        if (CollectionUtils.isEmpty(pmsSkuStocks)) {
+            return new ArrayList<>();
+        }
+
+        // Convert to wrapper
+        List<PmsSkuStockWrapper.PmsSkuStock> stockList = JSON.parseArray(JSON.toJSONString(pmsSkuStocks), PmsSkuStockWrapper.PmsSkuStock.class);
+
+        // 计算库存数据
+        List<PmsSkuStockWrapper.PmsSkuStockStock> skuStockStocks =  skuStockDao.getSkuStockByProductIds(Lists.newArrayList(pid));
+
+        // Convert to map
+        Map<Long, PmsSkuStockWrapper.PmsSkuStockStock> skuStockStockMap = skuStockStocks.stream().collect(Collectors.toMap(PmsSkuStockWrapper.PmsSkuStockStock::getId, skuStock -> skuStock));
+
+        // Merge
+        for (PmsSkuStockWrapper.PmsSkuStock stock : stockList) {
+            PmsSkuStockWrapper.PmsSkuStockStock skuStockStock = skuStockStockMap.get(stock.getId());
+            if (skuStockStock != null) {
+                stock.setInternalStock(skuStockStock.getInternalStock());
+                stock.setTaxStock(skuStockStock.getTaxStock());
+            } else {
+                stock.setInternalStock(0);
+                stock.setTaxStock(0);
+            }
+        }
+
+        return stockList;
     }
 
     @Override

+ 15 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductSkuStockRecordWrapper.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.format.DateTimeFormat;
 import com.alibaba.excel.annotation.format.NumberFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -11,6 +12,7 @@ import lombok.Data;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 public class PmsProductSkuStockRecordWrapper {
 
@@ -41,6 +43,8 @@ public class PmsProductSkuStockRecordWrapper {
         @ApiModelProperty("入库结束时间")
         private Date endTime;
 
+        private List<Long> productIds;
+
     }
 
 
@@ -54,6 +58,7 @@ public class PmsProductSkuStockRecordWrapper {
         @ApiModelProperty("批次号")
 
         @ExcelProperty(value = "批次号",order = 1)
+        @ColumnWidth(20)
         private Long id;
 
         /**
@@ -64,6 +69,15 @@ public class PmsProductSkuStockRecordWrapper {
         @ExcelIgnore
         private Long productId;
 
+        @ApiModelProperty("商品货号")
+        @ExcelProperty(value = "商品货号",order = 2)
+        private String productSn;
+
+
+        @ApiModelProperty("商品名称")
+        @ExcelProperty(value = "商品名称",order = 2)
+        private String productName;
+
         /**
          * 商品skuId
          */
@@ -132,6 +146,7 @@ public class PmsProductSkuStockRecordWrapper {
          * 创建时间
          */
         @ApiModelProperty("创建时间")
+        @ColumnWidth(30)
         @ExcelProperty(value = "创建时间",order = 9)
         @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
         private Date createTime;

+ 37 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductWrapper.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.admin.wrapper;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+public class PmsProductWrapper {
+
+    @Data
+    @ApiModel("商品导出数据")
+    public static class PmsProductExport {
+        @ExcelProperty("商品编号")
+        private Long id;
+
+        @ExcelProperty("商品货号")
+        private String productSn;
+
+        @ExcelProperty("商品名称")
+        private String name;
+
+        @ExcelProperty("品牌")
+        private String brandName;
+
+
+        /**
+         * 内部库存
+         */
+        @ExcelProperty(value = "内部剩余库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ExcelProperty(value = "税务剩余库存")
+        private Integer taxStock;
+    }
+}

+ 79 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsSkuStockWrapper.java

@@ -0,0 +1,79 @@
+package com.yonge.cooleshow.admin.wrapper;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+public class PmsSkuStockWrapper {
+
+    @Data
+    @ApiModel("PmsSkuStock-sku管理")
+    public static class PmsSkuStock {
+        @ApiModelProperty(value = "sku库存表id")
+        private Long id;
+
+        @ApiModelProperty(value = "商品id")
+        private Long productId;
+
+        @ApiModelProperty(value = "sku编码")
+        private String skuCode;
+
+        private BigDecimal price;
+
+        /**
+         * 内部库存
+         */
+        @ApiModelProperty("内部库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务库存")
+        private Integer taxStock;
+
+        @ApiModelProperty(value = "预警库存")
+        private Integer lowStock;
+
+        @ApiModelProperty(value = "展示图片")
+        private String pic;
+
+        @ApiModelProperty(value = "销量")
+        private Integer sale;
+
+        @ApiModelProperty(value = "单品促销价格")
+        private BigDecimal promotionPrice;
+
+
+        @ApiModelProperty(value = "商品销售属性,json格式")
+        private String spData;
+    }
+
+
+    @Data
+    @ApiModel("PmsSkuStock-sku管理")
+    public static class PmsSkuStockStock {
+        @ApiModelProperty(value = "sku库存表id")
+        private Long id;
+
+        @ApiModelProperty(value = "商品id")
+        private Long productId;
+
+        /**
+         * 内部库存
+         */
+        @ApiModelProperty("内部库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务库存")
+        private Integer taxStock;
+
+    }
+}

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

@@ -74,7 +74,9 @@
             left join
             (select DISTINCT pss.product_id
             from  pms_sku_stock pss
-            where pss.stock &lt;= pss.low_stock) b
+            left join pms_product_sku_stock_record t3 on t3.product_sku_id= pss.id
+            group by pss.product_id,pss.id,pss.low_stock
+            having sum(t3.internal_stock - t3.internal_sale_stock) &lt;= pss.low_stock) b
             on b.product_id = pp.id
         </if>
 
@@ -99,10 +101,10 @@
                 and pp.product_category_id = #{param.productCategoryId}
             </if>
             <if test="param.stock == 1">
-                and (pp.stock &lt;= pp.low_stock or b.product_id is not null)
+                and ( b.product_id is not null)
             </if>
             <if test="param.stock == 0">
-                and (pp.stock &gt; pp.low_stock and b.product_id is null)
+                and (b.product_id is null)
             </if>
         </where>
         order by pp.sort desc,pp.id desc

+ 6 - 0
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductSkuStockRecordDao.xml

@@ -24,6 +24,12 @@
             <if test="param.endTime != null">
                 and t.create_time &lt;= #{param.endTime}
             </if>
+            <if test="param.productIds != null and param.productIds.size() != 0">
+                and t.product_id in
+                <foreach collection="param.productIds" item="productId" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+            </if>
 
         </where>
 

+ 14 - 0
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsSkuStockDao.xml

@@ -28,4 +28,18 @@
             #{item.spData,jdbcType=VARCHAR})
         </foreach>
     </insert>
+
+    <select id="getSkuStockByProductIds"
+            resultType="com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper$PmsSkuStockStock">
+        select t.product_sku_id                              as id,
+               t.product_id                                  as productId,
+               sum(t.internal_stock - t.internal_sale_stock) as internalStock,
+               sum(t.tax_stock - t.tax_sale_stock) as taxStock
+        from pms_product_sku_stock_record t
+        where t.product_id in
+        <foreach collection="productIds" item="productId" open="(" separator="," close=")">
+            #{productId}
+        </foreach>
+        group by t.product_sku_id, t.product_id
+    </select>
 </mapper>

+ 2 - 2
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java

@@ -14,7 +14,7 @@ public class PmsSkuStock implements Serializable {
 
     private BigDecimal price;
 
-    @ApiModelProperty(value = "库存")
+    @ApiModelProperty(value = "库存 弃用 库存从进货清单中计算")
     private Integer stock;
 
     @ApiModelProperty(value = "预警库存")
@@ -29,7 +29,7 @@ public class PmsSkuStock implements Serializable {
     @ApiModelProperty(value = "单品促销价格")
     private BigDecimal promotionPrice;
 
-    @ApiModelProperty(value = "锁定库存")
+    @ApiModelProperty(value = "锁定库存 弃用 不在锁定库存 库存在发货时扣减")
     private Integer lockStock;
 
     @ApiModelProperty(value = "商品销售属性,json格式")