Merge remote-tracking branch 'origin/feature/NoScanning' into feature/NoScanning

This commit is contained in:
yf001217 2026-06-09 18:03:26 +08:00
commit 4a2f6acb05
6 changed files with 106 additions and 3 deletions

View File

@ -3,6 +3,7 @@ package com.nflg.qms.admin.controller.external;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.qo.ExemptMaterialCheckQO;
import com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO;
import com.nflg.wms.repository.service.IQmsExemptCategoryService;
import com.nflg.wms.repository.service.IQmsExemptMaterialService;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
@ -15,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 对外接口-物料信息
@ -28,15 +31,42 @@ public class MaterialController extends BaseController {
@Resource
private IQmsExemptMaterialService exemptMaterialService;
@Resource
private IQmsExemptCategoryService exemptCategoryService;
/**
* 批量判断物料是否免检
* - 参数为供应商编号和物料编号的组合列表
* - 根据系统中已审核已启用且在有效期内的免检设置判断
* - 先按免检物料判断命中则视为免检未命中再按免检类别判断
* - 仅根据系统中已审核已启用且在有效期内的免检设置判断
* - 返回每个组合的免检标志exempt=true 表示免检
*/
@PostMapping("batchCheckExempt")
public ApiResult<List<ExemptMaterialCheckVO>> batchCheckExempt(
@Valid @RequestBody @NotEmpty List<ExemptMaterialCheckQO> request) {
return ApiResult.success(exemptMaterialService.batchCheckExempt(request));
// 物料级免检判断
List<ExemptMaterialCheckVO> result = exemptMaterialService.batchCheckExempt(request);
// 物料级未命中的组合再做类别级免检判断
List<ExemptMaterialCheckQO> remaining = result.stream()
.filter(vo -> !Boolean.TRUE.equals(vo.getExempt()))
.map(vo -> new ExemptMaterialCheckQO(vo.getSupplierCode(), vo.getMaterialNo()))
.collect(Collectors.toList());
if (!remaining.isEmpty()) {
Set<String> categoryExemptKeys = exemptCategoryService.batchCheckExempt(remaining).stream()
.filter(vo -> Boolean.TRUE.equals(vo.getExempt()))
.map(vo -> vo.getSupplierCode() + ":" + vo.getMaterialNo())
.collect(Collectors.toSet());
result.forEach(vo -> {
if (!Boolean.TRUE.equals(vo.getExempt())
&& categoryExemptKeys.contains(vo.getSupplierCode() + ":" + vo.getMaterialNo())) {
vo.setExempt(true);
}
});
}
return ApiResult.success(result);
}
}

View File

@ -213,7 +213,7 @@ public class InProduceOrderController extends BaseController {
.setCreateTime(LocalDateTime.now())
);
}
qmsService.pushPdiInspection(order.getNo(), parent);
qmsService.pushPdiInspection(order.getOrderNo(), parent);
return ApiResult.success(order.getId());
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsExemptCategorySearchQO;
import com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO;
import com.nflg.wms.common.pojo.vo.QmsExemptCategoryVO;
import com.nflg.wms.repository.entity.QmsExemptCategory;
import org.apache.ibatis.annotations.Param;
@ -29,4 +30,11 @@ public interface QmsExemptCategoryMapper extends BaseMapper<QmsExemptCategory> {
* 按物料类别编码查询关联的供应商免检明细
*/
List<QmsExemptCategoryVO> detailByCategory(@Param("categoryCode") String categoryCode);
/**
* 批量查询类别级有效免检组合供应商编号+物料编号
* 通过物料所属类别匹配免检类别仅返回审核通过启用且在有效期内的记录
*/
List<ExemptMaterialCheckVO> batchCheckExempt(@Param("supplierCodes") List<String> supplierCodes,
@Param("materialNos") List<String> materialNos);
}

View File

@ -1,9 +1,11 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.qo.ExemptMaterialCheckQO;
import com.nflg.wms.common.pojo.qo.QmsExemptCategorySearchQO;
import com.nflg.wms.common.pojo.qo.QmsExemptCategorySaveQO;
import com.nflg.wms.common.pojo.qo.QmsExemptMaterialAuditQO;
import com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO;
import com.nflg.wms.common.pojo.vo.QmsExemptCategoryVO;
import com.nflg.wms.repository.entity.QmsExemptCategory;
import com.baomidou.mybatisplus.extension.service.IService;
@ -44,4 +46,10 @@ public interface IQmsExemptCategoryService extends IService<QmsExemptCategory> {
* 审核
*/
void audit(QmsExemptMaterialAuditQO request);
/**
* 批量判断物料是否类别级免检
* 通过物料所属类别匹配免检类别返回每个请求组合的免检标志
*/
List<ExemptMaterialCheckVO> batchCheckExempt(List<ExemptMaterialCheckQO> items);
}

View File

@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.qo.ExemptMaterialCheckQO;
import com.nflg.wms.common.pojo.qo.QmsExemptCategorySearchQO;
import com.nflg.wms.common.pojo.qo.QmsExemptCategorySaveQO;
import com.nflg.wms.common.pojo.qo.QmsExemptMaterialAuditQO;
import com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO;
import com.nflg.wms.common.pojo.vo.QmsExemptCategoryVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsExemptCategory;
@ -20,7 +22,10 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 免检物料类别 服务实现类
@ -165,4 +170,32 @@ public class QmsExemptCategoryServiceImpl extends ServiceImpl<QmsExemptCategoryM
}
return LocalDateTime.parse(dateStr, DATE_FMT);
}
@Override
public List<ExemptMaterialCheckVO> batchCheckExempt(List<ExemptMaterialCheckQO> items) {
List<String> supplierCodes = items.stream()
.map(ExemptMaterialCheckQO::getSupplierCode)
.distinct()
.collect(Collectors.toList());
List<String> materialNos = items.stream()
.map(ExemptMaterialCheckQO::getMaterialNo)
.distinct()
.collect(Collectors.toList());
List<ExemptMaterialCheckVO> exemptList = baseMapper.batchCheckExempt(supplierCodes, materialNos);
Set<String> exemptSet = exemptList.stream()
.map(v -> v.getSupplierCode() + ":" + v.getMaterialNo())
.collect(Collectors.toCollection(HashSet::new));
List<ExemptMaterialCheckVO> result = new ArrayList<>(items.size());
for (ExemptMaterialCheckQO item : items) {
ExemptMaterialCheckVO vo = new ExemptMaterialCheckVO();
vo.setSupplierCode(item.getSupplierCode());
vo.setMaterialNo(item.getMaterialNo());
vo.setExempt(exemptSet.contains(item.getSupplierCode() + ":" + item.getMaterialNo()));
result.add(vo);
}
return result;
}
}

View File

@ -154,4 +154,28 @@
ORDER BY ec.create_time DESC
</select>
<!-- 批量查询类别级有效免检组合,通过物料所属类别匹配免检类别,仅返回审核通过、启用且在有效期内的记录 -->
<select id="batchCheckExempt" resultType="com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO">
SELECT DISTINCT
us.supplier_code AS supplierCode,
qm.material_no AS materialNo
FROM qms_exempt_category ec
INNER JOIN user_supplier us ON us.id = ec.supplier_id
INNER JOIN qms_qc_material qm ON qm.material_category_code = ec.category_code
WHERE ec.audit_status = 1
AND ec.enable = true
AND (
ec.exempt_mode = 0
OR (ec.exempt_mode = 1 AND ec.valid_end_date IS NOT NULL AND ec.valid_end_date &gt;= NOW())
)
AND us.supplier_code IN
<foreach collection="supplierCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
AND qm.material_no IN
<foreach collection="materialNos" item="no" open="(" separator="," close=")">
#{no}
</foreach>
</select>
</mapper>