@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional ;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.util.* ;
import java.util.stream.Collectors ;
@ -162,21 +163,23 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
purchaseDetail . setStockLogList1 ( stockLogMap . get ( productId ) ) ;
productIdList . add ( productId ) ;
}
// 20240602 将商品的采购价、零售价、批发价回填回来
// 获取商品
final List < Product > productList = productService . getProductList ( productIdList ) ;
// 将商品封装为map,key为商品id,value为商品信息
final Map < String , Product > productMap = productList . stream ( ) . collect ( Collectors . toMap ( Product : : getId , product - > product ) ) ;
for ( PurchaseDetail purchaseDetail : purchaseDetails ) {
final String productId = purchaseDetail . getProductId ( ) ;
if ( productMap . containsKey ( productId ) ) {
final Product product = productMap . get ( productId ) ;
purchaseDetail . setPrice ( product . getPrice ( ) ) ;
purchaseDetail . setWholesalePrice ( product . getWholesalePrice ( ) ) ;
purchaseDetail . setPurchasePrice ( product . getPurchasePrice ( ) ) ;
if ( ! productIdList . isEmpty ( ) ) {
// 20240602 将商品的采购价、零售价、批发价回填回来
// 获取商品
final List < Product > productList = productService . getProductList ( productIdList ) ;
// 将商品封装为map,key为商品id,value为商品信息
final Map < String , Product > productMap = productList . stream ( ) . collect ( Collectors . toMap ( Product : : getId , product - > product ) ) ;
for ( PurchaseDetail purchaseDetail : purchaseDetails ) {
final String productId = purchaseDetail . getProductId ( ) ;
if ( productMap . containsKey ( productId ) ) {
final Product product = productMap . get ( productId ) ;
purchaseDetail . setPrice ( product . getPrice ( ) ) ;
purchaseDetail . setWholesalePrice ( product . getWholesalePrice ( ) ) ;
purchaseDetail . setPurchasePrice ( product . getPurchasePrice ( ) ) ;
}
}
purchaseVo . setPurchaseDetails ( purchaseDetails ) ;
}
purchaseVo . setPurchaseDetails ( purchaseDetails ) ;
// 获取该入库单的欠款更新记录
purchaseVo . setDealingsRecords ( dealingsRecordService . getDealingsRecordList ( id ) ) ;
@ -637,8 +640,8 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
public void cancelPurchase ( String id ) {
// 获取采购单信息
Purchase purchase = purchaseService . getById ( id ) ;
List < String > purchaseIdList = new ArrayList < > ( ) ;
final Purchase purchase = purchaseService . getById ( id ) ;
final List < String > purchaseIdList = new ArrayList < > ( ) ;
purchaseIdList . add ( id ) ;
// 3. 商品及库存回退
// 查询商品是有有销售记录并且是不是有且只有这一次入库记录,是的话,直接删除商品及其库存信息,其他的只回退库存即可
@ -689,22 +692,22 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
needDeleteProductId . add ( productId ) ;
// 库存删除
needDeleteStockProductId . add ( productId ) ;
} else {
} else {
// 商品保留,库存扣减
needReduceStockProductId . add ( productId ) ;
}
}
// 执行删除商品
if ( StringUtils . isNotEmpty ( needDeleteProductId . toString ( ) ) ) {
if ( StringUtils . isNotEmpty ( needDeleteProductId . toString ( ) ) ) {
productService . batchDeleteProduct ( needDeleteProductId . toString ( ) ) ;
}
// 执行删除库存
if ( StringUtils . isNotEmpty ( needReduceStockProductId . toString ( ) ) ) {
if ( StringUtils . isNotEmpty ( needReduceStockProductId . toString ( ) ) ) {
stockService . batchDeleteStockByProductIds ( needDeleteStockProductId . toString ( ) ) ;
}
// 执行扣减库存
if ( StringUtils . isNotEmpty ( needReduceStockProductId . toString ( ) ) ) {
if ( StringUtils . isNotEmpty ( needReduceStockProductId . toString ( ) ) ) {
// 获取当前入库单各商品的规格及数量信息
final List < StockLog > stockLogList = stockLogService . getByProductIds ( id , needReduceStockProductId . toString ( ) ) ;
// 根据入库记录减掉库存数
@ -714,12 +717,12 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
stockLogService . deleteByPurchaseId ( id ) ;
// 5. 计算平均采购价
// 获取该商品的历次入库记录,排除掉本次入库记录 入库的价格*入库数量/入库总数量
Map < String , BigDecimal > productPurchasePriceMap = new HashMap < > ( ) ;
final Map < String , BigDecimal > productPurchasePriceMap = new HashMap < > ( ) ;
List < Product > productList = new ArrayList < > ( ) ;
final List < Product > productList = new ArrayList < > ( ) ;
for ( Map . Entry < String , List < PurchaseDetail > > stringListEntry : purductPurchaseMap . entrySet ( ) ) {
final String productId = stringListEntry . getKey ( ) ;
List < PurchaseDetail > purchaseDetail = stringListEntry . getValue ( ) ;
final List < PurchaseDetail > purchaseDetail = stringListEntry . getValue ( ) ;
// 计算该商品的平均采购价 = (当前入库价格*当前入库数量 + 历史入库价格*历史入库数量)/(当前入库数量+历史入库数量)
// 总入库数量
int totalInStorageCount = 0 ;
@ -727,20 +730,26 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
BigDecimal totalInStoragePrice = BigDecimal . ZERO ;
for ( PurchaseDetail detail : purchaseDetail ) {
totalInStorageCount + = detail . getProductCount ( ) ;
BigDecimal bigDecimalOfProductCount = new BigDecimal ( detail . getProductCount ( ) ) ;
BigDecimal purchasePrice = detail . getPurchasePrice ( ) ;
final BigDecimal bigDecimalOfProductCount = new BigDecimal ( detail . getProductCount ( ) ) ;
final BigDecimal purchasePrice = detail . getPurchasePrice ( ) ;
totalInStoragePrice = totalInStoragePrice . add ( purchasePrice . multiply ( bigDecimalOfProductCount ) ) ;
}
final BigDecimal productContBigDe = BigDecimal . valueOf ( totalInStorageCount ) ;
BigDecimal newPurchasePrice = BigDecimal . ZERO ;
// 平均采购价为 总入库金额 / 总入库数量
BigDecimal newPurchasePrice = totalInStoragePrice . divide ( BigDecimal . valueOf ( totalInStorageCount ) ) ;
Product product = new Product ( ) ;
if ( productContBigDe . compareTo ( BigDecimal . ZERO ) > 0 ) {
// 不能整除,数学上是无穷小数,抛出ArithmeticException异常
// 指定计算结果的精度,保留到小数点后几位,以及舍入模式
newPurchasePrice = totalInStoragePrice . divide ( productContBigDe , 4 , RoundingMode . HALF_UP ) ;
}
final Product product = new Product ( ) ;
product . setId ( productId ) ;
product . setPurchasePrice ( newPurchasePrice ) ;
productList . add ( product ) ;
}
// 执行更新平均采购价
if ( ! productList . isEmpty ( ) ) {
if ( ! productList . isEmpty ( ) ) {
productService . batchUpdatePurchasePrice ( productList ) ;
}
// 6. 欠款回退
@ -779,6 +788,7 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
dealingsRecord . setAmount ( noPay ) ;
dealingsRecord . setDealingsType ( DealingsRecordConstant . DEALINGS_TYPE [ 6 ] ) ;
dealingsRecord . setUserType ( DealingsRecordConstant . TYPE [ 0 ] ) ;
dealingsRecord . setSaleId ( id ) ;
dealingsRecordService . save ( dealingsRecord ) ;
}
// 作废当前订单的欠款记录
@ -788,4 +798,11 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
// 2. 将订单详情设置为删除状态
purchaseDetailService . deleteByPurchaseId ( id ) ;
}
@Override
public boolean insert ( Purchase purchase ) {
// log.debug("保存前的入库时间==="+DateUtil.COMMON_FULL.getDateText(purchase.getCreateTime())+"===="+DateUtil.COMMON_FULL.getDateText(purchase.getPurchaseTime()));
final int insert = purchaseMapper . insert ( purchase ) ;
return insert > 0 ;
}
}