فهرست منبع

feat: 商品进销存

Joburgess 5 سال پیش
والد
کامیت
ef4e2b23d6

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java

@@ -13,6 +13,8 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
     int batchInsert(@Param("sellOrders") List<SellOrder> sellOrders);
 
+    int batchUpdate(@Param("sellOrders") List<SellOrder> sellOrders);
+
     /**
      * 获取订单的销售列表
      *
@@ -136,4 +138,12 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
      * @return java.util.List<com.ym.mec.biz.dal.entity.SellOrder>
      */
     List<SellOrder> getSellOrders(@Param("sellOrderIds") List<Integer> sellOrderIds);
+
+    /**
+     * @describe 获取无批次号商品销售记录
+     * @author Joburgess
+     * @date 2020.10.13
+     * @return java.util.List<com.ym.mec.biz.dal.entity.SellOrder>
+     */
+    List<SellOrder> getNoneBatchNoSellOrders();
 }

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

@@ -80,13 +80,12 @@ public interface GoodsService extends BaseService<Integer, Goods> {
     void repertoryWarn();
 
     /**
-     * @describe 商品批次号分配
+     * @describe 给超售商品分配批次
      * @author Joburgess
      * @date 2020.10.13
-     * @param goods:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.GoodsProcurement>
+     * @return void
      */
-    List<SellOrder> goodsBatchNoAllot(Goods goods);
+    void sellOrderBatchNoAllot();
 
     /**
      * @describe 扣减商品库存

+ 68 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -39,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -266,6 +267,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		}
 		goodsProcurementDao.batchInsert(goodsProcurements);
 
+		sellOrderBatchNoAllot();
+
 		return goodsList;
 	}
 
@@ -304,9 +307,34 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
-	public List<SellOrder> goodsBatchNoAllot(Goods goods) {
+	public void sellOrderBatchNoAllot() {
+		List<SellOrder> noneBatchNoSellOrders = sellOrderDao.getNoneBatchNoSellOrders();
+		if(CollectionUtils.isEmpty(noneBatchNoSellOrders)){
+			return;
+		}
+		for (SellOrder noneBatchNoSellOrder : noneBatchNoSellOrders) {
+			GoodsProcurement goodsProcurement = null;
+			if(StockType.INTERNAL.equals(noneBatchNoSellOrder.getStockType())||(StockType.ALL.equals(noneBatchNoSellOrder.getStockType())&&AccountType.INTERNAL.equals(noneBatchNoSellOrder.getAccountType()))){
+				goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(noneBatchNoSellOrder.getGoodsId());
+				if(Objects.nonNull(goodsProcurement)){
+					goodsProcurement.setStockCount(new AtomicInteger(goodsProcurement.getStockCount()).decrementAndGet());
+					goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
+				}
+			}else if(StockType.EXTERNAL.equals(noneBatchNoSellOrder.getStockType())||(StockType.ALL.equals(noneBatchNoSellOrder.getStockType())&&AccountType.EXTERNAL.equals(noneBatchNoSellOrder.getAccountType()))){
+				goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(noneBatchNoSellOrder.getGoodsId());
+				if(Objects.nonNull(goodsProcurement)){
+					goodsProcurement.setTaxStockCount(new AtomicInteger(goodsProcurement.getTaxStockCount()).decrementAndGet());
+					goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
+				}
+			}
 
-		return null;
+			if(Objects.nonNull(goodsProcurement)){
+				goodsProcurementDao.update(goodsProcurement);
+				noneBatchNoSellOrder.setBatchNo(goodsProcurement.getBatchNo());
+				noneBatchNoSellOrder.setSellCost(goodsProcurement.getDiscountPrice());
+			}
+		}
+		sellOrderDao.batchUpdate(noneBatchNoSellOrders);
 	}
 
 	@Override
@@ -320,7 +348,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 
 		List<Goods> tempGoodsList = goodsDao.lockGoods(new ArrayList<>(goodsIds));
 		Map<Integer, Goods> idTempGoodsMap = tempGoodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
-		List<SellOrder> goodsBatchNoDtos = new ArrayList<>();
+		List<GoodsProcurement> goodsProcurements = new ArrayList<>();
 		for (Integer goodsId : goodsIds) {
 			Goods tempGoods = idTempGoodsMap.get(goodsId);
 			List<Goods> childGoods = new ArrayList<>();
@@ -359,12 +387,47 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 					goodsProcurement.setParentGoodsId(tempGoods.getId());
 				}
 
-//				goodsBatchNoDtos.add(goodsProcurement);
+				goodsProcurements.add(goodsProcurement);
 			}
 //			goodsDao.update(tempGoods);
 		}
 		goodsDao.batchUpdate(tempGoodsList);
-		return goodsBatchNoDtos;
+
+		List<SellOrder> sellOrders = new ArrayList<>();
+
+		List<GoodsProcurement> singleGoodsList = goodsProcurements.stream().filter(g -> Objects.isNull(g.getParentGoodsId())&&Objects.nonNull(g.getBatchNo())).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(singleGoodsList)){
+			Map<String, List<Integer>> batchNoGoodsIdMap = singleGoodsList.stream().collect(Collectors.groupingBy(GoodsProcurement::getBatchNo, Collectors.mapping(GoodsProcurement::getGoodsId, Collectors.toList())));
+			for (Map.Entry<String, List<Integer>> batchNoGoodsIdMapEntry : batchNoGoodsIdMap.entrySet()) {
+				Map<Integer, Long> goodsNumMap = batchNoGoodsIdMapEntry.getValue().stream().collect(Collectors.groupingBy(gid -> gid, Collectors.counting()));
+				for (Map.Entry<Integer, Long> goodsNumMapEntry : goodsNumMap.entrySet()) {
+					SellOrder sellOrder = new SellOrder();
+					sellOrder.setGoodsId(goodsNumMapEntry.getKey());
+					sellOrder.setNum(goodsNumMapEntry.getValue().intValue());
+					sellOrder.setBatchNo(batchNoGoodsIdMapEntry.getKey());
+					GoodsProcurement goodsProcurement = goodsProcurementDao.getWithGoodsAndBatchNo(sellOrder.getGoodsId(), sellOrder.getBatchNo());
+					sellOrder.setSellCost(goodsProcurement.getDiscountPrice().multiply(new BigDecimal(sellOrder.getNum())));
+					sellOrders.add(sellOrder);
+				}
+			}
+		}
+
+		List<GoodsProcurement> groupGoodsList = goodsProcurements.stream().filter(g -> Objects.nonNull(g.getParentGoodsId())||Objects.isNull(g.getBatchNo())).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(groupGoodsList)){
+			for (GoodsProcurement goodsProcurement : groupGoodsList) {
+				SellOrder sellOrder = new SellOrder();
+				sellOrder.setParentGoodsId(goodsProcurement.getParentGoodsId());
+				sellOrder.setGoodsId(goodsProcurement.getGoodsId());
+				sellOrder.setNum(1);
+				sellOrder.setBatchNo(goodsProcurement.getBatchNo());
+				if(Objects.nonNull(goodsProcurement.getBatchNo())){
+					sellOrder.setSellCost(goodsProcurement.getDiscountPrice().multiply(new BigDecimal(sellOrder.getNum())));
+				}
+				sellOrders.add(sellOrder);
+			}
+		}
+
+		return sellOrders;
 	}
 
 	@Override

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

@@ -34,6 +34,7 @@
         <result column="complement_goods_id_list_" property="complementGoodsIdList"/>
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="supply_channel_" property="supplyChannel" />
+
         <result column="client_show_" property="clientShow" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="stock_warning_" property="stockWarning" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
@@ -228,7 +229,7 @@
                 <if test="goods.clientShow != null">
                     client_show_ = #{goods.clientShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 </if>
-                <if test="stockWarning != null">
+                <if test="goods.stockWarning != null">
                     stock_warning_ = #{goods.stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 </if>
                     update_time_ = NOW()

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

@@ -150,6 +150,91 @@
         where id_ = #{id}
     </update>
 
+    <update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.SellOrder">
+        <foreach collection="sellOrders" item="sellOrder" separator=";">
+            update sell_order
+            <set>
+                <if test="sellOrder.eduTeacherId != null">
+                    edu_teacher_id_ = #{sellOrder.eduTeacherId},
+                </if>
+                <if test="sellOrder.organId != null">
+                    organ_id_ = #{sellOrder.organId},
+                </if>
+                <if test="sellOrder.cooperationOrganId != null">
+                    cooperation_organ_id_ = #{sellOrder.cooperationOrganId},
+                </if>
+                <if test="sellOrder.transNo != null">
+                    trans_no_ = #{sellOrder.transNo},
+                </if>
+                <if test="sellOrder.orderId != null">
+                    order_id_ = #{sellOrder.orderId},
+                </if>
+                <if test="sellOrder.orderNo != null">
+                    order_no_ = #{sellOrder.orderNo},
+                </if>
+                <if test="sellOrder.expectAmount != null">
+                    expect_amount_ = #{sellOrder.expectAmount},
+                </if>
+                <if test="sellOrder.actualAmount != null">
+                    actual_amount_ = #{sellOrder.actualAmount},
+                </if>
+                <if test="sellOrder.balanceAmount != null">
+                    balance_amount_ = #{sellOrder.balanceAmount},
+                </if>
+                <if test="sellOrder.type != null">
+                    type_ = #{sellOrder.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="sellOrder.parentGoodsId != null">
+                    parent_goods_id_ = #{sellOrder.parentGoodsId},
+                </if>
+                <if test="sellOrder.goodsId != null">
+                    goods_id_ = #{sellOrder.goodsId},
+                </if>
+                <if test="sellOrder.goodsName != null">
+                    goods_name_ = #{sellOrder.goodsName},
+                </if>
+                <if test="sellOrder.sellCost != null">
+                    sell_cost_ = #{sellOrder.sellCost},
+                </if>
+                <if test="sellOrder.sellCost2 != null">
+                    sell_cost2_ = #{sellOrder.sellCost2},
+                </if>
+                <if test="sellOrder.num != null">
+                    num_ = #{sellOrder.num},
+                </if>
+                <if test="sellOrder.userId != null">
+                    user_id_ = #{sellOrder.userId},
+                </if>
+                <if test="sellOrder.paymentChannel != null">
+                    payment_channel_ = #{sellOrder.paymentChannel},
+                </if>
+                <if test="sellOrder.merNo != null">
+                    mer_no_ = #{sellOrder.merNo},
+                </if>
+                <if test="sellOrder.batchNo != null">
+                    batch_no_ = #{sellOrder.batchNo},
+                </if>
+                <if test="sellOrder.stockType != null">
+                    stock_type_ = #{sellOrder.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="sellOrder.accountType != null">
+                    account_type_ = #{sellOrder.accountType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="sellOrder.status != null">
+                    status_ = #{sellOrder.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="sellOrder.sellTime != null">
+                    sell_time_ = #{sellOrder.sellTime},
+                </if>
+                <if test="sellOrder.createIme != null">
+                    create_ime_ = #{sellOrder.createIme},
+                </if>
+                    update_time_ = NOW()
+            </set>
+            where id_ = #{sellOrder.id}
+        </foreach>
+    </update>
+
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
         insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
         actual_amount_,balance_amount_, type_, parent_goods_id_, goods_id_,goods_name_, sell_cost_, sell_cost2_, num_, user_id_, payment_channel_,
@@ -404,4 +489,8 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="getNoneBatchNoSellOrders" resultMap="SellOrder">
+        SELECT * FROM sell_order WHERE stock_type_ IS NOT NULL AND batch_no_ IS NULL
+    </select>
 </mapper>