wip(wms): 出库报关流程暂时搁置,注释相关代码恢复原出库交接流程
This commit is contained in:
@@ -16,7 +16,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
|||||||
@MapperScan("com.mhd.wms.domain.**.mapper")
|
@MapperScan("com.mhd.wms.domain.**.mapper")
|
||||||
@EnableMethodCache(basePackages = "com.mhd.platform.domain.**.cache")
|
@EnableMethodCache(basePackages = "com.mhd.platform.domain.**.cache")
|
||||||
@EnableAsync
|
@EnableAsync
|
||||||
@EnableScheduling
|
//@EnableScheduling
|
||||||
@ComponentScan(basePackages = {
|
@ComponentScan(basePackages = {
|
||||||
"com.mhd.wms",
|
"com.mhd.wms",
|
||||||
"com.mhd.system.api.factory"
|
"com.mhd.system.api.factory"
|
||||||
|
|||||||
+9
-8
@@ -270,16 +270,17 @@ public class HandoverTaskOrderApplicationService {
|
|||||||
.eq(HandoverTaskOrder::getOrderNumber, orderNumber)
|
.eq(HandoverTaskOrder::getOrderNumber, orderNumber)
|
||||||
.set(HandoverTaskOrder::getBillingJson, handoverTaskOrderDO.getBillingJson())
|
.set(HandoverTaskOrder::getBillingJson, handoverTaskOrderDO.getBillingJson())
|
||||||
.set(HandoverTaskOrder::getPictureApp, handoverTaskOrderDO.getPictureApp()));
|
.set(HandoverTaskOrder::getPictureApp, handoverTaskOrderDO.getPictureApp()));
|
||||||
// 2. 状态按是否报关:仅通宇(2830)+需报关→已交接(13),否则→已出库(9)
|
// // 2. 状态按是否报关:仅通宇(2830)+需报关→已交接(13),否则→已出库(9)
|
||||||
StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
|
// StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
|
||||||
.eq(StockOutOrder::getOutOrderNumber, orderNumber));
|
// .eq(StockOutOrder::getOutOrderNumber, orderNumber));
|
||||||
boolean needCustoms = soo != null
|
// boolean needCustoms = soo != null
|
||||||
&& Long.valueOf(2830L).equals(soo.getOrganizationId())
|
// && Long.valueOf(2830L).equals(soo.getOrganizationId())
|
||||||
&& "1".equals(soo.getNeedDeclareFlag());
|
// && "1".equals(soo.getNeedDeclareFlag());
|
||||||
int targetStatus = needCustoms ? 13 : 9;
|
// int targetStatus = needCustoms ? 13 : 9;
|
||||||
stockOutOrderService.update(new LambdaUpdateWrapper<StockOutOrder>()
|
stockOutOrderService.update(new LambdaUpdateWrapper<StockOutOrder>()
|
||||||
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
|
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
|
||||||
.set(StockOutOrder::getStatus, targetStatus)
|
// .set(StockOutOrder::getStatus, targetStatus)
|
||||||
|
.set(StockOutOrder::getStatus, 9) // 不注释之后需要删除
|
||||||
.set(StockOutOrder::getBillingJson, handoverTaskOrderDO.getBillingJson())
|
.set(StockOutOrder::getBillingJson, handoverTaskOrderDO.getBillingJson())
|
||||||
.set(StockOutOrder::getPictureApp, handoverTaskOrderDO.getPictureApp()));
|
.set(StockOutOrder::getPictureApp, handoverTaskOrderDO.getPictureApp()));
|
||||||
// 3. 参考PC端完成交接:根据orderNumber查询交接单ID,执行库存扣减+交接状态更新
|
// 3. 参考PC端完成交接:根据orderNumber查询交接单ID,执行库存扣减+交接状态更新
|
||||||
|
|||||||
+218
-214
@@ -99,29 +99,29 @@ public class HandoverTaskOrderDomainService {
|
|||||||
private CopyCodeReferenceDomainService copyCodeReferenceDomainService;
|
private CopyCodeReferenceDomainService copyCodeReferenceDomainService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OmsServiceFeign omsServiceFeign;
|
private OmsServiceFeign omsServiceFeign;
|
||||||
@Autowired
|
// @Autowired
|
||||||
private ICustomsDeclarationDetailService customsDeclarationDetailService;
|
// private ICustomsDeclarationDetailService customsDeclarationDetailService;
|
||||||
|
|
||||||
// 报关回写相关常量
|
// // 报关回写相关常量
|
||||||
private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData";
|
// private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData";
|
||||||
private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD";
|
// private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD";
|
||||||
// 通宇组织ID(只有通宇才启用报关出库流程)
|
// // 通宇组织ID(只有通宇才启用报关出库流程)
|
||||||
private static final Long TONGYU_ORGANIZATION_ID = 2830L;
|
// private static final Long TONGYU_ORGANIZATION_ID = 2830L;
|
||||||
// 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}"))
|
// // 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}"))
|
||||||
// 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库)
|
// // 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库)
|
||||||
private static final String[] CUSTOMS_PASS_STATUS = {"P"};
|
// private static final String[] CUSTOMS_PASS_STATUS = {"P"};
|
||||||
// 退单/失败状态码(记告警用)
|
// // 退单/失败状态码(记告警用)
|
||||||
private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"};
|
// private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"};
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 判断是否需要走报关出库流程(仅通宇 + needDeclareFlag=1)
|
// * 判断是否需要走报关出库流程(仅通宇 + needDeclareFlag=1)
|
||||||
* 其它组织一律走老流程(交接直接出库)
|
// * 其它组织一律走老流程(交接直接出库)
|
||||||
*/
|
// */
|
||||||
private boolean isCustomsDeclareOrder(StockOutOrder stockOutOrder) {
|
// private boolean isCustomsDeclareOrder(StockOutOrder stockOutOrder) {
|
||||||
return stockOutOrder != null
|
// return stockOutOrder != null
|
||||||
&& TONGYU_ORGANIZATION_ID.equals(stockOutOrder.getOrganizationId())
|
// && TONGYU_ORGANIZATION_ID.equals(stockOutOrder.getOrganizationId())
|
||||||
&& "1".equals(stockOutOrder.getNeedDeclareFlag());
|
// && "1".equals(stockOutOrder.getNeedDeclareFlag());
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -331,18 +331,20 @@ public class HandoverTaskOrderDomainService {
|
|||||||
xgkc(handoverTaskOrderIds,loginUser);
|
xgkc(handoverTaskOrderIds,loginUser);
|
||||||
//推送oms(需报关的单子等海关确认放行后再推)
|
//推送oms(需报关的单子等海关确认放行后再推)
|
||||||
for (Long handoverTaskOrderId : handoverTaskOrderIds) {
|
for (Long handoverTaskOrderId : handoverTaskOrderIds) {
|
||||||
HandoverTaskOrder hto = handoverTaskOrderService.getById(handoverTaskOrderId);
|
// HandoverTaskOrder hto = handoverTaskOrderService.getById(handoverTaskOrderId);
|
||||||
if (hto == null) {
|
// if (hto == null) {
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
|
// StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
|
||||||
.eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber()));
|
// .eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber()));
|
||||||
if (isCustomsDeclareOrder(soo)) {
|
// if (isCustomsDeclareOrder(soo)) {
|
||||||
continue; // 需报关(仅通宇),跳过
|
// continue; // 需报关(仅通宇),跳过
|
||||||
}
|
// }
|
||||||
if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) {
|
// if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) {
|
||||||
pushOms(handoverTaskOrderId);
|
// pushOms(handoverTaskOrderId);
|
||||||
}
|
// }
|
||||||
|
// 推送 oms ,当上面不注释时,需要将这个删除
|
||||||
|
pushOms(handoverTaskOrderId);
|
||||||
}
|
}
|
||||||
HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getById(handoverTaskOrderIds.get(0));
|
HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getById(handoverTaskOrderIds.get(0));
|
||||||
stockOutOrderService.update(null,new UpdateWrapper<StockOutOrder>().lambda().set(StockOutOrder::getBillingJson,handoverTaskOrderDO.getBillingJson()).eq(StockOutOrder::getOutOrderNumber,handoverTaskOrder.getOrderNumber()));
|
stockOutOrderService.update(null,new UpdateWrapper<StockOutOrder>().lambda().set(StockOutOrder::getBillingJson,handoverTaskOrderDO.getBillingJson()).eq(StockOutOrder::getOutOrderNumber,handoverTaskOrder.getOrderNumber()));
|
||||||
@@ -386,13 +388,15 @@ public class HandoverTaskOrderDomainService {
|
|||||||
if (stockOutOrder == null) {
|
if (stockOutOrder == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 需要报关(仅通宇+needDeclareFlag=1):交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理
|
// // 需要报关(仅通宇+needDeclareFlag=1):交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理
|
||||||
if (isCustomsDeclareOrder(stockOutOrder)) {
|
// if (isCustomsDeclareOrder(stockOutOrder)) {
|
||||||
stockOutOrder.setStatus(13);
|
// stockOutOrder.setStatus(13);
|
||||||
stockOutOrderMapper.updateById(stockOutOrder);
|
// stockOutOrderMapper.updateById(stockOutOrder);
|
||||||
continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认)
|
// continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认)
|
||||||
}
|
// }
|
||||||
// 不需要报关:维持原逻辑,状态改「已出库(9)」+ 扣库存
|
// // 不需要报关:维持原逻辑,状态改「已出库(9)」+ 扣库存
|
||||||
|
|
||||||
|
//完成交接状态改为已出库
|
||||||
stockOutOrder.setStatus(9);
|
stockOutOrder.setStatus(9);
|
||||||
stockOutOrderMapper.updateById(stockOutOrder);
|
stockOutOrderMapper.updateById(stockOutOrder);
|
||||||
doStockOutDeduct(orderNumber, stockOutOrder, loginUser);
|
doStockOutDeduct(orderNumber, stockOutOrder, loginUser);
|
||||||
@@ -470,184 +474,184 @@ public class HandoverTaskOrderDomainService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 定时任务入口:每小时整点扫描「已交接(13)」状态的需报关出库单,调 sendDec 查报关结果,
|
// * 定时任务入口:每小时整点扫描「已交接(13)」状态的需报关出库单,调 sendDec 查报关结果,
|
||||||
* 放行/结关的 → 状态 13→9 + 扣库存 + 推OMS;未放行 → 跳过下次再查。
|
// * 放行/结关的 → 状态 13→9 + 扣库存 + 推OMS;未放行 → 跳过下次再查。
|
||||||
* 由 @Scheduled 触发,无需在 sys_job 表配置。
|
// * 由 @Scheduled 触发,无需在 sys_job 表配置。
|
||||||
*/
|
// */
|
||||||
@Scheduled(cron = "0 0 * * * ?")
|
// @Scheduled(cron = "0 0 * * * ?")
|
||||||
public void scheduledCustomsConfirm() {
|
// public void scheduledCustomsConfirm() {
|
||||||
log.info("【报关确认出库】定时任务开始执行");
|
// log.info("【报关确认出库】定时任务开始执行");
|
||||||
try {
|
// try {
|
||||||
AjaxResult result = customsConfirmOut(null);
|
// AjaxResult result = customsConfirmOut(null);
|
||||||
log.info("【报关确认出库】定时任务执行完成 result={}", result);
|
// log.info("【报关确认出库】定时任务执行完成 result={}", result);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
log.error("【报关确认出库】定时任务执行异常", e);
|
// log.error("【报关确认出库】定时任务执行异常", e);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 海关确认出库(轮询/手动入口)
|
// * 海关确认出库(轮询/手动入口)
|
||||||
* 对 status=13(已交接)的需报关出库单,调 sendDec 查报关状态:
|
// * 对 status=13(已交接)的需报关出库单,调 sendDec 查报关状态:
|
||||||
* ✅ 放行/结关 → 状态 13→9 + 扣库存 + 推OMS
|
// * ✅ 放行/结关 → 状态 13→9 + 扣库存 + 推OMS
|
||||||
* ❌ 退单 → 保持13,记告警
|
// * ❌ 退单 → 保持13,记告警
|
||||||
* ⏳ 进行中 → 跳过,下次再查
|
// * ⏳ 进行中 → 跳过,下次再查
|
||||||
* @param outOrderNumbers 传空则扫全部 status=13;传值则按指定单号处理
|
// * @param outOrderNumbers 传空则扫全部 status=13;传值则按指定单号处理
|
||||||
*/
|
// */
|
||||||
@Transactional(rollbackFor = Exception.class)
|
// @Transactional(rollbackFor = Exception.class)
|
||||||
public AjaxResult customsConfirmOut(List<String> outOrderNumbers) {
|
// public AjaxResult customsConfirmOut(List<String> outOrderNumbers) {
|
||||||
// 1. 确定处理范围(只处理通宇、status=13 且需要报关的出库单)
|
// // 1. 确定处理范围(只处理通宇、status=13 且需要报关的出库单)
|
||||||
LambdaQueryWrapper<StockOutOrder> qw = new LambdaQueryWrapper<StockOutOrder>()
|
// LambdaQueryWrapper<StockOutOrder> qw = new LambdaQueryWrapper<StockOutOrder>()
|
||||||
.eq(StockOutOrder::getOrganizationId, TONGYU_ORGANIZATION_ID)
|
// .eq(StockOutOrder::getOrganizationId, TONGYU_ORGANIZATION_ID)
|
||||||
.eq(StockOutOrder::getStatus, 13)
|
// .eq(StockOutOrder::getStatus, 13)
|
||||||
.eq(StockOutOrder::getNeedDeclareFlag, "1");
|
// .eq(StockOutOrder::getNeedDeclareFlag, "1");
|
||||||
if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) {
|
// if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) {
|
||||||
qw.in(StockOutOrder::getOutOrderNumber, outOrderNumbers);
|
// qw.in(StockOutOrder::getOutOrderNumber, outOrderNumbers);
|
||||||
}
|
// }
|
||||||
List<StockOutOrder> list = stockOutOrderService.list(qw);
|
// List<StockOutOrder> list = stockOutOrderService.list(qw);
|
||||||
|
//
|
||||||
|
// int pass = 0, pending = 0, fail = 0;
|
||||||
|
// LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||||
|
//
|
||||||
|
// for (StockOutOrder soo : list) {
|
||||||
|
// try {
|
||||||
|
// // 2. 调 sendDec 查报关状态
|
||||||
|
// JSONArray decData = queryCustomsDeclaration(
|
||||||
|
// soo.getOutOrderNumber(),
|
||||||
|
// soo.getOrganizationId(),
|
||||||
|
// soo.getOrganizationName());
|
||||||
|
// if (decData == null || decData.isEmpty()) {
|
||||||
|
// pending++; // ERP 里还没报关单,下次再查
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 3. 判断状态(遍历全部明细,任一命中放行即整单放行)
|
||||||
|
// String decStatus = null;
|
||||||
|
// boolean passed = false, failed = false;
|
||||||
|
// for (int i = 0; i < decData.size(); i++) {
|
||||||
|
// JSONObject item = decData.getJSONObject(i);
|
||||||
|
// decStatus = item.getString("dec_status");
|
||||||
|
// if (isInList(decStatus, CUSTOMS_PASS_STATUS)) {
|
||||||
|
// passed = true;
|
||||||
|
// // 报关单号写入 customs_declaration_detail(补全出库单关联)
|
||||||
|
// saveCustomsDetail(soo, item);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// if (isInList(decStatus, CUSTOMS_FAIL_STATUS)) {
|
||||||
|
// failed = true;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (passed) {
|
||||||
|
// // ✅ 放行:状态 13→9 + 扣库存 + 推 OMS
|
||||||
|
// soo.setStatus(9);
|
||||||
|
// stockOutOrderMapper.updateById(soo);
|
||||||
|
// doStockOutDeduct(soo.getOutOrderNumber(), soo, loginUser);
|
||||||
|
// pushOmsByOrderNumber(soo.getOutOrderNumber());
|
||||||
|
// pass++;
|
||||||
|
// } else if (failed) {
|
||||||
|
// // ❌ 退单:保持13,记告警日志(暂留人工处理)
|
||||||
|
// log.warn("报关退单,请人工处理 outOrderNumber={} decStatus={}",
|
||||||
|
// soo.getOutOrderNumber(), decStatus);
|
||||||
|
// fail++;
|
||||||
|
// } else {
|
||||||
|
// pending++; // 进行中
|
||||||
|
// }
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log.error("海关确认出库异常 outOrderNumber={}", soo.getOutOrderNumber(), e);
|
||||||
|
// fail++;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// Map<String, Object> r = new HashMap<>();
|
||||||
|
// r.put("pass", pass);
|
||||||
|
// r.put("pending", pending);
|
||||||
|
// r.put("fail", fail);
|
||||||
|
// return AjaxResult.success(r);
|
||||||
|
// }
|
||||||
|
|
||||||
int pass = 0, pending = 0, fail = 0;
|
// /**
|
||||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
// * sendDec 查询报关回写(参考 PickingOrderApplicationService.java:771-818 模板)
|
||||||
|
// * 关键改造:① erpBillNo 传出库单号 ② 返回整个 data 数组(不只第0条) ③ 不在这里处理 dec_status
|
||||||
|
// */
|
||||||
|
// private JSONArray queryCustomsDeclaration(String erpBillNo, Long organizationId, String organizationName) throws Exception {
|
||||||
|
// Map<String, Object> param = new HashMap<>();
|
||||||
|
// param.put("beginDate", "2020-01-01");
|
||||||
|
// param.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
|
||||||
|
// param.put("erpBillNo", erpBillNo);
|
||||||
|
// param.put("pageIndex", 1);
|
||||||
|
// param.put("pageSize", 100);
|
||||||
|
// List<Map<String, Object>> body = new ArrayList<>();
|
||||||
|
// body.add(param);
|
||||||
|
//
|
||||||
|
// // 多租户 URL(保证查的地址和推 save_order_e 的地址一致)
|
||||||
|
// String ncUrl = pickingMaterialDetailMapper.getNcUrl("gw", organizationName, organizationId);
|
||||||
|
// String url = (ncUrl != null) ? ncUrl : CUSTOMS_PUSH_API_URL;
|
||||||
|
//
|
||||||
|
// HttpPost post = new HttpPost(url);
|
||||||
|
// post.setEntity(new StringEntity(JSONObject.toJSONString(body), "UTF-8"));
|
||||||
|
// post.setHeader("Content-type", "application/json");
|
||||||
|
// post.setHeader("apiName", "sendDec");
|
||||||
|
// post.setHeader("verify", CUSTOMS_VERIFY);
|
||||||
|
// log.info("sendDec 请求 erpBillNo={} url={} body={}", erpBillNo, url,body);
|
||||||
|
//
|
||||||
|
// try (CloseableHttpClient client = HttpClients.createDefault();
|
||||||
|
// CloseableHttpResponse resp = client.execute(post)) {
|
||||||
|
// String respStr = EntityUtils.toString(resp.getEntity());
|
||||||
|
// log.info("sendDec 响应 erpBillNo={} resp={}", erpBillNo, respStr);
|
||||||
|
// if (resp.getStatusLine().getStatusCode() == 200) {
|
||||||
|
// JSONObject json = JSONObject.parseObject(respStr);
|
||||||
|
// Integer code = json.getInteger("code");
|
||||||
|
// if (code != null && code == 200) {
|
||||||
|
// return json.getJSONArray("data");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
for (StockOutOrder soo : list) {
|
// private boolean isInList(String v, String[] arr) {
|
||||||
try {
|
// if (v == null) return false;
|
||||||
// 2. 调 sendDec 查报关状态
|
// for (String s : arr) {
|
||||||
JSONArray decData = queryCustomsDeclaration(
|
// if (s.equalsIgnoreCase(v)) return true;
|
||||||
soo.getOutOrderNumber(),
|
// }
|
||||||
soo.getOrganizationId(),
|
// return false;
|
||||||
soo.getOrganizationName());
|
// }
|
||||||
if (decData == null || decData.isEmpty()) {
|
|
||||||
pending++; // ERP 里还没报关单,下次再查
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 判断状态(遍历全部明细,任一命中放行即整单放行)
|
// /**
|
||||||
String decStatus = null;
|
// * 报关明细写入 customs_declaration_detail
|
||||||
boolean passed = false, failed = false;
|
// * (补 set outOrderNumber/outOrderId,原 PickingOrder 代码这两字段漏 set 了)
|
||||||
for (int i = 0; i < decData.size(); i++) {
|
// */
|
||||||
JSONObject item = decData.getJSONObject(i);
|
// private void saveCustomsDetail(StockOutOrder soo, JSONObject item) {
|
||||||
decStatus = item.getString("dec_status");
|
// try {
|
||||||
if (isInList(decStatus, CUSTOMS_PASS_STATUS)) {
|
// CustomsDeclarationDetailDO d = new CustomsDeclarationDetailDO();
|
||||||
passed = true;
|
// d.setDocumentNumber(soo.getOutOrderNumber());
|
||||||
// 报关单号写入 customs_declaration_detail(补全出库单关联)
|
// d.setBondInvtNo(item.getString("entry_id"));
|
||||||
saveCustomsDetail(soo, item);
|
// Object erpGNo = item.get("erp_g_no");
|
||||||
break;
|
// if (erpGNo != null) {
|
||||||
}
|
// d.setInvtRow(erpGNo instanceof Number
|
||||||
if (isInList(decStatus, CUSTOMS_FAIL_STATUS)) {
|
// ? ((Number) erpGNo).intValue()
|
||||||
failed = true;
|
// : Integer.parseInt(erpGNo.toString()));
|
||||||
}
|
// }
|
||||||
}
|
// d.setOutOrderNumber(soo.getOutOrderNumber());
|
||||||
|
// d.setOutOrderId(soo.getOutOrderId());
|
||||||
|
// d.setOrganizationId(soo.getOrganizationId());
|
||||||
|
// d.setOrganizationName(soo.getOrganizationName());
|
||||||
|
// d.setTopOrganizationId(soo.getTopOrganizationId());
|
||||||
|
// customsDeclarationDetailService.insert(d);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log.error("写报关明细失败 outOrderNumber={}", soo.getOutOrderNumber(), e);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
if (passed) {
|
// /** 按 orderNumber 推 OMS(pushOms 入参是 handoverTaskOrderId,这里包一层) */
|
||||||
// ✅ 放行:状态 13→9 + 扣库存 + 推 OMS
|
// private void pushOmsByOrderNumber(String orderNumber) {
|
||||||
soo.setStatus(9);
|
// List<HandoverTaskOrder> htoList = handoverTaskOrderService.list(
|
||||||
stockOutOrderMapper.updateById(soo);
|
// new LambdaQueryWrapper<HandoverTaskOrder>()
|
||||||
doStockOutDeduct(soo.getOutOrderNumber(), soo, loginUser);
|
// .eq(HandoverTaskOrder::getOrderNumber, orderNumber));
|
||||||
pushOmsByOrderNumber(soo.getOutOrderNumber());
|
// for (HandoverTaskOrder hto : htoList) {
|
||||||
pass++;
|
// pushOms(hto.getHandoverTaskOrderId());
|
||||||
} else if (failed) {
|
// }
|
||||||
// ❌ 退单:保持13,记告警日志(暂留人工处理)
|
// }
|
||||||
log.warn("报关退单,请人工处理 outOrderNumber={} decStatus={}",
|
|
||||||
soo.getOutOrderNumber(), decStatus);
|
|
||||||
fail++;
|
|
||||||
} else {
|
|
||||||
pending++; // 进行中
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("海关确认出库异常 outOrderNumber={}", soo.getOutOrderNumber(), e);
|
|
||||||
fail++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Map<String, Object> r = new HashMap<>();
|
|
||||||
r.put("pass", pass);
|
|
||||||
r.put("pending", pending);
|
|
||||||
r.put("fail", fail);
|
|
||||||
return AjaxResult.success(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sendDec 查询报关回写(参考 PickingOrderApplicationService.java:771-818 模板)
|
|
||||||
* 关键改造:① erpBillNo 传出库单号 ② 返回整个 data 数组(不只第0条) ③ 不在这里处理 dec_status
|
|
||||||
*/
|
|
||||||
private JSONArray queryCustomsDeclaration(String erpBillNo, Long organizationId, String organizationName) throws Exception {
|
|
||||||
Map<String, Object> param = new HashMap<>();
|
|
||||||
param.put("beginDate", "2020-01-01");
|
|
||||||
param.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
|
|
||||||
param.put("erpBillNo", erpBillNo);
|
|
||||||
param.put("pageIndex", 1);
|
|
||||||
param.put("pageSize", 100);
|
|
||||||
List<Map<String, Object>> body = new ArrayList<>();
|
|
||||||
body.add(param);
|
|
||||||
|
|
||||||
// 多租户 URL(保证查的地址和推 save_order_e 的地址一致)
|
|
||||||
String ncUrl = pickingMaterialDetailMapper.getNcUrl("gw", organizationName, organizationId);
|
|
||||||
String url = (ncUrl != null) ? ncUrl : CUSTOMS_PUSH_API_URL;
|
|
||||||
|
|
||||||
HttpPost post = new HttpPost(url);
|
|
||||||
post.setEntity(new StringEntity(JSONObject.toJSONString(body), "UTF-8"));
|
|
||||||
post.setHeader("Content-type", "application/json");
|
|
||||||
post.setHeader("apiName", "sendDec");
|
|
||||||
post.setHeader("verify", CUSTOMS_VERIFY);
|
|
||||||
log.info("sendDec 请求 erpBillNo={} url={} body={}", erpBillNo, url,body);
|
|
||||||
|
|
||||||
try (CloseableHttpClient client = HttpClients.createDefault();
|
|
||||||
CloseableHttpResponse resp = client.execute(post)) {
|
|
||||||
String respStr = EntityUtils.toString(resp.getEntity());
|
|
||||||
log.info("sendDec 响应 erpBillNo={} resp={}", erpBillNo, respStr);
|
|
||||||
if (resp.getStatusLine().getStatusCode() == 200) {
|
|
||||||
JSONObject json = JSONObject.parseObject(respStr);
|
|
||||||
Integer code = json.getInteger("code");
|
|
||||||
if (code != null && code == 200) {
|
|
||||||
return json.getJSONArray("data");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isInList(String v, String[] arr) {
|
|
||||||
if (v == null) return false;
|
|
||||||
for (String s : arr) {
|
|
||||||
if (s.equalsIgnoreCase(v)) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 报关明细写入 customs_declaration_detail
|
|
||||||
* (补 set outOrderNumber/outOrderId,原 PickingOrder 代码这两字段漏 set 了)
|
|
||||||
*/
|
|
||||||
private void saveCustomsDetail(StockOutOrder soo, JSONObject item) {
|
|
||||||
try {
|
|
||||||
CustomsDeclarationDetailDO d = new CustomsDeclarationDetailDO();
|
|
||||||
d.setDocumentNumber(soo.getOutOrderNumber());
|
|
||||||
d.setBondInvtNo(item.getString("entry_id"));
|
|
||||||
Object erpGNo = item.get("erp_g_no");
|
|
||||||
if (erpGNo != null) {
|
|
||||||
d.setInvtRow(erpGNo instanceof Number
|
|
||||||
? ((Number) erpGNo).intValue()
|
|
||||||
: Integer.parseInt(erpGNo.toString()));
|
|
||||||
}
|
|
||||||
d.setOutOrderNumber(soo.getOutOrderNumber());
|
|
||||||
d.setOutOrderId(soo.getOutOrderId());
|
|
||||||
d.setOrganizationId(soo.getOrganizationId());
|
|
||||||
d.setOrganizationName(soo.getOrganizationName());
|
|
||||||
d.setTopOrganizationId(soo.getTopOrganizationId());
|
|
||||||
customsDeclarationDetailService.insert(d);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("写报关明细失败 outOrderNumber={}", soo.getOutOrderNumber(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 按 orderNumber 推 OMS(pushOms 入参是 handoverTaskOrderId,这里包一层) */
|
|
||||||
private void pushOmsByOrderNumber(String orderNumber) {
|
|
||||||
List<HandoverTaskOrder> htoList = handoverTaskOrderService.list(
|
|
||||||
new LambdaQueryWrapper<HandoverTaskOrder>()
|
|
||||||
.eq(HandoverTaskOrder::getOrderNumber, orderNumber));
|
|
||||||
for (HandoverTaskOrder hto : htoList) {
|
|
||||||
pushOms(hto.getHandoverTaskOrderId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OMSInventorySynchronization(OutMaterialDetail outMaterialDetail,BigDecimal checkQuantity) {
|
private void OMSInventorySynchronization(OutMaterialDetail outMaterialDetail,BigDecimal checkQuantity) {
|
||||||
outMaterialDetail.getLotNo();
|
outMaterialDetail.getLotNo();
|
||||||
|
|||||||
+8
-8
@@ -69,8 +69,8 @@ public class StockOutOrderApi extends BaseController {
|
|||||||
private IStockOutOrderService stockOutOrderService;
|
private IStockOutOrderService stockOutOrderService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ExcelParseService excelParseService;
|
private ExcelParseService excelParseService;
|
||||||
@Autowired
|
// @Autowired
|
||||||
private HandoverTaskOrderDomainService handoverTaskOrderDomainService;
|
// private HandoverTaskOrderDomainService handoverTaskOrderDomainService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提货单大标题:未选时为「提货单」;可传副标题如「谷丰--营销部」,或与弹窗一致传整段「提货单--谷丰--营销部」(后者原样作标题,并将 -- 规范为 ——)。
|
* 提货单大标题:未选时为「提货单」;可传副标题如「谷丰--营销部」,或与弹窗一致传整段「提货单--谷丰--营销部」(后者原样作标题,并将 -- 规范为 ——)。
|
||||||
@@ -109,12 +109,12 @@ public class StockOutOrderApi extends BaseController {
|
|||||||
List<StockOutOrderPO> list = stockOutOrderApplicationService.queryList(stockOutOrderDO);
|
List<StockOutOrderPO> list = stockOutOrderApplicationService.queryList(stockOutOrderDO);
|
||||||
return getDataTable(list);
|
return getDataTable(list);
|
||||||
}
|
}
|
||||||
|
//
|
||||||
@ApiOperation("海关确认出库(人工批量触发,参数为空则扫全部已交接状态)")
|
// @ApiOperation("海关确认出库(人工批量触发,参数为空则扫全部已交接状态)")
|
||||||
@PostMapping("/customsConfirmOut")
|
// @PostMapping("/customsConfirmOut")
|
||||||
public AjaxResult customsConfirmOut(@RequestBody(required = false) List<String> outOrderNumbers) {
|
// public AjaxResult customsConfirmOut(@RequestBody(required = false) List<String> outOrderNumbers) {
|
||||||
return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers);
|
// return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers);
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PDA出库签名列表查询
|
* PDA出库签名列表查询
|
||||||
|
|||||||
Reference in New Issue
Block a user