tjx
6 天以前 637d269fd640fbc43dbeab9c96663430db415525
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
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SqlSugar;
 
namespace MES.Service.service.Warehouse;
 
/// <summary>
///     销售托盘管理服务
/// </summary>
public class SalesPalletManager : Repository<SalesPallet>
{
    /// <summary>
    /// 获取销售托盘分页数据
    /// </summary>
    /// <param name="request">查询请求参数</param>
    /// <returns></returns>
    public (List<SalesPalletQueryDto> item, int TotalCount)
        GetSalesPalletPage(SalesPalletSearchDto request)
    {
        var query = Db.Queryable<SalesPallet>()
            .LeftJoin<SalesDeliveryNotice>((z, a) => a.BillNo == z.BillNo)
            .LeftJoin<SalesDeliveryNoticeDetail>((z, a, b) =>
                a.ErpId == b.ErpHeadId && z.ItemId.ToString() == b.MaterialId)
            .LeftJoin<MesItems>((z, a, b, s) => s.Id.ToString() == b.MaterialId)
            .LeftJoin<MesUnit>((z, a, b, s, u) =>
                u.Id.ToString() == b.SalesUnitId)
            .LeftJoin<SysUser>((z, a, b, s, u, su) => su.Fcode == z.CheckUser)
            .LeftJoin<MesDepots>((z, a, b, s, u, su, d) =>
                d.DepotId.ToString() == b.Warehouse)
            .Where((z, a, b, s, u, su, d)=>z.SalesQuantity > 0)
            .WhereIF(!string.IsNullOrEmpty(request.BillNo),
                (z, a, b, s, u, su, d) => z.BillNo.Contains(request.BillNo))
            .WhereIF(!string.IsNullOrEmpty(request.ItemNo),
                (z, a, b, s, u, su, d) => s.ItemNo.Contains(request.ItemNo))
            .WhereIF(!string.IsNullOrEmpty(request.ItemName),
                (z, a, b, s, u, su, d) => s.ItemName.Contains(request.ItemName))
            .WhereIF(request.Status.HasValue,
                (z, a, b, s, u, su, d) => z.Status == request.Status)
            .Select((z, a, b, s, u, su, d) => new SalesPalletQueryDto
            {
                Id = z.Id,
                Status = z.Status,
                CheckDate = z.CheckDate,
                CheckUser = su.Fname,
                BillNo = z.BillNo,
                ItemNo = s.ItemNo,
                ItemName = s.ItemName,
                ItemModel = s.ItemModel,
                UnitName = u.Fname,
                Xsdd = b.SalesQuantity,
                Yb = z.SalesQuantity,
                Wyj = a.BillNo + s.Id.ToString()
            });
 
        var totalCount = 0;
        var items = query.ToPageList(request.PageIndex, request.Limit,
            ref totalCount);
 
        return (items, totalCount);
    }
 
    public List<SalesPalletDetailQueryDto>
        GetSalesPalletDetail(SalesPalletDetailQueryDto request)
    {
        var subQuery = Db.Queryable<MesPalletBinding1>()
            .LeftJoin<Womdaa>((a, b) => a.TicketNo == b.Daa001)
            .LeftJoin<MesItems>((a, b, it) => it.Id.ToString() == b.Daa002)
            .GroupBy((a, b, it) => new { a.Stackcode, it.Id })
            .Select((a, b, it) => new
            {
                StackCode = a.Stackcode,
                ItemId = it.Id,
                ItemNo = SqlFunc.AggregateMax(it.ItemNo),
                ItemName = SqlFunc.AggregateMax(it.ItemName),
                ItemModel = SqlFunc.AggregateMax(it.ItemModel)
            });
 
        var query = Db.Queryable<SalesPalletDetail>()
            .LeftJoin(subQuery, (b, o) => b.Stackcode == o.StackCode)
            .Where((b, o) => b.Mid == request.Mid)
            .Select((b, o) => new SalesPalletDetailQueryDto
            {
                Id = b.Id,
                Mid = b.Mid,
                BillNo = b.BillNo,
                Stackcode = b.Stackcode,
                Qty = b.Qty,
                ItemNo = o.ItemNo,
                ItemName = o.ItemName,
                ItemModel = o.ItemModel
            });
 
        return query.ToList();
    }
 
    /// <summary>
    /// 创建销售订单发货
    /// </summary>
    /// <param name="request">发货请求参数</param>
    /// <returns></returns>
    public int CreateSalesOrderShipping(CreateSalesOrderShippingRequestDto request)
    {
        //验证request.PalletIds是否为空
        if (request.PalletIds == null || !request.PalletIds.Any())
        {
            throw new Exception("销售托盘ID列表不能为空");
        }
 
        //调用GetSalesPalletDetail方法拿到返回值
        var allDetails = new List<SalesPalletDetailQueryDto>();
        foreach (var palletId in request.PalletIds)
        {
            var detailQuery = new SalesPalletDetailQueryDto { Mid = palletId };
            var details = GetSalesPalletDetail(detailQuery);
            allDetails.AddRange(details);
        }
 
        if (!allDetails.Any())
        {
            throw new Exception("未找到销售托盘明细数据");
        }
 
        //提取出结果集的Stackcode并去重
        var stackCodes = allDetails
            .Where(d => !string.IsNullOrEmpty(d.Stackcode))
            .Select(d => d.Stackcode)
            .Distinct()
            .ToList();
 
        if (!stackCodes.Any())
        {
            throw new Exception("未找到有效的栈板码");
        }
 
        //select * from MES_INV_ITEM_STOCKS where STACKCODE in (Stackcode去重后的结果);
        var stockItems = Db.Queryable<MesInvItemStocks>()
            .Where(s => stackCodes.Contains(s.StackCode) && s.Quantity > 0)
            .ToList();
 
        if (!stockItems.Any())
        {
            throw new Exception("未找到对应的库存数据");
        }
 
        //调用MesInvItemStocksManager.CreateReturnMaterialRequest方法
        var stockManager = new MesInvItemStocksManager();
        var itemStockQuery = new ItemStockQueryDto
        {
            UserCode = request.UserCode,
            Station = request.Station,
            ItemBarcodes = stackCodes
        };
 
        stockManager.CreateReturnMaterialRequest(itemStockQuery);
 
        return stackCodes.Count;
    }
}