Browse Source

分拣优化

master
常熟吴彦祖 6 days ago
parent
commit
dabbc91c97
  1. 2
      src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/HaiAnWcsApiService.java
  2. 45
      src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java
  3. 22
      src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java

2
src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/HaiAnWcsApiService.java

@ -121,7 +121,7 @@ public interface HaiAnWcsApiService {
/**
* @author rqrq
* @Description 查询出库看板(POST /api/wms/outbound/full-out-tasks/query):立库中有出库任务的栈板。site/warehouseCode 空白时默认 54/WH001,palletId 未填时下发空串。失败回写接口调用日志,系统错误日志暂不记,然后抛异常。 - rqrq
* @Description 查询出库看板(POST /api/wms/outbound/full-out-tasks/query):立库中有出库任务的栈板。site/warehouseCode 空白时默认 54/WH001,palletId 未填时下发空串。接口调用日志和系统错误日志先不记,resCode 非 200 仍抛异常。 - rqrq
* @param inData 查询条件,允许 null;有值时 site 必须来自调用方,本方法不读登录态 - rqrq
* @return 立库成功结果,rows 至少为空列表;resCode 非 200 不会返回 - rqrq
*/

45
src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java

@ -964,7 +964,7 @@ public class HaiAnWcsApiServiceImpl implements HaiAnWcsApiService {
/**
* @author rqrq
* @Description 查询出库看板:补齐 site/warehouseCode 默认值,palletId 空白改成空串后整包下发。resCode 非 200 回写接口调用日志后抛异常,系统错误日志暂不记。本方法不改托盘和任务。 - rqrq
* @Description 查询出库看板:补齐 site/warehouseCode 默认值,palletId 空白改成空串后整包下发。resCode 非 200 直接抛异常。接口调用日志和系统错误日志先不记,避免每 5 秒刷接口日志页。本方法不改托盘和任务。 - rqrq
* @param inData 看板查询条件,null 时按默认 54/WH001/空栈板查询全部 - rqrq
* @return 立库出库任务栈板清单,rows 不为 null - rqrq
*/
@ -982,25 +982,26 @@ public class HaiAnWcsApiServiceImpl implements HaiAnWcsApiService {
body.setWarehouseCode(warehouseCode);
body.setPalletId(palletId);
String wcsPath = HaiAnFullOutTaskStaticData.WCS_PATH;
Long logId = null;
// 保留已收到的响应原文供失败回填;未获得响应时保持 null,避免伪造立库回执 - rqrq
// 出库看板先不落接口调用日志,logId 停用 - rqrq
// Long logId = null;
// 保留已收到的响应原文;当前不再回填接口日志 - rqrq
String ifsResponse = null;
String url = haianWcsUrl + wcsPath;
String requestJson = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
// 用补齐后的报文写日志和下发,保证日志里的 palletId 也是空串而不是缺字段 - rqrq
// 用补齐后的报文下发,保证 palletId 是空串而不是缺字段;当前不写接口日志 - rqrq
requestJson = objectMapper.writeValueAsString(body);
// 先写海安接口调用日志;空栈板时用仓库编码当业务键,避免看板全量查询在日志里没有定位字段 - rqrq
logId = haiAnInterfaceCallLogService.haiAnLogInterfaceCall(
"QueryFullOutTasks",
"查询出库看板",
requestJson,
site,
StringUtils.hasText(palletId) ? palletId : warehouseCode,
"查询出库看板"
);
// 调用统一出口:开关关闭返回空 rows,看板展示空列表;真实失败由 catch 记日志并抛错 - rqrq
// 出库看板查询先不写接口调用日志,避免 interfaceCallLog54 被 5 秒轮询刷满 - rqrq
// logId = haiAnInterfaceCallLogService.haiAnLogInterfaceCall(
// "QueryFullOutTasks",
// "查询出库看板",
// requestJson,
// site,
// StringUtils.hasText(palletId) ? palletId : warehouseCode,
// "查询出库看板"
// );
// 调用统一出口:开关关闭返回空 rows,看板展示空列表;真实失败仍抛错,不记接口日志 - rqrq
ifsResponse = postToWcs(url, requestJson, HaiAnWcsShortCircuitStaticData.fullOutTasksJson());
HaiAnFullOutTaskQueryResult result = objectMapper.readValue(ifsResponse, HaiAnFullOutTaskQueryResult.class);
if (result == null || result.getResCode() == null || result.getResCode().intValue() != 200) {
@ -1015,16 +1016,16 @@ public class HaiAnWcsApiServiceImpl implements HaiAnWcsApiService {
if (result.getTotal() == null) {
result.setTotal(result.getRows().size());
}
if (logId != null) {
// 回写成功日志,responseData 存完整响应(含短路空清单)便于核对查询条件 - rqrq
markWcsCallSuccess(logId, ifsResponse, result.getResMsg());
}
// if (logId != null) {
// // 回写成功日志,responseData 存完整响应(含短路空清单)便于核对查询条件 - rqrq
// markWcsCallSuccess(logId, ifsResponse, result.getResMsg());
// }
return result;
} catch (Exception e) {
if (logId != null) {
// 失败只回写接口调用日志,保留立库原文和错误原因;系统错误日志先停用,异常仍抛给调用方 - rqrq
haiAnInterfaceCallLogService.haiAnUpdateCallResult(logId, ifsResponse, "FAILED", e.getMessage(), null);
}
// if (logId != null) {
// // 失败只回写接口调用日志,保留立库原文和错误原因;系统错误日志先停用,异常仍抛给调用方 - rqrq
// haiAnInterfaceCallLogService.haiAnUpdateCallResult(logId, ifsResponse, "FAILED", e.getMessage(), null);
// }
// 出库看板失败暂不记系统错误日志 - rqrq
// haiAnSysErrorLogService.haiAnLogInterface(
// site,

22
src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java

@ -1958,13 +1958,14 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe
}
/**
* 人工分拣工作盘按数据库位置映射被分拣位并查询源盘码;有增量时分别提示缺盘和多盘占位并阻断WCS下发,无增量时返回空串。- rqrq
* 人工分拣工作盘按数据库位置映射被分拣位并查询源盘码。提交分拣有增量时缺盘、多盘都阻断;结束分拣缺盘传空串,多盘仍阻断。- rqrq
* @param site 海安工厂,用于托盘查询隔离 - rqrq
* @param workStation 当前工作盘在数据库中的人工分拣位 - rqrq
* @param hasIncrement 本次是否存在wcs_flag=1的标签增量 - rqrq
* @return 唯一被分拣托盘码,允许无增量时返回空串 - rqrq
* @param allowMissingSource 结束分拣为true:没有被分拣盘时源盘编码传空,不报未找到被分拣托盘 - rqrq
* @return 唯一被分拣托盘码;允许缺盘时返回空串 - rqrq
*/
private String resolveManualSortingOriBarcode(String site, String workStation, boolean hasIncrement) {
private String resolveManualSortingOriBarcode(String site, String workStation, boolean hasIncrement, boolean allowMissingSource) {
// 按海安静态配对将当前人工分拣工作位映射为被分拣位;映射缺失直接失败,避免查错盘。- rqrq
String sourceStation = HaiAnStationStaticData.requireSortingSourceStation(workStation);
// 在同一分拣事务中按site+被分拣位查询有效托盘,最多取两条用于识别重复占位;查询失败不得继续下发。- rqrq
@ -1973,11 +1974,14 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe
return sourcePalletIds.get(0).trim();
}
if (hasIncrement) {
// 同一被分拣位查到多个有效托盘属于位置数据错误,单独提示并阻断本次增量下发;零盘仍沿用缺盘提示。- rqrq
// 同一被分拣位多个有效托盘属于位置数据错误,有增量时不能挑一块下发。- rqrq
if (sourcePalletIds != null && sourcePalletIds.size() > 1) {
throw new RuntimeException("数据错误,被分拣位同时有多个托盘存在!请联系管理员");
}
throw new RuntimeException("未找到被分拣托盘,请联系系统管理员");
if (!allowMissingSource) {
// 提交分拣带着增量却没有源盘时必须拦住;结束分拣允许源盘传空。- rqrq
throw new RuntimeException("未找到被分拣托盘,请联系系统管理员");
}
}
return "";
}
@ -2141,7 +2145,7 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe
String oriBarcode = "";
if (manualSortPallet) {
// 工作盘无论有无增量均查对应被分拣托盘;有增量查不到时立即报错,无增量允许空值并沿用跳过提交。- rqrq
oriBarcode = resolveManualSortingOriBarcode(site, palletInfo.getLocationCode(), pendingCount != null && pendingCount > 0);
oriBarcode = resolveManualSortingOriBarcode(site, palletInfo.getLocationCode(), pendingCount != null && pendingCount > 0, false);
}
// 手工分拣工作盘无增量直接跳过;被分拣源盘无增量也要发空组盘,通知立库托盘可以回库 - rqrq
if (!sortedSourcePallet && (pendingCount == null || pendingCount == 0)) {
@ -2975,7 +2979,7 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe
/**
* @author rqrq
* @Description 工作盘结束分拣:type=3、endFlag=Y,有无增量均下发并查询被分拣托盘;有增量时oriBarcode必填且同步回写立库取出。人工分拣位当前盘置calling_flag=Y,WCS成功后将普通明细置1供下次回库全量下发;失败回滚,不写WOT/WTT。- rqrq
* @Description 工作盘结束分拣:type=3、endFlag=Y,有无增量均下发。被分拣位有唯一托盘就写入oriBarcode,没有则传空,不报未找到被分拣托盘。人工分拣位当前盘置calling_flag=Y,WCS成功后将普通明细置1供下次回库全量下发;失败回滚,不写WOT/WTT。- rqrq
*/
@Override
@Transactional(rollbackFor = Exception.class)
@ -3026,8 +3030,8 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe
}
String oriBarcode = "";
if (manualSortPallet) {
// 结束分拣即使发送空包也查询对应被分拣托盘;只有存在增量标签时才强制要求唯一源盘码。- rqrq
oriBarcode = resolveManualSortingOriBarcode(site, palletInfo.getLocationCode(), !detailRows.isEmpty());
// 结束分拣仍查配对被分拣位:有唯一托盘就带编码,没有托盘时源盘传空,增量也不再报未找到被分拣托盘。- rqrq
oriBarcode = resolveManualSortingOriBarcode(site, palletInfo.getLocationCode(), !detailRows.isEmpty(), true);
}
request.setSite(site);
request.setPalletId(palletId);

Loading…
Cancel
Save