Browse Source

2023年7月25日17:47:42

纪新园 2 years ago
parent
commit
a9cd3c9fe5
26 changed files with 757 additions and 53 deletions
  1. 9 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderDescClient.java
  2. 1 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjCorpsDescExportExcel.java
  3. 1 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjCorpsDescGYSExportExcel.java
  4. 147 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/entity/StockGoodsLog.java
  5. 11 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/feign/IStockGoodsClient.java
  6. 10 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockPartsVO.java
  7. 36 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/StockGoodsLogVO.java
  8. 40 2
      blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryServiceImpl.java
  9. 18 9
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/feign/OrderDescClient.java
  10. 1 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml
  11. 69 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  12. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java
  13. 22 6
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  14. 3 4
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  15. 21 10
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/controller/ProductLaunchController.java
  16. 7 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipMapper.xml
  17. 11 8
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java
  18. 9 3
      blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java
  19. 126 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsLogController.java
  20. 9 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/feign/StockGoodsClient.java
  21. 42 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsLogMapper.java
  22. 34 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsLogMapper.xml
  23. 19 3
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml
  24. 41 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsLogService.java
  25. 41 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsLogServiceImpl.java
  26. 28 4
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

+ 9 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderDescClient.java

@@ -25,6 +25,7 @@ import java.util.Map;
 public interface IOrderDescClient {
 	String API_PREFIX = "/client";
 	String UPDATE_ORDER = API_PREFIX + "/updateOrder";
+	String UPDATE_ORDER_NEW = API_PREFIX + "/updateOrderNew";
 	String UPDATE_ORDER_YCP = API_PREFIX + "/updateOrderYCP";
 	String GET_BY_ORDER_NO = API_PREFIX + "/getByOrderNo";
 	String GET_BY_ID = API_PREFIX + "/getById";
@@ -51,6 +52,14 @@ public interface IOrderDescClient {
 	 */
 	@PostMapping(UPDATE_ORDER)
 	R updateOrder(@RequestBody Order order);
+	/**
+	 * 修改采购订单状态
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping(UPDATE_ORDER_NEW)
+	R updateOrderNew(@RequestBody Order order);
 
 	/**
 	 * 修改采购订单状态

+ 1 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjCorpsDescExportExcel.java

@@ -20,7 +20,7 @@ import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.ContentRowHeight;
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
 import lombok.Data;
-import org.springblade.common.execl.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelProperty;
 
 import java.io.Serializable;
 import java.math.BigDecimal;

+ 1 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjCorpsDescGYSExportExcel.java

@@ -16,11 +16,11 @@
  */
 package org.springblade.salesPart.excel;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.ContentRowHeight;
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
 import lombok.Data;
-import org.springblade.common.execl.ExcelProperty;
 
 import java.io.Serializable;
 import java.math.BigDecimal;

+ 147 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/entity/StockGoodsLog.java

@@ -0,0 +1,147 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 库存更新日志表实体类
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+@Data
+@TableName("business_stock_goods_log")
+@ApiModel(value = "StockGoodsLog对象", description = "库存更新日志表")
+public class StockGoodsLog implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 库存id
+	 */
+	@ApiModelProperty(value = "库存id")
+	private Long stockId;
+	/**
+	 * 来源销售id
+	 */
+	@ApiModelProperty(value = "来源销售id")
+	private Long srcOrderId;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	private Integer isDeleted;
+	/**
+	 * 时间
+	 */
+	@ApiModelProperty(value = "时间")
+	private Date time;
+	/**
+	 * 操作人
+	 */
+	@ApiModelProperty(value = "操作人")
+	private String userName;
+	/**
+	 * 锁定数量
+	 */
+	@ApiModelProperty(value = "锁定数量")
+	private BigDecimal lockingQuantity;
+	/**
+	 * 结余数量
+	 */
+	@ApiModelProperty(value = "结余数量")
+	private BigDecimal balanceQuantity;
+	/**
+	 * 可用数量
+	 */
+	@ApiModelProperty(value = "可用数量")
+	private BigDecimal surplusRouteQuantity;
+	/**
+	 * 来源发货id
+	 */
+	@ApiModelProperty(value = "来源发货id")
+	private Long srcDeliveryId;
+	/**
+	 * 类型
+	 */
+	@ApiModelProperty(value = "类型")
+	private String type;
+
+	/**
+	 * 租户id
+	 */
+	@ApiModelProperty(value = "租户id")
+	private String tenantId;
+
+
+	/**
+	 * 原锁定数量
+	 */
+	@ApiModelProperty(value = "原锁定数量")
+	private BigDecimal lockingQuantityOld;
+	/**
+	 * 原结余数量
+	 */
+	@ApiModelProperty(value = "原结余数量")
+	private BigDecimal balanceQuantityOld;
+	/**
+	 * 原可用数量
+	 */
+	@ApiModelProperty(value = "原可用数量")
+	private BigDecimal surplusRouteQuantityOld;
+/**
+	 * 单据数量
+	 */
+	@ApiModelProperty(value = "单据数量")
+	private BigDecimal orderQuantity;
+
+
+}

+ 11 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/feign/IStockGoodsClient.java

@@ -3,6 +3,7 @@ package org.springblade.stock.feign;
 import org.springblade.common.constant.LauncherConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.entity.StockGoodsLog;
 import org.springblade.stock.vo.StockGoodsVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -40,6 +41,7 @@ public interface IStockGoodsClient {
 	String SELECT_LIST_BY_GOODS_ID = API_PREFIX + "/selectListByGoodsId";
 	String UPDATE_STOCK_LIST = API_PREFIX + "/updateStockList";
 	String SAVE_OR_UPDATE_BATCH_LIST = API_PREFIX + "/saveOrUpdateBatchList";
+	String SAVE_OR_UPDATE_BATCH_LIST_LOG = API_PREFIX + "/saveOrUpdateBatchListLog";
 
 
 	@GetMapping("/stockgoods/stocklist")
@@ -251,4 +253,13 @@ public interface IStockGoodsClient {
 
 	@GetMapping(SELECT_LIST_BY_GOODS_ID)
 	List<StockGoods> selectListByGoodsId(@RequestParam("goodId") Long id);
+
+	/**
+	 * 库存总账日志
+	 *
+	 * @param stockGoodsLogList
+	 * @return
+	 */
+	@PostMapping(SAVE_OR_UPDATE_BATCH_LIST_LOG)
+	boolean saveOrUpdateBatchListLog(@RequestBody List<StockGoodsLog> stockGoodsLogList);
 }

+ 10 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockPartsVO.java

@@ -216,4 +216,14 @@ public class AppStockPartsVO {
 	 */
 	private String inventoryConditions;
 
+	/**
+	 * 客户id
+	 */
+	private Long corpId;
+
+	/**
+	 * 热卖标准
+	 */
+	private String  standard;
+
 }

+ 36 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/StockGoodsLogVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.vo;
+
+import org.springblade.stock.entity.StockGoodsLog;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 库存更新日志表视图实体类
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "StockGoodsLogVO对象", description = "库存更新日志表")
+public class StockGoodsLogVO extends StockGoodsLog {
+	private static final long serialVersionUID = 1L;
+
+}

+ 40 - 2
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryServiceImpl.java

@@ -63,6 +63,7 @@ import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springblade.purchase.sales.feign.IOrderItemsClient;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.entity.StockGoodsLog;
 import org.springblade.stock.feign.IStockGoodsClient;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
@@ -204,7 +205,7 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 					temp.setReceivingStatus("待收货");
 					temp.setDeliverQuantity(BigDecimal.ZERO);
 					temp.setReceiveQuantity(BigDecimal.ZERO);
-					orderDescClient.updateOrder(temp);
+					orderDescClient.updateOrderNew(temp);
 				} else {
 					Order orderTemp = new Order();
 					orderTemp.setId(delivery.getOrgId());
@@ -213,7 +214,7 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 					orderTemp.setCreateFreightTime(new Date());
 					orderTemp.setDeliverQuantity(BigDecimal.ZERO);
 					orderTemp.setReceiveQuantity(BigDecimal.ZERO);
-					orderDescClient.updateOrder(orderTemp);
+					orderDescClient.updateOrderNew(orderTemp);
 				}
 			}
 			//获得销售订单本次使用返利
@@ -872,7 +873,17 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 			List<BusinessOverpaymentItem> list = new ArrayList<>();
 			List<StockGoods> finalStockGoodsList = stockGoodsClient.selectStockGoodsAll();
 			List<StockGoods> stockGoodsList1 = new ArrayList<>();
+			List<StockGoodsLog> stockGoodsLogList = new ArrayList<>();
+			Date date = new Date();
 			deliveryItemsList.forEach(e -> {
+				StockGoodsLog stockGoodsLog = new StockGoodsLog();
+				stockGoodsLog.setTime(date);
+				stockGoodsLog.setSrcDeliveryId(select.getId());
+				stockGoodsLog.setUserName(AuthUtil.getUserName());
+				stockGoodsLog.setType("工厂发货释放");
+				stockGoodsLog.setTenantId(AuthUtil.getTenantId());
+				stockGoodsLog.setCreateUser(AuthUtil.getUserId());
+				stockGoodsLog.setCreateTime(date);
 				if ("681169".equals(AuthUtil.getTenantId())) {
 					// ===================增加益付款逻辑=========================
 					if (e.getPurchaseQuantity().compareTo(e.getActualQuantity()) > 0) {
@@ -950,6 +961,12 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 				}
 				StockGoods stock = model;
 
+				stockGoodsLog.setBalanceQuantityOld(stock.getBalanceQuantity());
+				stockGoodsLog.setSurplusRouteQuantityOld(stock.getSurplusRouteQuantity());
+				stockGoodsLog.setLockingQuantityOld(stock.getLockingQuantity());
+				stockGoodsLog.setStockId(stock.getId());
+				stockGoodsLog.setOrderQuantity(e.getActualQuantity());
+
 				// 比较2个库存值是否相等
 				//BigDecimal surplusRouteQuantity = stockGoodsVOR.getData().getSurplusRouteQuantity();
 
@@ -962,6 +979,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 						e.setInventoryNumber(stockGoods.getSurplusRouteQuantity());
 						e.setInWeight(stockGoods.getInWeight());
 						stockGoodsList1.add(stockGoods);
+						stockGoodsLog.setBalanceQuantity(stockGoods.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity());
+						stockGoodsLog.setLockingQuantity(stockGoods.getLockingQuantity());
+						stockGoodsLogList.add(stockGoodsLog);
 					}
 					//修改库存单
 					else {
@@ -971,6 +992,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 						e.setInWeight(receiving.getInWeight());
 						receiving.setVersion(stock.getVersion());
 						stockGoodsList1.add(receiving);
+						stockGoodsLog.setBalanceQuantity(receiving.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantity(receiving.getSurplusRouteQuantity());
+						stockGoodsLog.setLockingQuantity(receiving.getLockingQuantity());
+						stockGoodsLogList.add(stockGoodsLog);
 					}
 				} else {
 					if (ObjectUtils.isNotNull(sysClient.getParamService("inventory")) && "1".equals(sysClient.getParamService("inventory"))) {
@@ -981,6 +1006,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 							e.setInventoryNumber(stockGoods.getSurplusRouteQuantity());
 							e.setInWeight(stockGoods.getInWeight());
 							stockGoodsList1.add(stockGoods);
+							stockGoodsLog.setBalanceQuantity(stockGoods.getBalanceQuantity());
+							stockGoodsLog.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity());
+							stockGoodsLog.setLockingQuantity(stockGoods.getLockingQuantity());
+							stockGoodsLogList.add(stockGoodsLog);
 						}
 						//修改库存单
 						else {
@@ -990,6 +1019,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 							e.setInWeight(receiving.getInWeight());
 							receiving.setVersion(stock.getVersion());
 							stockGoodsList1.add(receiving);
+							stockGoodsLog.setBalanceQuantity(receiving.getBalanceQuantity());
+							stockGoodsLog.setSurplusRouteQuantity(receiving.getSurplusRouteQuantity());
+							stockGoodsLog.setLockingQuantity(receiving.getLockingQuantity());
+							stockGoodsLogList.add(stockGoodsLog);
 						}
 					} else {
 						if (stock == null) {
@@ -998,6 +1031,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 							StockGoods receiving = iDeliveryItemsService.receiving(select.getTradeType(), stock, e);
 							receiving.setVersion(stock.getVersion());
 							stockGoodsList1.add(receiving);
+							stockGoodsLog.setBalanceQuantity(receiving.getBalanceQuantity());
+							stockGoodsLog.setSurplusRouteQuantity(receiving.getSurplusRouteQuantity());
+							stockGoodsLog.setLockingQuantity(receiving.getLockingQuantity());
+							stockGoodsLogList.add(stockGoodsLog);
 						}
 					}
 				}
@@ -1020,6 +1057,7 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 			if (!res.isSuccess()) {
 				throw new RuntimeException(res.getMsg());
 			}
+			stockGoodsClient.saveOrUpdateBatchListLog(stockGoodsLogList);
 			//更新库存内容
 			iDeliveryItemsService.updateBatchById(deliveryItemsList);
 			if ("681169".equals(AuthUtil.getTenantId())) {

+ 18 - 9
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/feign/OrderDescClient.java

@@ -76,7 +76,7 @@ public class OrderDescClient implements IOrderDescClient {
 		}
 
 		if ("681169".equals(AuthUtil.getTenantId()) || "941197".equals(AuthUtil.getTenantId())) {
-			if ("待发货".equals(order.getOrderStatus()) || "未完成".equals(order.getOrderStatus())){
+			if ("待发货".equals(order.getOrderStatus()) || "未完成".equals(order.getOrderStatus())) {
 				if (ObjectUtil.isNotEmpty(order.getDeliverQuantity())) {
 					if (order.getDeliverQuantity().compareTo(BigDecimal.ZERO) == 0) {
 						iOrderService.update(null, new LambdaUpdateWrapper<Order>()
@@ -99,7 +99,7 @@ public class OrderDescClient implements IOrderDescClient {
 			iOrderService.updateById(order);
 		} else {
 			if (ObjectUtils.isNotNull(sysClient.getParamService("synchronous"))
-				&& "1".equals(sysClient.getParamService("synchronous"))){
+				&& "1".equals(sysClient.getParamService("synchronous"))) {
 				if (ObjectUtil.isNotEmpty(order.getDeliverQuantity())) {
 					if (order.getDeliverQuantity().compareTo(BigDecimal.ZERO) == 0) {
 						iOrderService.update(null, new LambdaUpdateWrapper<Order>()
@@ -119,7 +119,7 @@ public class OrderDescClient implements IOrderDescClient {
 					}
 				}
 				iOrderService.updateById(order);
-			}else{
+			} else {
 				if (ObjectUtil.isNotEmpty(order.getStatus())) {
 					R<String> dictKey = dictBizClient.getOneByValue("to_examine", "是否启用", AuthUtil.getTenantId());
 					if ((dictKey.isSuccess() && "1".equals(dictKey.getData())) || 6 == order.getStatus()) {
@@ -136,6 +136,15 @@ public class OrderDescClient implements IOrderDescClient {
 		return R.success("操作成功");
 	}
 
+	@Override
+	public R updateOrderNew(Order order) {
+		if (order.getId() == null) {
+			throw new SecurityException("修改状态失败");
+		}
+		iOrderService.updateById(order);
+		return R.success("操作成功");
+	}
+
 
 	@Override
 	@PostMapping(UPDATE_ORDER_YCP)
@@ -348,9 +357,9 @@ public class OrderDescClient implements IOrderDescClient {
 					surplusRouteQuantity = surplusRouteQuantity.add(r.getData().getSurplusRouteQuantity().add(orderItems.getStorageInQuantity()));
 					balanceQuantity = balanceQuantity.add(surplusRouteQuantity);
 					balanceAmount = balanceAmount.add(balanceQuantity.multiply(orderItems.getPrice(), MathContext.DECIMAL32));
-					if(new BigDecimal("0.00").equals(balanceQuantity)){
+					if (new BigDecimal("0.00").equals(balanceQuantity)) {
 						stockPrice = stockPrice.add(new BigDecimal("0.00"));
-					}else{
+					} else {
 						stockPrice = stockPrice.add(balanceAmount.divide(balanceQuantity, MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
 					}
 					r.getData().setOutQuantity(r.getData().getOutQuantity().add(orderItems.getStorageInQuantity()));
@@ -368,7 +377,7 @@ public class OrderDescClient implements IOrderDescClient {
 				r.getData().setBalanceAmount(balanceAmount);
 				r.getData().setStockPrice(stockPrice);
 				R res = stockGoodsClient.updateStock(r.getData());
-				if (!res.isSuccess()){
+				if (!res.isSuccess()) {
 					throw new RuntimeException(res.getMsg());
 				}
 
@@ -401,7 +410,7 @@ public class OrderDescClient implements IOrderDescClient {
 			R<List<Acc>> r = financeClient.getAccListByCondition(acc);
 			if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
 				for (Acc acc_ : r.getData()) {
-					if (!new BigDecimal("0.00").equals(acc_.getSettlementAmount())){
+					if (!new BigDecimal("0.00").equals(acc_.getSettlementAmount())) {
 						acc_.setSettlementAmount(acc_.getSettlementAmount().subtract(settlementList.get(0).getAmount()));
 						financeClient.update(acc_);
 					}
@@ -447,8 +456,8 @@ public class OrderDescClient implements IOrderDescClient {
 	}
 
 	@Override
-	public List<OrderVO> orderInventoryList( String billType, Long itemId, Long corpId,Long storageId) {
-		return iOrderService.orderInventoryList(billType,itemId,corpId,storageId);
+	public List<OrderVO> orderInventoryList(String billType, Long itemId, Long corpId, Long storageId) {
+		return iOrderService.orderInventoryList(billType, itemId, corpId, storageId);
 	}
 
 

+ 1 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml

@@ -3572,7 +3572,7 @@ ORDER BY
         bo.order_no,
         bo.busines_date,
         item.corp_id,
-        item.order_quantity as orderQuantity
+        sum(item.order_quantity) as orderQuantity
         FROM
         business_order bo
         LEFT JOIN business_order_items item ON bo.id = item.pid

+ 69 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -69,6 +69,7 @@ import org.springblade.purchase.sales.service.IOrderPartsService;
 import org.springblade.purchase.sales.service.IOrderService;
 import org.springblade.purchase.sales.vo.*;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.entity.StockGoodsLog;
 import org.springblade.stock.feign.IStockGoodsClient;
 import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.entity.DictBiz;
@@ -1205,8 +1206,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 //				List<StockGoods> stockGoodsList = castToList(redisTemplate.opsForValue().get("stockGoods"), StockGoods.class);
 				List<StockGoods> stockGoodsList = stockGoodsClient.selectStockGoodsAll();
 				List<StockGoods> stockGoods = new ArrayList<>();
+				List<StockGoodsLog> stockGoodsLogList = new ArrayList<>();
+				Date date = new Date();
 				if (CollectionUtils.isNotEmpty(orderItems)) {
 					for (OrderItems item : orderItems) {
+						StockGoodsLog stockGoodsLog = new StockGoodsLog();
+						stockGoodsLog.setTime(date);
+						stockGoodsLog.setSrcOrderId(salesOrder.getId());
+						stockGoodsLog.setUserName(AuthUtil.getUserName());
+						stockGoodsLog.setType("销售请核锁定");
+						stockGoodsLog.setTenantId(AuthUtil.getTenantId());
+						stockGoodsLog.setCreateUser(AuthUtil.getUserId());
+						stockGoodsLog.setCreateTime(date);
 						// 开始锁定库存,减少可用
 						StockGoods oneStock = stockGoodsList.stream().filter(s ->
 							s.getGoodsId().equals(item.getItemId())
@@ -1224,6 +1235,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						// 锁定库存
 						BigDecimal lockingQuantity = oneStock.getLockingQuantity();
 
+						stockGoodsLog.setStockId(oneStock.getId());
+						stockGoodsLog.setBalanceQuantityOld(oneStock.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantityOld(surplusRouteQuantity);
+						stockGoodsLog.setLockingQuantityOld(lockingQuantity);
+						stockGoodsLog.setOrderQuantity(orderQuantity);
+
 						// 判断比较大小
 						if (orderQuantity.compareTo(surplusRouteQuantity) > 0) {
 							throw new SecurityException("锁定库存失败:原单据的" + oneStock.getCode() + "订货数量大于可用库存,无法锁定");
@@ -1237,6 +1254,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						oneStock.setLockingQuantity(lockingQuantity == null ? new BigDecimal("0").add(orderQuantity) : lockingQuantity.add(orderQuantity));
 						oneStock.setVersion(oneStock.getVersion());
 						stockGoods.add(oneStock);
+
+						stockGoodsLog.setBalanceQuantity(oneStock.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantity(oneStock.getSurplusRouteQuantity());
+						stockGoodsLog.setLockingQuantity(oneStock.getLockingQuantity());
+						stockGoodsLogList.add(stockGoodsLog);
 					}
 					// 更新库存
 					R goods = stockGoodsClient.updateStockList(stockGoods);
@@ -1244,6 +1266,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 //						throw new SecurityException("锁定库存失败: " + salesOrder.getOrderNo() + "更新失败");
 						throw new SecurityException(goods.getMsg());
 					}
+					stockGoodsClient.saveOrUpdateBatchListLog(stockGoodsLogList);
 				}
 			}
 		}
@@ -1675,7 +1698,17 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			List<StockGoods> stockGoodsList = castToList(redisTemplate.opsForValue().get("stockGoods"), StockGoods.class);
 
 			if (CollectionUtils.isNotEmpty(orderItems)) {
+				List<StockGoodsLog> stockGoodsLogList = new ArrayList<>();
+				Date date = new Date();
 				orderItems.forEach(e -> {
+					StockGoodsLog stockGoodsLog = new StockGoodsLog();
+					stockGoodsLog.setTime(date);
+					stockGoodsLog.setSrcOrderId(order.getId());
+					stockGoodsLog.setUserName(AuthUtil.getUserName());
+					stockGoodsLog.setType("销售审核驳回释放");
+					stockGoodsLog.setTenantId(AuthUtil.getTenantId());
+					stockGoodsLog.setCreateUser(AuthUtil.getUserId());
+					stockGoodsLog.setCreateTime(date);
 					// 开始锁定库存,减少可用
 					StockGoods oneStock = stockGoodsList.stream().filter(s ->
 						s.getGoodsId().equals(e.getItemId())
@@ -1692,6 +1725,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 					// 锁定库存
 					BigDecimal lockingQuantity = oneStock.getLockingQuantity();
 
+
+					stockGoodsLog.setStockId(oneStock.getId());
+					stockGoodsLog.setBalanceQuantityOld(oneStock.getBalanceQuantity());
+					stockGoodsLog.setSurplusRouteQuantityOld(surplusRouteQuantity);
+					stockGoodsLog.setLockingQuantityOld(lockingQuantity);
+					stockGoodsLog.setOrderQuantity(orderQuantity);
+
 					// 判断比较大小
 					if (orderQuantity.compareTo(lockingQuantity) > 0) {
 						throw new SecurityException("驳回失败:原单据的订货数量大于锁定库存,无法释放库存");
@@ -1706,7 +1746,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 //						throw new SecurityException("驳回失败: 更新库存失败");
 						throw new SecurityException(res.getMsg());
 					}
+					stockGoodsLog.setBalanceQuantity(oneStock.getBalanceQuantity());
+					stockGoodsLog.setSurplusRouteQuantity(oneStock.getSurplusRouteQuantity());
+					stockGoodsLog.setLockingQuantity(oneStock.getLockingQuantity());
+					stockGoodsLogList.add(stockGoodsLog);
 				});
+				stockGoodsClient.saveOrUpdateBatchListLog(stockGoodsLogList);
+
 			}
 		}
 		order.setStatus(0);
@@ -1962,8 +2008,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				if (CollectionUtils.isNotEmpty(orderItems)) {
 					List<StockGoods> stockGoods = new ArrayList<>();
 					StockGoods oneStock = null;
+					List<StockGoodsLog> stockGoodsLogList = new ArrayList<>();
+					Date date = new Date();
 					boolean status = ObjectUtils.isNotNull(sysClient.getParamService("inventory")) && "1".equals(sysClient.getParamService("inventory"));
 					for (OrderItems e : orderItems) {
+						StockGoodsLog stockGoodsLog = new StockGoodsLog();
+						stockGoodsLog.setTime(date);
+						stockGoodsLog.setSrcOrderId(order.getId());
+						stockGoodsLog.setUserName(AuthUtil.getUserName());
+						stockGoodsLog.setType("销售撤销请核释放");
+						stockGoodsLog.setTenantId(AuthUtil.getTenantId());
+						stockGoodsLog.setCreateUser(AuthUtil.getUserId());
+						stockGoodsLog.setCreateTime(date);
 						if (status) {
 							// 开始锁定库存,减少可用
 							oneStock = stockGoodsList.stream().filter(s ->
@@ -1991,6 +2047,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						// 锁定库存
 						BigDecimal lockingQuantity = oneStock.getLockingQuantity();
 
+						stockGoodsLog.setStockId(oneStock.getId());
+						stockGoodsLog.setBalanceQuantityOld(oneStock.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantityOld(surplusRouteQuantity);
+						stockGoodsLog.setLockingQuantityOld(lockingQuantity);
+						stockGoodsLog.setOrderQuantity(orderQuantity);
+
 						// 判断比较大小
 						if (orderQuantity.compareTo(lockingQuantity) > 0) {
 							throw new SecurityException("撤销失败:原单据的" + oneStock.getCode() + "订货数量:" + orderQuantity + "大于锁定库存:" + lockingQuantity + ",无法释放 库存");
@@ -2001,6 +2063,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						oneStock.setLockingQuantity(lockingQuantity == null ? new BigDecimal("0") : lockingQuantity.subtract(orderQuantity));
 						oneStock.setVersion(oneStock.getVersion());
 						stockGoods.add(oneStock);
+
+						stockGoodsLog.setBalanceQuantity(oneStock.getBalanceQuantity());
+						stockGoodsLog.setSurplusRouteQuantity(oneStock.getSurplusRouteQuantity());
+						stockGoodsLog.setLockingQuantity(oneStock.getLockingQuantity());
+						stockGoodsLogList.add(stockGoodsLog);
 					}
 					// 更新库存
 					R r = stockGoodsClient.updateStockList(stockGoods);
@@ -2008,6 +2075,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 //						throw new SecurityException("撤销失败:" + order.getOrderNo() + "更新库存失败");
 						throw new SecurityException(r.getMsg());
 					}
+
+					stockGoodsClient.saveOrUpdateBatchListLog(stockGoodsLogList);
 				}
 			}
 			order.setStatus(0);

+ 1 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java

@@ -306,7 +306,7 @@ public class GoodsDescController extends BladeController {
 				.eq(PjProductLaunch::getGoodsId, goodsDesc.getId())
 				.eq(PjProductLaunch::getUpAndDownShelves, 1));
 			if (count > 0) {
-				return R.fail(500, "该轮胎上架,请先下架轮胎在进行操作");
+				return R.fail(500, "该轮胎上架,请先下架轮胎在进行操作");
 			}
 		}
 		boolean status = goodsDescService.updateById(goodsDesc);

+ 22 - 6
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java

@@ -29,6 +29,7 @@ import lombok.AllArgsConstructor;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
+import org.springblade.client.entity.CorpsAttn;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -37,6 +38,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.entity.*;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.PjOrderExportExcelCG;
@@ -72,6 +74,7 @@ public class OrderController extends BladeController {
 	private final IOrderService orderService;
 	private final IOrderItemsService orderItemsService;
 	private IUserClient iUserClient;//获取用户信息
+	private final ICorpsAttnService corpsAttnService;
 
 	/**
 	 * 销售详情
@@ -176,7 +179,7 @@ public class OrderController extends BladeController {
 	@GetMapping("/listExport")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入order")
-	public void  listExport(PjOrder order, HttpServletResponse response) {
+	public void listExport(PjOrder order, HttpServletResponse response) {
 		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)
@@ -250,9 +253,9 @@ public class OrderController extends BladeController {
 					.eq(PjOrderItems::getPid, item.getId())) + "");
 			});
 		}
-		if ("XS".equals(order.getBsType())){
+		if ("XS".equals(order.getBsType())) {
 			ExcelUtil.export(response, "销售订单", "订单数据", BeanUtil.copy(pages, PjOrderExportExcelXS.class), PjOrderExportExcelXS.class);
-		}else{
+		} else {
 			ExcelUtil.export(response, "采购订单", "订单数据", BeanUtil.copy(pages, PjOrderExportExcelCG.class), PjOrderExportExcelCG.class);
 		}
 
@@ -519,15 +522,28 @@ public class OrderController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "购物车列表不分页查询", notes = "传入shoppingCart")
 	public R<List<Map<String, Object>>> listAll(PjOrder order) {
+		PjCorpsAttn pjCorpsAttn = corpsAttnService.getOne(new LambdaQueryWrapper<PjCorpsAttn>()
+			.eq(PjCorpsAttn::getTenantId,AuthUtil.getTenantId())
+			.eq(PjCorpsAttn::getIsDeleted,0)
+			.eq(PjCorpsAttn::getUserId,AuthUtil.getUserId()));
+		if (ObjectUtils.isNull(pjCorpsAttn)){
+			throw new RuntimeException("未找到用户信息");
+		}
 		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)
 			//公司
 			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
 			.eq(PjOrder::getActualPaymentStatus, 1)
-			.eq(PjOrder::getCreateUser, AuthUtil.getUserId()).orderByDesc(PjOrder::getCreateTime);
+			.eq(PjOrder::getCustomerId, pjCorpsAttn.getPid())
+			.orderByDesc(PjOrder::getCreateTime);
 		List<PjOrder> list = orderService.list(lambdaQueryWrapper);
-
+		for (PjOrder item : list) {
+			if ("内部销售".equals(item.getBusinessSource())){
+				item.setSrcOrdNo(item.getOrdNo());
+			}
+		}
+		orderService.updateBatchById(list);
 		//按照所属公司分组
 		Map<String, List<PjOrder>> map = list.stream().filter(item -> com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(item.getSrcOrdNo()))
 			.collect(Collectors.groupingBy(PjOrder::getSrcOrdNo));
@@ -589,7 +605,7 @@ public class OrderController extends BladeController {
 	@GetMapping("/collectionExport")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入order")
-	public void  collectionExport(OrderVO order, HttpServletResponse response) {
+	public void collectionExport(OrderVO order, HttpServletResponse response) {
 		order.setTenantId(AuthUtil.getTenantId());
 		List<OrderStatistics> list = orderService.collectionStatisticsList(order);
 		ExcelUtil.export(response, "应收款统计", "应收款统计", list, OrderStatistics.class);

+ 3 - 4
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -305,10 +305,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 
 			// 保存订单明细
 			if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
-				long goodsId = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsId).distinct().count();
-				if (goodsId < order.getOrderItemsList().size()) {
-					throw new RuntimeException("明细中存在重复数据,保存失败");
-				}
 				//所属公司
 				R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
 				if (ObjectUtil.isNotEmpty(dept)) {
@@ -458,6 +454,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				order.getOrderItemsList().forEach(item -> {
 					item.setBizType(order.getBsType());
 					item.setBillNo(order.getOrdNo());
+					//计算小计
+					item.setSubTotalMoney(item.getGoodsNum().multiply(item.getPrice()));
 					if (item.getId() == null) {
 						item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 						item.setCreateTime(new Date());
@@ -539,6 +537,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 
 		//修改销售状态为待发货
 		pjOrder.setStatus(OrderTypeEnum.XSDFH.getType());
+		pjOrder.setXcxStatus(OrderTypeEnum.XSDFH.getType());
 		pjOrder.setGenerateTask(OrderTypeEnum.SCRW.getType());
 		if ("内部销售".equals(pjOrder.getBusinessSource())) {
 			pjOrder.setActualPaymentStatus(1);

+ 21 - 10
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/controller/ProductLaunchController.java

@@ -37,10 +37,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
-import org.springblade.salesPart.entity.PjCorpsAttn;
-import org.springblade.salesPart.entity.PjCorpsDesc;
-import org.springblade.salesPart.entity.PjProductLaunch;
-import org.springblade.salesPart.entity.PjProductLaunchFiles;
+import org.springblade.salesPart.entity.*;
 import org.springblade.salesPart.excel.ProductLaunchImportExcel;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchFilesService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
@@ -99,7 +96,16 @@ public class ProductLaunchController extends BladeController {
 			.eq(PjProductLaunch::getIsDeleted, 0)
 			.eq(ObjectUtils.isNotNull(productLaunch.getBrandId()), PjProductLaunch::getBrandId, productLaunch.getBrandId())
 			.like(ObjectUtils.isNotNull(productLaunch.getBrandItem()), PjProductLaunch::getBrandItem, productLaunch.getBrandItem())
-			.eq(PjProductLaunch::getBillType, productLaunch.getBillType());
+			.eq(PjProductLaunch::getBillType, productLaunch.getBillType())
+		;
+		if (ObjectUtils.isNotEmpty(productLaunch.getExplosionProof())
+			|| ObjectUtils.isNotEmpty(productLaunch.getOriginalFactory())
+			|| ObjectUtils.isNotEmpty(productLaunch.getSelfRecovery())) {
+			lambdaQueryWrapper.and(i -> i.eq(ObjectUtils.isNotEmpty(productLaunch.getExplosionProof()), PjProductLaunch::getExplosionProof, productLaunch.getExplosionProof())//防爆
+				.or().eq(ObjectUtils.isNotEmpty(productLaunch.getOriginalFactory()), PjProductLaunch::getOriginalFactory, productLaunch.getOriginalFactory())//原厂
+				.or().eq(ObjectUtils.isNotEmpty(productLaunch.getSelfRecovery()), PjProductLaunch::getSelfRecovery, productLaunch.getSelfRecovery())//自修补
+			);
+		}
 		lambdaQueryWrapper.like(ObjectUtils.isNotEmpty(productLaunch.getSpecificationAndModel()), PjProductLaunch::getSpecificationAndModel, productLaunch.getSpecificationAndModel())//规格型号
 			.eq(ObjectUtil.isNotEmpty(productLaunch.getUpAndDownShelves()), PjProductLaunch::getUpAndDownShelves, productLaunch.getUpAndDownShelves());//上下架
 		if (ObjectUtil.isNotEmpty(productLaunch.getCname())) {
@@ -275,11 +281,16 @@ public class ProductLaunchController extends BladeController {
 			.eq(PjProductLaunch::getIsDeleted, 0)
 			.eq(PjProductLaunch::getUpAndDownShelves, 1)
 			.eq(PjProductLaunch::getSalesCompanyId, AuthUtil.getDeptId())//公司
-			.eq(ObjectUtils.isNotEmpty(productLaunch.getBrandId()), PjProductLaunch::getBrandId, productLaunch.getBrandId())//品牌
-			.eq(ObjectUtils.isNotEmpty(productLaunch.getExplosionProof()), PjProductLaunch::getExplosionProof, productLaunch.getExplosionProof())//防爆
-			.eq(ObjectUtils.isNotEmpty(productLaunch.getOriginalFactory()), PjProductLaunch::getOriginalFactory, productLaunch.getOriginalFactory())//原厂
-			.eq(ObjectUtils.isNotEmpty(productLaunch.getSelfRecovery()), PjProductLaunch::getSelfRecovery, productLaunch.getSelfRecovery())//自修补
-			.like(ObjectUtils.isNotEmpty(productLaunch.getBrandName()), PjProductLaunch::getBrandName, productLaunch.getBrandName())
+			.eq(ObjectUtils.isNotEmpty(productLaunch.getBrandId()), PjProductLaunch::getBrandId, productLaunch.getBrandId());//品牌
+		if (ObjectUtils.isNotEmpty(productLaunch.getExplosionProof())
+			|| ObjectUtils.isNotEmpty(productLaunch.getOriginalFactory())
+			|| ObjectUtils.isNotEmpty(productLaunch.getSelfRecovery())) {
+			lambdaQueryWrapper.and(i -> i.eq(ObjectUtils.isNotEmpty(productLaunch.getExplosionProof()), PjProductLaunch::getExplosionProof, productLaunch.getExplosionProof())//防爆
+				.or().eq(ObjectUtils.isNotEmpty(productLaunch.getOriginalFactory()), PjProductLaunch::getOriginalFactory, productLaunch.getOriginalFactory())//原厂
+				.or().eq(ObjectUtils.isNotEmpty(productLaunch.getSelfRecovery()), PjProductLaunch::getSelfRecovery, productLaunch.getSelfRecovery())//自修补
+			);
+		}
+		lambdaQueryWrapper.like(ObjectUtils.isNotEmpty(productLaunch.getBrandName()), PjProductLaunch::getBrandName, productLaunch.getBrandName())
 			.ne(PjProductLaunch::getWhetherShare, 1)
 			.orderByAsc(PjProductLaunch::getBillType);
 

+ 7 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipMapper.xml

@@ -82,7 +82,13 @@
              ps.is_deleted = '0'
           AND FIND_IN_SET( ps.biz_type_name, 'FHGD,SHGD,TKSHGD' )
             AND ps.tenant_id = #{order.tenantId}
+          AND FIND_IN_SET( ps.status_name, '已入库,已出库' )
+        <if test="order.dot!=null and order.dot!=''">
             and psi.dot = #{order.dot}
+        </if>
+        <if test="order.dot == null or order.dot ==''">
+            and psi.dot is null
+        </if>
         <if test="order.storageId!=null">
             and ps.storage_id = #{order.storageId}
         </if>
@@ -112,6 +118,7 @@
         </if>
         GROUP BY
             ps.billno
+        ORDER BY ps.busines_date asc
     </select>
 
 </mapper>

+ 11 - 8
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

@@ -196,10 +196,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 		// 保存订单明细
 		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
-			long goodsId = ship.getShipItemsList().stream().map(PjShipItems::getGoodsName).distinct().count();
-			if (goodsId < ship.getShipItemsList().size()) {
-				throw new RuntimeException("明细中存在重复数据,保存失败");
-			}
 			List<PjShipItems> shipItemsList = new ArrayList<>();
 			ship.getShipItemsList().forEach(item -> {
 				if (item.getId() == null) {
@@ -291,6 +287,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			List<PjOrderItems> list = orderItemsService.list(new QueryWrapper<PjOrderItems>()
 				.eq("pid", rwShip.getOrdId())
 				.eq("is_deleted", 0)
+				.apply("goods_num != send_num")
 				.eq("tenant_id", AuthUtil.getTenantId()));
 			if (ObjectUtil.isNotEmpty(list)) {
 				List<PjShipItems> shipItemsList = new ArrayList<>();
@@ -695,6 +692,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			List<PjOrderItems> list = orderItemsService.list(new QueryWrapper<PjOrderItems>()
 				.eq("pid", rwShip.getOrdId())
 				.eq("is_deleted", 0)
+				.apply("goods_num != send_num")
 				.eq("tenant_id", AuthUtil.getTenantId()));
 			if (ObjectUtil.isNotEmpty(list)) {
 				List<PjShipItems> shipItemsList = new ArrayList<>();
@@ -904,7 +902,11 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					stockDesc.setBalanceQuantity(item.getSendNum());
 					stockDesc.setStoreInventory(item.getSendNum());
 					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
-					stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					if(stockDesc.getBalanceQuantity().compareTo(new BigDecimal("0")) !=0){
+						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					}else{
+						stockDesc.setInventoryCostPrice(item.getPrice());
+					}
 				} else {
 					stockDesc.setId(stockOne.getId());
 					stockDesc.setUpdateTime(new Date());
@@ -913,9 +915,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					stockDesc.setStoreInventory(stockDesc.getBalanceQuantity());
 					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
 					stockDesc.setInventoryAmount(stockDesc.getInventoryAmount().add(stockOne.getInventoryAmount()));
-					stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					if(stockDesc.getBalanceQuantity().compareTo(new BigDecimal("0")) !=0){
+						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					}
 					stockDesc.setVersion(stockOne.getVersion());
-
 				}
 				boolean count = iStockDescService.saveOrUpdate(stockDesc);
 				if (!count) {
@@ -1074,7 +1077,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				}
 
 				item.setUnits(goodsDesc.getUnit());
-				item.setSendNum(itemExcel.getGoodsNum());
+				item.setSendNum(new BigDecimal("0"));
 			} else {
 				throw new RuntimeException("第" + (i + 1) + "行,商品名称不存在");
 			}

+ 9 - 3
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java

@@ -473,6 +473,7 @@ public class StockGoodsController extends BladeController {
 			}
 		}
 		String shoppingMall = "";
+		Long corpId = null;
 		if (AuthUtil.getUserRole().equals("客户")) {
 			CorpsAttn corpsAttn = corpsAttnClient.getUser(AuthUtil.getUserId());
 			if (ObjectUtils.isNull(corpsAttn)) {
@@ -483,6 +484,7 @@ public class StockGoodsController extends BladeController {
 					throw new RuntimeException("未查到用户信息");
 				} else {
 					shoppingMall = corpsDesc.getShoppingMall();
+					corpId = corpsDesc.getId();
 				}
 			}
 		} else {
@@ -490,6 +492,10 @@ public class StockGoodsController extends BladeController {
 		}
 		appStockPartsVO.setUserType(shoppingMall);
 		String finalShoppingMall = shoppingMall;
+		if ("常买".equals(appStockPartsVO.getLabels())) {
+			appStockPartsVO.setCorpId(corpId);
+			appStockPartsVO.setStandard(sysClient.getParamService("hot.selling.standard"));
+		}
 		IPage<AppStockPartsVO> pages = stockGoodsService.selectAppStockPartsPage(Condition.getPage(query), appStockPartsVO);
 		List<AppStockPartsVO> records = pages.getRecords();
 		if (CollectionUtils.isNotEmpty(records)) {
@@ -738,7 +744,7 @@ public class StockGoodsController extends BladeController {
 	 * 分页 库存账
 	 */
 	@GetMapping("/export")
-	public void list(StockGoodsVO stockGoods,HttpServletResponse response) {
+	public void list(StockGoodsVO stockGoods, HttpServletResponse response) {
 
 		LambdaQueryWrapper<StockGoods> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(StockGoods::getTenantId, SecureUtil.getTenantId());
@@ -751,8 +757,8 @@ public class StockGoodsController extends BladeController {
 			if (CollectionUtils.isNotEmpty(goodId)) {
 				lambdaQueryWrapper.in(StockGoods::getGoodsId, goodId);
 			} else {
-				lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getCode()),StockGoods::getCode, stockGoods.getCode());
-				lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getCname()),StockGoods::getCname, stockGoods.getCname());
+				lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getCode()), StockGoods::getCode, stockGoods.getCode());
+				lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getCname()), StockGoods::getCname, stockGoods.getCname());
 			}
 		}
 		lambdaQueryWrapper.like(Func.isNotEmpty(stockGoods.getLotNo()), StockGoods::getLotNo, stockGoods.getLotNo());

+ 126 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsLogController.java

@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.stock.entity.StockGoodsLog;
+import org.springblade.stock.vo.StockGoodsLogVO;
+import org.springblade.stock.service.IStockGoodsLogService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 库存更新日志表 控制器
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/stockgoodslog")
+@Api(value = "库存更新日志表", tags = "库存更新日志表接口")
+public class StockGoodsLogController extends BladeController {
+
+	private final IStockGoodsLogService stockGoodsLogService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入stockGoodsLog")
+	public R<StockGoodsLog> detail(StockGoodsLog stockGoodsLog) {
+		StockGoodsLog detail = stockGoodsLogService.getOne(Condition.getQueryWrapper(stockGoodsLog));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 库存更新日志表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入stockGoodsLog")
+	public R<IPage<StockGoodsLog>> list(StockGoodsLog stockGoodsLog, Query query) {
+		IPage<StockGoodsLog> pages = stockGoodsLogService.page(Condition.getPage(query), Condition.getQueryWrapper(stockGoodsLog));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 库存更新日志表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入stockGoodsLog")
+	public R<IPage<StockGoodsLogVO>> page(StockGoodsLogVO stockGoodsLog, Query query) {
+		IPage<StockGoodsLogVO> pages = stockGoodsLogService.selectStockGoodsLogPage(Condition.getPage(query), stockGoodsLog);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 库存更新日志表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入stockGoodsLog")
+	public R save(@Valid @RequestBody StockGoodsLog stockGoodsLog) {
+		return R.status(stockGoodsLogService.save(stockGoodsLog));
+	}
+
+	/**
+	 * 修改 库存更新日志表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入stockGoodsLog")
+	public R update(@Valid @RequestBody StockGoodsLog stockGoodsLog) {
+		return R.status(stockGoodsLogService.updateById(stockGoodsLog));
+	}
+
+	/**
+	 * 新增或修改 库存更新日志表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入stockGoodsLog")
+	public R submit(@Valid @RequestBody StockGoodsLog stockGoodsLog) {
+		return R.status(stockGoodsLogService.saveOrUpdate(stockGoodsLog));
+	}
+
+	
+	/**
+	 * 删除 库存更新日志表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(stockGoodsLogService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 9 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/feign/StockGoodsClient.java

@@ -22,6 +22,8 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.entity.StockGoodsLog;
+import org.springblade.stock.service.IStockGoodsLogService;
 import org.springblade.stock.service.IStockGoodsService;
 import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.feign.ISysClient;
@@ -48,6 +50,8 @@ public class StockGoodsClient implements IStockGoodsClient {
 	//库存
 	private IStockGoodsService stockGoodsService;
 
+	private IStockGoodsLogService stockGoodsLogService;
+
 	private IStorageClient iStorageClient;
 
 	//商品信息
@@ -423,6 +427,11 @@ public class StockGoodsClient implements IStockGoodsClient {
 		return stockGoodsService.list(lambdaQueryWrapper);
 	}
 
+	@Override
+	public boolean saveOrUpdateBatchListLog(List<StockGoodsLog> stockGoodsLogList) {
+		return stockGoodsLogService.saveOrUpdateBatch(stockGoodsLogList);
+	}
+
 	/**
 	 * 将Object转换成List类型
 	 *

+ 42 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsLogMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.mapper;
+
+import org.springblade.stock.entity.StockGoodsLog;
+import org.springblade.stock.vo.StockGoodsLogVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 库存更新日志表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+public interface StockGoodsLogMapper extends BaseMapper<StockGoodsLog> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param stockGoodsLog
+	 * @return
+	 */
+	List<StockGoodsLogVO> selectStockGoodsLogPage(IPage page, StockGoodsLogVO stockGoodsLog);
+
+}

+ 34 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsLogMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.stock.mapper.StockGoodsLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="stockGoodsLogResultMap" type="org.springblade.stock.entity.StockGoodsLog">
+        <id column="id" property="id"/>
+        <result column="stock_id" property="stockId"/>
+        <result column="src_order_id" property="srcOrderId"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="time" property="time"/>
+        <result column="user_name" property="userName"/>
+        <result column="locking_quantity" property="lockingQuantity"/>
+        <result column="balance_quantity" property="balanceQuantity"/>
+        <result column="surplus_route_quantity" property="surplusRouteQuantity"/>
+        <result column="src_delivery_id" property="srcDeliveryId"/>
+        <result column="type" property="type"/>
+        <result column="locking_quantity_old" property="lockingQuantityOld"/>
+        <result column="balance_quantity_old" property="balanceQuantityOld"/>
+        <result column="surplus_route_quantity_old" property="surplusRouteQuantityOld"/>
+        <result column="order_quantity" property="orderQuantity"/>
+    </resultMap>
+
+
+    <select id="selectStockGoodsLogPage" resultMap="stockGoodsLogResultMap">
+        select * from business_stock_goods_log where is_deleted = 0
+    </select>
+
+</mapper>

+ 19 - 3
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml

@@ -191,9 +191,6 @@
             <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "3"'>
                 AND t1.surplus_route_quantity &lt; 0
             </if>
-            <if test="stock.labels != null and stock.labels != ''">
-                and find_in_set(#{stock.labels},t3.label)
-            </if>
             <if test="stock.goodsId != null">
                 and t1.goods_id = #{stock.goodsId}
             </if>
@@ -215,6 +212,25 @@
             <if test="stock.date != null and stock.date != '' and stock.date == 2">
                 and date_format(t1.in_date, '%Y %m') = date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),'%Y %m')
             </if>
+            <if test="stock.labels != null and stock.labels != '' and stock.labels != '常买'">
+                and find_in_set(#{stock.labels},t3.label)
+            </if>
+            <if test="stock.labels != null and stock.labels != '' and stock.labels == '常买'">
+                and (
+                SELECT
+                SUM( boi.storage_in_quantity )
+                FROM
+                business_order bo
+                LEFT JOIN business_order_items boi ON bo.id = boi.pid
+                WHERE
+                bo.is_deleted = 0
+                and bo.tenant_id = #{stock.tenantId}
+                AND boi.item_id = t1.goods_id
+                ) > #{stock.standard}
+                <if test="stock.corpId != null">
+                    and bo.corp_id = #{stock.corpId}
+                </if>
+            </if>
             <if test='stock.sort != null and stock.sort != "" and stock.sort == "0"'>
                 <if test='stock.sortType != null and stock.sortType != "" and stock.sortType == "1"'>
                     ORDER BY t3.cname ASC

+ 41 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsLogService.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.service;
+
+import org.springblade.stock.entity.StockGoodsLog;
+import org.springblade.stock.vo.StockGoodsLogVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 库存更新日志表 服务类
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+public interface IStockGoodsLogService extends IService<StockGoodsLog> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param stockGoodsLog
+	 * @return
+	 */
+	IPage<StockGoodsLogVO> selectStockGoodsLogPage(IPage<StockGoodsLogVO> page, StockGoodsLogVO stockGoodsLog);
+
+}

+ 41 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsLogServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.stock.service.impl;
+
+import org.springblade.stock.entity.StockGoodsLog;
+import org.springblade.stock.vo.StockGoodsLogVO;
+import org.springblade.stock.mapper.StockGoodsLogMapper;
+import org.springblade.stock.service.IStockGoodsLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 库存更新日志表 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-07-24
+ */
+@Service
+public class StockGoodsLogServiceImpl extends ServiceImpl<StockGoodsLogMapper, StockGoodsLog> implements IStockGoodsLogService {
+
+	@Override
+	public IPage<StockGoodsLogVO> selectStockGoodsLogPage(IPage<StockGoodsLogVO> page, StockGoodsLogVO stockGoodsLog) {
+		return page.setRecords(baseMapper.selectStockGoodsLogPage(page, stockGoodsLog));
+	}
+
+}

+ 28 - 4
blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

@@ -43,8 +43,10 @@ import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springblade.purchase.sales.vo.OrderVO;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.entity.StockGoodsLog;
 import org.springblade.stock.excel.StockGoodsExcel;
 import org.springblade.stock.mapper.StockGoodsMapper;
+import org.springblade.stock.service.IStockGoodsLogService;
 import org.springblade.stock.service.IStockGoodsService;
 import org.springblade.stock.vo.AppStockPartsVO;
 import org.springblade.stock.vo.AppStockVO;
@@ -56,10 +58,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 库存账 服务实现类
@@ -90,6 +89,8 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 
 	private final ISysClient sysClient;
 
+	private final IStockGoodsLogService stockGoodsLogService;
+
 	@Override
 	public IPage<StockGoodsVO> selectStockGoodsPage(IPage<StockGoodsVO> page, StockGoodsVO stockGoods) {
 		return page.setRecords(baseMapper.selectStockGoodsPage(page, stockGoods));
@@ -205,7 +206,18 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 		StringBuffer good = new StringBuffer();//未找到商品信息的商品
 		StringBuffer corp = new StringBuffer();//未找到供应商的商品
 		StringBuffer storage = new StringBuffer();//未找到仓库的商品
+		List<StockGoodsLog> stockGoodsLogList = new ArrayList<>();
+		Date date = new Date();
 		for (StockGoodsExcel datum : data) {
+
+			StockGoodsLog stockGoodsLog = new StockGoodsLog();
+			stockGoodsLog.setTime(date);
+			stockGoodsLog.setUserName(AuthUtil.getUserName());
+			stockGoodsLog.setType("库存导入更新");
+			stockGoodsLog.setTenantId(AuthUtil.getTenantId());
+			stockGoodsLog.setCreateUser(AuthUtil.getUserId());
+			stockGoodsLog.setCreateTime(date);
+
 			StockGoods stockGoods = new StockGoods();
 			stockGoods.setBalanceQuantity(datum.getSurplusRouteQuantity());//结余数量
 			stockGoods.setSurplusRouteQuantity(datum.getSurplusRouteQuantity());//可用数量
@@ -284,13 +296,25 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 				stockGoods.setLockingQuantity(BigDecimal.ZERO);//锁定数量
 				baseMapper.insert(stockGoods);
 			} else {
+				stockGoodsLog.setStockId(goods.getId());
+				stockGoodsLog.setBalanceQuantityOld(goods.getBalanceQuantity());
+				stockGoodsLog.setSurplusRouteQuantityOld(goods.getSurplusRouteQuantity());
+				stockGoodsLog.setLockingQuantityOld(goods.getLockingQuantity());
+				stockGoodsLog.setOrderQuantity(new BigDecimal("0"));
+
+				stockGoodsLogList.add(stockGoodsLog);
 				stockGoods.setUpdateUser(SecureUtil.getUserId());
 				stockGoods.setUpdateTime(new Date());
 				stockGoods.setId(goods.getId());
 				stockGoods.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity().subtract(goods.getLockingQuantity()));//可用数量 = 可用减去之前的锁定
 				baseMapper.updateById(stockGoods);
+				stockGoodsLog.setBalanceQuantity(stockGoods.getBalanceQuantity());
+				stockGoodsLog.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity());
+				stockGoodsLog.setLockingQuantity(goods.getLockingQuantity());
+				stockGoodsLogList.add(stockGoodsLog);
 			}
 		}
+		stockGoodsLogService.saveOrUpdateBatch(stockGoodsLogList);
 		String message = new String("导入成功");
 		if (StringUtils.isNotBlank(good)) {
 			message = message + "在基础资料中未查到商品信息的商品有:" + good.toString();