Browse Source

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

- 新增查询未处理异常盘点结果的接口和实现
- 新增保存异常处理结果的接口和事务处理逻辑
- 在盘点提交前添加单据状态检查防止非法操作
- 更新数据库映射文件添加异常查询和处理的SQL语句
- 修改处理方式显示为人工处理和系统处理两种类型
- 优化盘点回调和提交接口的状态验证机制
master
常熟吴彦祖 6 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); int result = physicalInventoryService.pdaSubmitCount(site, countNo, palletId, scannedLabels, username);
return R.ok().put("result", result); 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 * @author rqrq
*/ */
String getTaskNoByPallet(@Param("site") String site, @Param("countNo") String countNo, @Param("palletId") String palletId); 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, int pdaSubmitCount(String site, String countNo, String palletId,
java.util.List<java.util.Map<String, Object>> scannedLabels, String username); 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: {}", log.info("handleCountRfidCallback 开始,site: {}, countNo: {}, palletId: {}, taskNo: {}, resultCode: {}, resultMsg: {}",
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 // 1. 从pallet_detail查询当前栈板的所有标签 - rqrq
List<CountLabelData> palletLabels = baseMapper.getPalletDetailByPalletId(site, palletId); List<CountLabelData> palletLabels = baseMapper.getPalletDetailByPalletId(site, palletId);
log.info("栈板标签数量: {}", palletLabels.size()); 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) { public int pdaQuickSubmitCount(String site, String countNo, String palletId, String username) {
log.info("pdaQuickSubmitCount 开始,site: {}, countNo: {}, palletId: {}", site, countNo, palletId); 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 // 1. 查询栈板的盘点标签明细 - rqrq
List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId); List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId);
if (labelList.isEmpty()) { if (labelList.isEmpty()) {
@ -1686,6 +1702,14 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
log.info("pdaSubmitCount 开始,site: {}, countNo: {}, palletId: {}, 扫描标签数: {}", log.info("pdaSubmitCount 开始,site: {}, countNo: {}, palletId: {}, 扫描标签数: {}",
site, countNo, palletId, scannedLabels != null ? scannedLabels.size() : 0); 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 // 1. 查询栈板的盘点标签明细 - rqrq
List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId); List<CountLabelData> labelList = baseMapper.getCountLabelsByPalletId(site, countNo, palletId);
if (labelList.isEmpty()) { if (labelList.isEmpty()) {
@ -1796,6 +1820,54 @@ public class PhysicalInventoryServiceImpl extends ServiceImpl<PhysicalInventoryM
return labelList.size(); 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 * @Description 盘点完成后处理任务单与RFID接口逻辑一致- rqrq
* *

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

@ -333,9 +333,8 @@
ELSE '未处理' ELSE '未处理'
END AS handleFlagDesc, END AS handleFlagDesc,
CASE r.handle_type CASE r.handle_type
WHEN 'ADJUST' THEN '调整库存'
WHEN 'IGNORE' THEN '忽略差异'
WHEN 'RECOUNT' THEN '重新盘点'
WHEN 'MANUAL' THEN '人工处理'
WHEN 'SYSTEM' THEN '系统处理'
ELSE '' ELSE ''
END AS handleTypeDesc END AS handleTypeDesc
FROM count_result r FROM count_result r
@ -947,4 +946,62 @@
AND (cr.handle_flag IS NULL OR cr.handle_flag = 'N') AND (cr.handle_flag IS NULL OR cr.handle_flag = 'N')
</select> </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> </mapper>
Loading…
Cancel
Save