Compare commits

..

5 Commits

Author SHA1 Message Date
funny 9542751147 Merge branch 'qms/yf' into qms/develop 2026-04-29 16:39:54 +08:00
曹鹏飞 049ff61c24 fix(inspection): 增加物料唯一编号校验及检验数量限制
- 校验物料唯一编号不为空,防止传入空值
- 检查任务中物料是否已被检验,避免重复检验
- 验证当前检验数量未超过任务总检验数量减已检数量
- 优化异常提示信息,提高用户操作反馈准确性
2026-04-29 16:28:38 +08:00
曹鹏飞 6362d6ed7e fix(inspection-task): 优化来料检验任务提交及暂存逻辑
- 优化提交检验接口,增加任务存在性和完成状态校验
- 移除暂存检验结果接口及相关代码,简化业务流程
- 在提交检验时设置和更新检验开始时间及状态
- 校验质检人员时增加空格格式调整,提升代码规范性
- 调整相关请求参数,删除无用字段,只保留检验结果及开始时间校验
- 在提交样本检验时校验任务状态,防止重复完成操作
2026-04-29 15:09:34 +08:00
曹鹏飞 1a933353a3 fix(incoming-inspection): 优化样本数量校验和添加物料规格字段
- 修改样本数量校验逻辑,去除测试方法判断,使用检测数量限制样本数量
- 修正剩余样本数量计算,避免超出请求数量
- 在查询中增加检测数量字段,丰富任务详情信息
- 修正样本记录数量统计SQL,计算总检验数量而非计数
- 在检验任务VO中新增物料规格属性,完善物料信息展示
2026-04-29 14:36:04 +08:00
曹鹏飞 3fd457cdb6 refactor(controller): 移除QmsIncomingInspectionTaskController中未使用的导入
- 删除了未使用的QmsIncomingInspectionTaskRecordVO导入
- 移除了未使用的@Transactional注解导入
- 优化了导入列表,使代码更简洁规范
2026-04-29 11:44:49 +08:00
7 changed files with 140 additions and 128 deletions

View File

@ -8,13 +8,11 @@ import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCountVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskRecordItemDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskRecordVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -114,14 +112,14 @@ public class QmsIncomingInspectionTaskController extends BaseController {
return ApiResult.success();
}
/**
* 暂存检验结果
*/
@PostMapping("pad/staging")
public ApiResult<Void> staging(@Valid @RequestBody QmsIncomingInspectionTaskSubmitQO request){
incomingInspectionTaskControllerService.staging(request);
return ApiResult.success();
}
// /**
// * 暂存检验结果
// */
// @PostMapping("pad/staging")
// public ApiResult<Void> staging(@Valid @RequestBody QmsIncomingInspectionTaskSubmitQO request){
// incomingInspectionTaskControllerService.staging(request);
// return ApiResult.success();
// }
/**
* 提交检验结果

View File

@ -560,7 +560,7 @@ public class IncomingInspectionTaskControllerService {
// 通过当前登录用户的 userId 查询对应的质检人员记录
QmsQualityInspector inspector = qualityInspectorService.lambdaQuery()
.eq(QmsQualityInspector::getUserId, userId)
.eq(QmsQualityInspector::getInspectionType,1)
.eq(QmsQualityInspector::getInspectionType, 1)
.last("LIMIT 1")
.one();
VUtil.trueThrowBusinessError(Objects.isNull(inspector))
@ -577,7 +577,7 @@ public class IncomingInspectionTaskControllerService {
// 通过当前登录用户的 userId 查询对应的质检人员记录
QmsQualityInspector inspector = qualityInspectorService.lambdaQuery()
.eq(QmsQualityInspector::getUserId, userId)
.eq(QmsQualityInspector::getInspectionType,1)
.eq(QmsQualityInspector::getInspectionType, 1)
.last("LIMIT 1")
.one();
VUtil.trueThrowBusinessError(Objects.isNull(inspector))
@ -756,16 +756,10 @@ public class IncomingInspectionTaskControllerService {
List<QmsIncomingInspectionTaskCheckItemVO> datas = inspectionStandardService.getItemsForCheck(standard.getId());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("未设置检验项目");
Integer count = incomingInspectionTaskRecordService.getCount(task.getId());
Integer total;
if (Objects.equals(standard.getTestingMethodDictItemId(), dictionaryItemService.getIdByCode("InspectionStandardTestingMethod", "Full"))) {
total = task.getInspectionQty();
} else {
total = getCountOfSampling(task.getId(), task.getInspectionQty(), standard);
}
VUtil.trueThrowBusinessError(count > total).throwMessage("样本数量不能大于总数量");
VUtil.trueThrowBusinessError(count > task.getDetectionQty()).throwMessage("样本数量不能大于总数量");
return new QmsIncomingInspectionTaskCheckDetailVO()
.setItems(datas)
.setCount(total - count)
.setCount(Math.min(task.getDetectionQty() - count, request.getNum()))
.setPdfDrawings(
inspectionStandardItemService.lambdaQuery()
.select(QmsInspectionStandardItem::getPdfDrawing)
@ -812,6 +806,18 @@ public class IncomingInspectionTaskControllerService {
@Transactional
public void submitCheckItem(QmsIncomingInspectionTaskTodoCheckSubmitQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
VUtil.trueThrowBusinessError(task.getInspectionStatus() == 2).throwMessage("该任务已完成");
VUtil.trueThrowBusinessError(incomingInspectionTaskRecordService.lambdaQuery()
.eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
.eq(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo, request.getMaterialUniqueNo())
.exists()
).throwMessage("该物料已检验过");
Integer inspectedQty = incomingInspectionTaskService.getInspectedQty(task.getId());
VUtil.trueThrowBusinessError(request.getInspectionQty() > (task.getDetectionQty() - inspectedQty))
.throwMessage("超出总检验数量");
LocalDateTime now = LocalDateTime.now();
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
@ -892,20 +898,6 @@ public class IncomingInspectionTaskControllerService {
if (!updateDatas.isEmpty()) {
incomingInspectionTaskRecordItemDataService.updateBatchById(updateDatas);
}
}
/**
* 暂存检验结果
* 1. 根据任务ID查询所有样本记录
* 2. 计算合格数量和不合格数量
* 3. 更新任务的合格数量不合格数量检验结果
* 4. 如果检验开始时间为空则更新检验开始时间
*/
@Transactional
public void staging(QmsIncomingInspectionTaskSubmitQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
// 查询该任务下所有检验记录
List<QmsIncomingInspectionTaskRecord> records = incomingInspectionTaskRecordService.lambdaQuery()
.eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
@ -915,51 +907,72 @@ public class IncomingInspectionTaskControllerService {
int qualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getQualifiedQty)
.reduce(0, Integer::sum);
task.setQualifiedQty(qualifiedQty);
int unqualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getUnqualifiedQty)
.reduce(0, Integer::sum);
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 构建更新对象
var updateWrapper = incomingInspectionTaskService.lambdaUpdate()
.eq(QmsIncomingInspectionTask::getId, request.getTaskId())
.ne(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getQualifiedQty, qualifiedQty)
.set(QmsIncomingInspectionTask::getUnqualifiedQty, unqualifiedQty)
.set(QmsIncomingInspectionTask::getInspectionResult, request.getQualified())
.set(QmsIncomingInspectionTask::getUpdateUserId, userId)
.set(QmsIncomingInspectionTask::getUpdateUserName, userName)
.set(QmsIncomingInspectionTask::getUpdateTime, now);
// 如果检验开始时间为空则更新检验开始时间
task.setUnqualifiedQty(unqualifiedQty);
if (Objects.isNull(task.getInspectionStartTime())) {
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStartTime, request.getInspectionStartTime());
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStatus, 1);
task.setInspectionStartTime(request.getInspectionStartTime());
}
updateWrapper.update();
task.setInspectionStatus((short) 1);
incomingInspectionTaskService.updateById(task);
}
// /**
// * 暂存检验结果
// * 1. 根据任务ID查询所有样本记录
// * 2. 计算合格数量和不合格数量
// * 3. 更新任务的合格数量不合格数量检验结果
// * 4. 如果检验开始时间为空则更新检验开始时间
// */
// @Transactional
// public void staging(QmsIncomingInspectionTaskSubmitQO request) {
// QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
// VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
//
// // 查询该任务下所有检验记录
// List<QmsIncomingInspectionTaskRecord> records = incomingInspectionTaskRecordService.lambdaQuery()
// .eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
// .list();
//
// // 计算合格数量和不合格数量
// int qualifiedQty = records.stream()
// .map(QmsIncomingInspectionTaskRecord::getQualifiedQty)
// .reduce(0, Integer::sum);
// int unqualifiedQty = records.stream()
// .map(QmsIncomingInspectionTaskRecord::getUnqualifiedQty)
// .reduce(0, Integer::sum);
//
// Long userId = UserUtil.getUserId();
// String userName = UserUtil.getUserName();
// LocalDateTime now = LocalDateTime.now();
//
// // 构建更新对象
// var updateWrapper = incomingInspectionTaskService.lambdaUpdate()
// .eq(QmsIncomingInspectionTask::getId, request.getTaskId())
// .ne(QmsIncomingInspectionTask::getInspectionStatus, 2)
// .set(QmsIncomingInspectionTask::getQualifiedQty, qualifiedQty)
// .set(QmsIncomingInspectionTask::getUnqualifiedQty, unqualifiedQty)
// .set(QmsIncomingInspectionTask::getInspectionResult, request.getQualified())
// .set(QmsIncomingInspectionTask::getUpdateUserId, userId)
// .set(QmsIncomingInspectionTask::getUpdateUserName, userName)
// .set(QmsIncomingInspectionTask::getUpdateTime, now);
//
// // 如果检验开始时间为空则更新检验开始时间
// if (Objects.isNull(task.getInspectionStartTime())) {
// updateWrapper.set(QmsIncomingInspectionTask::getInspectionStartTime, request.getInspectionStartTime());
// updateWrapper.set(QmsIncomingInspectionTask::getInspectionStatus, 1);
// }
//
// updateWrapper.update();
// }
@Transactional
public void submit(@Valid QmsIncomingInspectionTaskSubmitQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
// 查询该任务下所有检验记录
List<QmsIncomingInspectionTaskRecord> records = incomingInspectionTaskRecordService.lambdaQuery()
.eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
.list();
// 计算合格数量和不合格数量
int qualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getQualifiedQty)
.reduce(0, Integer::sum);
int unqualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getUnqualifiedQty)
.reduce(0, Integer::sum);
VUtil.trueThrowBusinessError(task.getInspectionStatus() == 2).throwMessage("该任务已完成");
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
@ -969,8 +982,6 @@ public class IncomingInspectionTaskControllerService {
var updateWrapper = incomingInspectionTaskService.lambdaUpdate()
.eq(QmsIncomingInspectionTask::getId, request.getTaskId())
.ne(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getQualifiedQty, qualifiedQty)
.set(QmsIncomingInspectionTask::getUnqualifiedQty, unqualifiedQty)
.set(QmsIncomingInspectionTask::getInspectionResult, request.getQualified())
.set(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getInspectionFinishTime, LocalDateTime.now())
@ -978,11 +989,6 @@ public class IncomingInspectionTaskControllerService {
.set(QmsIncomingInspectionTask::getUpdateUserName, userName)
.set(QmsIncomingInspectionTask::getUpdateTime, now);
// 如果检验开始时间为空则更新检验开始时间
if (Objects.isNull(task.getInspectionStartTime())) {
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStartTime, request.getInspectionStartTime());
}
updateWrapper.update();
if (task.getInspectionResult()) {

View File

@ -19,10 +19,4 @@ public class QmsIncomingInspectionTaskSubmitQO {
*/
@NotNull(message = "检验结果不能为空")
private Boolean qualified;
/**
* 检验开始时间
*/
@NotNull(message = "检验开始时间不能为空")
private LocalDateTime inspectionStartTime;
}

View File

@ -1,10 +1,12 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ -21,9 +23,15 @@ public class QmsIncomingInspectionTaskTodoCheckSubmitQO {
/**
* 物料唯一编号
*/
@NotNull(message = "物料唯一编号不能为空")
@NotBlank(message = "物料唯一编号不能为空")
private String materialUniqueNo;
/**
* 检验开始时间
*/
@NotNull(message = "检验开始时间不能为空")
private LocalDateTime inspectionStartTime;
/**
* 样本数量
*/

View File

@ -37,6 +37,11 @@ public class QmsIncomingInspectionTaskVO {
*/
private String drawingNoVer;
/**
* 物料规格
*/
private String materialSpecifications;
/**
* 检验标准id
*/

View File

@ -42,7 +42,8 @@
t.callback_result,
t.warehouse,
t.storage_days,
t.storage_location
t.storage_location,
t.detection_qty
FROM qms_incoming_inspection_task t
LEFT JOIN qms_qc_material m ON t.material_id = m.id
LEFT JOIN qms_inspection_standard s ON t.inspection_standard_id = s.id
@ -177,51 +178,51 @@
</select>
<select id="getDetail" resultType="com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO">
SELECT
t.id,
t.task_no,
t.material_id,
m.material_no,
m.material_desc,
m.drawing_no_ver,
t.inspection_standard_id,
s.version AS standard_version,
t.supplier_code,
t.supplier_name,
t.delivery_order_no,
t.delivery_order_line,
t.purchase_order_no,
t.purchase_order_line,
t.factory,
t.inspection_type,
t.inspection_qty,
t.qualified_qty,
t.unqualified_qty,
t.inspection_status,
t.inspection_result,
t.inspector_id,
t.inspector_name,
t.agent_id,
t.agent_name,
t.submit_time,
t.inspection_start_time,
t.inspection_finish_time,
t.required_finish_time,
t.is_overdue,
t2.task_no as related_task_no,
t.update_user_id,
t.update_user_name,
t.update_time,
t.purchase_group,
t.warehouse,
t.storage_location,
t.storage_days,
t.callback_result,
t.detection_qty
SELECT t.id,
t.task_no,
t.material_id,
m.material_no,
m.material_desc,
m.drawing_no_ver,
m.material_specifications,
t.inspection_standard_id,
s.version AS standard_version,
t.supplier_code,
t.supplier_name,
t.delivery_order_no,
t.delivery_order_line,
t.purchase_order_no,
t.purchase_order_line,
t.factory,
t.inspection_type,
t.inspection_qty,
t.qualified_qty,
t.unqualified_qty,
t.inspection_status,
t.inspection_result,
t.inspector_id,
t.inspector_name,
t.agent_id,
t.agent_name,
t.submit_time,
t.inspection_start_time,
t.inspection_finish_time,
t.required_finish_time,
t.is_overdue,
t2.task_no as related_task_no,
t.update_user_id,
t.update_user_name,
t.update_time,
t.purchase_group,
t.warehouse,
t.storage_location,
t.storage_days,
t.callback_result,
t.detection_qty
FROM qms_incoming_inspection_task t
LEFT JOIN qms_qc_material m ON t.material_id = m.id
LEFT JOIN qms_inspection_standard s ON t.inspection_standard_id = s.id
LEFT JOIN qms_incoming_inspection_task t2 ON t.related_task_id = t2.id
LEFT JOIN qms_qc_material m ON t.material_id = m.id
LEFT JOIN qms_inspection_standard s ON t.inspection_standard_id = s.id
LEFT JOIN qms_incoming_inspection_task t2 ON t.related_task_id = t2.id
WHERE t.id = #{id}
</select>

View File

@ -3,6 +3,6 @@
<mapper namespace="com.nflg.wms.repository.mapper.QmsIncomingInspectionTaskRecordMapper">
<select id="getCount" resultType="java.lang.Integer">
SELECT SUM(count) FROM qms_incoming_inspection_task_record WHERE task_id=#{taskId}
SELECT COALESCE(SUM(inspection_qty),0) FROM qms_incoming_inspection_task_record WHERE task_id=#{taskId}
</select>
</mapper>