wangxinhui
5 天以前 9ec715d2deb18a269dd49c48da91a36632d08c81
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
using WIDESEA_DTO.ERP;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Common.OrderEnum;
using SqlSugar.Extensions;
using WIDESEA_Common.CommonEnum;
 
namespace WIDESEA_InboundService
{
    public class ReturnOrderService : ServiceBase<Dt_ReturnOrder, IReturnOrderRepository>, IReturnOrderService
    {
        public IReturnOrderRepository Repository => BaseDal;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IBasicRepository _basicRepository;
        private readonly IOutboundService _outboundService;
        private readonly IInboundRepository _inboundRepository;
        public ReturnOrderService(IReturnOrderRepository BaseDal,IUnitOfWorkManage unitOfWorkManage,IBasicRepository basicRepository,
        IOutboundService outboundService,IInboundRepository inboundRepository) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _basicRepository = basicRepository;
            _outboundService = outboundService;
            _inboundRepository = inboundRepository;
        }
        /// <summary>
        /// 获取退料单
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public WebResponseContent GetReturnOrders(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                int pageNo = saveModel.MainData["pageNo"].ObjToInt();
                string? orderNo = saveModel.MainData["orderNo"].ToString();
                int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
                List<Dt_ReturnOrder> returnOrders = new List<Dt_ReturnOrder>();
                if (string.IsNullOrEmpty(orderNo))
                {
                    returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                }
                else
                {
                    returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                }
 
                content.OK(data: returnOrders);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// 获取接收退料单
        /// </summary>
        public WebResponseContent ReturnOrder(ErpReturnOrderDTO model)
        {
            try
            {
                return model.Way switch
                {
                    1 => AddReturnOrder(model),
                    2 => UpdateReturnOrder(model),
                    3 => DeleteReturnOrder(model),
                    _ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{model.Way}"),
                };
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// 新建退料单
        /// </summary>
        public WebResponseContent AddReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (BaseDal.QueryFirst(x => x.OrderNo == model.OrderNo) != null) 
                {
                    return content.Error($"退料单号{model.OrderNo}已存在!");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaCode);
                if (warehouse == null)
                {
                    return content.Error($"未找到仓库信息");
                }
                List<Dt_ReturnOrderDetail> returnOrderDetails = new List<Dt_ReturnOrderDetail>();
                foreach (var item in model.Issitem)
                {
                    //判断发料单号
                    Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.Db.Queryable<Dt_OutboundOrder>().Where(x=>x.UpFLOrderNo==item.PickCode).Includes(x=>x.Details).First() ?? throw new Exception($"申请单号(发料单){item.PickCode}不存在");
                    
                    foreach (var pickitem in item.PickList)
                    {
                        Dt_OutboundOrderDetail outboundOrderDetail = outboundOrder.Details.Find(x => x.MaterielCode == pickitem.MCode) ?? throw new Exception($"{item.PickCode}申请单号中物料{pickitem.MCode}不存在");
                        //获取对应出库单详情
                        Dt_OutStockLockInfo outStockLockInfo = _outboundService.OutboundStockLockInfoService.Repository.QueryFirst(x => x.OrderDetailId == outboundOrderDetail.Id);
                        
                        Dt_ReturnOrderDetail returnOrderDetail = new Dt_ReturnOrderDetail()
                        {
                            PickCode = item.PickCode,
                            ApplyRow = item.ApplyRow ?? 0,
                            RowId = item.RowId,
                            OrderDetailStatus = ReturnOrderStatusEnum.NotReturn.ObjToInt(),
                            MCode = pickitem.MCode,
                            MaterielName = outboundOrderDetail.MaterielName,
                            MaterielSpec = outboundOrderDetail.MaterielSpec ?? "",
                            BatchNo = outStockLockInfo.BatchNo,
                            Qty = pickitem.Qty,
                            ReturnQty = pickitem.ReturnQty,
                            OverReturnQty = 0,
                            Unit = pickitem.Unit,
                            Code = pickitem.Code
                        };
                        returnOrderDetails.Add(returnOrderDetail);
                    }
                }
                Dt_ReturnOrder returnOrder = new Dt_ReturnOrder()
                {
                    OrderNo=model.OrderNo,
                    WarehouseId=warehouse.WarehouseId,
                    ReturnOrderType=model.OrderType,
                    ReturnOrderStatus=ReturnOrderStatusEnum.NotReturn.ObjToInt(),
                    UploadStatus= WhetherEnum.False.ObjToInt(),
                    IsDev=model.IsDev,
                    Remark=model.Note,
                    Details= returnOrderDetails
                };
                Db.InsertNav(returnOrder).Include(x => x.Details).ExecuteCommand();
 
                content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// 修改退料单
        /// </summary>
        public WebResponseContent UpdateReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            return content;
        }
        /// <summary>
        /// 删除退料单
        /// </summary>
        public WebResponseContent DeleteReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            return content;
        }
        /// <summary>
        /// 确认退库根据退库单生成入库单
        /// </summary>
        /// <returns></returns>
        public WebResponseContent IsReturnCreateInOrder(int returnId)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_ReturnOrder returnOrder = Db.Queryable<Dt_ReturnOrder>().Where(x => x.Id == returnId).Includes(x => x.Details).First();
                if (returnOrder==null)
                {
                    return content.Error("未找到退料该信息");
                }
                if (returnOrder.Details==null || returnOrder.Details.Count<=0)
                {
                    return content.Error("未找到该退料单信息");
                }
                if (returnOrder.ReturnOrderStatus!=ReturnOrderStatusEnum.NotReturn.ObjToInt())
                {
                    return content.Error("该退料单已完成或退料中");
                }
                //判断是否创建入库单
                Dt_InboundOrder InboundOld = _inboundRepository.InboundOrderRepository.QueryFirst(x=>x.UpperOrderNo== returnOrder.OrderNo);
                if (InboundOld!=null)
                {
                    return content.Error($"该退料单{returnOrder.OrderNo}已生成入库单号{InboundOld.InboundOrderNo}");
                }
                List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
                foreach (var item in returnOrder.Details)
                {
                    Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
                    {
                        MaterielCode=item.MCode,
                        BatchNo=item.BatchNo,
                        OrderQuantity=item.ReturnQty,
                        ReceiptQuantity=0,
                        OverInQuantity=0,
                        OrderDetailStatus= OrderDetailStatusEnum.New.ObjToInt(),
                        Unit=item.Unit,
                        RowNo=item.RowId,
                        MaterielName=item.MaterielName,
                        MaterielSpec=item.MaterielSpec,
                    };
                    inboundOrderDetails.Add(orderDetail);
                }
                Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
                {
                    WarehouseId=returnOrder.WarehouseId,
                    UpperOrderNo=returnOrder.OrderNo,
                    SupplierId="",
                    OrderType= InOrderTypeEnum.Return.ObjToInt(),
                    OrderStatus= InOrderStatusEnum.未开始.ObjToInt(),
                    CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                    Remark=returnOrder.Remark,
                    Details= inboundOrderDetails
                };
                returnOrder.ReturnOrderStatus=ReturnOrderStatusEnum.Returning.ObjToInt();
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(returnOrder);
                Db.InsertNav(inboundOrder).Include(x=>x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                return content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}