@@ -3,29 +3,38 @@
*/
package com.openhis.web.inventorymanage.appservice.impl ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
import com.core.common.core.domain.R ;
import com.core.common.exception.ServiceException ;
import com.core.common.utils.* ;
import com.core.common.utils.bean.BeanUtils ;
import com.openhis.administration.domain.DeviceDefinition ;
import com.openhis.administration.domain.Practitioner ;
import com.openhis.administration.service.IDeviceDefinitionService ;
import com.openhis.administration.service.IPractitionerService ;
import com.openhis.common.constant.CommonConstants ;
import com.openhis.common.constant.PromptMsgConstant ;
import com.openhis.common.enums.* ;
import com.openhis.common.utils.EnumUtils ;
import com.openhis.common.utils.HisQueryUtils ;
import com.openhis.medication.domain.MedicationDefinition ;
import com.openhis.medication.service.IMedicationDefinitionService ;
import com.openhis.web.common.dto.UnitDto ;
import com.openhis.web.inventorymanage.appservice.IRequisitionIssueAppService ;
import com.openhis.web.inventorymanage.dto.* ;
import com.openhis.web.inventorymanage.mapper.RequisitionIssueMapper ;
import com.openhis.workflow.domain.InventoryItem ;
import com.openhis.workflow.domain.SupplyRequest ;
import com.openhis.workflow.service.IInventoryItemService ;
import com.openhis.workflow.service.ISupplyRequestService ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import java.math.BigDecimal ;
import java.util.* ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
@@ -48,6 +57,15 @@ public class RequisitionIssueAppServiceImpl implements IRequisitionIssueAppServi
@Autowired
private IPractitionerService practitionerService ;
@Autowired
private IInventoryItemService inventoryItemService ;
@Autowired
private IMedicationDefinitionService medicationDefinitionService ;
@Autowired
private IDeviceDefinitionService deviceDefinitionService ;
@Autowired
private AssignSeqUtil assignSeqUtil ;
@@ -167,6 +185,10 @@ public class RequisitionIssueAppServiceImpl implements IRequisitionIssueAppServi
// 单据号取得
List < String > busNoList = requisitionIssueDtoList . stream ( ) . map ( IssueDto : : getBusNo ) . collect ( Collectors . toList ( ) ) ;
// 库存校验:领用数量不能超过源仓库实际库存
this . validateRequisitionStock ( requisitionIssueDtoList ) ;
// 请求数据取得
List < SupplyRequest > requestList = supplyRequestService . getSupplyByBusNo ( busNoList . get ( 0 ) ) ;
if ( ! requestList . isEmpty ( ) ) {
@@ -328,4 +350,73 @@ public class RequisitionIssueAppServiceImpl implements IRequisitionIssueAppServi
}
}
}
/**
* 校验领用数量是否超过源仓库实际库存
*
* @param requisitionIssueDtoList 领用出库单据列表
*/
private void validateRequisitionStock ( List < IssueDto > requisitionIssueDtoList ) {
Integer tenantId = SecurityUtils . getLoginUser ( ) . getTenantId ( ) ;
for ( IssueDto issueDto : requisitionIssueDtoList ) {
Long itemId = issueDto . getItemId ( ) ;
String lotNumber = issueDto . getLotNumber ( ) ;
Long sourceLocationId = issueDto . getSourceLocationId ( ) ;
BigDecimal reqQuantity = issueDto . getItemQuantity ( ) ;
String itemUnit = issueDto . getUnitCode ( ) ;
String itemTable = issueDto . getItemTable ( ) ;
// 根据物品类型查询定义信息(拆零比、常规单位、最小单位)
BigDecimal partPercent = BigDecimal . ONE ;
String unitCode = itemUnit ;
String minUnitCode = itemUnit ;
if ( CommonConstants . TableName . MED_MEDICATION_DEFINITION . equals ( itemTable ) ) {
MedicationDefinition medDef = medicationDefinitionService . getById ( itemId ) ;
if ( medDef ! = null ) {
unitCode = medDef . getUnitCode ( ) ;
minUnitCode = medDef . getMinUnitCode ( ) ;
if ( medDef . getPartPercent ( ) ! = null ) {
partPercent = medDef . getPartPercent ( ) ;
}
}
} else if ( CommonConstants . TableName . ADM_DEVICE_DEFINITION . equals ( itemTable ) ) {
DeviceDefinition devDef = deviceDefinitionService . getById ( itemId ) ;
if ( devDef ! = null ) {
unitCode = devDef . getUnitCode ( ) ;
minUnitCode = devDef . getMinUnitCode ( ) ;
if ( devDef . getPartPercent ( ) ! = null ) {
partPercent = devDef . getPartPercent ( ) ;
}
}
}
// 计算领用数量折合最小单位的值
BigDecimal reqQuantityInMinUnit ;
if ( itemUnit . equals ( unitCode ) ) {
// 领用单位 = 包装单位,需乘以拆零比
reqQuantityInMinUnit = reqQuantity . multiply ( partPercent ) ;
} else {
// 领用单位 = 最小单位,无需换算
reqQuantityInMinUnit = reqQuantity ;
}
// 查询源仓库实际库存(按物品编号、批号、仓库匹配)
List < InventoryItem > inventoryItemList = inventoryItemService . selectInventoryByItemId (
itemId , lotNumber , sourceLocationId , tenantId ) ;
// 累加匹配批号的总库存( 库存表quantity字段为最小单位)
BigDecimal totalStock = BigDecimal . ZERO ;
for ( InventoryItem inventoryItem : inventoryItemList ) {
if ( inventoryItem . getLocationId ( ) . equals ( sourceLocationId ) ) {
totalStock = totalStock . add ( inventoryItem . getQuantity ( ) ) ;
}
}
// 比较领用数量与库存
if ( reqQuantityInMinUnit . compareTo ( totalStock ) > 0 ) {
throw new ServiceException ( " 操作失败,库存数量不足 " ) ;
}
}
}
}