1
0
Kaynağa Gözat

Merge branch 'master' of hyq/kmall-pt into master

黄亚琴 5 yıl önce
ebeveyn
işleme
5d0ef60492
30 değiştirilmiş dosya ile 462 ekleme ve 158 silme
  1. 2 2
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  2. 3 2
      kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java
  3. 6 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  4. 13 0
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java
  5. 36 23
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  6. 31 7
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  7. 4 0
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  8. 8 0
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  9. 5 5
      kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html
  10. 8 1
      kmall-admin/src/main/webapp/WEB-INF/page/shop/storemngchange.html
  11. 16 5
      kmall-admin/src/main/webapp/js/shop/storemngchange.js
  12. 1 1
      kmall-api/src/main/java/com/kmall/api/api/ApiCartController.java
  13. 0 1
      kmall-api/src/main/java/com/kmall/api/api/ApiOrderController.java
  14. 2 0
      kmall-api/src/main/java/com/kmall/api/dao/ApiGoodsMapper.java
  15. 13 0
      kmall-api/src/main/java/com/kmall/api/entity/GoodsVo.java
  16. 1 0
      kmall-api/src/main/java/com/kmall/api/service/ApiGoodsService.java
  17. 45 21
      kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java
  18. 5 52
      kmall-api/src/main/resources/mybatis/mapper/ApiCartMapper.xml
  19. 2 5
      kmall-api/src/main/resources/mybatis/mapper/ApiFootprintMapper.xml
  20. 11 4
      kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml
  21. 6 1
      kmall-common/pom.xml
  22. 33 0
      kmall-common/src/main/java/com/kmall/common/constant/Dict.java
  23. 1 1
      kmall-common/src/main/java/com/kmall/common/fileserver/util/FileManager.java
  24. 3 1
      kmall-common/src/main/java/com/kmall/common/utils/DateUtils.java
  25. 1 1
      kmall-common/src/main/java/com/kmall/common/utils/JacksonStringUnicodeSerializer.java
  26. 61 0
      kmall-common/src/main/java/com/kmall/common/utils/file/FileUploadUtil.java
  27. 6 0
      kmall-schedule/src/main/java/com/kmall/schedule/dao/QzOrderMapper.java
  28. 28 17
      kmall-schedule/src/main/java/com/kmall/schedule/quartz/OrderTask.java
  29. 91 4
      kmall-schedule/src/main/java/com/kmall/schedule/service/QzOrderService.java
  30. 20 4
      kmall-schedule/src/main/resources/mybatis/mapper/QzOrderMapper.xml

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -421,8 +421,8 @@ public class OrderController {
                 orderRefundService.update(orderRefund);//退款记录
             }
             OrderExceptionRecordEntity mallOrderExceptionRecord = new OrderExceptionRecordEntity();
-            mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
             mallOrderExceptionRecord.setOrderSn(orderInfo.getOrderSn());
+            mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUserId() + ""));
             mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_03.getItem());
             mallOrderExceptionRecord.setExceptionContent("退款失败" + result.getErr_code_des());
             mallOrderExceptionRecord.setCreateTime(new Date());
@@ -447,8 +447,8 @@ public class OrderController {
             OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
             OrderRefundEntity orderRefund = new OrderRefundEntity();
             orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
-            orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
             orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
+            orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().doubleValue()));
 //            orderRefund.setOutRefundNo(result.getOut_refund_no());
             orderRefund.setModTime(new Date());
             if (mallOrderRefund != null) {

+ 3 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java

@@ -52,7 +52,8 @@ public class ProductStoreRelaController {
         Query query = new Query(params);
 
         List<ProductStoreRelaEntity> productStoreRelaList = productStoreRelaService.queryList(query);
-        /*for (ProductStoreRelaEntity pro: productStoreRelaList) {
+        //共享库存以商品总库存为准
+        for (ProductStoreRelaEntity pro: productStoreRelaList) {
             if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getIsStockShare())) {
                 if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getGoodsBizType())) {
                     if (pro.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
@@ -62,7 +63,7 @@ public class ProductStoreRelaController {
                     }
                 }
             }
-        }*/
+        }
         int total = productStoreRelaService.queryTotal(query);
 
         PageUtils pageUtil = new PageUtils(productStoreRelaList, total, query.getLimit(), query.getPage());

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java

@@ -63,4 +63,10 @@ public interface ProductStoreRelaDao extends BaseDao<ProductStoreRelaEntity> {
      * @return 总数
      */
     int queryGoodsRealListByTopicIdTotal(Map<String, Object> map);
+
+    /**
+     * 共享库存商品库存变化,修改该商品的所有库存信息
+     * @param productStoreRelaEntity
+     */
+    void updateStockNumByGoodsId(ProductStoreRelaEntity productStoreRelaEntity);
 }

+ 13 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java

@@ -192,6 +192,19 @@ public class GoodsEntity implements Serializable {
     private String goodsIsStockShare;
     private String isStockShareBySuppler;
 
+    /**
+     * 商品库存数量变化后是否已共享,0:否,1:是(下单、退款、取消订单触发)
+     */
+    private String isGoodsShareStock;
+
+    public String getIsGoodsShareStock() {
+        return isGoodsShareStock;
+    }
+
+    public void setIsGoodsShareStock(String isGoodsShareStock) {
+        this.isGoodsShareStock = isGoodsShareStock;
+    }
+
     public String getIsSupplierGoods() {
         return isSupplierGoods;
     }

+ 36 - 23
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -58,6 +58,8 @@ public class GoodsServiceImpl implements GoodsService {
     private MngChangeDao mngChangeDao;
     @Autowired
     private MerchUserDao merchUserDao;
+    @Autowired
+    private StoreMngChangeDao storeMngChangeDao;
 
     @Override
     public GoodsEntity queryObject(Integer id) {
@@ -407,29 +409,6 @@ public class GoodsServiceImpl implements GoodsService {
         if (productStoreRelaEntityList != null && productStoreRelaEntityList.size() > 0) {
             for (int i = 0; i < productStoreRelaEntityList.size(); i++) {
                 //修改该商品的所属商户信息,如在该商户门店中有该上架的商品信息,则提示该商品不能修改
-                /*if(org.apache.commons.lang3.StringUtils.isNotEmpty(productStoreRela.getMerchSn()) && productStoreRela.getMerchSn().equalsIgnoreCase(goods.getMerchSn())
-                        && goods.getIsOnSale() == Integer.parseInt(Dict.isOnSale.item_1.getItem())) {
-                    if (goods.getRetailPrice() != null) {
-                        productStoreRela.setRetailPrice(goods.getRetailPrice());
-                    }
-                    if (goods.getMarketPrice() != null) {
-                        productStoreRela.setMarketPrice(goods.getMarketPrice());
-                    }
-                    productStoreRelaDao.update(productStoreRela);
-                }else {
-                    if (goods.getIsOnSale() == Integer.parseInt(Dict.isOnSale.item_0.getItem())) {
-                        if (goods.getRetailPrice() != null) {
-                            productStoreRela.setRetailPrice(goods.getRetailPrice());
-                        }
-                        if (goods.getMarketPrice() != null) {
-                            productStoreRela.setMarketPrice(goods.getMarketPrice());
-                        }
-                        productStoreRela.setMerchSn("");
-                        productStoreRelaDao.update(productStoreRela);
-                    } else {
-                        throw new RRException("商品编码为【" + goods.getGoodsSn() + "】的商品已上架在商户编号为【" + productStoreRela.getMerchSn() + "】的门店中,可先将该商品下架后再进行修改!");
-                    }
-                }*/
                 ProductStoreRelaEntity relaEntity = productStoreRelaEntityList.get(i);
                 if(org.apache.commons.lang3.StringUtils.isNotEmpty(relaEntity.getMerchSn()) && relaEntity.getMerchSn().equalsIgnoreCase(goods.getMerchSn())
                         && goods.getIsOnSale() == Integer.parseInt(Dict.isOnSale.item_1.getItem())) {
@@ -446,6 +425,40 @@ public class GoodsServiceImpl implements GoodsService {
             if (goodsNumber < storeTotalGoodsNumber) {
                 throw new RRException("该商品已在各门店分配库存" + storeTotalGoodsNumber + ",当前商品总库存不能小于分配库存总额!请先修改门店库存!");
             }
+        }else{
+            //共享库存商品库存变化,修改该商品的所有库存信息
+            ProductStoreRelaEntity productStoreRelaEntity = new ProductStoreRelaEntity();
+            productStoreRelaEntity.setStockNum(goodsNumber);
+            productStoreRelaEntity.setGoodsId(goods.getId());
+            productStoreRelaDao.updateStockNumByGoodsId(productStoreRelaEntity);
+
+            for (int i = 0; i < productStoreRelaEntityList.size(); i++) {
+                ProductStoreRelaEntity relaEntity = productStoreRelaEntityList.get(i);
+                //新增库存操作记录
+                StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+                storeMngChangeEntity.setChangeReason("共享库存变更,更新门店商品库存");
+                storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(relaEntity.getGoodsId())));
+                storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(relaEntity.getStoreId())));
+                storeMngChangeEntity.setMerchSn(goods.getMerchSn());
+                storeMngChangeEntity.setCreateTime(new Date());
+                storeMngChangeEntity.setModTime(new Date());
+                storeMngChangeEntity.setCreaterSn(user.getUsername());
+                storeMngChangeEntity.setModerSn(user.getUsername());
+                storeMngChangeEntity.setIsValid(0);
+                Integer orginalNum = relaEntity.getStockNum()==null?0:relaEntity.getStockNum();//原有库存
+                if(goodsNumber != orginalNum) {
+                    if (orginalNum > goodsNumber) {
+                        storeMngChangeEntity.setChangeType(Dict.changeType.item_4.getItem());
+                        storeMngChangeEntity.setStoreChangeNum(orginalNum - goodsNumber);//变化数
+                    } else {
+                        storeMngChangeEntity.setChangeType(Dict.changeType.item_3.getItem());
+                        storeMngChangeEntity.setStoreChangeNum(goodsNumber - orginalNum);//变化数
+                    }
+                    storeMngChangeEntity.setStoreOriginalNum(orginalNum);//原库存数
+                    storeMngChangeEntity.setStoreValidNum(goodsNumber);//可用数
+                    storeMngChangeDao.save(storeMngChangeEntity);
+                }
+            }
         }
 
         Map cartMap = Maps.newHashMap();

+ 31 - 7
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -428,7 +428,7 @@ public class OrderServiceImpl implements OrderService {
     }
 
     private void updateStock(OrderEntity order, String changeReason){
-        Map<String, Object> map = new HashMap<String, Object>();
+        Map<String, Object> map = new HashMap();
         SysUserEntity user = ShiroUtils.getUserEntity();
         map.put("orderId", order.getId());
         List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
@@ -444,22 +444,46 @@ public class OrderServiceImpl implements OrderService {
             }
 
             Integer stockNum = 0;
-            // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-            if (null != storeRelaEntity.getStockNum()) {
-                stockNum = storeRelaEntity.getStockNum();
-                //还原门店库存
-                resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
-            }
             GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
             if(goodsEntity != null){
                 stockNum = goodsEntity.getGoodsNumber();
                 //还原商户商品库存
                 resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
             }
+            if (null != storeRelaEntity.getStockNum()) {
+                stockNum = storeRelaEntity.getStockNum();
+                //普通商品不受共享库存影响,直接取门店配置库存
+                //该商品所属第三方商户不是共享库存
+                if(goodsEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+                    resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
+                }else{
+                    //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
+                    if(!goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                        resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
+                    }
+                }
+            }
+            //该商品所属第三方商户为共享库存,且是保税备货商品,取消订单时改变
+            updateGoodsByIsShareStock(goodsEntity);
         }
     }
 
     /**
+     * 更新商品库存数量变化后是否已共享为0“未共享”
+     * @param goodsInfo
+     */
+    private void updateGoodsByIsShareStock(GoodsEntity goodsInfo){
+        //该商品所属第三方商户为共享库存,且是保税备货商品
+        if(goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())
+                && goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+            GoodsEntity goodsVo = new GoodsEntity();
+            goodsVo.setId(goodsInfo.getId());
+            //商品库存数量变化后是否已共享,0:否,1:是(下单、退款触发)
+            goodsVo.setIsGoodsShareStock(Dict.isGoodsShareStock.item_0.getItem());
+            goodsDao.update(goodsVo);
+        }
+    }
+    /**
      * 还原商品总库存
      * @param stockNum
      * @param storeRelaEntity

+ 4 - 0
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -66,6 +66,7 @@
         <result column="isStockShare" property="isStockShare" />
         <result column="gross_weight" property="grossWeight" />
         <result column="net_weight" property="netWeight" />
+        <result property="isGoodsShareStock" column="is_goods_share_stock"/>
 
     </resultMap>
 
@@ -386,6 +387,7 @@
 			`is_app_exclusive`,
             `gross_weight`,
             `net_weight`,
+            is_goods_share_stock,
 			`is_limited`,
 			`is_hot`,
 			`creater_sn`,
@@ -433,6 +435,7 @@
 			#{isAppExclusive},
             #{grossWeight},
             #{netWeight},
+            #{isGoodsShareStock},
 			#{isLimited},
 			#{isHot},
 			#{createrSn},
@@ -484,6 +487,7 @@
             <if test="isAppExclusive != null">`is_app_exclusive` = #{isAppExclusive}, </if>
             <if test="grossWeight != null">`gross_weight` = #{grossWeight}, </if>
             <if test="netWeight != null">`net_weight` = #{netWeight}, </if>
+            <if test="isGoodsShareStock != null">`is_goods_share_stock` = #{isGoodsShareStock}, </if>
             <if test="isLimited != null">`is_limited` = #{isLimited}, </if>
             <if test="isHot != null">`is_hot` = #{isHot}, </if>
             <if test="createrSn != null">`creater_sn` = #{createrSn}, </if>

+ 8 - 0
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -671,4 +671,12 @@
         </if>
     </select>
 
+    <update id="updateStockNumByGoodsId" parameterType="com.kmall.admin.entity.ProductStoreRelaEntity">
+        update mall_product_store_rela a
+        <set>
+            <if test="stockNum != null">a.`stock_num` = #{stockNum},</if>
+        </set>
+        where a.goods_id = #{goodsId}
+    </update>
+
 </mapper>

+ 5 - 5
kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html

@@ -52,15 +52,15 @@
         <Row :gutter="16">
             <div class="search-group">
                 <i-col span="3">
-                    <i-select v-model="q.storeId" placeholder="门店" filterable label-in-value>
-                        <i-option v-for="store in stores" :value="store.id"
-                                  :key="store.id">{{store.storeName}}
+                    <i-select v-model="q.thirdPartyMerchCode" placeholder="所属三方商户" filterable >
+                        <i-option v-for="thirdMerchant in thirdMerchantBizShowList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}
                         </i-option>
                     </i-select>
                 </i-col>
                 <i-col span="3">
-                    <i-select v-model="q.thirdPartyMerchCode" placeholder="所属三方商户" filterable >
-                        <i-option v-for="thirdMerchant in thirdMerchantBizShowList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}
+                    <i-select v-model="q.storeId" placeholder="门店" filterable label-in-value>
+                        <i-option v-for="store in stores" :value="store.id"
+                                  :key="store.id">{{store.storeName}}
                         </i-option>
                     </i-select>
                 </i-col>

+ 8 - 1
kmall-admin/src/main/webapp/WEB-INF/page/shop/storemngchange.html

@@ -9,9 +9,16 @@
 	<div v-show="showList">
         <Row :gutter="16">
             <div class="search-group">
+                <i-col span="3">
+                    <i-select v-model="q.storeId" placeholder="门店" filterable label-in-value @on-change="changeGoods">
+                        <i-option v-for="store in stores" :value="store.id"
+                                  :key="store.id">{{store.storeName}}
+                        </i-option>
+                    </i-select>
+                </i-col>
                 <i-col span="4">
                     <i-select v-model="q.goodsId" filterable placeholder="商品" label-in-value>
-                        <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                        <i-option v-for="goods in goodss" :value="goods.goodsId" :key="goods.goodsId">{{goods.goodsName}}</i-option>
                     </i-select>
                 </i-col>
                 <i-col span="4">

+ 16 - 5
kmall-admin/src/main/webapp/js/shop/storemngchange.js

@@ -84,9 +84,11 @@ let vm = new Vue({
 		},
 		q: {
             goodsId: '',
-            changeType: ''
+            changeType: '',
+            storeId: ''
 		},
         goodss: [],
+        stores: [],
         macros: []
 	},
 	methods: {
@@ -155,10 +157,19 @@ let vm = new Vue({
                 vm.storeMngChange = r.storeMngChange;
             });
 		},
+        changeGoods:function (opt) {
+		    var storeId = opt.value;
+		    if(storeId){
+                $.get("../productstorerela/queryAll?storeId=" + storeId, function (r) {
+                    vm.goodss = r.list;
+                });
+            }
+        },
         reloadSearch: function() {
             vm.q = {
                 goodsId: '',
-                changeType: ''
+                changeType: '',
+                storeId: ''
             }
             vm.reload();
 		},
@@ -166,7 +177,7 @@ let vm = new Vue({
 			vm.showList = true;
             let page = $("#jqGrid").jqGrid('getGridParam', 'page');
 			$("#jqGrid").jqGrid('setGridParam', {
-                postData: {'goodsId': vm.q.goodsId,'changeType': vm.q.changeType},
+                postData: {'goodsId': vm.q.goodsId,'changeType': vm.q.changeType,'storeId':vm.q.storeId},
                 page: page
             }).trigger("reloadGrid");
             vm.handleReset('formValidate');
@@ -185,8 +196,8 @@ let vm = new Vue({
         /*$.get("../category/getCategorySelect", function (r) {
             vm.queryCategories = r.list;
         });*/
-        $.get("../goods/queryAll", function (r) {
-            vm.goodss = r.list;
+        $.get("../store/queryAll", function (r) {
+            vm.stores = r.list;
         });
 
         $.get("../sys/macro/queryMacrosByValue?value=changeType", function (r) {

+ 1 - 1
kmall-api/src/main/java/com/kmall/api/api/ApiCartController.java

@@ -85,7 +85,6 @@ public class ApiCartController extends ApiBaseAction {
         param.put("store_id", storeId);
         param.put("merchSn", getMerchSn());
         param.put("checkCart", checkCart);
-//        param.putAll(setIsStockShare(storeId));
         param.put("isStockShare", StockUtil.getIsStockShareByStore(storeId,apiStoreService,apiThirdMerchantBizService));
         List<CartVo> cartList = cartService.queryList(param);
         List<CartVo> validCartList = cartService.queryValidCartList(param);
@@ -788,6 +787,7 @@ public class ApiCartController extends ApiBaseAction {
             param.put("user_id", getUserId());
             Long storeId = getStoreId();
             param.put("store_id", storeId);
+            param.put("checkCart", checkCart);
             List<CartVo> list = cartService.queryValidCartList(param);
             for (CartVo cart: list) {
                 cartService.delete(cart.getId());

+ 0 - 1
kmall-api/src/main/java/com/kmall/api/api/ApiOrderController.java

@@ -86,7 +86,6 @@ public class ApiOrderController extends ApiBaseAction {
         params.put("limit", size);
         params.put("sidx", "add_time");
         params.put("order", "desc");
-        params.put("size", "desc");
         if(order_status != null) {
             if (order_status == Integer.parseInt(Dict.orderStatus.item_401.getItem())) {
                 params.put("pay_status", Dict.payStatus.item_4.getItem());

+ 2 - 0
kmall-api/src/main/java/com/kmall/api/dao/ApiGoodsMapper.java

@@ -30,4 +30,6 @@ public interface ApiGoodsMapper extends BaseDao<GoodsVo> {
     void updateGoodsStock(GoodsVo goodsVo);
 
     Integer selectCountByCatalogProductList(Map<String, Object> params);
+
+    void updateByGoodsShareStock(GoodsVo goodsVo);
 }

+ 13 - 0
kmall-api/src/main/java/com/kmall/api/entity/GoodsVo.java

@@ -127,6 +127,19 @@ public class GoodsVo implements Serializable {
      */
     private String isSupplierGoods;
 
+    /**
+     * 商品库存数量变化后是否已共享,0:否,1:是(下单、退款、取消订单触发)
+     */
+    private String isGoodsShareStock;
+
+    public String getIsGoodsShareStock() {
+        return isGoodsShareStock;
+    }
+
+    public void setIsGoodsShareStock(String isGoodsShareStock) {
+        this.isGoodsShareStock = isGoodsShareStock;
+    }
+
     public String getIsSupplierGoods() {
         return isSupplierGoods;
     }

+ 1 - 0
kmall-api/src/main/java/com/kmall/api/service/ApiGoodsService.java

@@ -244,6 +244,7 @@ public class ApiGoodsService {
                 }
             }
         }
+        info.setStock_num(stockNum);
         resultObj.put("info", info);
 
         resultObj.put("attribute", attribute);

+ 45 - 21
kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java

@@ -135,13 +135,22 @@ public class ApiOrderService {
             if (null == goodsInfo || goodsInfo.getIs_delete() == 1 || goodsInfo.getIs_on_sale() == 0) {
                 throw new RRException("订单提交失败:商品不存在");
             }
+            //普通、门店商品不受共享库存影响,直接取门店配置库存
 //            Integer stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
-//            String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
-            // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-            //还原门店库存
-            resetStoreGoodsStock(goodsInfo.getStockNum(), productInfo, goodsInfo, orderGoodsVo, userName);
-            //还原商户商品库存
+            String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
+            //还原商户商品总库存
             resetGoodsStock(goodsInfo.getGoods_number(), productInfo, goodsInfo, orderGoodsVo, userName);
+            //该商品所属第三方商户不是共享库存
+            if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+                resetStoreGoodsStock(goodsInfo.getStockNum(), productInfo, goodsInfo, orderGoodsVo, userName);//还原门店库存
+            }else{
+                //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
+                if(!goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                    resetStoreGoodsStock(goodsInfo.getStockNum(), productInfo, goodsInfo, orderGoodsVo, userName);//还原门店库存
+                }
+            }
+            //该商品所属第三方商户为共享库存,且是保税备货商品,取消订单时改变
+            updateGoodsByIsShareStock(isStockShare, goodsInfo);
         }
         update(order);
         // 判断是否有优惠券
@@ -566,7 +575,7 @@ public class ApiOrderService {
         mngChangeVo.setChangeType(Dict.changeType.item_1.getItem());
         mngChangeVo.setChangeNum(goodsItem.getNumber());//变化数
         mngChangeVo.setOriginalNum(goodsVo.getGoods_number());//原库存数
-        mngChangeVo.setValidNum(goodsVo.getGoods_number() - goodsItem.getNumber());//可用数
+        mngChangeVo.setValidNum(goodsVo.getGoods_number());//可用数
         mngChangeVo.setCreateTime(new Date());
         mngChangeVo.setModTime(new Date());
         mngChangeVo.setCreaterSn("小程序用户"+userName);
@@ -592,7 +601,6 @@ public class ApiOrderService {
         //修改门店商品销量
         productInfo.setSell_volume(productInfo.getSell_volume() + goodsItem.getNumber());
         productInfo.setGoods_id(goodsVo.getId());
-//        productVos.add(productInfo);
         apiProductMapper.updateStockNum(productInfo);
         
         StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
@@ -603,7 +611,7 @@ public class ApiOrderService {
         storeMngChangeVo.setMerchSn(goodsVo.getMerchSn());
         storeMngChangeVo.setStoreChangeNum(goodsItem.getNumber());
         storeMngChangeVo.setStoreOriginalNum(stockNum);
-        storeMngChangeVo.setStoreValidNum(stockNum - goodsItem.getNumber());
+        storeMngChangeVo.setStoreValidNum(productInfo.getStock_num());
         storeMngChangeVo.setCreateTime(new Date());
         storeMngChangeVo.setModTime(new Date());
         storeMngChangeVo.setCreaterSn("小程序用户"+userName);
@@ -613,6 +621,23 @@ public class ApiOrderService {
     }
 
     /**
+     * 更新商品库存数量变化后是否已共享为0“未共享”
+     * @param isStockShare
+     * @param goodsInfo
+     */
+    private void updateGoodsByIsShareStock(String isStockShare, GoodsVo goodsInfo){
+        //该商品为共享库存,且是保税备货商品
+        if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())
+                && goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+            GoodsVo goodsVo = new GoodsVo();
+            goodsVo.setId(goodsInfo.getId());
+            //商品库存数量变化后是否已共享,0:否,1:是(下单、退款触发)
+            goodsVo.setIsGoodsShareStock(Dict.isGoodsShareStock.item_0.getItem());
+            apiGoodsMapper.updateByGoodsShareStock(goodsVo);
+        }
+    }
+
+    /**
      * 检查库存和更新库存
      * @param checkedGoodsList
      * @param storeId
@@ -633,19 +658,9 @@ public class ApiOrderService {
                     logger.error("订单提交失败:商品已下架");
                     throw new RRException("订单提交失败:商品已下架");
                 }
-//                String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
+                String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
                 // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
                 stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
-                /*if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
-                    if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                        stockNum = goodsInfo.getGoods_number();
-                    }
-                    if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
-                        stockNum = productInfo.getStock_num();
-                    }
-                }else {
-                    stockNum = productInfo.getStock_num();
-                }*/
                 if (null == stockNum || stockNum < goodsItem.getNumber() || stockNum <= 0) {
                     logger.error("订单提交失败:库存不足,仅剩余" + stockNum);
                     throw new RRException("订单提交失败:库存不足,仅剩余" + stockNum);
@@ -653,8 +668,17 @@ public class ApiOrderService {
                     productInfo.setStore_id(storeId);
                     //扣减商户商品总库存
                     updateGoodsStock(goodsInfo, goodsItem, userName);
-                    //扣减门店库存
-                    updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
+                    //该商品所属第三方商户不是共享库存
+                    if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+                        updateStock(productInfo, goodsInfo, stockNum, goodsItem, storeId, userName);//扣减门店库存
+                    }else{
+                        //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
+                        if(!goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                            updateStock(productInfo, goodsInfo, stockNum, goodsItem, storeId, userName);//扣减门店库存
+                        }
+                    }
+                    //该商品所属第三方商户为共享库存,且是保税备货商品,下单时改变
+                    updateGoodsByIsShareStock(isStockShare, goodsInfo);
                 }
             }
         }

+ 5 - 52
kmall-api/src/main/resources/mybatis/mapper/ApiCartMapper.xml

@@ -79,24 +79,8 @@
         LEFT JOIN mk_store_camp_minus_goods g ON g.store_rela_id = psr.id
         AND apply_type != '02'
         LEFT JOIN mk_store_camp_minus m ON m.camp_minus_id = g.camp_minus_id
-        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1 and psr.stock_num > 0
-        <!--<if test="checkCart == null">
-            <if test="isStockShare == 1 and goodsBizType == 00">
-                and b.goods_number > 0
-            </if>
-            <if test="isStockShare == 1 and goodsBizType != 00">
-                and psr.stock_num > 0
-            </if>
-            <if test="isStockShare == 0">
-                and psr.stock_num > 0
-            </if>
-        </if>-->
-        <!--<if test="isStockShare == 1 and (checkCart != null and checkCart != '11')">-->
-            <!--and b.goods_number > 0-->
-        <!--</if>-->
-        <!--<if test="isStockShare == 0 and (checkCart != null and checkCart != '11')">-->
-            <!--and psr.stock_num > 0-->
-        <!--</if>-->
+        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1 and b.goods_number > 0
+        and psr.stock_num > 0
         <if test="checkCart != null and checkCart == '11'">
             and b.goods_biz_type = '11'
         </if>
@@ -152,22 +136,10 @@
         LEFT JOIN mall_store s ON s.id = psr.store_id
         LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code
         LEFT JOIN third_merchant_biz mb2 ON b.third_party_merch_code = mb2.third_party_merch_code
-        where 1 = 1
-        <!--<if test="isStockShare == 1 and checkCart != null and checkCart != '11'">-->
-        <!--and (b.goods_number = 0 or b.is_on_sale = 0)-->
-        <!--</if>-->
-        <!--<if test="isStockShare == 0 and checkCart != null and checkCart != '11'">-->
-        <!--and (psr.stock_num = 0 or b.is_on_sale = 0)-->
-        <!--</if>-->
+        where 1 = 1 and (b.goods_number = 0 or psr.stock_num = 0 or b.is_on_sale = 0)
         <if test="checkCart != null and checkCart != '11'">
             and b.goods_biz_type != '11'
         </if>
-        <if test="checkCart != null and checkCart != '11'">
-            and (psr.stock_num = 0 or b.is_on_sale = 0)
-        </if>
-        <if test="checkCart != null and checkCart == '11'">
-            and (psr.stock_num = 0 or b.is_on_sale = 0)
-        </if>
         <if test="checkCart != null and checkCart == '11'">
             and b.goods_biz_type = '11'
         </if>
@@ -217,27 +189,8 @@
         LEFT JOIN mk_store_camp_minus_goods g ON g.store_rela_id = psr.id
         AND apply_type != '02'
         LEFT JOIN mk_store_camp_minus m ON m.camp_minus_id = g.camp_minus_id
-        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1
-        <if test="checkCart == null">
-            <if test="isStockShare == 1 and goodsBizType == 00">
-                and b.goods_number > 0
-            </if>
-            <if test="isStockShare == 1 and goodsBizType != 00">
-                and psr.stock_num > 0
-            </if>
-            <if test="isStockShare == 0">
-                and psr.stock_num > 0
-            </if>
-        </if>
-        <!--<if test="isStockShare == 1 and (checkCart != null and checkCart != '11')">-->
-        <!--and b.goods_number > 0-->
-        <!--</if>-->
-        <!--<if test="isStockShare == 0 and (checkCart != null and checkCart != '11')">-->
-        <!--and psr.stock_num > 0-->
-        <!--</if>-->
-        <if test="checkCart != null and checkCart == '11'">
-            and psr.stock_num > 0 and b.goods_biz_type = '11'
-        </if>
+        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1 and b.goods_number > 0
+        and psr.stock_num > 0
         <if test="checkCart != null and checkCart != '11'">
             and b.goods_biz_type != '11'
         </if>

+ 2 - 5
kmall-api/src/main/resources/mybatis/mapper/ApiFootprintMapper.xml

@@ -35,12 +35,9 @@
         left join mall_goods g on f.goods_id = g.id
         LEFT JOIN mall_product_store_rela psr ON psr.goods_id = g.id and g.merch_sn = psr.merch_sn
         <where>
-            1=1 and g.is_delete = 0 and g.is_on_sale = 1
+            1=1 and g.is_delete = 0 and g.is_on_sale = 1 and g.goods_number > 0
             <if test="bizType == true">
-                <if test="isStockShare == 1 and (checkCart != null and checkCart == '00')">
-                    and g.goods_number > 0
-                </if>
-                <if test="isStockShare == 0 and (checkCart != null and checkCart == '00')">
+                <if test="isStockShare == 0">
                     and psr.stock_num > 0
                 </if>
                 <if test="checkCart != null and checkCart == '11'">

+ 11 - 4
kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml

@@ -52,6 +52,7 @@
         <result column="third_party_merch_code" property="thirdPartyMerchCode" />
         <result column="isStockShare" property="isStockShare" />
         <result property="goods_sell_volume" column="goods_sell_volume"/>
+        <result property="isGoodsShareStock" column="is_goods_share_stock"/>
 
     </resultMap>
 
@@ -245,10 +246,7 @@
         LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code AND mb.merch_sn = s.merch_sn
         LEFT JOIN mall_product b ON b.id = psr1.product_id
         LEFT JOIN mall_category c ON psr1.category_id = c.id
-        where 1 = 1
-        <if test="isStockShare == 1">
-            and (a.goods_number > 0  or psr1.stock_num > 0 )
-        </if>
+        where 1 = 1 and a.goods_number > 0
         <if test="isStockShare == 0">
             and psr1.stock_num > 0
         </if>
@@ -502,4 +500,13 @@
         </set>
         where a.id = #{id}
     </update>
+
+
+    <update id="updateByGoodsShareStock" parameterType="com.kmall.api.entity.GoodsVo">
+        update mall_goods
+        <set>
+            <if test="isGoodsShareStock != null">`is_goods_share_stock` = #{isGoodsShareStock} </if>
+        </set>
+        where id = #{id}
+    </update>
 </mapper>

+ 6 - 1
kmall-common/pom.xml

@@ -18,7 +18,7 @@
         <qiniu-version>[7.2.0, 7.2.99]</qiniu-version>
         <aliyun-oss-version>2.5.0</aliyun-oss-version>
         <qcloud-cos-version>4.4</qcloud-cos-version>
-        <jackson.version>2.5.0</jackson.version>
+        <jackson.version>2.5.1</jackson.version>
         <jackson.core.version>2.7.3</jackson.core.version>
         <poi.version>3.15</poi.version>
         <poi.ooxml.version>3.15</poi.ooxml.version>
@@ -71,6 +71,11 @@
             <artifactId>jackson-databind</artifactId>
             <version>${jackson.version}</version>
         </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.fasterxml.jackson.dataformat</groupId>-->
+            <!--<artifactId>jackson-dataformat-xml</artifactId>-->
+            <!--<version>2.8.10</version>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>dom4j</groupId>

+ 33 - 0
kmall-common/src/main/java/com/kmall/common/constant/Dict.java

@@ -1463,4 +1463,37 @@ public class Dict {
             this.itemName = itemName;
         }
     }
+
+    /**
+     * 商品库存数量变化后是否已共享,0:否,1:是(下单、退款、取消订单触发)
+     */
+    public enum isGoodsShareStock {
+        item_0("0", "否"),
+        item_1("1", "是");
+
+        private String item;
+        private String itemName;
+
+        isGoodsShareStock(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+    }
+
 }

+ 1 - 1
kmall-common/src/main/java/com/kmall/common/fileserver/util/FileManager.java

@@ -57,7 +57,7 @@ public class FileManager implements Serializable {
      * <strong>方法概要: 文件上传</strong> <br>
      * <strong>创建时间: 2016-9-26 上午10:26:11</strong> <br>
      *
-     * @param FastDFSFile file
+     * @param attach file
      * @return fileAbsolutePath
      * @author Wang Liang
      */

+ 3 - 1
kmall-common/src/main/java/com/kmall/common/utils/DateUtils.java

@@ -201,7 +201,7 @@ public class DateUtils {
     }
 
     /**
-     * true为开始时间小于结束时间,false为开始时间大于结束时间
+     * true为开始时间小于或等于结束时间,false为开始时间大于结束时间
      * @param startDate
      * @param endDate
      * @return
@@ -238,6 +238,8 @@ public class DateUtils {
 //        System.out.println(DateUtils.getDateFormat(str));
 //        System.out.println(DateUtils.addDay(2));
 
+        System.out.println(DateUtils.compareDate(new Date(), new Date()));
         System.out.println(new BigDecimal("11").compareTo(new BigDecimal("11")));
+        System.out.println(BigDecimal.valueOf(Double.valueOf("0.112")));
     }
 }

+ 1 - 1
kmall-common/src/main/java/com/kmall/common/utils/JacksonStringUnicodeSerializer.java

@@ -45,7 +45,7 @@ public class JacksonStringUnicodeSerializer extends JsonSerializer<String> {
 	        gen.writeRaw(',');
 	        break;
 	      case JsonWriteContext.STATUS_EXPECT_NAME:
-	        throw new JsonParseException(null, "Can not write string value here");
+	        throw new JsonParseException("Can not write string value here", null);
 	    }
 	    gen.writeRaw('"');//写入JSON中字符串的开头引号
 	    for (char c : str.toCharArray()) {

+ 61 - 0
kmall-common/src/main/java/com/kmall/common/utils/file/FileUploadUtil.java

@@ -14,6 +14,12 @@ import org.apache.http.protocol.HTTP;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
 import java.io.*;
 import java.nio.file.Files;
 
@@ -73,6 +79,7 @@ public class FileUploadUtil {
                 IOUtils.copy(input, os);
                 MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
                 String url = FileManager.upload(multipartFile);
+//                compressPic(url, url);
                 return url;
             }
         }catch (Exception e){
@@ -80,7 +87,61 @@ public class FileUploadUtil {
         }
         return "";
     }
+    public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {
+        File file = null;
+        BufferedImage src = null;
+        FileOutputStream out = null;
+        ImageWriter imgWrier;
+        ImageWriteParam imgWriteParams;
 
+        // 指定写图片的方式为 jpg
+        imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
+        imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
+                null);
+        // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
+        imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
+        // 这里指定压缩的程度,参数qality是取值0~1范围内,
+        imgWriteParams.setCompressionQuality((float)1);
+        imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
+        ColorModel colorModel = ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
+        // 指定压缩时使用的色彩模式
+//        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
+//                colorModel, colorModel.createCompatibleSampleModel(16, 16)));
+        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
+                colorModel, colorModel.createCompatibleSampleModel(16, 16)));
+
+        try {
+            if (isBlank(srcFilePath)) {
+                return false;
+            } else {
+                file = new File(srcFilePath);
+                System.out.println(file.length());
+                src = ImageIO.read(file);
+                out = new FileOutputStream(descFilePath);
+
+                imgWrier.reset();
+                // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
+                // OutputStream构造
+                imgWrier.setOutput(ImageIO.createImageOutputStream(out));
+                // 调用write方法,就可以向输入流写图片
+                imgWrier.write(null, new IIOImage(src, null, null),
+                        imgWriteParams);
+                out.flush();
+                out.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    public static boolean isBlank(String string) {
+        if (string == null || string.length() == 0 || string.trim().equals("")) {
+            return true;
+        }
+        return false;
+    }
 
     private static void deleteFile(File dirFile){
         if(dirFile.exists()){

+ 6 - 0
kmall-schedule/src/main/java/com/kmall/schedule/dao/QzOrderMapper.java

@@ -94,4 +94,10 @@ public interface QzOrderMapper {
     List<Map> queryOrderIdByOrderGoodsList();
 
     Map queryOrderCountByIdAndPayStatus(@Param("storeRelaId") Integer storeRelaId);
+
+    List<Map> queryGoodsListByIsShareStock();
+
+    List<Map> queryStoreRelaListByGoodsId(@Param("goodsId") Integer goodsId);
+
+    void updateByGoodsShareStock(Map map);
 }

+ 28 - 17
kmall-schedule/src/main/java/com/kmall/schedule/quartz/OrderTask.java

@@ -48,7 +48,7 @@ public class OrderTask {
      * 方法描述:更新过期未支付订单
      * 二分钟更新未付款订单
      */
-    @Scheduled(fixedRate = 1000 * 60 * 2)
+//    @Scheduled(fixedRate = 1000 * 60 * 2)
     public void unpayPastUpdate() {
         logger.info(">>>>>>>>>>>>>>>>>>>>unpayPastUpdate is start ");
         qzOrderService.unpayPastUpdate();
@@ -59,7 +59,7 @@ public class OrderTask {
      * 方法描述:查询已申请退款订单以及退款中订单,查询微信退款更新订单状态
      * 二分钟更新订单
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void refundUpdate() {
         logger.info(">>>>>>>>>>>>>>>>>>>>refundUpdate is start ");
         qzOrderService.refundUpdate();
@@ -70,7 +70,7 @@ public class OrderTask {
      * 方法描述:查询支付中的订单以及小程序更新支付信息异常订单,查询微信订单信息更新订单状态
      * 二分钟更新订单
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void orderQueryUpdate() {
         logger.info(">>>>>>>>>>>>>>>>>>>>orderQueryUpdate is start ");
         qzOrderService.orderQueryUpdate();
@@ -81,7 +81,7 @@ public class OrderTask {
      * 方法描述:查询支付中的订单以及小程序更新支付信息异常订单,查询平安订单信息更新订单状态
      * 二分钟更新订单
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void pinganOrderQueryUpdate() {
         logger.info(">>>>>>>>>>>>>>>>>>>>pinganOrderQueryUpdate is start ");
         qzOrderService.pinganOrderQueryUpdate();
@@ -91,7 +91,7 @@ public class OrderTask {
     /**
      * 方法描述:商品发货后7天自动确认收货
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void shipmentOrderAutoTakeGoods() {
         logger.info(">>>>>>>>>>>>>>>>>>>>shipmentOrderAutoTakeGoods is start ");
         qzOrderService.shipmentOrderAutoTakeGoods();
@@ -101,7 +101,7 @@ public class OrderTask {
     /**
      * 方法描述:确认收货后30天自动确认好评
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void receiptOrderAutoComment() {
         logger.info(">>>>>>>>>>>>>>>>>>>>receiptOrderAutoComment is start ");
         qzOrderService.receiptOrderAutoComment();
@@ -112,7 +112,7 @@ public class OrderTask {
      * 方法描述:返回海关所需获取的支付相关实时数据
      * 五分钟更新未付款订单
      */
-    @Scheduled(fixedRate = 1000 * 60 * 5)
+//    @Scheduled(fixedRate = 1000 * 60 * 5)
     public void realTimeDataUp() {
         logger.info(">>>>>>>>>>>>>>>>>>>>realTimeDataUp is start ");
         qzOrderService.realTimeDataUp();
@@ -123,7 +123,7 @@ public class OrderTask {
      * 方法描述:用户确认收货后,记录商品分销购买记录
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void receiptOrderSaveDistSellStatis() {
         logger.info(">>>>>>>>>>>>>>>>>>>>receiptOrderSaveDistSellStatis is start ");
         qzOrderService.receiptOrderSaveDistSellStatis();
@@ -133,7 +133,7 @@ public class OrderTask {
      * 方法描述:查询渠道推广有效开始时间是否过期,过期则修改结束状态为已结束
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateQueryStoreProm() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateQueryStoreProm is start ");
         qzStorePromService.updateQueryStoreProm();
@@ -143,7 +143,7 @@ public class OrderTask {
      * 方法描述:支付成功且是渠道推广订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updatePromStatByPaySuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updatePromStatByPaySuccess is start ");
         qzStorePromService.updatePromStatByPaySuccess();
@@ -153,7 +153,7 @@ public class OrderTask {
      * 方法描述:退款成功且是渠道推广订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updatePromStatByRefundSuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updatePromStatByRefundSuccess is start ");
         qzStorePromService.updatePromStatByRefundSuccess();
@@ -163,7 +163,7 @@ public class OrderTask {
      * 方法描述:查询优惠券有效时间是否过期,修改过期优惠券数据结束状态为无效,修改过期用户优惠券状态为无效
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateQueryTicketDiscount() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateQueryTicketDiscount is start ");
         qzStoreTicketDiscountService.updateQueryTicketDiscount();
@@ -174,7 +174,7 @@ public class OrderTask {
      * 方法描述:支付成功且是门店优惠券活动订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateTopicStatByPaySuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateTopicStatByPaySuccess is start ");
         qzStoreTopicStatisService.updateTopicStatByPaySuccess();
@@ -185,7 +185,7 @@ public class OrderTask {
      * 方法描述:退款成功且是门店优惠券活动订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateTopicStatByRefundSuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateTopicStatByRefundSuccess is start ");
         qzStoreTopicStatisService.updateTopicStatByRefundSuccess();
@@ -196,7 +196,7 @@ public class OrderTask {
      * 方法描述:修改过期满减满折数据结束状态为无效,修改未开始且开始时间已小于或等于当前时间的满减满折结束状态为进行中
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateQueryStoreCampMinus() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateQueryStoreCampMinus is start ");
         qzStoreCampMinusService.updateQueryStoreCampMinus();
@@ -207,7 +207,7 @@ public class OrderTask {
      * 方法描述:支付成功且是门店促销满减活动订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateCampTopicStatByPaySuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateCampTopicStatByPaySuccess is start ");
         qzStoreTopicStatisService.updateCampTopicStatByPaySuccess();
@@ -218,7 +218,7 @@ public class OrderTask {
      * 方法描述:退款成功且是门店促销满减活动订单统计支付数据
      * 1分钟更新
      */
-    @Scheduled(fixedRate = 1000 * 60 * 1)
+//    @Scheduled(fixedRate = 1000 * 60 * 1)
     public void updateCampTopicStatByRefundSuccess() {
         logger.info(">>>>>>>>>>>>>>>>>>>>updateCampTopicStatByRefundSuccess is start ");
         qzStoreTopicStatisService.updateCampTopicStatByRefundSuccess();
@@ -231,4 +231,15 @@ public class OrderTask {
         qzOrderService.updateSellVolume();
         logger.info(">>>>>>>>>>>>>>>>>>>>updateSellVolume is end ");
     }*/
+
+    /**
+     * 查询商品库存数量变化后未共享的商品数据,批量修改该商品的门店商品库存信息
+     * 10秒执行一次
+     */
+//    @Scheduled(cron = "0/10 * * * * ?")
+    public void updateProductStoreByGoodsShareStock() {
+        logger.info(">>>>>>>>>>>>>>>>>>>>updateProductStoreByGoodsShareStock is start ");
+        qzOrderService.updateProductStoreByGoodsShareStock();
+        logger.info(">>>>>>>>>>>>>>>>>>>>updateProductStoreByGoodsShareStock is end ");
+    }
 }

+ 91 - 4
kmall-schedule/src/main/java/com/kmall/schedule/service/QzOrderService.java

@@ -301,7 +301,7 @@ public class QzOrderService {
                             refundRaram.put("wechat_refund_status_des", "退款成功");
                             orderRaram.put("payStatus", Dict.payStatus.item_4.getItem());
                             //退款成功释放库存、释放优惠券、释放促销满减
-                             restStockNum(map,"定时任务更新退款成功订单");//库存还原
+                            restStockNum(map,"定时任务更新退款成功订单");//库存还原
                             restUserCoupon(map);// 判断是否使用优惠券,修改为可使用
                             restUserCamp(map);// 判断是否使用促销满减活动,修改为可使用
                         } else if (result.getRefund_status().equalsIgnoreCase("REFUNDCLOSE")) {
@@ -587,7 +587,7 @@ public class QzOrderService {
                         wxOrderQuery(map);
                     }
                 }else{
-                    logger.info(">>>>>>>>>>>>>>>>>>>>refundUpdate 订单编号【"+orderId+"】的支付方式不能为空! ");
+                    logger.info(">>>>>>>>>>>>>>>>>>>>orderQueryUpdate 订单编号【"+orderId+"】的支付方式不能为空! ");
                 }
             }
         } else {
@@ -1240,10 +1240,70 @@ public class QzOrderService {
     }
 
     /**
+     * 查询商品库存数量变化后未共享的商品数据,批量修改该商品的门店商品库存信息
+     */
+    public void updateProductStoreByGoodsShareStock(){
+        logger.info(">>>>>>>>>>>>>>>>>>>>updateProductStoreByGoodsShareStock is start ");
+        logger.info(">>>>>>>>>>>>>>>>>>>>查询商品库存数量变化后未共享的商品数据,批量修改该商品的门店商品库存信息 ");
+
+        // 查询商品库存数量变化后未共享的商品数据
+        List<Map> goodsList = qzOrderMapper.queryGoodsListByIsShareStock();
+        if (null != goodsList && goodsList.size() > 0) {
+            for (Map map : goodsList) {
+                Integer goodsId = MapUtils.getInteger("goodsId", map);
+                Integer goodsNumber = MapUtils.getInteger("goodsNumber", map);
+                String merchSn = MapUtils.getString("merchSn", map);
+
+                List<Map> storeRelaList = qzOrderMapper.queryStoreRelaListByGoodsId(goodsId);
+                for (Map storeRelaMap : storeRelaList) {
+                    Integer storeRelaId = MapUtils.getInteger("storeRelaId", storeRelaMap);
+                    Integer storeId = MapUtils.getInteger("storeId", storeRelaMap);
+                    Integer stockNum = MapUtils.getInteger("stockNum", storeRelaMap);//原有库存
+                    Map param = Maps.newHashMap();
+                    param.put("id", storeRelaId);
+                    param.put("stock_num", goodsNumber);
+                    qzOrderMapper.updateStockNum(param);//修改该商品的门店商品库存信息
+
+                    StoreMngChangeJobEntity storeMngChangeJobEntity = new StoreMngChangeJobEntity();
+                    storeMngChangeJobEntity.setChangeReason("共享库存变更,门店商品库存同步更新");
+                    storeMngChangeJobEntity.setGoodsId(goodsId);
+                    storeMngChangeJobEntity.setStoreId(storeId);
+                    storeMngChangeJobEntity.setMerchSn(merchSn);
+                    storeMngChangeJobEntity.setCreateTime(new Date());
+                    storeMngChangeJobEntity.setModTime(new Date());
+                    storeMngChangeJobEntity.setCreaterSn("定时任务");
+                    storeMngChangeJobEntity.setModerSn("定时任务");
+                    storeMngChangeJobEntity.setIsValid(0);
+                    if(goodsNumber != stockNum) {
+                        if (stockNum > goodsNumber) {
+                            storeMngChangeJobEntity.setStoreChangeNum(stockNum - goodsNumber);//变化数
+                            storeMngChangeJobEntity.setChangeType(Dict.changeType.item_4.getItem());
+                        } else {
+                            storeMngChangeJobEntity.setChangeType(Dict.changeType.item_3.getItem());
+                            storeMngChangeJobEntity.setStoreChangeNum(goodsNumber - stockNum);//变化数
+                        }
+                        storeMngChangeJobEntity.setStoreOriginalNum(stockNum);//原库存数
+                        storeMngChangeJobEntity.setStoreValidNum(goodsNumber);//可用数
+                        qzOrderMapper.saveStoreMngChange(storeMngChangeJobEntity);
+                    }
+                }
+                Map goodsMap = new HashMap();
+                goodsMap.put("goodsId", goodsId);
+                //商品库存数量变化后是否已共享,0:否,1:是(下单、退款触发)
+                goodsMap.put("isGoodsShareStock", Dict.isGoodsShareStock.item_1.getItem());
+                qzOrderMapper.updateByGoodsShareStock(goodsMap);
+            }
+        }else{
+            logger.info(">>>>>>>>>>>>>>>>>>>>未查到商品库存数量变化后未共享的商品数据");
+        }
+        logger.info(">>>>>>>>>>>>>>>>>>>>updateProductStoreByGoodsShareStock is end ");
+
+    }
+
+    /**
      * 查询订单中支付成功的订单详情,更新详情中商品的销量信息
      */
     public void updateSellVolume(){
-
         logger.info(">>>>>>>>>>>>>>>>>>>>updateSellVolume is start ");
         logger.info(">>>>>>>>>>>>>>>>>>>>查询订单中支付成功的订单详情,更新详情中商品的销量信息 ");
 
@@ -1303,7 +1363,19 @@ public class QzOrderService {
     private void restStockNum(Map map, String changeReason){
         String isStockShare = getIsStockShareByGoodsVo(map);
         resetGoodsStockNum(map, changeReason);
-        resetStoreStockNumAndSellVolume(map, changeReason);
+        String goodsBizType = MapUtils.getString("goods_biz_type", map);
+        Integer goodsId = MapUtils.getInteger("goods_id", map);
+        //该商品所属第三方商户不是共享库存
+        if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+            resetStoreStockNumAndSellVolume(map, changeReason);//还原门店商品库存
+        }else{
+            //该商品所属第三方商户是共享库存,但商品业务类型不是00保税备货
+            if(!goodsBizType.equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                resetStoreStockNumAndSellVolume(map, changeReason);//还原门店商品库存
+            }
+        }
+        //该商品所属第三方商户为共享库存,且是保税备货商品,取消订单时改变
+        updateGoodsByIsShareStock(isStockShare, goodsBizType, goodsId);
     }
 
     /**
@@ -1377,6 +1449,21 @@ public class QzOrderService {
         storeMngChangeJobEntity.setIsValid(0);
         qzOrderMapper.saveStoreMngChange(storeMngChangeJobEntity);
     }
+    /**
+     * 更新商品库存数量变化后是否已共享为0“未共享”
+     * @param isStockShare
+     */
+    private void updateGoodsByIsShareStock(String isStockShare, String goodsBizType, Integer goodsId){
+        //该商品所属第三方商户为共享库存,且是保税备货商品
+        if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())
+                && goodsBizType.equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+            Map goodsMap = new HashMap();
+            goodsMap.put("goodsId", goodsId);
+            //商品库存数量变化后是否已共享,0:否,1:是(下单、退款触发)
+            goodsMap.put("isGoodsShareStock", Dict.isGoodsShareStock.item_0.getItem());
+            qzOrderMapper.updateByGoodsShareStock(goodsMap);
+        }
+    }
 
     private String getIsStockShareByGoodsVo(Map map){
         String isStockShare = "";

+ 20 - 4
kmall-schedule/src/main/resources/mybatis/mapper/QzOrderMapper.xml

@@ -34,7 +34,7 @@
         g.sell_volume 'goods_sell_volume',
         c.sell_volume 'store_sell_volume',
         a.id 'orderId',
-        mb.is_stock_share,
+        mb.is_stock_share 'isStockShare',
         mb.third_party_merch_code,
         mb.is_supplier_goods 'isSupplierGoods',
         mb2.third_party_merch_code 'supplierThirdMerchCode',
@@ -173,7 +173,7 @@
         g.goods_biz_type,
         g.sell_volume 'goods_sell_volume',
         c.sell_volume 'store_sell_volume',
-        mb.is_stock_share,
+        mb.is_stock_share 'isStockShare',
         mb.third_party_merch_code,
         mb.is_supplier_goods 'isSupplierGoods',
         mb2.third_party_merch_code 'supplierThirdMerchCode',
@@ -216,7 +216,7 @@
         mb.third_party_merch_code,
         g.sell_volume 'goods_sell_volume',
         c.sell_volume 'store_sell_volume',
-        mb.is_stock_share,
+        mb.is_stock_share 'isStockShare',
         mb.third_party_merch_code,
         mb.is_supplier_goods 'isSupplierGoods',
         mb2.third_party_merch_code 'supplierThirdMerchCode',
@@ -263,7 +263,7 @@
         mb.third_party_merch_code,
         g.sell_volume 'goods_sell_volume',
         c.sell_volume 'store_sell_volume',
-        mb.is_stock_share,
+        mb.is_stock_share 'isStockShare',
         mb.third_party_merch_code,
         mb.is_supplier_goods 'isSupplierGoods',
         mb2.third_party_merch_code 'supplierThirdMerchCode',
@@ -572,4 +572,20 @@
             AND p.goods_id = gs.id where o.pay_status = 2
             AND is_onffline_order = 0 and p.id= #{storeRelaId}
     </select>
+
+    <select id="queryGoodsListByIsShareStock" resultType="map">
+        SELECT g.id 'goodsId',g.goods_number 'goodsNumber',g.merch_sn 'merchSn' FROM mall_goods g where g.is_goods_share_stock = 0
+    </select>
+
+    <select id="queryStoreRelaListByGoodsId" resultType="map">
+        SELECT p.id 'storeRelaId',p.stock_num 'stockNum',p.store_id 'storeId' FROM mall_product_store_rela p where p.goods_id = #{goodsId}
+    </select>
+
+    <update id="updateByGoodsShareStock" parameterType="map">
+        update mall_goods
+        <set>
+            is_goods_share_stock = #{isGoodsShareStock}
+        </set>
+        where id = #{goodsId}
+    </update>
 </mapper>