fix:物料综合测试并调整接口
This commit is contained in:
@@ -16,6 +16,9 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
|
||||
@Data
|
||||
public class MaterialBatchPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "分类其他配置")
|
||||
private String categoryCustomConfig;
|
||||
|
||||
@Schema(description = "物料大类id", example = "9381")
|
||||
private Long productId;
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.zt.plat.module.qms.resource.material.controller.vo;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
@@ -29,6 +30,10 @@ public class MaterialBatchRespVO {
|
||||
@ExcelProperty("物料大类id")
|
||||
private Long productId;
|
||||
|
||||
@Schema(description = "分类自定义配置")
|
||||
@ExcelProperty("分类自定义配置")
|
||||
private JSONObject categoryCustomConfig;
|
||||
|
||||
@Schema(description = "物料大类名称")
|
||||
@ExcelProperty("物料大类名称")
|
||||
private String productName;
|
||||
@@ -73,6 +78,10 @@ public class MaterialBatchRespVO {
|
||||
@ExcelProperty("已入库数量")
|
||||
private BigDecimal inboundEndQuantity;
|
||||
|
||||
@Schema(description = "检定/校准数量")
|
||||
@ExcelProperty("检定/校准数量")
|
||||
private BigDecimal verificationQuantity;
|
||||
|
||||
@Schema(description = "锁定数量")
|
||||
@ExcelProperty("锁定数量")
|
||||
private BigDecimal lockQuantity;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.zt.plat.module.qms.resource.material.controller.vo.query;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.zt.plat.module.qms.resource.material.enums;
|
||||
|
||||
/**
|
||||
* 物料批次业务类型
|
||||
*
|
||||
*/
|
||||
public enum MaterialBatchBusinessType {
|
||||
/**
|
||||
* 拆分到工段
|
||||
*/
|
||||
batch_assign_gong,
|
||||
/**
|
||||
* 检定
|
||||
*/
|
||||
verify,
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.zt.plat.module.qms.resource.material.enums;
|
||||
|
||||
/**
|
||||
* 物料批次工段枚举
|
||||
* 物料批次操作类型
|
||||
*
|
||||
*/
|
||||
public enum MaterialBatchOperationType {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -92,13 +92,18 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb
|
||||
List<MaterialInfomationDO> infomationDOS = materialInfomationService.saveMaterialInfomationsByBatInb(locationId, reqQuantity, gongduanId, product, batch);
|
||||
// 5.保存入库明细
|
||||
materialInventoryInboundDetailService.saveInboundDetails(infomationDOS, inbound, batchId, gongduanId);
|
||||
// 是否为检定入库
|
||||
Boolean isVerify = materialProductService.checkIsVerifyCategoryByPdtId(batch.getProductId());
|
||||
// 更新工段已入库数量和可用数量
|
||||
gongDO.setInboundEndQuantity(gongDO.getInboundEndQuantity().add(reqQuantity));
|
||||
gongDO.setRemaineQuantity(gongDO.getRemaineQuantity().subtract(reqQuantity));
|
||||
materialBatchService.updateById(gongDO);
|
||||
// 更新批次已入库数量和可用数量
|
||||
batch.setInboundEndQuantity(batch.getInboundEndQuantity().add(reqQuantity));
|
||||
batch.setRemaineQuantity(batch.getRemaineQuantity().subtract(reqQuantity));
|
||||
if (!isVerify) {
|
||||
// 检定业务 检定流程提交时已经扣减过可用数量
|
||||
batch.setRemaineQuantity(batch.getRemaineQuantity().subtract(reqQuantity));
|
||||
}
|
||||
materialBatchService.updateById(batch);
|
||||
// 更新物料大类预警级别
|
||||
materialProductService.updateMaterialProductAlarmLevel(Collections.singletonList(productId));
|
||||
|
||||
@@ -310,13 +310,19 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService ,
|
||||
List<MaterialBatchDO> batches = materialBatchService.getBatchListByBatchIds(batIds);
|
||||
if (CollUtil.isEmpty(batches) || batches.size() != batIds.size())
|
||||
throw new ServiceException(1_032_160_000, "批次不存在或与传入的批次数量不匹配");
|
||||
// 检定数量检验
|
||||
for (MaterialBatchDO batch : batches) {
|
||||
if (batch.getSubmitStatus() != 1)
|
||||
throw new ServiceException(1_032_160_000, String.format("批次【%s】未提交,不可检定", batch.getBatchNo()));
|
||||
}
|
||||
// 检定数量校验
|
||||
Map<Long, MaterialBatchDO> batchDOMapById = batches.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity()));
|
||||
for (MaterialLifecycleDetailSaveReqVO reqDetail : reqDetails) {
|
||||
MaterialBatchDO batchDO = batchDOMapById.get(reqDetail.getBatchId());
|
||||
// 可用数量
|
||||
BigDecimal remaineQuantity = batchDO.getRemaineQuantity();
|
||||
if (reqDetail.getInfluenceCount().compareTo(BigDecimal.ZERO) <= 0)
|
||||
throw new ServiceException(1_032_160_000, "检定数量不能小于等于0");
|
||||
if (reqDetail.getInfluenceCount().compareTo(remaineQuantity) > 0)
|
||||
// 可用数量
|
||||
throw new ServiceException(1_032_160_000, String.format("检定数量超过了批次【%s】可用数量【%s】", batchDO.getBatchNo(), remaineQuantity));
|
||||
if (reqDetail.getQualifiedCount().compareTo(reqDetail.getInfluenceCount()) > 0)
|
||||
throw new ServiceException(1_032_160_000, "合格数量超过了检定数量");
|
||||
|
||||
@@ -132,4 +132,20 @@ public interface MaterialProductService {
|
||||
* @return 物料数据
|
||||
*/
|
||||
MaterialProductRespVO getMaterialProductInfoWithFiles(Long id);
|
||||
|
||||
/**
|
||||
* 获取顶级分类
|
||||
*
|
||||
* @param pdtIds 大类ids
|
||||
* @return 顶级分类
|
||||
*/
|
||||
List<MaterialProductDO> getTopCategoriesByPdtIds(List<Long> pdtIds);
|
||||
|
||||
/**
|
||||
* 检查是否是检定的分类
|
||||
*
|
||||
* @param productId 大类id
|
||||
* @return 是否是审核的分类
|
||||
*/
|
||||
Boolean checkIsVerifyCategoryByPdtId(Long productId);
|
||||
}
|
||||
@@ -11,9 +11,11 @@ import com.zt.plat.framework.common.pojo.CommonResult;
|
||||
import com.zt.plat.framework.common.pojo.PageResult;
|
||||
import com.zt.plat.framework.common.util.object.BeanUtils;
|
||||
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX;
|
||||
import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO;
|
||||
import com.zt.plat.module.qms.common.service.BusinessFileService;
|
||||
import com.zt.plat.module.qms.core.constant.DataTypeConstant;
|
||||
import com.zt.plat.module.qms.enums.QmsCommonConstant;
|
||||
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO;
|
||||
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductRespVO;
|
||||
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductSaveReqVO;
|
||||
@@ -22,6 +24,7 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO
|
||||
import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialProductMapper;
|
||||
import com.zt.plat.module.qms.resource.material.enums.MaterialInventoryAlarmLevel;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -39,6 +42,7 @@ import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*;
|
||||
*
|
||||
* @author 后台管理
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@Validated
|
||||
public class MaterialProductServiceImpl implements MaterialProductService {
|
||||
@@ -355,15 +359,21 @@ public class MaterialProductServiceImpl implements MaterialProductService {
|
||||
.eqIfPresent(MaterialProductDO::getStandardSolutionFlag, queryVO.getStandardSolutionFlag())
|
||||
.eqIfPresent(MaterialProductDO::getStandardMaterialFlag, queryVO.getStandardMaterialFlag())
|
||||
.likeIfPresent(MaterialProductDO::getName, queryVO.getName())
|
||||
.and(StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()),
|
||||
wrapper ->
|
||||
wrapper.eq(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY)
|
||||
.like(MaterialProductDO::getCustomConfig, queryVO.getCategoryCustomConfig()));
|
||||
.and(StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()),wrapper ->
|
||||
wrapper.eq(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY)
|
||||
.like(MaterialProductDO::getCustomConfig, queryVO.getCategoryCustomConfig()));
|
||||
List<MaterialProductDO> mtrlDos = materialProductMapper.selectList(wrapperX);
|
||||
|
||||
if (CollUtil.isEmpty(mtrlDos)) return List.of();
|
||||
|
||||
return mtrlDos.stream().map(m -> BeanUtils.toBean(m, MaterialProductRespVO.class)).toList();
|
||||
if (StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()) && StrUtil.isEmpty(queryVO.getNodeType())) {
|
||||
List<Long> ctgIds = mtrlDos.stream().map(MaterialProductDO::getId).toList();
|
||||
List<MaterialProductDO> pdts = materialProductMapper.selectList(Wrappers.lambdaQuery(MaterialProductDO.class)
|
||||
.in(MaterialProductDO::getParentId, ctgIds));
|
||||
mtrlDos.addAll(pdts);
|
||||
}
|
||||
|
||||
return BeanUtils.toBean(mtrlDos, MaterialProductRespVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -441,4 +451,31 @@ public class MaterialProductServiceImpl implements MaterialProductService {
|
||||
return respVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MaterialProductDO> getTopCategoriesByPdtIds(List<Long> pdtIds) {
|
||||
List<MaterialProductDO> productDOS = materialProductMapper.selectByIds(pdtIds);
|
||||
// 获取顶级分类ids ipPath格式:/0/2015987059211448321/2018922665117827074/2018932101769150466/
|
||||
Set<Long> topCategoryIds = productDOS.stream()
|
||||
.map(MaterialProductDO::getIdPath)
|
||||
.filter(StrUtil::isNotEmpty)
|
||||
.map(path -> path.split("/"))
|
||||
.filter(segments -> segments.length > 2)
|
||||
.map(segments -> segments[2])
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
return materialProductMapper.selectByIds(topCategoryIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean checkIsVerifyCategoryByPdtId(Long productId) {
|
||||
|
||||
List<MaterialProductDO> topCategories = this.getTopCategoriesByPdtIds(Collections.singletonList(productId));
|
||||
if (CollUtil.isEmpty(topCategories)) return false;
|
||||
MaterialProductDO topCtg = topCategories.get(0);
|
||||
JSONObject customConfig = JSONUtil.parseObj(topCtg.getCustomConfig());
|
||||
Object verifyCalibrateFlag = customConfig.get("verifyCalibrateFlag");
|
||||
if (verifyCalibrateFlag == null) return false;
|
||||
return "1".equals(verifyCalibrateFlag);
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user