批量扫码优化

dev_2.5_scan_2
yewj 3 months ago
parent 257389d5fa
commit 8f1e9b705c

@ -48,6 +48,7 @@ import com.glxp.api.util.*;
import com.glxp.api.util.udi.FilterUdiUtils;
import com.glxp.api.util.udi.UdiCalCountUtil;
import com.glxp.api.vo.basic.InvProductNewVo;
import groovy.util.logging.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -57,8 +58,13 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@lombok.extern.slf4j.Slf4j
@Slf4j
@RestController
public class IoCodeTempController extends BaseController {
@ -407,6 +413,9 @@ public class IoCodeTempController extends BaseController {
}
@Resource
AddCoodeService addCoodeService;
@RepeatSubmit()
@AuthRuleAnnotation("")
@PostMapping("warehouse/inout/batchAddCode")
@ -417,10 +426,27 @@ public class IoCodeTempController extends BaseController {
if (bindingResult.hasErrors()) {
return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage());
}
AuthAdmin authAdmin = getUser();
AddCodeResult addCodeResult = new AddCodeResult();
List<String> codeList = addOrderCodeRequest.getCodeList();
if (CollUtil.isEmpty(codeList))
return ResultVOUtils.error(500, "追溯码不能为空");
// 获取第一个码判断类型,如果是药品类型则使用批量处理方法
if (!codeList.isEmpty()) {
String firstCode = codeList.get(0);
if (firstCode.endsWith("\u001D")) {
firstCode = firstCode.replace("\u001D", "");
}
UdiEntity firstUdiEntity = FilterUdiUtils.getUdi(firstCode);
if (firstUdiEntity != null && IntUtil.value(firstUdiEntity.getProductType()) == 2) {
// 药品类型,使用批量处理方法
return addCoodeService.batchProcessDrugCodes(addOrderCodeRequest, authAdmin);
}
}
// 原有处理逻辑,处理非药品或空列表情况
List<VailCodeResultResponse> vailCodeResultResponses = new ArrayList<>();
Integer groupNumber = getMaxGroupNumber() == null ? 1 : getMaxGroupNumber() + 1;
for (String code : codeList) {
@ -451,8 +477,6 @@ public class IoCodeTempController extends BaseController {
if (StrUtil.isNotEmpty(addOrderRequest.getSerialNo())) {
udiEntity.setSerialNo(addOrderRequest.getSerialNo());
}
AuthAdmin authAdmin = getUser();
addOrderRequest.setInvCode(authAdmin.getLocInvCode());
if (IntUtil.value(addOrderCodeRequest.getInoutType()) == 2) {
addOrderRequest.setAction(ConstantType.SPLIT_RETURN);
@ -1232,15 +1256,22 @@ public class IoCodeTempController extends BaseController {
// @Transactional(rollbackFor = Exception.class)
public BaseResponse addDrugOrder(AddOrderRequest addOrderRequest, UdiEntity udiEntity, String code, Integer groupNumber) {
long startTime = System.currentTimeMillis();
AddCodeResult addCodeResult = new AddCodeResult();
InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByInvSubByCode(addOrderRequest.getInvCode());
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByNameCode(udiEntity.getUdi());
// 检查码是否空
if (udiEntity == null) {
return ResultVOUtils.error(500, "无效条码");
}
//批次号校验
//判断此产品是否开启允许无批次号
UdiProductEntity udiInfoEntity = udiProductService.findByNameCode(udiEntity.getUdi());
if (udiInfoEntity == null) {
// 1. 批量查询业务类型和药品信息,减少数据库查询次数
BasicBussinessTypeEntity bussinessTypeEntity = basicBussinessTypeService.findByAction(addOrderRequest.getAction());
if (bussinessTypeEntity == null) {
return ResultVOUtils.error(500, "业务类型不存在");
}
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByNameCode(udiEntity.getUdi());
if (udiRelevanceResponse == null) {
return ResultVOUtils.error(500, "药品字典不存在此产品!");
}
@ -1248,7 +1279,7 @@ public class IoCodeTempController extends BaseController {
return ResultVOUtils.error(500, "当前为无码类型产品,无需扫码!");
}
// 2. 将批次号查询移至此处统一处理
if (StrUtil.isEmpty(udiEntity.getBatchNo())) {
IoCodeLostEntity codeLostEntity = codeLostService.findByCode(addOrderRequest.getCode());
if (codeLostEntity != null) {
@ -1257,63 +1288,74 @@ public class IoCodeTempController extends BaseController {
udiEntity.setExpireDate(codeLostEntity.getExpireDate());
}
}
String orderId = addOrderRequest.getBillNo();
//过期提醒:
BasicBussinessTypeEntity bussinessTypeEntity = basicBussinessTypeService.findByAction(addOrderRequest.getAction());
// 3. 合并校验流程,减少方法调用
// 过期校验
int checkExpire = IntUtil.value(bussinessTypeEntity.getCheckExpire());
BaseResponse response = checkExpireDate(checkExpire, udiEntity, addOrderRequest);
if (response.getCode() != 20000) {
return response;
if (checkExpire > 0) {
BaseResponse response = checkExpireDate(checkExpire, udiEntity, addOrderRequest);
if (response.getCode() != 20000) {
return response;
}
}
//判断层级标识是否正确
// 层级标识校验
boolean packLevelValid;
if (bussinessTypeEntity.isUse()) {
if (!isPackLevelValid(udiRelevanceResponse.getUseMaxLevel(), IntUtil.value(udiRelevanceResponse.getPackLevel()), udiRelevanceResponse.getUseLevel())) {
return ResultVOUtils.error(500, "当前产品不支持采集该包装层级追溯码!");
}
packLevelValid = isPackLevelValid(udiRelevanceResponse.getUseMaxLevel(),
IntUtil.value(udiRelevanceResponse.getPackLevel()),
udiRelevanceResponse.getUseLevel());
} else {
if (!isPackLevelValid(udiRelevanceResponse.getDistributeMaxLevel(), IntUtil.value(udiRelevanceResponse.getPackLevel()), udiRelevanceResponse.getDistributeLevel())) {
return ResultVOUtils.error(500, "当前产品不支持采集该包装层级追溯码!");
}
packLevelValid = isPackLevelValid(udiRelevanceResponse.getDistributeMaxLevel(),
IntUtil.value(udiRelevanceResponse.getPackLevel()),
udiRelevanceResponse.getDistributeLevel());
}
if (!packLevelValid) {
return ResultVOUtils.error(500, "当前产品不支持采集该包装层级追溯码!");
}
//近效期提醒
// 近效期提醒
BaseResponse checkResponse = checkIsExpired(udiRelevanceResponse, udiEntity, addOrderRequest, bussinessTypeEntity);
if (checkResponse.getCode() == 505) {
return checkResponse;
}
//------工位上货相关-----校验工位存量是否存在----
// 工位上货相关校验
BaseResponse handleSplitOutAndSplitReturnResponse = handleSplitOutAndSplitReturn(code, udiEntity, bussinessTypeEntity);
if (handleSplitOutAndSplitReturnResponse.getCode() != 20000) {
return handleSplitOutAndSplitReturnResponse;
}
if (addOrderRequest.getFromCorp() == null || StrUtil.isNotEmpty(addOrderRequest.getSickerAdNum())) {
String fromCorp = ioAddInoutService.updateCorp(bussinessTypeEntity, addOrderRequest.getFromCorp(), addOrderRequest.getSickerAdNum());
addOrderRequest.setFromCorp(fromCorp);
}
//先生成扫码单据
// 4. 优化订单处理流程
InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByInvSubByCode(addOrderRequest.getInvCode());
IoOrderEntity orderEntity = orderService.findByBillNo(orderId);
String inBatch = "";
if (StringUtils.isBlank(orderId) || orderEntity == null) {
String orderNo = gennerOrderUtils.createScOrderNo(new OrderNoTypeBean(Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix()), "yyyyMMdd"));
orderId = orderNo;
inBatch = orderId.substring((Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix())).length());
} else {
inBatch = orderId.substring((Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix())).length());
}
inBatch = orderId.substring((Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix())).length());
// 5. 提前获取码信息,减少重复查询
List<IoCodeTempEntity> codeEnttitys = codeTempService.findByOrderId(orderId);
IoCodeTempEntity exitLocalEntity = null;
IoCodeTempEntity genDetaiEntity = new IoCodeTempEntity();
List<UdiRelevanceResponse> udiRelevanceResponses = null;
if (codeEnttitys.size() > 0) {
// 6. 优化已存在码的处理逻辑
if (!codeEnttitys.isEmpty()) {
exitLocalEntity = isExitLocal(code, codeEnttitys);
if (exitLocalEntity != null) {
// 处理已存在码的情况
if (StrUtil.isEmpty(exitLocalEntity.getSupId()) || exitLocalEntity.getRelId() == null) {
return ResultVOUtils.error(500, "当前药品追溯码已存在,且存在异常未处理!");
}
@ -1322,95 +1364,40 @@ public class IoCodeTempController extends BaseController {
return ResultVOUtils.error(500, "重复扫码!");
}
udiRelevanceResponses = udiRelevanceService.selectGroupByNameCode(exitLocalEntity.getNameCode(), null);
// 获取udiRelevanceResponses数据共用前面查询的udiRelevanceResponse
List<UdiRelevanceResponse> udiRelevanceResponses = new ArrayList<>();
udiRelevanceResponses.add(udiRelevanceResponse);
BeanUtils.copyProperties(exitLocalEntity, genDetaiEntity);
genDetaiEntity.setCount(1);
// 处理数量计算
if (bussinessTypeEntity.isUse()) {
genDetaiEntity.setReCount(udiCalCountUtil.getUseActCount(udiRelevanceResponses.get(0)));
} else {
genDetaiEntity.setReCount(udiCalCountUtil.getCirActCount(udiRelevanceResponses.get(0)));
}
exitLocalEntity.setCount(exitLocalEntity.getMyCount() + 1);
if (bussinessTypeEntity.isUse()) {
exitLocalEntity.setReCount(exitLocalEntity.getMyReCount() * udiCalCountUtil.getUseActCount(udiRelevanceResponses.get(0)));
genDetaiEntity.setReCount(udiCalCountUtil.getUseActCount(udiRelevanceResponse));
exitLocalEntity.setCount(exitLocalEntity.getMyCount() + 1);
exitLocalEntity.setReCount(exitLocalEntity.getMyReCount() * udiCalCountUtil.getUseActCount(udiRelevanceResponse));
} else {
exitLocalEntity.setReCount(exitLocalEntity.getMyReCount() * udiCalCountUtil.getCirActCount(udiRelevanceResponses.get(0)));
genDetaiEntity.setReCount(udiCalCountUtil.getCirActCount(udiRelevanceResponse));
exitLocalEntity.setCount(exitLocalEntity.getMyCount() + 1);
exitLocalEntity.setReCount(exitLocalEntity.getMyReCount() * udiCalCountUtil.getCirActCount(udiRelevanceResponse));
}
//匹配biz
// 匹配biz并缓存结果
IoOrderDetailCodeEntity byRelId = ioOrderDetailCodeService.findByRelNameCode(addOrderRequest.getBillNo(), udiEntity.getUdi(), udiEntity.getBatchNo());
if (byRelId != null) {
exitLocalEntity.setBizId(byRelId.getId());
}
//校验库存
BaseResponse invRes = null;
if (IntUtil.value(bussinessTypeEntity.getUseDyCount()) == 2) {
if (bussinessTypeEntity.isScanPreIn() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 2)) { //校验预验收库存
invRes = checkInvService.checkPreInInv(bussinessTypeEntity, genDetaiEntity, false);
}
if (bussinessTypeEntity.isAdvancePreIn() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 3)) { //校验寄售库存
invRes = checkInvService.checkPreInv(bussinessTypeEntity, genDetaiEntity, false);
}
if (bussinessTypeEntity.isVailInv() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 1)) {
invRes = checkInvService.checkInv(bussinessTypeEntity, genDetaiEntity, false);
}
} else {
if (bussinessTypeEntity.isScanPreIn()) { //校验预验收库存
invRes = checkInvService.checkPreInInv(bussinessTypeEntity, genDetaiEntity, false);
} else if (bussinessTypeEntity.isAdvancePreIn()) { //校验寄售库存
invRes = checkInvService.checkPreInv(bussinessTypeEntity, genDetaiEntity, false);
} else {
invRes = checkInvService.checkInv(bussinessTypeEntity, genDetaiEntity, false);
}
}
// 优化库存校验流程
BaseResponse invRes = checkInventory(bussinessTypeEntity, udiRelevanceResponse, genDetaiEntity);
if (invRes != null) {
return invRes;
}
if (bussinessTypeEntity.getCheckWebNew() == 1 && bussinessTypeEntity.isCheckEnable()) {
String errMsg = ioCheckInoutService.checkCode(genDetaiEntity);
if (errMsg != null) {
return ResultVOUtils.error(500, errMsg);
} else
codeTempService.updateById(exitLocalEntity);
} else if (bussinessTypeEntity.getCheckWebNew() == 2 && bussinessTypeEntity.isCheckEnable()) {
String errMsg = ioCheckInoutService.checkNoPiCode(genDetaiEntity);
if (errMsg != null) {
return ResultVOUtils.error(500, errMsg);
} else
codeTempService.updateById(exitLocalEntity);
} else {
boolean update = true;
String priceFifo = systemParamConfigService.selectValueByParamKey("price_fifo");
if (IntUtil.value(priceFifo) > 0) {
if (bussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_OUT)) {
//1.获取当前批次已出库数量
Integer outCount = invProductServiceNew.selectCountByInBatch(exitLocalEntity.getRelId() + "", exitLocalEntity.getBatchNo(), bussinessTypeEntity, exitLocalEntity.getInBatchNo(), exitLocalEntity.getInvCode(), ConstantType.TYPE_OUT);
//2.获取当前批次入库数量
Integer inCount = invProductServiceNew.selectCountByInBatch(exitLocalEntity.getRelId() + "", exitLocalEntity.getBatchNo(), bussinessTypeEntity, exitLocalEntity.getInBatchNo(), exitLocalEntity.getInvCode(), ConstantType.TYPE_PUT);
if ((IntUtil.value(inCount) - IntUtil.value(outCount) - IntUtil.value(exitLocalEntity.getReCount())) < 0) {
InvProductNewVo nextInvProduct = invProductServiceNew.selectNextInBatch(bussinessTypeEntity, exitLocalEntity.getRelId() + "", exitLocalEntity.getBatchNo(), exitLocalEntity.getInvCode(), ConstantType.TYPE_PUT, exitLocalEntity.getInBatchNo());
if (nextInvProduct != null) {
genDetaiEntity.setPrice(nextInvProduct.getPrice());
genDetaiEntity.setInBatchNo(nextInvProduct.getInBatchNo());
codeTempService.insert(genDetaiEntity);
update = false;
}
}
}
}
if (update) {
codeTempService.updateById(exitLocalEntity);
}
// 优化校验和更新流程
boolean updated = handleCodeCheckAndUpdate(bussinessTypeEntity, genDetaiEntity, exitLocalEntity, inBatch, codeEnttitys);
if (!updated) {
return ResultVOUtils.error(500, "更新码信息失败");
}
}
}
@ -1494,11 +1481,11 @@ public class IoCodeTempController extends BaseController {
} else if (StrUtil.isNotEmpty(addOrderRequest.getSelectSupId())) {
unitFk = addOrderRequest.getSelectSupId();
}
//产品是否禁用
udiRelevanceResponses = udiRelevanceService.selectGroupByNameCode(codeEnttity.getNameCode(), false);
// 获取产品列表 - 使用前面查询的单个产品
List<UdiRelevanceResponse> productList = Collections.singletonList(udiRelevanceResponse);
if (udiRelevanceResponses.size() >= 1) {
if (productList.size() >= 1) {
if (udiRelevanceResponse == null) {
return ResultVOUtils.error(500, "该产品信息未维护!");
} else if (!udiRelevanceResponse.getUseDy() && udiRelevanceResponse.getDiType() == ConstantStatus.DITYPE_SYDY) {
@ -1517,18 +1504,19 @@ public class IoCodeTempController extends BaseController {
return ResultVOUtils.error(500, bussinessTypeEntity.getName() + "单只允许录入非集采产品!");
}
//计算实际数量
// 直接使用传入的udiRelevanceResponse计算数量
if (bussinessTypeEntity.isUse()) {
codeEnttity.setReCount(codeEnttity.getMyReCount() + udiCalCountUtil.getUseActCount(udiRelevanceResponses.get(0)));
codeEnttity.setReCount(codeEnttity.getMyReCount() + udiCalCountUtil.getUseActCount(udiRelevanceResponse));
} else {
codeEnttity.setReCount(codeEnttity.getMyReCount() + udiCalCountUtil.getCirActCount(udiRelevanceResponses.get(0)));
codeEnttity.setReCount(codeEnttity.getMyReCount() + udiCalCountUtil.getCirActCount(udiRelevanceResponse));
}
} else if (udiRelevanceResponses.size() == 0) {
} else {
if (unitFk == null)
return ResultVOUtils.error(500, "耗材字典不存在此产品!");
else
return ResultVOUtils.error(500, "当前供应商不存在此配送产品!");
}
if (!(bussinessTypeEntity.getAction().equals(ConstantType.SPLIT_RETURN) || bussinessTypeEntity.getAction().equals(ConstantType.SPLIT_OUT))) {
//校验供应商是否配送此产品
BaseResponse corpResponse = checkCorp(codeEnttity, bussinessTypeEntity, unitFk);
@ -1835,12 +1823,6 @@ public class IoCodeTempController extends BaseController {
}
public Integer getMaxGroupNumber() {
Integer groupNumber = codeTempService.selectMaxGroupNumber();
return groupNumber;
}
public void updateRelCode(BasicBussinessTypeEntity bussinessTypeEntity, String code) {
if (!(bussinessTypeEntity.getAction().equals(ConstantType.SPLIT_OUT) || bussinessTypeEntity.getAction().equals(ConstantType.SPLIT_RETURN)))
relCodeBatchService.threadUpdateIoCodeTempEntity(code);
@ -3106,5 +3088,111 @@ public class IoCodeTempController extends BaseController {
return ResultVOUtils.success();
}
/**
*
*
* @param bussinessTypeEntity
* @param udiRelevanceResponse UDI
* @param codeEntity
* @return
*/
private BaseResponse checkInventory(BasicBussinessTypeEntity bussinessTypeEntity, UdiRelevanceResponse udiRelevanceResponse, IoCodeTempEntity codeEntity) {
BaseResponse invRes = null;
if (IntUtil.value(bussinessTypeEntity.getUseDyCount()) == 2) {
if (bussinessTypeEntity.isScanPreIn() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 2)) { //校验预验收库存
invRes = checkInvService.checkPreInInv(bussinessTypeEntity, codeEntity, false);
}
if (bussinessTypeEntity.isAdvancePreIn() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 3)) { //校验寄售库存
invRes = checkInvService.checkPreInv(bussinessTypeEntity, codeEntity, false);
}
if (bussinessTypeEntity.isVailInv() && checkDiAttribute(bussinessTypeEntity, udiRelevanceResponse, 1)) {
invRes = checkInvService.checkInv(bussinessTypeEntity, codeEntity, false);
}
} else {
if (bussinessTypeEntity.isScanPreIn()) { //校验预验收库存
invRes = checkInvService.checkPreInInv(bussinessTypeEntity, codeEntity, false);
} else if (bussinessTypeEntity.isAdvancePreIn()) { //校验寄售库存
invRes = checkInvService.checkPreInv(bussinessTypeEntity, codeEntity, false);
} else {
invRes = checkInvService.checkInv(bussinessTypeEntity, codeEntity, false);
}
}
return invRes;
}
public Integer getMaxGroupNumber() {
Integer groupNumber = codeTempService.selectMaxGroupNumber();
return groupNumber;
}
/**
*
*
* @param bussinessTypeEntity
* @param genDetaiEntity
* @param exitLocalEntity
* @param inBatch
* @param codeEnttitys
* @return
*/
private boolean handleCodeCheckAndUpdate(BasicBussinessTypeEntity bussinessTypeEntity,
IoCodeTempEntity genDetaiEntity,
IoCodeTempEntity exitLocalEntity,
String inBatch,
List<IoCodeTempEntity> codeEnttitys) {
try {
if (bussinessTypeEntity.getCheckWebNew() == 1 && bussinessTypeEntity.isCheckEnable()) {
String errMsg = ioCheckInoutService.checkCode(genDetaiEntity);
if (errMsg != null) {
return false;
} else {
codeTempService.updateById(exitLocalEntity);
}
} else if (bussinessTypeEntity.getCheckWebNew() == 2 && bussinessTypeEntity.isCheckEnable()) {
String errMsg = ioCheckInoutService.checkNoPiCode(genDetaiEntity);
if (errMsg != null) {
return false;
} else {
codeTempService.updateById(exitLocalEntity);
}
} else {
boolean update = true;
String priceFifo = systemParamConfigService.selectValueByParamKey("price_fifo");
if (IntUtil.value(priceFifo) > 0) {
if (bussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_OUT)) {
//1.获取当前批次已出库数量
Integer outCount = invProductServiceNew.selectCountByInBatch(exitLocalEntity.getRelId() + "",
exitLocalEntity.getBatchNo(), bussinessTypeEntity, exitLocalEntity.getInBatchNo(),
exitLocalEntity.getInvCode(), ConstantType.TYPE_OUT);
//2.获取当前批次入库数量
Integer inCount = invProductServiceNew.selectCountByInBatch(exitLocalEntity.getRelId() + "",
exitLocalEntity.getBatchNo(), bussinessTypeEntity, exitLocalEntity.getInBatchNo(),
exitLocalEntity.getInvCode(), ConstantType.TYPE_PUT);
if ((IntUtil.value(inCount) - IntUtil.value(outCount) - IntUtil.value(exitLocalEntity.getReCount())) < 0) {
InvProductNewVo nextInvProduct = invProductServiceNew.selectNextInBatch(bussinessTypeEntity,
exitLocalEntity.getRelId() + "", exitLocalEntity.getBatchNo(), exitLocalEntity.getInvCode(),
ConstantType.TYPE_PUT, exitLocalEntity.getInBatchNo());
if (nextInvProduct != null) {
genDetaiEntity.setPrice(nextInvProduct.getPrice());
genDetaiEntity.setInBatchNo(nextInvProduct.getInBatchNo());
codeTempService.insert(genDetaiEntity);
update = false;
}
}
}
}
if (update) {
codeTempService.updateById(exitLocalEntity);
}
}
return true;
} catch (Exception e) {
log.error("处理码校验和更新异常:{}", e.getMessage(), e);
return false;
}
}
}

@ -109,4 +109,11 @@ public interface UdiRelevanceDao extends BaseMapperPlus<UdiRelevanceDao, UdiRele
List<BasicProductsEntity> selectProductByRelIds(@Param("relIds")List<Long> relIds);
List<UdiRelevanceResponse> getProductsEntitiesByNameCode(String nameCode);
/**
*
* @param filterUdiRelRequest
* @return
*/
List<UdiRelevanceResponse> batchSelectByNameCodes(FilterUdiRelRequest filterUdiRelRequest);
}

@ -126,6 +126,10 @@ public class FilterUdiRelRequest extends ListPageRequest {
private String keyWords;
private List<String> filterNameCodes;
/**
*
*/
private List<String> nameCodes;
}

@ -420,7 +420,10 @@ public class UdiRelevanceService extends ServiceImpl<UdiRelevanceDao, UdiRelevan
public List<UdiRelevanceResponse> selectGroupByNameCode(String nameCode, Boolean isDisable) {
return udiRelevanceDao.selectGroupByNameCode(nameCode, isDisable);
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setUniqueNameCode(nameCode);
filterUdiRelRequest.setIsDisable(isDisable);
return udiRelevanceDao.filterUdiGp(filterUdiRelRequest);
}
public UdiRelevanceResponse selectOneUdi(FilterUdiRelRequest filterUdiRelRequest) {
@ -478,5 +481,43 @@ public class UdiRelevanceService extends ServiceImpl<UdiRelevanceDao, UdiRelevan
}
}
/**
*
*
* @param nameCodes
* @return
*/
public Map<String, UdiRelevanceResponse> batchSelectByNameCodes(List<String> nameCodes) {
if (CollUtil.isEmpty(nameCodes)) {
return new HashMap<>();
}
Map<String, UdiRelevanceResponse> resultMap = new HashMap<>();
// 对大批量数据进行分批处理每次处理500个
int batchSize = 500;
for (int i = 0; i < nameCodes.size(); i += batchSize) {
int endIndex = Math.min(i + batchSize, nameCodes.size());
List<String> batchCodes = nameCodes.subList(i, endIndex);
// 使用IN查询一次性获取多个码的信息
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setNameCodes(batchCodes);
List<UdiRelevanceResponse> batchResponses = udiRelevanceDao.batchSelectByNameCodes(filterUdiRelRequest);
if (CollUtil.isNotEmpty(batchResponses)) {
for (UdiRelevanceResponse response : batchResponses) {
if (response != null && StrUtil.isNotEmpty(response.getNameCode())) {
resultMap.put(response.getNameCode(), response);
}
}
}
}
return resultMap;
}
}

@ -46,6 +46,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
@Service
@Transactional(rollbackFor = Exception.class)
@ -517,4 +519,70 @@ public class IoCodeTempService {
addEnterCodeResponse.setGgxh(checkUdi.getGgxh());
return addEnterCodeResponse;
}
/**
*
* @param entities
* @return
*/
public boolean batchInsert(List<IoCodeTempEntity> entities) {
if (CollUtil.isEmpty(entities)) {
return true;
}
// 分批插入每批最多500条
int batchSize = 500;
int totalSize = entities.size();
boolean result = true;
for (int i = 0; i < totalSize; i += batchSize) {
int end = Math.min(i + batchSize, totalSize);
List<IoCodeTempEntity> batch = entities.subList(i, end);
result = result && ioCodeTempDao.insertBatch(batch);
}
return result;
}
/**
*
* @param entities
* @return
*/
public int batchUpdate(List<IoCodeTempEntity> entities) {
if (CollUtil.isEmpty(entities)) {
return 0;
}
int updatedRows = 0;
for (IoCodeTempEntity entity : entities) {
updatedRows += ioCodeTempDao.updateById(entity);
}
return updatedRows;
}
/**
*
* @param codes
* @param orderId ID
* @return
*/
public Map<String, IoCodeTempEntity> batchCheckCodesExistence(List<String> codes, String orderId) {
if (CollUtil.isEmpty(codes) || StrUtil.isEmpty(orderId)) {
return new HashMap<>();
}
List<IoCodeTempEntity> existingEntities = selectByCodes(codes, orderId);
if (CollUtil.isEmpty(existingEntities)) {
return new HashMap<>();
}
Map<String, IoCodeTempEntity> codeToEntityMap = new HashMap<>();
for (IoCodeTempEntity entity : existingEntities) {
codeToEntityMap.put(entity.getCode(), entity);
}
return codeToEntityMap;
}
}

@ -4,9 +4,9 @@ server:
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/udi_wms_cl?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
jdbc-url: jdbc:p6spy:mysql://192.168.0.206:3306/udiwms81?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
password: Glxp@6066
hikari:
connection-timeout: 60000
maximum-pool-size: 20

@ -2036,4 +2036,79 @@
ON bu.uuid = basic_products.uuid
where basic_products.nameCode = #{nameCode}
</select>
<!-- 批量查询追溯码信息 -->
<select id="batchSelectByNameCodes" parameterType="com.glxp.api.req.basic.FilterUdiRelRequest"
resultType="com.glxp.api.res.basic.UdiRelevanceResponse">
select basic_udirel.*,
basic_udirel.id relId,
basic_products.originUuid,
basic_products.nameCode,
basic_products.deviceRecordKey,
basic_products.packRatio,
basic_products.packUnit,
basic_products.packLevel,
basic_products.bhxjsl,
basic_products.bhzxxsbzsl,
basic_products.zxxsbzbhsydysl,
basic_products.bhxjcpbm,
basic_products.bzcj,
basic_products.cpmctymc,
basic_products.cplb,
basic_products.flbm,
basic_products.ggxh,
basic_products.qxlb,
basic_products.tyshxydm,
basic_products.ylqxzcrbarmc,
basic_products.zczbhhzbapzbh,
basic_products.ylqxzcrbarywmc,
basic_products.sydycpbs,
basic_products.sjcpbm,
basic_products.versionNumber,
basic_products.diType,
basic_products.ybbm,
basic_products.sptm,
basic_products.manufactory,
basic_products.measname,
basic_products.productType,
basic_products.scbssfbhph,
basic_products.scbssfbhxlh,
basic_products.scbssfbhscrq,
basic_products.scbssfbhsxrq,
basic_products.cpms,
basic_products.allowNoBatch,
basic_products.allowNoExpire,
basic_products.allowNoProduct,
basic_products.allowNoSerial,
basic_products.spmc,
basic_products.cplx,
basic_products.hchzsb,
basic_products.cpdls,
basic_products.price,
basic_products.basicPrductRemak1,
basic_products.basicPrductRemak2,
basic_products.basicPrductRemak3,
basic_products.basicPrductRemak4,
basic_products.basicPrductRemak5,
basic_products.basicPrductRemak6,
basic_products.basicPrductRemak7,
basic_products.basicPrductRemak8,
basic_products.bhltcjsl,
basic_products.bhsycjsl,
basic_products.xjdw,
basic_products.levelUnit,
basic_products.bzgg,
basic_products.prepnUnit,
basic_products.prepnSpec
FROM basic_udirel
INNER JOIN basic_products ON basic_products.uuid = basic_udirel.uuid
<where>
<if test="nameCodes != null and nameCodes.size() > 0">
AND basic_products.nameCode IN
<foreach collection="nameCodes" item="nameCode" open="(" separator="," close=")">
#{nameCode}
</foreach>
</if>
</where>
</select>
</mapper>

Loading…
Cancel
Save