自动化立体仓库 - WMS系统
lty
17 小时以前 f08dd93e49e8461f362c8f45f17fe10e0fbdebec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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);
        }
    }
 
}