Przeglądaj źródła

add 采购和零售商品优化

xuhaifeng 2 miesięcy temu
rodzic
commit
44f813bdea

+ 1 - 1
admin-ui/src/views/order/retailOrder/index.vue

@@ -88,7 +88,7 @@
         </Page>
 
         <!--    详情-->
-        <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%">
+        <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%" append-to-body>
             <el-card>
                 <el-descriptions title="客户信息" v-show="detailView" :column="3" border :label-style="{ 'text-align': 'center' }" :contentStyle="{ 'text-align': 'center' }">
                     <el-descriptions-item label="客户姓名">{{ detailView.realName }}</el-descriptions-item>

+ 7 - 15
admin-ui/src/views/systemSet/purchaseGoods/index.vue

@@ -156,7 +156,7 @@
                                         <el-tag v-if="scope.row.stock <= 5" size="mini" type="warning">库存不足</el-tag>
                                     </template>
                                 </el-table-column>
-                            
+
                                 <el-table-column label="操作" align="center" width="100" fixed="right">
                                     <template slot-scope="scope">
                                         <el-button
@@ -220,7 +220,7 @@
         </el-dialog>
 
         <!--    详情-->
-        <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%">
+        <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%" append-to-body>
             <el-card>
                 <el-descriptions title="基本信息" v-show="detailView" :column="3" border :label-style="{ 'text-align': 'center' }" :contentStyle="{ 'text-align': 'center' }">
                     <el-descriptions-item label="采购来源" span="3">{{ detailView.orgName ? detailView.orgName : '--' }}</el-descriptions-item>
@@ -243,7 +243,7 @@
                     <el-table-column :label="goodsType == 0 ? '商品名称' : '材料名称'" align="center" prop="goodsName" width="250px" />
                     <el-table-column :label="goodsType == 0 ? '商品规格' : '材料规格'" align="center" width="250px">
                         <template slot-scope="scope">
-                            <div style="text-align: center">{{ scope.row.skuName.replace(' ', '/') }}</div>
+                            <div style="text-align: center">{{ scope.row.skuName }}</div>
                         </template>
                     </el-table-column>
                     <el-table-column label="数量" align="center" prop="buyNum" />
@@ -449,7 +449,7 @@ export default {
                 this.purchaseCountVOList.push({
                     'goodsSkuStoreId': row.goodsSkuStoreId,
                     'goodsCategoryId': this.goodsCategoryId,
-                    'goodsCategoryName': this.categoryList.find(item => item.id == this.goodsCategoryId).categoryName,
+                    'skuName': this.formatSpec(row.specValLists),
                     'count': 1
                 });
                 this.$forceUpdate();
@@ -468,7 +468,7 @@ export default {
                 this.purchaseCountVOList.push({
                     'goodsSkuStoreId': row.goodsSkuStoreId,
                     'goodsCategoryId': this.goodsCategoryId,
-                    'goodsCategoryName': this.categoryList.find(item => item.id == this.goodsCategoryId).categoryName,
+                  'skuName': this.formatSpec(row.specValLists),
                     'count': 1
                 });
                 this.$forceUpdate();
@@ -602,7 +602,7 @@ export default {
 
                 // 检查库存
                 for (let item of this.addGoodsList) {
-                    let purchaseVo = this.purchaseCountVOList.find(item => item.goodsSkuStoreId == item.goodsSkuStoreId);
+                    let purchaseVo = this.purchaseCountVOList.find(pur => pur.goodsSkuStoreId === item.goodsSkuStoreId);
                     if (purchaseVo.count > item.hqStock) {
                         console.log("purchaseVo",purchaseVo);
                         console.log("item",item);
@@ -625,18 +625,10 @@ export default {
                         skuId: vo.id,
                         goodsId: vo.goodsId,
                         goodsCategoryId: purchaseVO.goodsCategoryId,
-                        goodsCategoryName: purchaseVO.goodsCategoryName,
                         costPrice: vo.purchasePrice,
                         buyNum: purchaseVO.count,
-                        skuName: ''
+                        skuName: purchaseVO.skuName
                     };
-
-                    if (vo.specVoList != null) {
-                        vo.specVoList.forEach(spec => {
-                            purchaseGoodsVO.skuName = purchaseGoodsVO.skuName + spec.specName + ':' + spec.specValue + ' ';
-                        });
-                    }
-
                     this.submitGoodsOrderVO.purchaseGoodsVOList.push(purchaseGoodsVO);
                 });
 

+ 3 - 4
admin-ui/src/views/systemSet/sellGoods/retailStore.vue

@@ -67,13 +67,13 @@
             v-if="(scope.row.orderStatus == '3' || scope.row.orderStatus == '4' || scope.row.orderStatus == '5') && scope.row.deliveryWay == '1'">物流信息
           </el-button>
           <el-button type="text" icon="el-icon-check" @click="confirmReceive(scope.row)" v-hasPermi="['order:purchaseGoods:edit']"
-            v-if="scope.row.orderStatus == '3' || scope.row.orderStatus == '4'">确认交货</el-button>
+            v-if="(scope.row.orderStatus == '3' || scope.row.orderStatus == '4') && userInfoVO.userType !== '00' ">确认收货</el-button>
         </template>
       </el-table-column>
     </Page>
 
     <!--    详情-->
-    <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%">
+    <el-dialog :title="detailTitle" :visible.sync="openDetail" size="80%" append-to-body>
       <el-card>
         <el-descriptions title="基本信息" v-show="detailView" :column="3" border :label-style="{ 'text-align': 'center' }"
           :contentStyle="{ 'text-align': 'center' }">
@@ -104,11 +104,10 @@
           <span>商品详情</span>
         </div>
         <el-table v-loading="loading" fit highlight-current-row border stripe :data="detailList">
-          <el-table-column label="分类" align="center" prop="goodsCategoryName" />
           <el-table-column :label="goodsType == 0 ? '商品名称' : '材料名称'" align="center" prop="goodsName" />
           <el-table-column :label="goodsType == 0 ? '商品规格' : '材料规格'" align="center">
             <template slot-scope="scope">
-              <div style="text-align: center">{{ scope.row.skuName.replace(' ', '/') }}</div>
+              <div style="text-align: center">{{ scope.row.skuName}}</div>
             </template>
           </el-table-column>
           <el-table-column label="数量" align="center" prop="buyNum" />

+ 7 - 6
admin-ui/src/views/workbench/workRetail/index.vue

@@ -219,7 +219,7 @@
     </el-row>
 
     <!-- 选择规格弹窗 -->
-    <el-dialog title="选择规格" :visible.sync="skuOpen" width="500px">
+    <el-dialog title="选择规格" :visible.sync="skuOpen" width="500px" append-to-body>
       <el-table :data="goodsSkuList" v-loading="skuLoading">
         <el-table-column label="规格" prop="specVoList">
           <template slot-scope="scope">
@@ -249,6 +249,7 @@
       width="600px"
       :close-on-click-modal="false"
       custom-class="settlement-dialog"
+      append-to-body
     >
       <!-- 订单信息概览 -->
       <div class="order-summary">
@@ -594,7 +595,7 @@ export default {
         this.$message.warning("该商品已售罄");
         return;
       }
-      
+
       if (this.addGoodsList.length > 0) {
         let match = this.addGoodsList.findIndex(item => item.goodsSkuStoreId == row.goodsSkuStoreId)
         if (match !== -1) {
@@ -609,7 +610,7 @@ export default {
           return;
         }
       }
-      
+
       this.addGoodsList.push(row);
       this.purchaseCountVOList.push({
         'goodsSkuStoreId': row.goodsSkuStoreId,
@@ -659,7 +660,7 @@ export default {
         this.$message.warning("该商品已售罄");
         return;
       }
-      
+
       this.skuLoading = true;
       getGoodsSkuListToGoodsRetail(row.id).then(response => {
         this.goodsSkuList = response.data;
@@ -858,7 +859,7 @@ export default {
     &.out-of-stock {
       cursor: not-allowed;
       opacity: 0.7;
-      
+
       &:hover {
         transform: none;
         box-shadow: none;
@@ -899,7 +900,7 @@ export default {
       .goods-stock {
         font-size: 12px;
         color: #67c23a;
-        
+
         &.low-stock {
           color: #e6a23c;
         }

+ 0 - 2
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderPurchaseGoodsController.java

@@ -95,7 +95,6 @@ public class OrderPurchaseGoodsController extends BaseController {
     /**
      * 新增商品进货订单
      */
-    @Transactional(rollbackFor = Exception.class)
     @PreAuthorize("@ss.hasPermi('order:purchaseGoods:add')")
     @Log(title = "新增商品进货订单", businessType = BusinessType.INSERT)
     @PostMapping
@@ -206,7 +205,6 @@ public class OrderPurchaseGoodsController extends BaseController {
     /**
      * 商品确认收货
      */
-    @Transactional(rollbackFor = Exception.class)
     @GetMapping("/confirmReceiveGoodsByOrderGoods")
     @ApiOperation(value = "商品确认收货")
     public AjaxResult confirmReceiveGoodsByOrderGoods(@RequestParam("orderId") Long orderId) {

+ 8 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/dto/GoodsSkuDTO.java

@@ -16,6 +16,13 @@ public class GoodsSkuDTO {
     @ApiModelProperty("商品编号")
     private Long goodsId;
 
+
+    /**
+     * 商品分类
+     */
+    @Excel(name = "商品分类")
+    @ApiModelProperty("商品分类")
+    private Long goodsCategoryId;
     /**
      * 门店编号
      */
@@ -46,4 +53,5 @@ public class GoodsSkuDTO {
     private String keywords;
 
     private List<Long> goodsIdList;
+
 }

+ 37 - 34
yiqi-common/src/main/java/com/yiqi/core/domain/dto/GoodsSkuStockRecordDTO.java

@@ -158,7 +158,7 @@ public class GoodsSkuStockRecordDTO extends BaseEntity {
 
     /**
      * 进出货订单 写入库存记录
-      */
+     */
     public static List<GoodsSkuStockRecord> buildStockByOrderPurchaseGoods(OrderPurchaseGoods orderPurchaseGoods,
                                                                            List<OrderPurchaseGoodsSku> orderPurchaseGoodsSkus,
                                                                            Boolean isAdd,
@@ -173,31 +173,24 @@ public class GoodsSkuStockRecordDTO extends BaseEntity {
             goodsSkuStockRecord.setOrderNo(orderPurchaseGoods.getOrderNo());
             goodsSkuStockRecord.setGoodsId(goodsSkus.getGoodsId());
             goodsSkuStockRecord.setGoodsType(orderPurchaseGoods.getGoodsType());
-            goodsSkuStockRecord.setIsAdd(isAdd?SysBoolType.YES.getCode():SysBoolType.NO.getCode());
-            goodsSkuStockRecord.setIsRefund(isRefund?SysBoolType.YES.getCode():SysBoolType.NO.getCode());
+            goodsSkuStockRecord.setIsAdd(isAdd ? SysBoolType.YES.getCode() : SysBoolType.NO.getCode());
+            goodsSkuStockRecord.setIsRefund(isRefund ? SysBoolType.YES.getCode() : SysBoolType.NO.getCode());
             goodsSkuStockRecord.setSourceType(SecurityUtils.getLoginUser().getSourceType());
+            goodsSkuStockRecord.setBuySourceType(orderPurchaseGoods.getSourceType());
+            goodsSkuStockRecord.setBuyOrgId(orderPurchaseGoods.getOrgId());
             // 进货
             if (isAdd) {
                 // 总部进货
-                if(SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())){
-                    goodsSkuStockRecord.setBuySourceType(SourceType.MANAGER.getCode());
-                }else {
-                    // 工厂/门店 进货
-                    goodsSkuStockRecord.setBuySourceType(orderPurchaseGoods.getSourceType());
-                    goodsSkuStockRecord.setBuyOrgId(orderPurchaseGoods.getOrgId());
-                    goodsSkuStockRecord.setSellSourceType(orderPurchaseGoods.getParentSourceType());
-                    goodsSkuStockRecord.setSellOrgId(orderPurchaseGoods.getParentOrgId());
+                if (SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())) {
+                    goodsSkuStockRecord.setRemark("总部进货");
+                } else {
+                    // 门店进货
+                    goodsSkuStockRecord.setOrgId(SecurityUtils.getLoginUser().getStoreId());
+                    goodsSkuStockRecord.setRemark("门店进货");
                 }
-            }else {
+            } else {
                 // 出货
-                if(!SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())){
-                    //  非总部出货,需要加orgid
-                    goodsSkuStockRecord.setOrgId(SecurityUtils.getLoginUser().getOrgId());
-                }
-                goodsSkuStockRecord.setBuySourceType(orderPurchaseGoods.getSourceType());
-                goodsSkuStockRecord.setBuyOrgId(orderPurchaseGoods.getOrgId());
-                goodsSkuStockRecord.setSellSourceType(orderPurchaseGoods.getParentSourceType());
-                goodsSkuStockRecord.setSellOrgId(orderPurchaseGoods.getParentOrgId());
+                goodsSkuStockRecord.setRemark("总部出货");
             }
             goodsStockRecordList.add(goodsSkuStockRecord);
         }
@@ -214,9 +207,9 @@ public class GoodsSkuStockRecordDTO extends BaseEntity {
         List<GoodsSkuStockRecord> goodsStockRecordList = new ArrayList<>();
         for (OrderGoodsSku goodsSkus : orderGoodsSkus) {
             GoodsSkuStockRecord goodsSkuStockRecord = new GoodsSkuStockRecord();
-            if (OrderSourceType.APP.getCode().equals(orderGoods.getOrderSource())){
-                goodsSkuStockRecord.setSourceType(com.yiqi.common.enums.SourceType.MANAGER.getCode());
-            }else{
+            if (OrderSourceType.APP.getCode().equals(orderGoods.getOrderSource())) {
+                goodsSkuStockRecord.setSourceType(SourceType.MANAGER.getCode());
+            } else {
                 goodsSkuStockRecord.setSourceType(SecurityUtils.getLoginUser().getSourceType());
             }
             goodsSkuStockRecord.buildCreateData();
@@ -226,31 +219,41 @@ public class GoodsSkuStockRecordDTO extends BaseEntity {
             goodsSkuStockRecord.setOrderNo(orderGoods.getOrderNo());
             goodsSkuStockRecord.setGoodsId(goodsSkus.getGoodsId());
             goodsSkuStockRecord.setGoodsType(orderGoods.getGoodsType());
-            goodsSkuStockRecord.setIsAdd(isAdd?SysBoolType.YES.getCode():SysBoolType.NO.getCode());
-            goodsSkuStockRecord.setIsRefund(isRefund?SysBoolType.YES.getCode():SysBoolType.NO.getCode());
+            goodsSkuStockRecord.setIsAdd(isAdd ? SysBoolType.YES.getCode() : SysBoolType.NO.getCode());
+            goodsSkuStockRecord.setIsRefund(isRefund ? SysBoolType.YES.getCode() : SysBoolType.NO.getCode());
 
             // 客户退货 = 加货 只有总部会退货 所以都是总部
             if (isAdd) {
-                goodsSkuStockRecord.setSourceType(SourceType.MANAGER.getCode());
-            }else {
-                if (OrderSourceType.APP.getCode().equals(orderGoods.getOrderSource())){
+                if (SourceType.STORE.getCode().equals(SecurityUtils.getLoginUser().getSourceType())) {
+                    //门店退货
+                    goodsSkuStockRecord.setSourceType(SecurityUtils.getLoginUser().getSourceType());
+                    goodsSkuStockRecord.setOrgId(SecurityUtils.getLoginUser().getOrgId());
+                    goodsSkuStockRecord.setRemark("线下门店退货");
+                }else{
+                    goodsSkuStockRecord.setSourceType(SourceType.MANAGER.getCode());
+                    goodsSkuStockRecord.setRemark("线上零售退货");
+                }
+            } else {
+                if (OrderSourceType.APP.getCode().equals(orderGoods.getOrderSource())) {
                     // 总部出货
                     goodsSkuStockRecord.setSourceType(SourceType.MANAGER.getCode());
-                }else {
+                    goodsSkuStockRecord.setRemark("线上零售出货");
+                } else {
                     // 总部出货
-                    if(SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())){
-                        goodsSkuStockRecord.setSourceType(SecurityUtils.getLoginUser().getSourceType());
-                    }else {
+                    if (SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())) {
+
+                    } else {
                         // 门店零售出货
                         goodsSkuStockRecord.setSourceType(SecurityUtils.getLoginUser().getSourceType());
                         goodsSkuStockRecord.setOrgId(SecurityUtils.getLoginUser().getOrgId());
+                        goodsSkuStockRecord.setRemark("线下门店出货");
                     }
                 }
             }
             goodsSkuStockRecord.setBuySourceType(SourceType.CUSTOM.getCode());
             goodsSkuStockRecord.setBuyOrgId(orderGoods.getAppUserId());
-            goodsSkuStockRecord.setSellSourceType(orderGoods.getSourceType());
-            goodsSkuStockRecord.setSellOrgId(orderGoods.getOrgId());
+//            goodsSkuStockRecord.setSellSourceType(orderGoods.getSourceType());
+//            goodsSkuStockRecord.setSellOrgId(orderGoods.getOrgId());
             goodsStockRecordList.add(goodsSkuStockRecord);
         }
         return goodsStockRecordList;

+ 11 - 0
yiqi-common/src/main/java/com/yiqi/core/service/IGoodsSkuService.java

@@ -4,8 +4,10 @@ import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yiqi.core.domain.GoodsInfo;
 import com.yiqi.core.domain.GoodsSku;
+import com.yiqi.core.domain.GoodsSkuStore;
 import com.yiqi.core.domain.vo.GoodsSkuAddVO;
 import com.yiqi.core.domain.vo.GoodsSkuQueryVO;
+import com.yiqi.order.domain.OrderPurchaseGoodsSku;
 import com.yiqi.order.domain.dto.RetailQueryGoodsDTO;
 
 /**
@@ -95,4 +97,13 @@ public interface IGoodsSkuService extends IService<GoodsSku> {
      * @return
      */
     int updateGoodsSkuStatus(GoodsSkuAddVO goodsSkuAddVO);
+
+
+    /**
+     * 采购扣减库存
+     *
+     * @param orderPurchaseGoodsSkuList 减去商品物料库存
+     * @return 结果
+     */
+    public int minusGoodsSkuStockByPurchase(List<OrderPurchaseGoodsSku> orderPurchaseGoodsSkuList);
 }

+ 0 - 5
yiqi-common/src/main/java/com/yiqi/order/domain/OrderPurchaseGoodsSku.java

@@ -34,11 +34,6 @@ public class OrderPurchaseGoodsSku extends BaseEntity
     @ApiModelProperty("订单ID")
     private Long orderId;
 
-    /** 商品订单商品明细ID */
-    @Excel(name = "商品订单商品明细ID")
-    @ApiModelProperty("商品订单商品明细ID")
-    private Long orderPurchaseGoodsItemId;
-
     /** 购买数量 */
     @Excel(name = "购买数量")
     @ApiModelProperty("购买数量")

+ 9 - 0
yiqi-core/src/main/java/com/yiqi/core/mapper/GoodsSkuMapper.java

@@ -170,4 +170,13 @@ public interface GoodsSkuMapper extends BaseMapper<GoodsSku> {
      */
     @MapKey("goodsId")
     Map<Long, Map<String, Object>> selectStoreSkuMinSalePriceToGoodsRetail(@Param("goodsIds") List<Long> goodsIds, @Param("storeId") Long storeId);
+
+    /**
+     * 减库存,保证库存不小于0
+     *
+     * @param skuId
+     * @param buyNum
+     * @return
+     */
+    int minusGoodsSkuStock(@Param("skuId") Long skuId, @Param("buyNum") Integer buyNum);
 }

+ 25 - 2
yiqi-core/src/main/java/com/yiqi/core/service/impl/GoodsSkuServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yiqi.common.core.domain.entity.SysUser;
 import com.yiqi.common.enums.SourceType;
+import com.yiqi.common.exception.ServiceException;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.SecurityUtils;
 import com.yiqi.common.utils.StringUtils;
@@ -21,6 +22,7 @@ import com.yiqi.core.service.IGoodsInfoService;
 import com.yiqi.core.service.IGoodsSkuService;
 import com.yiqi.core.service.IGoodsSkuSpecService;
 import com.yiqi.core.service.IGoodsSkuStoreService;
+import com.yiqi.order.domain.OrderPurchaseGoodsSku;
 import com.yiqi.order.domain.dto.RetailQueryGoodsDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -309,6 +311,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
             GoodsSkuDTO goodsSkuDTO = new GoodsSkuDTO();
             goodsSkuDTO.setSourceType(user.getUserType());
             goodsSkuDTO.setKeywords(keywords);
+            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
 //            goodsSkuDTO.setGoodsIdList(goodsIdList);
             SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByHq(goodsSkuDTO);
         }
@@ -319,6 +322,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
 //            goodsSkuDTO.setGoodsIdList(goodsIdList);
             goodsSkuDTO.setTargetId(user.getFactoryId());
             goodsSkuDTO.setKeywords(keywords);
+            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
             SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByFactory(goodsSkuDTO);
         }
         // 门店
@@ -327,6 +331,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
             goodsSkuDTO.setSourceType(user.getUserType());
             goodsSkuDTO.setTargetId(user.getStoreId());
             goodsSkuDTO.setKeywords(keywords);
+            goodsSkuDTO.setGoodsCategoryId(goodsCategoryId);
 //            goodsSkuDTO.setGoodsIdList(goodsIdList);
             SkuQueryVOS = baseMapper.selectPurchaseGoodsSkuInfoByStore(goodsSkuDTO);
         }
@@ -355,8 +360,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
         // 设置规格值
         goodsInfoList.forEach(goodsInfo -> {
             if (CollUtil.isNotEmpty(resultMap) && resultMap.containsKey(goodsInfo.getId())) {
-                goodsInfo.setSalePrice((BigDecimal)resultMap.get(goodsInfo.getId()).get("salePrice"));
-                goodsInfo.setStock((Integer)resultMap.get(goodsInfo.getId()).get("stock"));
+                goodsInfo.setSalePrice((BigDecimal) resultMap.get(goodsInfo.getId()).get("salePrice"));
+                goodsInfo.setStock(Integer.parseInt(resultMap.get(goodsInfo.getId()).get("stock").toString()));
             } else {
                 goodsInfo.setSalePrice(BigDecimal.ZERO);
                 goodsInfo.setStock(0);
@@ -428,4 +433,22 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
         }
         return 1;
     }
+
+    // 采购减库存,总部
+    @Override
+    public int minusGoodsSkuStockByPurchase(List<OrderPurchaseGoodsSku> orderPurchaseGoodsSkuList) {
+        if (CollUtil.isNotEmpty(orderPurchaseGoodsSkuList)) {
+            orderPurchaseGoodsSkuList.forEach(orderPurchaseGoodsSku -> {
+                //扣减库存,如果库存不足,则扣减失败
+                int result = baseMapper.minusGoodsSkuStock(orderPurchaseGoodsSku.getSkuId(), orderPurchaseGoodsSku.getBuyNum());
+                if (result == 0) {
+                    throw new ServiceException(String.format("%s库存不足或者已下架", orderPurchaseGoodsSku.getGoodsName()));
+                }
+            });
+            return 1;
+        }
+        return 0;
+    }
+
+
 }

+ 29 - 68
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderPurchaseGoodsServiceImpl.java

@@ -21,10 +21,7 @@ import com.yiqi.core.domain.GoodsInfo;
 import com.yiqi.core.domain.GoodsSkuStore;
 import com.yiqi.core.domain.SettlementBalanceRecord;
 import com.yiqi.core.domain.dto.GoodsSkuStockRecordDTO;
-import com.yiqi.core.service.IGoodsInfoService;
-import com.yiqi.core.service.IGoodsSkuStockRecordService;
-import com.yiqi.core.service.IGoodsSkuStoreService;
-import com.yiqi.core.service.ISettlementBalanceRecordService;
+import com.yiqi.core.service.*;
 import com.yiqi.order.domain.*;
 import com.yiqi.order.domain.dto.*;
 import com.yiqi.order.domain.vo.OrderDeliveryPathVO;
@@ -43,6 +40,7 @@ import org.springframework.stereotype.Service;
 import com.yiqi.order.mapper.OrderPurchaseGoodsMapper;
 import com.yiqi.order.service.IOrderPurchaseGoodsService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 商品订单Service业务层处理
@@ -67,6 +65,8 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
     @Autowired
     private IGoodsSkuStoreService goodsSkuStoreService;
     @Autowired
+    private IGoodsSkuService goodsSkuService;
+    @Autowired
     private IGoodsSkuStockRecordService goodsSkuStockRecordService;
     @Autowired
     private IThirdDeliveryService thirdDeliveryService;
@@ -204,13 +204,6 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         if (!purchaseGoodsStatusType.CONFIRM_PAY.getCode().equals(orderPurchaseGoods.getOrderStatus())) {
             throw new GlobalException("订单状态非待确认,无法接单");
         }
-//        // 材料进货,扣除金额
-//        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoods.getGoodsType()) && SysBoolType.YES.getCode().equals(orderPurchaseGoods.getIsUseBalance())){
-//            this.handleSetBalanceDeductAmount(orderPurchaseGoods);
-//            // 保存记录
-//            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildConsumeBalanceRecordByPurchaseOrder(orderPurchaseGoods);
-//            settlementBalanceRecordService.save(settlementBalanceRecord);
-//        }
         orderPurchaseGoods.setPayTime(DateUtils.getNowDate());
         orderPurchaseGoods.setOrderStatus(purchaseGoodsStatusType.NO_SEND.getCode());
         orderPurchaseGoods.buildUpdateData();
@@ -238,14 +231,13 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         // 更新订单状态
         orderPurchaseGoods.setOrderStatus(purchaseGoodsStatusType.REFUSE.getCode());
         orderPurchaseGoods.buildUpdateData();
-
-        // 如果勾选了使用抵扣金额,则退回余额
-        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoods.getGoodsType()) && SysBoolType.YES.getCode().equals(orderPurchaseGoods.getIsUseBalance())) {
-            this.handleRefundBalanceDeductAmount(orderPurchaseGoods);
-            // 保存记录
-            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildRefundBalanceRecordByPurchaseOrder(orderPurchaseGoods);
-            settlementBalanceRecordService.save(settlementBalanceRecord);
-        }
+//        // 如果勾选了使用抵扣金额,则退回余额
+//        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoods.getGoodsType()) && SysBoolType.YES.getCode().equals(orderPurchaseGoods.getIsUseBalance())) {
+//            this.handleRefundBalanceDeductAmount(orderPurchaseGoods);
+//            // 保存记录
+//            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildRefundBalanceRecordByPurchaseOrder(orderPurchaseGoods);
+//            settlementBalanceRecordService.save(settlementBalanceRecord);
+//        }
         return baseMapper.updateById(orderPurchaseGoods);
     }
 
@@ -274,12 +266,12 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         orderPurchaseGoods.buildUpdateData();
 
         // 如果勾选了使用抵扣金额,则退回余额
-        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoods.getGoodsType()) && SysBoolType.YES.getCode().equals(orderPurchaseGoods.getIsUseBalance())) {
-            this.handleRefundBalanceDeductAmount(orderPurchaseGoods);
-            // 保存记录
-            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildRefundBalanceRecordByPurchaseOrder(orderPurchaseGoods);
-            settlementBalanceRecordService.save(settlementBalanceRecord);
-        }
+//        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoods.getGoodsType()) && SysBoolType.YES.getCode().equals(orderPurchaseGoods.getIsUseBalance())) {
+//            this.handleRefundBalanceDeductAmount(orderPurchaseGoods);
+//            // 保存记录
+//            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildRefundBalanceRecordByPurchaseOrder(orderPurchaseGoods);
+//            settlementBalanceRecordService.save(settlementBalanceRecord);
+//        }
         return baseMapper.updateById(orderPurchaseGoods);
     }
 
@@ -291,6 +283,7 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int outOrderGoods(OrderGoodsOutGoodsDTO orderGoodsOutGoodsDTO, String deliveryWay) throws Exception {
         OrderPurchaseGoods orderPurchaseGoods = baseMapper.selectById(orderGoodsOutGoodsDTO.getOrderId());
         if (orderPurchaseGoods == null) {
@@ -309,31 +302,10 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         if (CollUtil.isEmpty(orderPurchaseGoodsSkus)) {
             throw new GlobalException("未查询到订单进货商品信息,无法出货");
         }
-        List<GoodsSkuStore> goodsSkuStoreList = new ArrayList<>();
-        // 总部代理工厂出货
-        if (SourceType.MANAGER.getCode().equals(SecurityUtils.getLoginUser().getSourceType())
-                && SourceType.FACTORY.getCode().equals(orderPurchaseGoods.getParentSourceType())
-                && SourceType.HQ_FACTORY.getCode().equals(String.valueOf(orderPurchaseGoods.getParentOrgId()))) {
-            // 复制一份 处理库存
-            OrderPurchaseGoods copyPurchase = new OrderPurchaseGoods();
-            BeanUtils.copyProperties(orderPurchaseGoods, copyPurchase);
-            copyPurchase.setParentSourceType(SourceType.MANAGER.getCode());
-            copyPurchase.setParentOrgId(null);
-            // 组装 扣总部库存VOList
-            goodsSkuStoreList = goodsSkuStoreService.buildGoodsSkuStockVOByPurchase2MinusStock(orderPurchaseGoodsSkus, copyPurchase);
-            // 扣订单上级parent库存
-            goodsSkuStoreService.minusGoodsSkuStockByOrder(goodsSkuStoreList);
-            // 库存记录
-            this.buildStockRecord(copyPurchase, orderPurchaseGoodsSkus, Boolean.FALSE, Boolean.FALSE);
-        } else {
-            //正常上下级出货
-            // 组装 扣订单上级parent库存VOList
-            goodsSkuStoreList = goodsSkuStoreService.buildGoodsSkuStockVOByPurchase2MinusStock(orderPurchaseGoodsSkus, orderPurchaseGoods);
-            // 扣订单上级parent库存
-            goodsSkuStoreService.minusGoodsSkuStockByOrder(goodsSkuStoreList);
-            // 库存记录
-            this.buildStockRecord(orderPurchaseGoods, orderPurchaseGoodsSkus, Boolean.FALSE, Boolean.FALSE);
-        }
+        //扣减总部库存
+        goodsSkuService.minusGoodsSkuStockByPurchase(orderPurchaseGoodsSkus);
+        // 库存记录
+        this.buildStockRecord(orderPurchaseGoods, orderPurchaseGoodsSkus, Boolean.FALSE, Boolean.FALSE);
         //  自己配送
         if (DeliveryWayType.SELF_SEND.getCode().equals(deliveryWay)) {
             orderPurchaseGoods.setDeliveryWay(DeliveryWayType.SELF_SEND.getCode());
@@ -455,6 +427,7 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int confirmReceiveGoodsByOrderGoods(Long orderId) {
         OrderPurchaseGoods orderPurchaseGoods = baseMapper.selectById(orderId);
         if (orderPurchaseGoods == null) {
@@ -501,6 +474,7 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int insertOrderPurchaseGoods(OrderPurchaseGoodsAddDTO orderPurchaseGoodsAddDTO) {
         // 保存进货订单
         OrderPurchaseGoods orderPurchaseGoods = this.buildOrderPurchaseGoodsInfo(orderPurchaseGoodsAddDTO);
@@ -539,6 +513,10 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
      * @return
      */
     private OrderPurchaseGoods buildOrderPurchaseGoodsInfo(OrderPurchaseGoodsAddDTO orderPurchaseGoodsAddDTO) {
+        List<OrderPurchaseGoodsVO> purchaseGoodsVOList = orderPurchaseGoodsAddDTO.getPurchaseGoodsVOList();
+        if (CollUtil.isEmpty(purchaseGoodsVOList)) {
+            throw new GlobalException("操作失败,商品信息为空");
+        }
         SysUser user = SecurityUtils.getLoginUser().getUser();
         // 保存订单
         OrderPurchaseGoods orderPurchaseGoods = new OrderPurchaseGoods();
@@ -547,10 +525,6 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         if (!SourceType.MANAGER.getCode().equals(user.getUserType())) {
             orderPurchaseGoods.setOrderStatus(purchaseGoodsStatusType.CONFIRM_PAY.getCode());
             orderPurchaseGoods.setOrgId(SourceType.STORE.getCode().equals(user.getUserType()) ? user.getStoreId() : user.getFactoryId());
-            orderPurchaseGoods.setParentSourceType(SourceType.FACTORY.getCode().equals(user.getUserType()) ? SourceType.MANAGER.getCode() : SourceType.FACTORY.getCode());
-            if (SourceType.STORE.getCode().equals(user.getUserType())) {
-                orderPurchaseGoods.setParentOrgId(sysStoreService.selectSysStoreById(user.getStoreId()).getFactoryId());
-            }
         } else {
             orderPurchaseGoods.setOrderStatus(purchaseGoodsStatusType.CONFIRM_RECEIVE.getCode());
             orderPurchaseGoods.setSendTime(DateUtils.getNowDate());
@@ -568,22 +542,9 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         orderPurchaseGoods.setCreateById(user.getUserId());
         // 生成订单编号
         orderPurchaseGoods.setOrderNo(orderNoUtils.getPurchaseOrderNo());
-        // 材料进货,设置是否抵扣金额
-        if (GoodsType.MATERIAL.getCode().equals(orderPurchaseGoodsAddDTO.getGoodsType()) && orderPurchaseGoodsAddDTO.getIsUserBalance()) {
-            orderPurchaseGoods.setIsUseBalance(SysBoolType.YES.getCode());
-//            this.handleSetBalanceDeductAmount(orderPurchaseGoods);
-            // 保存记录
-//            SettlementBalanceRecord settlementBalanceRecord = SettlementBalanceRecord.buildConsumeBalanceRecordByPurchaseOrder(orderPurchaseGoods);
-//            settlementBalanceRecordService.save(settlementBalanceRecord);
-        } else {
-            orderPurchaseGoods.setIsUseBalance(SysBoolType.NO.getCode());
-        }
+        orderPurchaseGoods.setIsUseBalance(SysBoolType.NO.getCode());
         this.save(orderPurchaseGoods);
 
-        List<OrderPurchaseGoodsVO> purchaseGoodsVOList = orderPurchaseGoodsAddDTO.getPurchaseGoodsVOList();
-        if (CollUtil.isEmpty(purchaseGoodsVOList)) {
-            throw new GlobalException("操作失败,商品信息为空");
-        }
         // 无法批量插入
         for (OrderPurchaseGoodsVO orderPurchaseGoodsVO : purchaseGoodsVOList) {
             OrderPurchaseGoodsSku orderPurchaseGoodsSku = new OrderPurchaseGoodsSku();

+ 33 - 9
yiqi-core/src/main/resources/mapper/core/GoodsSkuMapper.xml

@@ -196,7 +196,8 @@
         where id = #{id}
     </update>
 
-        <delete id="deleteGoodsSkuById" parameterType="Long">
+
+    <delete id="deleteGoodsSkuById" parameterType="Long">
             update goods_sku set del_flag = '2' where id = #{id}
         </delete>
 
@@ -223,6 +224,9 @@
                 #{item}
             </foreach>
         </if>
+        <if test="goodsCategoryId != null">
+            and e.goods_category_id = #{goodsCategoryId}
+        </if>
         <if test="keywords != null and keywords != ''">
             and (e.goods_name like concat('%', #{keywords}, '%') or e.goods_code like concat('%', #{keywords}, '%') )
         </if>
@@ -245,6 +249,12 @@
                 #{item}
             </foreach>
         </if>
+        <if test="goodsCategoryId != null">
+            and e.goods_category_id = #{goodsCategoryId}
+        </if>
+        <if test="keywords != null and keywords != ''">
+            and (e.goods_name like concat('%', #{keywords}, '%') or e.goods_code like concat('%', #{keywords}, '%') )
+        </if>
     </select>
 
     <select id="selectPurchaseGoodsSkuInfoByStore" resultType="com.yiqi.core.domain.vo.GoodsSkuQueryVO">
@@ -264,6 +274,9 @@
                 #{item}
             </foreach>
         </if>
+        <if test="goodsCategoryId != null">
+            and e.goods_category_id = #{goodsCategoryId}
+        </if>
         <if test="keywords != null and keywords != ''">
             and (e.goods_name like concat('%', #{keywords}, '%') or e.goods_code like concat('%', #{keywords}, '%') )
         </if>
@@ -298,13 +311,17 @@
     <select id="selectRetailGoodsSkuInfoByStore" resultType="com.yiqi.core.domain.vo.GoodsSkuQueryVO">
         select b.id as id, b.goods_id as goodsId, a.status as status, b.specs,
         e.goods_name as goodsName, e.goods_img as goodsImg, a.id as goodsSkuStoreId,
-        a.cost_price as costPrice,
-        a.purchase_price as purchasePrice,
-        a.sale_price as salePrice, a.stock as stock
+        b.cost_price as costPrice,
+        b.purchase_price as purchasePrice,
+        CASE
+        WHEN a.sale_price IS NOT NULL AND a.sale_price > 0 THEN a.sale_price
+        ELSE b.sale_price
+        END AS salePrice,
+        a.stock as stock
         from goods_sku_store a
         left join goods_sku b on b.id = a.goods_sku_id
         left join goods_info e on e.id = b.goods_id
-        where b.del_flag = 0 and b.status = '0' and b.goods_id = #{goodsId} and a.sale_price is not Null
+        where b.del_flag = 0 and a.status = '0' and b.goods_id = #{goodsId}
         <if test="targetId != null  and targetId != ''">
             and a.target_id = #{targetId}
         </if>
@@ -323,15 +340,22 @@
 
     <!--查询门店指定的商品集合里面,每个商品的最小值-->
     <select id="selectStoreSkuMinSalePriceToGoodsRetail" resultType="java.util.Map">
-        select goods_id, min(sale_price) as sale_price, sum(stock) as stock from goods_sku_store where
-             target_id = #{storeId} and source_type='02' and sale_price is not null and status = '0'
+        select st.goods_id as goodsId, min(CASE
+        WHEN st.sale_price IS NOT NULL AND st.sale_price > 0 THEN st.sale_price
+        ELSE sku.sale_price
+        END ) as salePrice, sum(st.stock) as stock from goods_sku_store st LEFT JOIN goods_sku sku on st.goods_sku_id = sku.id and st.target_id = #{storeId} and st.source_type='02'
+        where st.status = '0'
              <if test="goodsIds != null">
-                and goods_id in
+                and st.goods_id in
                 <foreach item="item" collection="goodsIds" open="(" separator="," close=")">
                     #{item}
                 </foreach>
             </if>
-            group by goods_id
+            group by st.goods_id
     </select>
 
+    <update id="minusGoodsSkuStock">
+        update goods_sku set stock = stock - #{buyNum} where id = #{skuId} and status = '0' and stock >= #{buyNum}
+    </update>
+
 </mapper>