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<String> {
|
@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<String> 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<OrderDetlPakin> pakinDetails = orderDetlPakinService.selectList(
|
new EntityWrapper<OrderDetlPakin>().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);
|
}
|
}
|
|
}
|