heshaofeng
2025-12-01 a87f474357470222ec6e890bac8ba5a009a321c7
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_DTO.Outbound;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using static WIDESEA_OutboundService.OutboundBatchPickingService;
 
namespace WIDESEA_WMSServer.Controllers.Outbound
{
 
    [Route("api/OutboundBatchPicking")]
    [ApiController]
    public class OutboundBatchPickingController : ApiBaseController<IOutboundBatchPickingService, Dt_PickingRecord>
    {
        private readonly ISplitPackageService _splitPackageService;
        private readonly IOutStockLockInfoService _outStockLockInfoService;
        private readonly IOutboundBatchPickingService _outboundBatchPickingService;
 
        private readonly ILogger<OutboundBatchPickingController> _logger;
        public OutboundBatchPickingController(IOutboundBatchPickingService service, ISplitPackageService splitPackageService, IOutStockLockInfoService outStockLockInfoService, IOutboundBatchPickingService outboundBatchPickingService, ILogger<OutboundBatchPickingController> logger) : base(service)
        {
            _splitPackageService = splitPackageService;
            _outStockLockInfoService = outStockLockInfoService;
            _outboundBatchPickingService = outboundBatchPickingService;
            _logger = logger;
        }
 
        /// <summary>
        /// 分拣确认
        /// </summary>
        [HttpPost("confirm-picking")]
        public async Task<WebResponseContent> ConfirmPicking([FromBody] ConfirmPickingDto dto)
        {
            return await _outboundBatchPickingService.ConfirmBatchPicking(dto.OrderNo, dto.PalletCode, dto.Barcode);
        }
 
        /// <summary>
        /// 取消分拣
        /// </summary>
        [HttpPost("cancel-picking")]
        public async Task<WebResponseContent> CancelPicking([FromBody] CancelPickingDto dto)
        {
            return await _outboundBatchPickingService.CancelPicking(dto.OrderNo, dto.PalletCode, dto.Barcode);
        }
        /// <summary>
        /// 取消拆包链
        /// </summary>
        [HttpPost("cancel-split-chain")]
        public async Task<WebResponseContent> CancelSplitChain([FromBody] CancelSplitChainDto dto)
        {
            return await _outboundBatchPickingService.CancelSplitPackageChain(dto.OrderNo, dto.PalletCode, dto.StartBarcode);
        }
 
        /// <summary>
        /// 获取拆包链信息
        /// </summary>
        [HttpPost("split-package-chain-info")]
        public async Task<WebResponseContent> GetSplitPackageChainInfo([FromBody] SplitPackageChainInfoRequestDto dto)
        {
            return await _outboundBatchPickingService.GetSplitPackageChainInfo(dto.OrderNo, dto.Barcode);
        }
        /// <summary>
        /// 查找完整拆包链(从根条码开始)
        /// </summary>
        [HttpPost("find-root-split-chain")]
        public async Task<WebResponseContent> FindRootSplitChain([FromBody] SplitPackageChainInfoRequestDto dto)
        {
            try
            {
                // 查找根条码
                var rootBarcode = await _outboundBatchPickingService. FindRootBarcode(dto.OrderNo, dto.Barcode);
 
                // 获取完整拆包链
                var splitChain = await _outboundBatchPickingService.GetSplitPackageChain(dto.OrderNo, rootBarcode);
 
                var chainInfo = new SplitPackageChainInfoDto
                {
                    OriginalBarcode = rootBarcode,
                    RootBarcode = rootBarcode,
                    TotalSplitTimes = splitChain.Count,
                    ChainType = "root",
                    SplitChain = splitChain.Select(x => new SplitChainItemDto
                    {
                        SplitTime = x.SplitTime,
                        OriginalBarcode = x.OriginalBarcode,
                        NewBarcode = x.NewBarcode,
                        SplitQuantity = x.SplitQty,
                        Operator = x.Operator,
                        IsReverted = x.IsReverted
                    }).ToList()
                };
 
                return WebResponseContent.Instance.OK("获取成功", chainInfo);
            }
            catch (Exception ex)
            {
                _logger.LogError($"查找完整拆包链失败 - OrderNo: {dto.OrderNo}, Barcode: {dto.Barcode}, Error: {ex.Message}");
                return WebResponseContent.Instance.Error("查找完整拆包链失败");
            }
        }
        /// <summary>
        /// 手动拆包
        /// </summary>
        [HttpPost("split-package")]
        public async Task<WebResponseContent> SplitPackage([FromBody] SplitPackageDto dto)
        {
            return await _outboundBatchPickingService.ManualSplitPackage(dto.OrderNo, dto.PalletCode, dto.OriginalBarcode, dto.SplitQuantity);
        }
        /// <summary>
        /// 取消拆包
        /// </summary>
        [HttpPost("cancel-split")]
        public async Task<WebResponseContent> CancelSplit([FromBody] CancelSplitDto dto)
        {
            return await _outboundBatchPickingService.CancelSplitPackage(dto.OrderNo, dto.PalletCode, dto.NewBarcode);
        }
 
        /// <summary>
        /// 分批回库
        /// </summary>
        [HttpPost("return-stock")]
        public async Task<WebResponseContent> ReturnStock([FromBody] ReturnStockDto dto)
        {
            return await _outboundBatchPickingService.BatchReturnStock(dto.OrderNo, dto.PalletCode);
        }
 
        /// <summary>
        /// 获取托盘的锁定信息
        /// </summary>
        [HttpPost("pallet-locks")]
        public async Task<WebResponseContent> GetPalletLocks([FromBody] PalletLocksDto dto)
        {
            try
            {
                var locks = await _outboundBatchPickingService.GetPalletLockInfos(dto.OrderNo, dto.PalletCode);
                return WebResponseContent.Instance.OK("获取成功", locks);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"获取托盘锁定信息异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}");
                return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message);
            }
        }
        /// <summary>
        /// 获取已拣选列表
        /// </summary>
        [HttpPost("pallet-picked-list")]
        public async Task<WebResponseContent> GetPalletPickedList([FromBody] PalletLocksDto dto)
        {
            try
            {
                var pickedList = await _outboundBatchPickingService.GetPalletPickedList(dto.OrderNo, dto.PalletCode);
                return WebResponseContent.Instance.OK("获取成功", pickedList);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"获取已拣选列表异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}");
                return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message);
            }
        }
 
        /// <summary>
        /// 获取托盘状态
        /// </summary>
        [HttpPost("pallet-status")]
        public async Task<WebResponseContent> GetPalletStatus([FromBody] PalletLocksDto dto)
        {
            try
            {
                var status = await _outboundBatchPickingService.GetPalletStatus(dto.OrderNo, dto.PalletCode);
                return WebResponseContent.Instance.OK("获取成功", status);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"获取托盘状态异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}");
                return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message);
            }
        }
 
        /// <summary>
        /// 获取拆包信息
        /// </summary>
        [HttpPost("split-package-info")]
        public async Task<WebResponseContent> GetSplitPackageInfo([FromBody] SplitPackageInfoDto dto)
        {
            try
            {
                var info = await _outboundBatchPickingService.GetSplitPackageInfo(dto.OrderNo, dto.PalletCode, dto.Barcode);
                return WebResponseContent.Instance.OK("获取成功", info);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"获取拆包信息异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}, Barcode: {dto.Barcode}");
                return WebResponseContent.Instance.Error("系统异常,请稍后重试" +ex.Message);
            }
        }
 
        /// <summary>
        /// 取走空箱
        /// </summary>
        [HttpPost("remove-empty-pallet")]
        public async Task<WebResponseContent> RemoveEmptyPallet([FromBody] RemoveEmptyPalletDto dto)
        {
            try
            {
                var result = await _outboundBatchPickingService.RemoveEmptyPallet(dto.OrderNo, dto.PalletCode);
                return result;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"取走空箱异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}");
                return WebResponseContent.Instance.Error("系统异常,请稍后重试" +ex.Message);
            }
        }
 
    }
 
}