package com.zy.asrs.task.kingdee.handler; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.toolkit.CollectionUtils; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.OrderDetlPakin; import com.zy.asrs.entity.OrderPakin; import com.zy.asrs.service.*; import com.zy.asrs.service.impl.ErpSecretServiceImpl; import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl; import com.zy.asrs.service.impl.OrderDetlServiceImpl; import com.zy.asrs.service.impl.OrderPakinServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @Slf4j @Service public class AutoTransferOutHandler extends AbstractHandler { @Autowired private OrderService orderService; @Autowired private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; @Autowired private LoginAuthenticationHandler loginAuthenticationHandler; @Autowired private ErpSecretServiceImpl erpSecretService; @Autowired private LocDetlService locDetlService; @Autowired private MatService matService; @Autowired private OrderDetlPakinServiceImpl orderDetlPakinService; @Autowired private OrderDetlServiceImpl orderDetlService; @Autowired private OrderPakinServiceImpl orderPakinServiceImpl; @Autowired private OrderPakinServiceImpl orderPakinService; @Transactional(rollbackFor = Exception.class) public ReturnT start(OrderPakin orderPakin) { JSONObject logData = new JSONObject(); String responseMsg = ""; boolean apiSuccess = false; Order orderNew = null; try { logData.put("orderNo", orderPakin.getOrderNo()); logData.put("operation", "生成出库单"); logData.put("source", "入库单转出库单"); logData.put("startTime", System.currentTimeMillis()); orderNew = new Order(orderPakin); orderNew.setDocType(23L); orderNew.setOrderNo(orderPakin.getOrderNo() + "ZHCK"); orderNew.setSettle(65L); // 插入出库主单 orderService.insert(orderNew); List pakinDetails = orderDetlPakinService.selectList( new EntityWrapper().eq("order_no", orderPakin.getOrderNo()) ); boolean hasInsertFailed = false; if (CollectionUtils.isNotEmpty(pakinDetails)) { for (OrderDetlPakin pd : pakinDetails) { OrderDetl od = new OrderDetl(pd); od.setOrderId(orderNew.getId()); boolean insertSuccess = orderDetlService.insert(od); if (!insertSuccess) { hasInsertFailed = true; log.warn("出库明细插入失败:出库单号={}, 物料={}", orderNew.getOrderNo(), pd.getMatnr()); } } } // 根据明细插入结果更新状态 if (!hasInsertFailed) { orderNew.setSettle(4L); // 出库单成功状态 orderPakin.setSettle(4L); // 原入库单更新状态(视业务是否需要) orderService.updateById(orderNew); orderPakinService.updateById(orderPakin); // 注意:这里用了 orderPakinService apiSuccess = true; responseMsg = String.format("成功生成出库单:%s,共 %d 条明细", orderNew.getOrderNo(), pakinDetails.size()); log.info(responseMsg); } else { responseMsg = "部分出库明细插入失败,订单号:" + orderNew.getOrderNo(); log.error(responseMsg); throw new RuntimeException("部分明细插入失败,触发事务回滚"); } } catch (Exception e) { apiSuccess = false; responseMsg = "生成出库单失败:" + e.getMessage(); log.error("生成出库单失败,入库单号:{},原因:{}", orderPakin.getOrderNo(), e.getMessage(), e); // 如果你希望失败时不回滚,可以注释掉下面这行 throw e; // ← 保持事务回滚(推荐) } finally { // 无论成功失败,都记录日志 logData.put("endTime", System.currentTimeMillis()); logData.put("durationMs", logData.getLongValue("endTime") - logData.getLongValue("startTime")); logData.put("success", apiSuccess); logData.put("message", responseMsg); logData.put("outOrderNo", orderNew != null ? orderNew.getOrderNo() : "未生成"); saveApiLog(logData, responseMsg, apiSuccess); } return apiSuccess ? SUCCESS : FAIL; } private void saveApiLog(JSONObject add, String response, boolean success) { try { apiLogService.save( "货主转换出库上报", "AutoTransferHandler", null, "127.0.0.1", add.toJSONString(), response, success ); } catch (Exception e) { log.error("接口日志保存失败", e); } } }