更新
1.处理入库接口效率慢,修改入库接口循环去操作数据库的逻辑 2.启动两个线程处理不同的统计数据
This commit is contained in:
@@ -302,10 +302,10 @@ public class SamplePutInStorageController {
|
|||||||
@PreAuthorize("@pms.hasPermission('imr_inbound_or_outbound_edit')")
|
@PreAuthorize("@pms.hasPermission('imr_inbound_or_outbound_edit')")
|
||||||
public R sampleDepositRepository(@RequestBody DepositDTO dto) {
|
public R sampleDepositRepository(@RequestBody DepositDTO dto) {
|
||||||
if (dto.getIds() == null) {
|
if (dto.getIds() == null) {
|
||||||
throw new RuntimeException("样本不能为空");
|
return R.failed("样本不能为空");
|
||||||
}
|
}
|
||||||
if (StrUtil.isEmpty(dto.getCellId())) {
|
if (StrUtil.isEmpty(dto.getCellId())) {
|
||||||
throw new RuntimeException("存放位置不能为空");
|
return R.failed("存放位置不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<OutSampleVO> vo = samplePutInStorageService.sampleDepositRepository(dto);
|
List<OutSampleVO> vo = samplePutInStorageService.sampleDepositRepository(dto);
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -52,8 +53,22 @@ public class DrugHandingOverStatisticServiceImpl implements DrugHandingOverStati
|
|||||||
@Override
|
@Override
|
||||||
public DrugStatisticVO statistic(DrugStatisticQuery query) {
|
public DrugStatisticVO statistic(DrugStatisticQuery query) {
|
||||||
DrugStatisticVO drugStatisticVO = new DrugStatisticVO();
|
DrugStatisticVO drugStatisticVO = new DrugStatisticVO();
|
||||||
buildLineChartData(query, drugStatisticVO);
|
// 创建 CompletableFuture 用于异步执行 buildLineChartData 和 buildBarChartData
|
||||||
buildBarChartData(query, drugStatisticVO);
|
CompletableFuture<Void> lineChartFuture = CompletableFuture.runAsync(() -> buildLineChartData(query, drugStatisticVO));
|
||||||
|
CompletableFuture<Void> barChartFuture = CompletableFuture.runAsync(() -> buildBarChartData(query, drugStatisticVO));
|
||||||
|
|
||||||
|
// 等待两个任务完成
|
||||||
|
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(lineChartFuture, barChartFuture);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 等待所有异步任务执行完成
|
||||||
|
combinedFuture.get();
|
||||||
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
|
// 处理异常
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回最终构建好的 DrugStatisticVO
|
||||||
return drugStatisticVO;
|
return drugStatisticVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import digital.laboratory.platform.imr.feign.dto.UpdateHolderDTO;
|
|||||||
import digital.laboratory.platform.imr.mapper.*;
|
import digital.laboratory.platform.imr.mapper.*;
|
||||||
import digital.laboratory.platform.imr.service.DrugMaterialInfoService;
|
import digital.laboratory.platform.imr.service.DrugMaterialInfoService;
|
||||||
import digital.laboratory.platform.imr.service.SamplePutInStorageService;
|
import digital.laboratory.platform.imr.service.SamplePutInStorageService;
|
||||||
|
import digital.laboratory.platform.imr.service.SampleStorageService;
|
||||||
import digital.laboratory.platform.imr.vo.InboundRecordVO;
|
import digital.laboratory.platform.imr.vo.InboundRecordVO;
|
||||||
import digital.laboratory.platform.imr.vo.OutSampleVO;
|
import digital.laboratory.platform.imr.vo.OutSampleVO;
|
||||||
import digital.laboratory.platform.imr.vo.RepositorySampleVO;
|
import digital.laboratory.platform.imr.vo.RepositorySampleVO;
|
||||||
@@ -34,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -50,6 +52,8 @@ public class SamplePutInStorageServiceImpl implements SamplePutInStorageService
|
|||||||
|
|
||||||
private final SampleStorageMapper storageMapper;
|
private final SampleStorageMapper storageMapper;
|
||||||
|
|
||||||
|
private final SampleStorageService sampleStorageService;
|
||||||
|
|
||||||
private final TransferFeignService transferFeignService;
|
private final TransferFeignService transferFeignService;
|
||||||
|
|
||||||
private final CabinetOpeningRecordMapper openingRecordMapper;
|
private final CabinetOpeningRecordMapper openingRecordMapper;
|
||||||
@@ -449,16 +453,24 @@ public class SamplePutInStorageServiceImpl implements SamplePutInStorageService
|
|||||||
@Override
|
@Override
|
||||||
@GlobalTransactional
|
@GlobalTransactional
|
||||||
public List<OutSampleVO> sampleDepositRepository(DepositDTO dto) {
|
public List<OutSampleVO> sampleDepositRepository(DepositDTO dto) {
|
||||||
|
/**
|
||||||
|
* 优化接口效率,不在循环中操作数据库,提前获取需要的数据,转成map操作
|
||||||
|
*/
|
||||||
|
List<String> ids = dto.getIds();
|
||||||
|
Map<String, SampleStorage> sampleStorageMap = storageMapper
|
||||||
|
.selectList(Wrappers.<SampleStorage>lambdaQuery().in(SampleStorage::getId, ids))
|
||||||
|
.stream().collect(Collectors.toMap(SampleStorage::getId, Function.identity()));
|
||||||
|
|
||||||
ArrayList<String> sampleIds = new ArrayList<>();
|
ArrayList<String> sampleIds = new ArrayList<>();
|
||||||
List<OutSampleVO> outSampleVOS = new ArrayList<>();
|
List<OutSampleVO> outSampleVOS = new ArrayList<>();
|
||||||
for (String id:dto.getIds()) {//这里的id是样本存储表的id
|
List<SampleStorage> sampleStorageList = ids.stream().map(id -> {
|
||||||
SampleStorage sampleStorage = storageMapper.selectById(id);
|
//这里的id是样本存储表的id
|
||||||
|
SampleStorage sampleStorage = sampleStorageMap.get(id);
|
||||||
if (sampleStorage == null) {
|
if (sampleStorage == null) {
|
||||||
throw new RuntimeException(String.format("当前"+id+"样本存储数据为空"));
|
throw new RuntimeException(String.format("当前id为 %s 样本存储数据为空", id));
|
||||||
}
|
}
|
||||||
if (sampleStorage.getStatus() != 1) {
|
if (sampleStorage.getStatus() != 1) {
|
||||||
throw new RuntimeException(String.format("当前"+id+"样本不是待存放的状态"));
|
throw new RuntimeException(String.format("当前id为 %s 样本不是待存放的状态", id));
|
||||||
}
|
}
|
||||||
sampleStorage.setStorageLocation(dto.getStorageLocation());
|
sampleStorage.setStorageLocation(dto.getStorageLocation());
|
||||||
sampleStorage.setStatus(2);//入库已经存放
|
sampleStorage.setStatus(2);//入库已经存放
|
||||||
@@ -467,24 +479,28 @@ public class SamplePutInStorageServiceImpl implements SamplePutInStorageService
|
|||||||
sampleStorage.setBoxId(dto.getBoxId());
|
sampleStorage.setBoxId(dto.getBoxId());
|
||||||
sampleStorage.setCabinetName(dto.getCabinetName());//柜子名称
|
sampleStorage.setCabinetName(dto.getCabinetName());//柜子名称
|
||||||
sampleStorage.setBuildingLv(dto.getBuildingLv());//楼层
|
sampleStorage.setBuildingLv(dto.getBuildingLv());//楼层
|
||||||
//数据修改
|
|
||||||
storageMapper.updateById(sampleStorage);
|
|
||||||
|
|
||||||
//添加样本id
|
//添加样本id
|
||||||
sampleIds.add(sampleStorage.getSampleId());
|
sampleIds.add(sampleStorage.getSampleId());
|
||||||
OutSampleVO sampleVO;
|
return sampleStorage;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
// 批量更新
|
||||||
|
sampleStorageService.updateBatchById(sampleStorageList);
|
||||||
|
// 根据检材的类型做对应的处理
|
||||||
if (dto.getType() == 0) {
|
if (dto.getType() == 0) {
|
||||||
sampleVO = storageMapper.getSampleById(sampleStorage.getSampleId());
|
sampleStorageList.forEach(sampleStorage -> {
|
||||||
} else {
|
OutSampleVO sampleVO = storageMapper.getSampleById(sampleStorage.getSampleId());
|
||||||
sampleVO = drugMaterialInfoService.drugMaterialToOutSampleVO(sampleStorage, sampleStorage.getSampleId());
|
|
||||||
//3.毒品库中的毒品检材信息样本状态为已入库
|
|
||||||
drugMaterialInfoService.update(Wrappers.<DrugMaterialInfo>lambdaUpdate().eq(DrugMaterialInfo::getId, sampleStorage.getSampleId())
|
|
||||||
.set(DrugMaterialInfo::getStatus, DrugMaterialStatus.FINISH_INBOUND.getStatus()));
|
|
||||||
}
|
|
||||||
sampleVO.setStorageLocation(dto.getStorageLocation());
|
sampleVO.setStorageLocation(dto.getStorageLocation());
|
||||||
outSampleVOS.add(sampleVO);
|
outSampleVOS.add(sampleVO);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
sampleStorageList.forEach(sampleStorage ->
|
||||||
|
outSampleVOS.add(drugMaterialInfoService.drugMaterialToOutSampleVO(sampleStorage, sampleStorage.getSampleId()))
|
||||||
|
);
|
||||||
|
//3.毒品库中的毒品检材信息样本状态为已入库
|
||||||
|
drugMaterialInfoService.update(Wrappers.<DrugMaterialInfo>lambdaUpdate().in(DrugMaterialInfo::getId, sampleIds)
|
||||||
|
.set(DrugMaterialInfo::getStatus, DrugMaterialStatus.FINISH_INBOUND.getStatus()));
|
||||||
}
|
}
|
||||||
|
|
||||||
//去除最后一个“,”
|
//去除最后一个“,”
|
||||||
//String str = sampleIds.substring(0,sampleIds.lastIndexOf(","));
|
//String str = sampleIds.substring(0,sampleIds.lastIndexOf(","));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user