Browse Source

feat(physical-inventory): 添加盘点异常处理功能

- 新增查询未处理异常盘点结果的接口和实现
- 新增保存异常处理结果的接口和事务处理逻辑
- 在盘点提交前添加单据状态检查防止非法操作
- 更新数据库映射文件添加异常查询和处理的SQL语句
- 修改处理方式显示为人工处理和系统处理两种类型
- 优化盘点回调和提交接口的状态验证机制
master
常熟吴彦祖 2 months ago
parent
commit
64157cb181
  1. 33
      src/main/java/com/gaotao/modules/check/controller/PhysicalInventoryController.java
  2. 29
      src/main/java/com/gaotao/modules/check/mapper/PhysicalInventoryMapper.java
  3. 24
      src/main/java/com/gaotao/modules/check/service/PhysicalInventoryService.java
  4. 72
      src/main/java/com/gaotao/modules/check/service/impl/PhysicalInventoryServiceImpl.java
  5. 63
      src/main/resources/mapper/check/PhysicalInventoryMapper.xml

33
src/main/java/com/gaotao/modules/check/controller/PhysicalInventoryController.java

@ -388,4 +388,37 @@ public class PhysicalInventoryController {
int result = physicalInventoryService.pdaSubmitCount(site, countNo, palletId, scannedLabels, username);
return R.ok().put("result", result);
}
// ==================== 异常处理 ==================== - rqrq
/**
* @Description 查询未处理的异常盘点结果 - rqrq
* @param query 查询条件包含sitecountNo
* @return R
* @author rqrq
*/
@PostMapping("/searchUnhandledExceptionList")
public R searchUnhandledExceptionList(@RequestBody CountResultData query) {
List<CountResultData> result = physicalInventoryService.searchUnhandledExceptionList(query);
return R.ok().put("rows", result);
}
/**
* @Description 保存异常处理结果 - rqrq
* @param query 包含sitecountNousernameexceptionList
* @return R
* @author rqrq
*/
@PostMapping("/saveExceptionHandle")
@SuppressWarnings("unchecked")
public R saveExceptionHandle(@RequestBody java.util.Map<String, Object> query) {
String site = (String) query.get("site");
String countNo = (String) query.get("countNo");
String username = (String) query.get("username");
java.util.List<java.util.Map<String, Object>> exceptionList =
(java.util.List<java.util.Map<String, Object>>) query.get("exceptionList");
int result = physicalInventoryService.saveExceptionHandle(site, countNo, username, exceptionList);
return R.ok().put("result", result);
}
}

29
src/main/java/com/gaotao/modules/check/mapper/PhysicalInventoryMapper.java

@ -546,4 +546,33 @@ public interface PhysicalInventoryMapper extends BaseMapper<CountHeader> {
* @author rqrq
*/
String getTaskNoByPallet(@Param("site") String site, @Param("countNo") String countNo, @Param("palletId") String palletId);
// ==================== 异常处理 ==================== - rqrq
/**
* @Description 查询未处理的异常盘点结果 - rqrq
* <p>查询条件count_result != 'OK' AND handle_flag = 'N'</p>
* @param query 查询条件包含sitecountNo
* @return List<CountResultData>
* @author rqrq
*/
List<CountResultData> searchUnhandledExceptionList(@Param("query") CountResultData query);
/**
* @Description 更新盘点结果的处理标记和处理方式 - rqrq
* @param id 盘点结果ID
* @param site 工厂编码
* @param countNo 盘点单号
* @param unitId 标签号
* @param palletId 栈板号
* @param handleFlag 处理标记Y/N
* @param handleType 处理方式SYSTEM/MANUAL
* @param username 操作人
* @return int
* @author rqrq
*/
int updateCountResultHandleFlag(@Param("id") Long id, @Param("site") String site,
@Param("countNo") String countNo, @Param("unitId") String unitId,
@Param("palletId") String palletId, @Param("handleFlag") String handleFlag,
@Param("handleType") String handleType, @Param("username") String username);
}

24
src/main/java/com/gaotao/modules/check/service/PhysicalInventoryService.java

@ -346,4 +346,28 @@ public interface PhysicalInventoryService {
*/
int pdaSubmitCount(String site, String countNo, String palletId,
java.util.List<java.util.Map<String, Object>> scannedLabels, String username);
// ==================== 异常处理 ==================== - rqrq
/**
* @Description 查询未处理的异常盘点结果 - rqrq
* <p>查询条件count_result != 'OK' AND handle_flag = 'N'</p>
* @param query 查询条件包含sitecountNo
* @return List<CountResultData>
* @author rqrq
*/
java.util.List<CountResultData> searchUnhandledExceptionList(CountResultData query);
/**
* @Description 保存异常处理结果 - rqrq
* <p>更新count_result表的handle_flag和handle_type字段</p>
* @param site 工厂编码
* @param countNo 盘点单号
* @param username 操作人
* @param exceptionList 异常处理列表包含idunitIdpalletIdhandleType
* @return int 处理的记录数
* @author rqrq
*/
int saveExceptionHandle(String site, String countNo, String username,
java.util.List<java.util.Map<String, Object>> exceptionList);
}

72
src/main/java/com/gaotao/modules/check/service/impl/PhysicalInventoryServiceImpl.java

@ -1205,6 +1205,14 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
log.info("handleCountRfidCallback 开始,site: {}, countNo: {}, palletId: {}, taskNo: {}, resultCode: {}, resultMsg: {}",
site, countNo, palletId, taskNo, resultCode, resultMsg);
// 0. 检查单据状态是否为盘点中如果不是则直接返回成功不做业务 - rqrq
CountHeaderData countHeader = getCountHeaderByNo(site, countNo);
if (countHeader == null || !CountHeader.STATUS_CHECKING.equals(countHeader.getStatus())) {
log.info("盘点单状态不是盘点中,直接返回成功不做业务,countNo: {}, status: {}",
countNo, countHeader != null ? countHeader.getStatus() : "null");
return;
}
// 1. 从pallet_detail查询当前栈板的所有标签 - rqrq
List<CountLabelData> palletLabels = baseMapper.getPalletDetailByPalletId(site, palletId);
log.info("栈板标签数量: {}", palletLabels.size());
@ -1624,6 +1632,14 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
public int pdaQuickSubmitCount(String site, String countNo, String palletId, String username) {
log.info("pdaQuickSubmitCount 开始,site: {}, countNo: {}, palletId: {}", site, countNo, palletId);
// 0. 检查单据状态是否为盘点中如果不是PDA直接报错 - rqrq
CountHeaderData countHeader = getCountHeaderByNo(site, countNo);
if (countHeader == null || !CountHeader.STATUS_CHECKING.equals(countHeader.getStatus())) {
log.error("盘点单状态不是盘点中,无法提交盘点结果,countNo: {}, status: {}",
countNo, countHeader != null ? countHeader.getStatus() : "null");
throw new RuntimeException("盘点单状态不是盘点中,无法提交盘点结果");
}
// 1. 查询栈板的盘点标签明细 - rqrq
List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId);
if (labelList.isEmpty()) {
@ -1686,6 +1702,14 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
log.info("pdaSubmitCount 开始,site: {}, countNo: {}, palletId: {}, 扫描标签数: {}",
site, countNo, palletId, scannedLabels != null ? scannedLabels.size() : 0);
// 0. 检查单据状态是否为盘点中如果不是PDA直接报错 - rqrq
CountHeaderData countHeader = getCountHeaderByNo(site, countNo);
if (countHeader == null || !CountHeader.STATUS_CHECKING.equals(countHeader.getStatus())) {
log.error("盘点单状态不是盘点中,无法提交盘点结果,countNo: {}, status: {}",
countNo, countHeader != null ? countHeader.getStatus() : "null");
throw new RuntimeException("盘点单状态不是盘点中,无法提交盘点结果");
}
// 1. 查询栈板的盘点标签明细 - rqrq
List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId);
if (labelList.isEmpty()) {
@ -1796,6 +1820,54 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
return labelList.size();
}
// ==================== 异常处理 ==================== - rqrq
@Override
public java.util.List<CountResultData> searchUnhandledExceptionList(CountResultData query) {
System.out.println("searchUnhandledExceptionList 开始");
System.out.println("参数:site=" + query.getSite() + ", countNo=" + query.getCountNo());
java.util.List<CountResultData> result = baseMapper.searchUnhandledExceptionList(query);
System.out.println("searchUnhandledExceptionList 结束,结果数量: " + (result != null ? result.size() : 0));
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int saveExceptionHandle(String site, String countNo, String username,
java.util.List<java.util.Map<String, Object>> exceptionList) {
System.out.println("saveExceptionHandle 开始");
System.out.println("参数:site=" + site + ", countNo=" + countNo + ", username=" + username);
if (exceptionList == null || exceptionList.isEmpty()) {
return 0;
}
int updateCount = 0;
for (java.util.Map<String, Object> item : exceptionList) {
Long id = null;
Object idObj = item.get("id");
if (idObj instanceof Number) {
id = ((Number) idObj).longValue();
} else if (idObj instanceof String) {
id = Long.parseLong((String) idObj);
}
String unitId = (String) item.get("unitId");
String palletId = (String) item.get("palletId");
String handleType = (String) item.get("handleType");
// 更新处理标记和处理方式 - rqrq
int updated = baseMapper.updateCountResultHandleFlag(id, site, countNo, unitId, palletId,
CountResult.HANDLE_FLAG_YES, handleType, username);
updateCount += updated;
}
System.out.println("saveExceptionHandle 结束,更新数量: " + updateCount);
return updateCount;
}
/**
* @Description 盘点完成后处理任务单与RFID接口逻辑一致- rqrq
*

63
src/main/resources/mapper/check/PhysicalInventoryMapper.xml

@ -333,9 +333,8 @@
ELSE '未处理'
END AS handleFlagDesc,
CASE r.handle_type
WHEN 'ADJUST' THEN '调整库存'
WHEN 'IGNORE' THEN '忽略差异'
WHEN 'RECOUNT' THEN '重新盘点'
WHEN 'MANUAL' THEN '人工处理'
WHEN 'SYSTEM' THEN '系统处理'
ELSE ''
END AS handleTypeDesc
FROM count_result r
@ -946,5 +945,63 @@
AND cr.count_result != 'OK'
AND (cr.handle_flag IS NULL OR cr.handle_flag = 'N')
</select>
<!-- rqrq - 查询未处理的异常盘点结果 -->
<select id="searchUnhandledExceptionList" resultType="CountResultData">
SELECT
r.id,
r.site,
r.count_no AS countNo,
r.unit_id AS unitId,
r.part_no AS partNo,
r.qty,
r.batch_no AS batchNo,
r.location_id AS locationId,
r.warehouse_id AS warehouseId,
r.wdr,
r.pallet_id AS palletId,
r.count_date AS countDate,
r.count_user AS countUser,
r.count_result AS countResult,
r.diff_qty AS diffQty,
r.handle_flag AS handleFlag,
r.handle_type AS handleType,
r.remark,
r.created_by AS createdBy,
r.created_date AS createdDate,
h.part_desc AS partDesc,
w.WareHouseName AS warehouseName,
loc.LocationName AS locationName,
CASE r.count_result
WHEN 'OK' THEN '正常'
WHEN 'MISSING' THEN '缺失'
WHEN 'SURPLUS' THEN '盈余'
WHEN 'QTY_DIFF' THEN '数量差异'
ELSE r.count_result
END AS countResultDesc,
CASE r.handle_flag
WHEN 'Y' THEN '已处理'
WHEN 'N' THEN '未处理'
ELSE '未处理'
END AS handleFlagDesc
FROM count_result r
LEFT JOIN handling_unit h ON r.unit_id = h.unit_id AND r.site = h.site
LEFT JOIN warehouse w ON r.warehouse_id = w.WareHouseID AND r.site = w.Site
LEFT JOIN location loc ON r.location_id = loc.LocationID AND r.site = loc.Site
WHERE r.site = #{query.site}
AND r.count_no = #{query.countNo}
AND r.count_result != 'OK'
AND (r.handle_flag IS NULL OR r.handle_flag = 'N')
ORDER BY r.count_result, r.unit_id
</select>
<!-- rqrq - 更新盘点结果的处理标记和处理方式 -->
<update id="updateCountResultHandleFlag">
UPDATE count_result
SET handle_type = #{handleType}
WHERE id = #{id}
<!-- AND site = #{site} -->
<!-- AND count_no = #{countNo}-->
</update>
</mapper>
Loading…
Cancel
Save