11
啊鑫
2025-01-08 7e4085b2b97386abb8b7dc5626953dc79b1f1b45
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using SqlSugar;
 
namespace NewPdaSqlServer.service.Warehouse;
 
/// <summary>
///     调拨出库管理类
///     负责处理调拨出库相关的业务逻辑
/// </summary>
public class TransferOutManager : Repository<TransferOut>
{
    /// <summary>
    ///     获取未完成的调拨出库单号列表
    /// </summary>
    /// <returns>未完成的调拨出库单号列表</returns>
    public List<string> GetTransferOutNoList()
    {
        // 先从数据库获取Transfer_Out_ETAIL表的数据
        var transferOutDetails = Db.Queryable<TransferOutDetail>().ToList();
 
        // 使用LINQ对获取的数据进行分组和筛选
        // 筛选条件:申请数量(sq)不等于已扫数量(ys)的记录
        var result = transferOutDetails
            .GroupBy(x => x.Pid)
            .Select(g => new
            {
                pid = g.Key,
                sq = g.Sum(x => x.ShNum), // 申请数量合计
                ys = g.Sum(x => x.YsNum) // 已扫数量合计
            })
            .Where(x => (x.sq ?? 0) != (x.ys ?? 0))
            .Select(x => x.pid)
            .ToList();
 
        // 根据pid查询对应的出库单号
        var billNos = Db.Queryable<TransferOut>()
            .Where(x => result.Contains(x.Guid))
            .Select(x => x.BillNo)
            .ToList();
 
        return billNos;
    }
 
    /// <summary>
    ///     根据单据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public List<TransferOutDetail> GetTransferOutDetailListByBillNo(
        WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
 
        // 根据SQL查询条件获取待处理的出库明细
        // 关联查询TransferOutDetail、TransferOut和MesItems三张表
        // 筛选条件:未完成数量大于0且单据已审核
        var result = Db.Queryable<TransferOutDetail, TransferOut, MesItems>(
                (b, a, s) => new JoinQueryInfos(
                    JoinType.Left, b.Pid == a.Guid,
                    JoinType.Left, b.ItemId == s.Id))
            .Where((b, a, s) =>
                (b.ShNum ?? 0) - (b.YsNum ?? 0) > 0 // 未完成数量大于0
                && a.BillNo == p_bill_no // 匹配单据号
                && a.Status == 1) // 单据已审核
            .OrderBy((b, a, s) => s.ItemNo)
            .Select((b, a, s) => new TransferOutDetail
            {
                ItemNo = s.ItemNo,
                ItemModel = s.ItemModel,
                ShNum = b.ShNum, // 申请数量
                YsNum = b.YsNum, // 已扫数量
                // 保留其他必要字段...
                Pid = b.Pid,
                ItemId = b.ItemId,
                Guid = b.Guid
            })
            .ToList();
 
        return result;
    }
 
    /// <summary>
    ///     扫描条码进行调拨出库处理
    /// </summary>
    /// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
    /// <returns>处理后的表单和待处理明细列表</returns>
    public (WarehouseQuery form, List<TransferOutDetail> items)
        ScanMoveBarcode(WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var c_user = query.userName;
        var p_item_barcode = query.barcode;
 
        var p_bill_type_id = 300; // 单据类型ID
        var p_transaction_no = 301; // 交易编号
 
        // 验证单据号
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
 
        // 查询出库单并验证状态
        var transferOut = Db.Queryable<TransferOut>()
            .Where(x => x.BillNo == p_bill_no && x.Status == 1)
            .First();
        if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
 
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode
                        && x.Quantity > 0
                        && !string.IsNullOrEmpty(x.DepotsCode))
            .First();
        if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
 
        // 验证仓库一致性
        if (stock.DepotsCode != transferOut.InvCode)
            throw new Exception(
                $"条码库存仓库{stock.DepotsCode}和申请仓库不一致{transferOut.InvCode}");
 
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == stock.ItemId)
            .First();
        if (item == null) throw new Exception("未找到物料");
 
        // 查询调拨明细并验证
        var detail = Db.Queryable<TransferOutDetail>()
            .Where(x => x.ItemId == stock.ItemId && x.Pid == transferOut.Guid)
            .First();
        if (detail == null) throw new Exception("未找到条码物料相应的调拨申请");
 
        // 验证数量是否超出未扫数量
        if ((detail.ShNum ?? 0) - (detail.YsNum ?? 0) < stock.Quantity)
            throw new Exception("条码数量大于申请未扫数量,请拆分了再扫码");
 
        // 使用事务处理数据更新
        UseTransaction(db =>
        {
            // 查询现有移库记录
            var existingMove = db.Queryable<MesInvItemMoves>()
                .Where(x => x.TaskNo == p_bill_no
                            && x.TransactionNo == p_transaction_no
                            && (x.Status ?? 0) == 0)
                .First();
 
            var commit = 0; // 记录更新操作次数
            var c_id = Guid.Empty;
 
            // 处理移库主表记录
            if (existingMove != null)
            {
                // 更新现有记录的最后修改信息
                commit += db.Updateable<MesInvItemMoves>()
                    .SetColumns(s => s.LastupdateDate == DateTime.Now)
                    .SetColumns(s => s.LastupdateBy == c_user)
                    .Where(s => s.Guid == existingMove.Guid)
                    .ExecuteCommand();
 
                c_id = existingMove.Guid;
            }
            else
            {
                // 查询相关仓库信息
                var mesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.FromCode)
                    .First();
 
                var invMesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.InvCode)
                    .First();
 
                c_id = Guid.NewGuid();
 
                // 创建新的移库记录
                var newMove = new MesInvItemMoves
                {
                    Guid = c_id,
                    BillNo = BillNo.GetBillNo("DBCKD"),
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    InvDepotSectionsId = mesDepots.DepotId,
                    // InvDepotSectionsCode = transferOut.FromCode,
                    // FromDepotsCode = transferOut.InvCode,
                    FromDepotsId = invMesDepots.DepotId.ToString(),
                    TaskNo = p_bill_no
                };
                commit += db.Insertable(newMove).IgnoreColumns(true)
                    .ExecuteCommand();
            }
 
            // 写入老条码交易明细
            var business = new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transaction_no.ToString(),
                BusinessType = -1,
                ItemBarcode = p_item_barcode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                EpFlag = true,
                Quantity = stock.Quantity,
                FromInvDepotsCode = stock.DepotsCode,
                FromInvDepotSectionsCode = stock.DepotSectionsCode,
                ToInvDepotsCode = transferOut.FromCode,
                ToInvDepotSectionsCode = stock.DepotSectionsCode,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Factory = stock.Factory,
                Company = stock.Company,
                TaskNo = stock.TaskNo,
                BillNo = p_bill_no,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
 
            commit += db.Insertable(business).IgnoreColumns(true)
                .ExecuteCommand();
 
            // 写入新条码交易明细
            var moveDetail = new MesInvItemMovesCDetails
            {
                Guid = Guid.NewGuid(),
                ItemMoveGuid = c_id,
                ItemBarcode = p_item_barcode,
                CItemCode = stock.CItemCode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                Quantity = stock.Quantity,
                EpFlag = stock.EpFlag,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                // CustomerNo = stock.CustomerNo,
                TaskNo = stock.TaskNo,
                FromDepotsCode = stock.DepotsCode,
                FromDepotSectionsCode = stock.DepotSectionsCode,
                Factory = stock.Factory,
                Company = stock.Company,
                InvDepotsCode = transferOut.FromCode,
                // InvDepotSectionsCode = p_sectioncode,
                IqcStatus = stock.IqcStatus,
                Fcar = stock.Fcar,
                IndepDate = stock.IndepDate,
                VisableSubmit = stock.VisableSubmit,
                VisableSubmitBy = stock.VisableSubmitBy,
                VisableSubmitDate = stock.VisableSubmitDate,
                BoardStyle = stock.BoardStyle,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = (int)stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
 
            commit += db.Insertable(moveDetail).IgnoreColumns(true)
                .ExecuteCommand();
 
            // 更新或插入出库明细记录
            var outItem = db.Queryable<MesInvItemOutItems>()
                .Where(x => x.ItemOutId == c_id && x.ItemId == stock.ItemId)
                .First();
 
            if (outItem != null)
            {
                // 更新现有记录的数量
                outItem.Quantity += stock.Quantity;
                commit += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(x => x.Quantity == outItem.Quantity)
                    .Where(x => x.Guid == outItem.Guid)
                    .ExecuteCommand();
            }
            else
            {
                // 插入新记录
                var newOutItem = new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = c_id,
                    ItemId = stock.ItemId,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    TaskNo = stock.TaskNo,
                    WorkNo = stock.WorkNo,
                    WorkLine = stock.WorkLine,
                    EbelnK3id = (int)stock.EbelnK3id,
                    LineK3id = (int)stock.LineK3id,
                    Quantity = stock.Quantity
                    // Unit = stock.ItemUnit
                };
 
                commit += db.Insertable(newOutItem).IgnoreColumns(true)
                    .ExecuteCommand();
            }
 
            // 更新调拨申请已扫数量
            detail = db.Queryable<TransferOutDetail>()
                .Where(x => x.Guid == detail.Guid)
                .First();
 
            if (detail != null)
            {
                detail.YsNum = (detail.YsNum ?? 0) + stock.Quantity as int?;
                commit += db.Updateable<TransferOutDetail>()
                    .SetColumns(x => x.YsNum == detail.YsNum)
                    .Where(x => x.Guid == detail.Guid)
                    .ExecuteCommand();
            }
 
            // 检查是否所有明细都已完成
            var totals = db.Queryable<TransferOutDetail, TransferOut>((b, a) =>
                    new JoinQueryInfos(JoinType.Left, b.Pid == a.Guid))
                .Where((b, a) => a.BillNo == p_bill_no)
                .Select((b, a) => new
                {
                    ShNum = SqlFunc.AggregateSum(b.ShNum), // 申请总数量
                    YsNum = SqlFunc.AggregateSum(b.YsNum) // 已扫总数量
                })
                .First();
 
            // 如果申请数量等于已扫数量,更新单据完成状态
            if (totals.ShNum == totals.YsNum)
                commit += db.Updateable<TransferOut>()
                    .SetColumns(x => x.IsWc == 1)
                    .Where(x => x.BillNo == p_bill_no)
                    .ExecuteCommand();
 
            // 更新返回参数
            query.itemNo = item.ItemNo;
            query.Num = stock.Quantity;
 
            // 验证更新操作是否全部成功
            if (commit < 4) throw new Exception("更新失败");
 
            return commit;
        });
 
        // 返回更新后的表单和待处理明细
        return (query, GetTransferOutDetailListByBillNo(query));
    }
}