· 8 years ago · Dec 12, 2017, 02:30 AM
1USE [Adayroi_TMS]
2GO
3/****** Object: StoredProcedure [dbo].[APIClient_3PL_Upd_LadingWaitingListClosed_V01] Script Date: 12/12/2017 9:29:03 AM ******/
4SET ANSI_NULLS ON
5GO
6SET QUOTED_IDENTIFIER ON
7GO
8-- =============================================
9-- Author: Hoà ng Äình Khiêm
10-- Create date: 05/10/2015
11-- Description: Lưu danh sách váºn đơn chỠđóng
12-- Author: KhiemHD
13-- Create date: 28/02/2017
14--Note: Update theo User Story 454245:[TMS] TMS ghi nháºn thá»i gian Min - Max giao hà ng từ OMS đổ xuống & thay đổi cách tÃnh thá»i gian còn lại theo thá»i gian Min
15-- =============================================
16ALTER PROCEDURE [dbo].[APIClient_3PL_Upd_LadingWaitingListClosed_V01]
17 @strXmlDetail NVARCHAR(MAX),
18 @CurrentUser INT,
19 @SesstionKey VARCHAR(250),
20 @Serials NVARCHAR(MAX)
21AS
22BEGIN
23 DECLARE @PROC_NAME VARCHAR(250) = OBJECT_NAME(@@PROCID)
24 --Tạo Table temp
25 CREATE TABLE #TableOpenXml
26 (
27 ReferenceId BIGINT,
28 LogId BIGINT,
29 IsAgain BIT,
30 IsCanceled BIT,
31 IsCheckSave BIT,
32 ReasonNameNote NVARCHAR(250),
33 ReasonId INT,
34 MethodId INT,
35 StatusId INT,
36 DateAgain DATETIME,
37 DateAgainTo DATETIME
38 )
39 CREATE TABLE #TableSerial
40 (
41 Id INT,
42 SoDetailId BIGINT,
43 SerialNumber VARCHAR(250),
44 StatusId INT
45 )
46
47 BEGIN TRY
48 EXEC [dbo].[CHECK_SESSION_AND_PERMISSION] @CurrentUser, @SesstionKey, @PROC_NAME
49
50 BEGIN TRAN T
51 DECLARE @idoc INT
52 DECLARE @idoc1 INT
53 EXEC sp_xml_preparedocument @idoc OUTPUT, @strXmlDetail
54 EXEC sp_xml_preparedocument @idoc1 OUTPUT, @Serials
55
56 INSERT INTO #TableOpenXml
57 (
58 ReferenceId,
59 LogId,
60 IsAgain,
61 IsCanceled,
62 IsCheckSave,
63 ReasonNameNote,
64 ReasonId,
65 MethodId,
66 StatusId,
67 DateAgain,
68 DateAgainTo
69 )
70 SELECT ReferenceId, LogId, IsAgain, IsCanceled, IsCheckSave, ReasonNameNote, ReasonId, MethodId, StatusId, DateAgain, DateAgainTo
71 FROM OPENXML (@idoc, '/ArrayOfLadingWaitingListClosed/LadingWaitingListClosed', 8)
72 WITH
73 (
74 ReferenceId BIGINT 'ReferenceId',
75 LogId BIGINT 'LogId',
76 IsAgain BIT 'IsAgain',
77 IsCanceled BIT 'IsCanceled',
78 IsCheckSave BIT 'IsCheckSave',
79 ReasonNameNote NVARCHAR(250) 'ReasonNameNote',
80 ReasonId BIGINT 'ReasonId',
81 MethodId BIGINT 'MethodId',
82 StatusId BIGINT 'StatusId',
83 DateAgain DATETIME 'DateAgain',
84 DateAgainTo DATETIME 'DateAgainTo'
85 )
86 INSERT INTO #TableSerial
87 (
88 Id, SoDetailId, SerialNumber, StatusId
89 )
90 SELECT Id, SoDetailId, SerialNumber, StatusId
91 FROM OPENXML (@idoc1, '/ArrayOfSerialInfo/SerialInfo', 8)
92 WITH
93 (
94 Id INT 'Id',
95 SoDetailId BIGINT 'SoDetailId',
96 SerialNumber VARCHAR(250) 'SerialNumber',
97 StatusId INT 'StatusId'
98 )
99
100 Declare @tempSoDetail as Table
101 (
102 ClientSoId BIGINT,
103 ClientPoId BIGINT,
104 SoId BIGINT,
105 ProductTypeId INT,
106 SoDetailId BIGINT,
107 ClientProductId INT,
108 PackingID BIGINT,
109 PackingDetailId BIGINT,
110 Amount INT,
111 SellPrice DECIMAL(18,4),
112 SAPReservationNumber NVARCHAR(50),
113 SAPPONumberInterim NVARCHAR(50),
114 SAPReservationLineItem NVARCHAR(700)
115 )
116 ------------------------------------------------------------------------------------------------------------------------------------
117 --Update UnitTransport_Log_CreateShippingOrder
118 UPDATE UnitTransport_Log_CreateShippingOrder
119 SET
120 IsAgain = tox.IsAgain,
121 IsCanceled = tox.IsCanceled,
122 IsCheckSave = 1,
123 StatusId = CASE
124 WHEN tox.IsAgain = 1 THEN 9
125 WHEN tox.IsCanceled = 1 THEN 8 ELSE utl.StatusId
126 END,
127 ReasonName = tox.ReasonNameNote
128 FROM #TableOpenXml tox INNER JOIN dbo.UnitTransport_Log_CreateShippingOrder utl ON utl.LogId = tox.LogId
129 WHERE utl.StatusId NOT IN (10, 11, 12) -- Update: 03/11/2016
130
131 --Giao hà ng
132 IF(EXISTS(SELECT 1 FROM #TableOpenXml WHERE MethodId = 1))
133 BEGIN
134 --Update DE_DeliverySlipsDetails
135 UPDATE DE_DeliverySlipsDetails
136 SET
137 IsAgain = tox.IsAgain,
138 IsCompleted = 0,
139 IsCanceled = tox.IsCanceled,
140 QuantityCompleted = 0,
141 QuantityAgain = CASE WHEN tox.IsAgain = 1 THEN ddsd.Quantity ELSE 0 END,
142 QuantityCanceled = CASE WHEN tox.IsCanceled = 1 THEN ddsd.Quantity ELSE 0 END,
143 DateCompleted = NULL,
144 DateAgain = CASE WHEN tox.IsAgain = 1 THEN tox.DateAgain ELSE NULL END,
145 DateAgainTo = CASE WHEN tox.IsAgain = 1 THEN tox.DateAgainTo ELSE NULL END,
146 DateCanceled = CASE WHEN tox.IsCanceled = 1 THEN GETDATE() ELSE NULL END,
147 ReasonAgain = CASE WHEN tox.IsAgain = 1 THEN tox.ReasonId ELSE 0 END,
148 ReasonCanceled = CASE WHEN tox.IsCanceled = 1 THEN tox.ReasonId ELSE 0 END,
149 ModifiedBy = @CurrentUser,
150 DateModified = GETDATE(),
151 [Status] = 29,
152 StatusProcessFor3PL = 73, --XỠlý đơn hủy và hẹn lại từ 3PL
153 ReasonAgainOrther = CASE WHEN tox.IsAgain = 1 THEN tox.ReasonNameNote ELSE NULL END,
154 ReasonCanceledOrther = CASE WHEN tox.IsCanceled = 1 THEN tox.ReasonNameNote ELSE NULL END,
155 DateSaveTemp = CASE WHEN ddsd.DateSaveTemp IS NULL THEN GETDATE() ELSE ddsd.DateSaveTemp END,
156 Note = tox.ReasonNameNote
157 FROM
158 #TableOpenXml tox INNER JOIN dbo.Packing_Detail pd WITH (NOLOCK) ON pd.PackingID = tox.ReferenceId
159 INNER JOIN dbo.DE_DeliverySlipsDetails ddsd WITH (NOLOCK) ON ddsd.PackingDetailId = pd.PackingDetailId
160 WHERE tox.MethodId = 1
161 AND ddsd.Visible = 1
162
163 --Update SO_Detail
164
165 UPDATE SO_Detail
166 SET DeliveryDateFrom = CASE WHEN tox.IsAgain = 1 THEN tox.DateAgainTo ELSE sd.DeliveryDateFrom END,
167 DeliveryDateTo = CASE WHEN tox.IsAgain = 1 THEN tox.DateAgainTo ELSE sd.DeliveryDateTo END,
168 TempDeliveryDateFrom = CASE WHEN tox.IsAgain = 1 THEN tox.DateAgain ELSE sd.DeliveryDateFrom END,
169 IsPushCS = 0,
170 IsDeliveryAgain = CASE WHEN tox.IsAgain = 1 THEN 1 ELSE 0 END,
171 SODetailStatusID = CASE
172 WHEN tox.IsAgain = 1 THEN 7
173 WHEN tox.IsCanceled = 1 THEN 16 ELSE sd.SODetailStatusID
174 END,
175 UserModify = @CurrentUser,
176 DeliveryFromTimeUpdateTime = GETDATE(),
177 DeliveryPeriodTime = CASE WHEN tox.IsAgain = 1 THEN (SELECT TOP 1 dpt.Name FROM DeliveryPeriodTime dpt WITH (NOLOCK) WHERE CONVERT(CHAR(8), tox.DateAgain, 108) BETWEEN dpt.FromTime AND dpt.ToTime)
178 ELSE sd.DeliveryPeriodTime
179 END
180
181
182 OUTPUT INSERTED.ClientSoId, INSERTED.ClientPoId, INSERTED.SOId, INSERTED.ProductTypeID, INSERTED.SODetailID, INSERTED.ClientProductId, pd.PackingID, pd.PackingDetailId,
183 INSERTED.Amount, INSERTED.SellPrice, INSERTED.SAPReservationNumber, INSERTED.SAPPONumberInterim, INSERTED.SAPReservationLineItem
184 INTO @tempSoDetail (ClientSoId, ClientPoId, SoId, ProductTypeId, SoDetailId, ClientProductId, PackingID, PackingDetailId, Amount, SellPrice, SAPReservationNumber, SAPPONumberInterim, SAPReservationLineItem)
185
186 FROM #TableOpenXml tox INNER JOIN dbo.Packing_Detail pd WITH (NOLOCK) ON pd.PackingID = tox.ReferenceId
187 INNER JOIN dbo.SO_Detail sd WITH (NOLOCK) ON pd.SoDetailId = sd.SODetailID
188 WHERE --sd.SODetailStatusID < 13
189 sd.Visible = 1
190 AND tox.MethodId = 1
191
192 --Update SO_Detail_Serial
193 UPDATE dbo.SO_Detail_Serial
194 SET StatusId = ts.StatusId,
195 RollBackSerial = 0
196 FROM dbo.SO_Detail_Serial sds INNER JOIN #TableSerial ts ON (ts.SerialNumber = sds.SerialNumber AND ts.SoDetailId = sds.SODetailID)
197
198 --Update (15/11/2016) đẩy thá»i gian hẹn lại sang PushCsDateTime
199 DECLARE @NoteByUser nvarchar(250)
200 SELECT @NoteByUser = uu.FullName + ' - [' + CAST(uu.UserId AS varchar(50)) + ']' FROM dbo.UM_Users uu WHERE uu.UserId = @CurrentUser
201
202 INSERT INTO dbo.PushCsDateTime
203 (
204 Soid,
205 Push,
206 CreateDate,
207 TmsShippingFrom,
208 TmsShippingTo,
209 Note,
210 CityId,
211 PoNumber,
212 ProductItemId,
213 ProductType,
214 Quantity,
215 PhoneNumber,
216 FailDeliveryReson,
217 cp.ClientProductId
218 )
219 SELECT s.ClientSoId, -- Số SO
220 0, -- đã push hay chưa default = 0
221 GETDATE(),
222 tox.DateAgain, -- Thá»i gian hẹn lại từ
223 tox.DateAgainTo, -- Thá»i gian hẹn lại đến
224 @NoteByUser, -- ghi chú
225 s.DeliveryCityId, -- Thà nh phố (get theo trạm)
226 sd.ClientPoId, -- Số PO
227 cp.ProductItemId,
228 sd.ProductTypeID, -- Loại hà ng
229 ddsd.Quantity, -- Số lượng hẹn lại
230 s.CustomerPhone, -- Số dt khách hà ng
231 0 , -- lý do false - default :0
232 cp.ClientProductId
233 FROM #TableOpenXml tox INNER JOIN @tempSoDetail sd ON sd.PackingID = tox.ReferenceId
234 INNER JOIN dbo.SO s WITH (NOLOCK) ON s.SOID = sd.SoId
235 INNER JOIN dbo.DE_DeliverySlipsDetails ddsd WITH (NOLOCK) ON ddsd.PackingDetailId = sd.PackingDetailId
236 INNER JOIN dbo.ClientProduct cp WITH (NOLOCK) ON cp.ClientProductId = sd.ClientProductId
237 WHERE tox.IsAgain = 1
238
239 --Update thá»i gian hẹn lại lại cho PurcharseOrder
240 UPDATE po
241 SET DeliveryDateFrom = tox.DateAgainTo,
242 DeliveryDateTo = tox.DateAgainTo,
243 DeliveryPolicyType = 2,
244 TempDeliveryDateFrom = tox.DateAgain,
245 DeliveryPeriodTime = CASE WHEN tox.IsAgain = 1 THEN ( SELECT TOP 1 dpt.Name
246 FROM DeliveryPeriodTime dpt WITH (NOLOCK)
247 WHERE CONVERT( CHAR(8), tox.DateAgain, 108) BETWEEN dpt.FromTime AND dpt.ToTime
248 )
249 ELSE po.DeliveryPeriodTime
250 END
251 FROM #TableOpenXml tox INNER JOIN @tempSoDetail tsd ON tsd.PackingID = tox.ReferenceId
252 INNER JOIN dbo.PurchaseOrder po WITH (NOLOCK) ON po.ClientPoId = tsd.ClientPoId
253 WHERE tox.IsAgain = 1
254 AND po.POStatusId < 5
255
256 --Update SO
257 UPDATE dbo.SO
258 SET dbo.SO.SOStatusId = ( SELECT st.Id
259 FROM dbo.SOStatus st WITH (NOLOCK) INNER JOIN
260 (SELECT MIN(st1.Priority) AS MinPriority
261 FROM dbo.SO_Detail sd WITH (NOLOCK) INNER JOIN dbo.SOStatus st1 WITH (NOLOCK) ON sd.SODetailStatusID = st1.Id
262 WHERE sd.ClientSoId = s.ClientSoId AND sd.Visible = 1) ts ON st.Priority = ts.MinPriority)
263 FROM dbo.SO s WITH (NOLOCK) INNER JOIN @tempSoDetail AS Sml ON Sml.SoId = s.SOID
264
265 END
266
267 --GHI LOG
268 DECLARE @StationId int = 0
269 SELECT @StationId = uu.SID FROM dbo.UM_Users uu WHERE uu.UserId = @CurrentUser
270 INSERT INTO Log_Information
271 (
272 ObjectTypeId, ObjectId, ActionId, LogDetails, CreatedBy, CreatedDate, UID_AssignTo, OldStatusId, NewStatusId, StationId
273 )
274 SELECT 3,
275 tsd.SoDetailId,
276 105,
277 N'Xá» lý váºn đơn há»§y từ 3PL: Lý do: ' + tox.ReasonNameNote,
278 @CurrentUser,
279 GETDATE(),
280 @CurrentUser,
281 7,
282 CASE
283 WHEN tox.IsAgain = 1 THEN 7
284 WHEN tox.IsCanceled = 1 THEN 16 ELSE NULL
285 END,
286 @StationId
287 FROM #TableOpenXml tox INNER JOIN @tempSoDetail tsd ON tsd.PackingID = tox.ReferenceId
288
289 --Ghi log
290 INSERT INTO dbo.UnitTransport_Tracking3PLStatus
291 (
292 CreatedDate,
293 QueueId,
294 MethodId,
295 ClientSoId,
296 ReferenceId,
297 OrderReference,
298 TPLOrderReference,
299 OperationStatusId,
300 OldOrderStatusId,
301 NewOrderStatusId,
302 OldMerchantStatusId,
303 NewMerchantStatusId,
304 Message
305 )
306 SELECT
307 GETDATE() -- CreatedDate
308 , utlcso.LogId -- QueueId
309 , utlcso.MethodId -- MethodId
310 , isnull(utlcso.AdrClientSoId,0)-- ClientSoId
311 , utlcso.ReferenceId -- ReferenceId
312 , utlcso.OrderReference -- OrderReference
313 , utlcso.UnitTransportOrderCode -- TPLOrderReference
314 , 0 -- OperationStatusId - int
315 , CASE
316 WHEN tox.StatusId = 8 THEN 8
317 WHEN tox.StatusId = 9 THEN 9 ELSE NULL
318 END
319 , CASE
320 WHEN tox.StatusId = 8 THEN 8
321 WHEN tox.StatusId = 9 THEN 9 ELSE NULL
322 END -- NewOrderStatusId - int
323 , 2 -- OldMerchantStatusId - int
324 , 2 -- NewMerchantStatusId - int
325 , N'Xá» lý váºn đơn há»§y từ 3PL -> Cáºp nháºt:' + CASE
326 WHEN tox.IsAgain = 1 THEN N'Hẹn lại'
327 WHEN tox.IsCanceled = 1 THEN N'Há»§y giao' ELSE NULL
328 END + N'( Lý do: ' + tox.ReasonNameNote + ' )'
329 FROM #TableOpenXml tox INNER JOIN dbo.UnitTransport_Log_CreateShippingOrder utlcso ON utlcso.LogId = tox.LogId
330 WHERE utlcso.StatusId NOT IN (10, 11, 12) -- Update: 03/11/2016
331
332 --Thêm log cáºp nháºt trạng thái OMS, lưu ý phải tá»± thêm và o các item phà đối vá»›i PO có phà (CPN, GCD)
333 IF (EXISTS(SELECT 1 FROM @tempSoDetail tsd INNER JOIN dbo.SO s WITH (NOLOCK) ON s.SOID = tsd.SoId
334 WHERE s.SourceClientId = 1 ))
335 BEGIN
336 DECLARE @TblOms AS Oms_UpdateSoDetailStatus
337 INSERT INTO @TblOms
338 (
339 SOID,
340 PO,
341 ProductItemId,
342 Amount,
343 CurrentStatus,
344 DeliveryReasonId,
345 DeliveryNote,
346 OldStatus,
347 PriceCustomer,
348 SAPReservationNumber,
349 SAPReservationLineItem,
350 SAPPONumberInterim,
351 Serials
352 )
353 SELECT -->HỦY
354 tsd.ClientSoId,
355 tsd.ClientPoId,
356 cp.ProductItemId,
357 tsd.Amount,
358 33554432, --Há»§y
359 tox.ReasonId,
360 tox.ReasonNameNote,
361 CASE WHEN po.DeliveryFlowId <> 2 THEN 256 ELSE 128 END AS OldStatus,
362 tsd.SellPrice,
363 tsd.SAPReservationNumber,
364 tsd.SAPReservationLineItem,
365 tsd.SAPPONumberInterim,
366 (
367 SELECT ts.SerialNumber AS string
368 FROM #TableSerial ts
369 WHERE (ts.SodetailId = tsd.SoDetailId OR ts.SoDetailId = sd.SoDetailIdRoot) AND ts.StatusId = 69 AND ISNULL(sd.IsVinIdCard, 0) = 0
370 FOR XML PATH ('')
371 ) AS Serials
372 FROM #TableOpenXml tox INNER JOIN @tempSoDetail tsd ON tsd.PackingID = tox.ReferenceId
373 INNER JOIN dbo.SO s WITH (NOLOCK) ON s.SOID = tsd.SoId
374 INNER JOIN dbo.SO_Detail sd WITH (NOLOCK) ON tsd.SoDetailId = sd.SODetailID
375 LEFT JOIN dbo.ClientProduct cp WITH (NOLOCK) ON cp.ClientProductId = sd.ClientProductId
376 LEFT JOIN dbo.PurchaseOrder po WITH (NOLOCK) ON po.ClientPoId = tsd.ClientPoId
377 WHERE tox.IsCanceled = 1
378 AND s.SourceClientId = 1
379 UNION ALL
380 SELECT -->HẸN LẠI
381 tsd.ClientSoId,
382 tsd.ClientPoId,
383 cp.ProductItemId,
384 tsd.Amount,
385 CASE WHEN po.DeliveryFlowId = 2 THEN 128 ELSE 256 END AS CurrentStatus,
386 tox.ReasonId,
387 tox.ReasonNameNote,
388 CASE WHEN po.DeliveryFlowId <> 2 THEN 256 ELSE 128 END AS OldStatus,
389 tsd.SellPrice,
390 tsd.SAPReservationNumber,
391 tsd.SAPReservationLineItem,
392 tsd.SAPPONumberInterim,
393 (
394 SELECT ts.SerialNumber AS string
395 FROM #TableSerial ts
396 WHERE (ts.SodetailId = tsd.SoDetailId OR ts.SoDetailId = sd.SoDetailIdRoot) AND ts.StatusId = 68 AND ISNULL(sd.IsVinIdCard, 0) = 0
397 FOR XML PATH ('')
398 ) AS Serials
399 FROM #TableOpenXml tox INNER JOIN @tempSoDetail tsd ON tsd.PackingID = tox.ReferenceId
400 INNER JOIN dbo.SO s WITH (NOLOCK) ON s.SOID = tsd.SoId
401 INNER JOIN dbo.SO_Detail sd WITH (NOLOCK) ON tsd.SoDetailId = sd.SODetailID
402 LEFT JOIN dbo.ClientProduct cp WITH (NOLOCK) ON cp.ClientProductId = sd.ClientProductId
403 LEFT JOIN dbo.PurchaseOrder po WITH (NOLOCK) ON po.ClientPoId = tsd.ClientPoId
404 WHERE tox.IsAgain = 1
405 AND s.SourceClientId = 1
406
407 EXEC dbo.APIClient_OMS_CreateLogUpdateSoDetails_V01 @CurrentUser, @SesstionKey, @TblOms
408 END
409
410 --Nếu đơn hà ng có hẹn lại thì insert đơn hà ng và o bảng SoNotAllowAutoCall để chặn không cho gá»i xác nháºn giao hà ng.
411 IF (EXISTS(SELECT 1 FROM #TableOpenXml tox WHERE tox.IsAgain = 1))
412 BEGIN
413 INSERT INTO dbo.SoNotAllowAutoCall
414 (
415 ClientSoId, CreatedBy, ReasonBlockId
416 )
417 SELECT DISTINCT
418 tsd.ClientSoId, -- ClientSoId - bigint
419 @CurrentUser, -- CreatedBy - int
420 2 --Thay đổi leadtime
421 FROM @tempSoDetail tsd INNER JOIN #TableOpenXml tox ON tox.ReferenceId = tsd.PackingID
422 WHERE tox.IsAgain = 1
423 AND NOT EXISTS (
424 SELECT TOP 1 1
425 FROM SoNotAllowAutoCall sna WITH (NOLOCK)
426 WHERE sna.ClientSoId = tsd.ClientSoId AND sna.Visible = 1
427 )
428 END
429
430 EXEC sp_xml_removedocument @idoc
431 EXEC sp_xml_removedocument @idoc1
432 COMMIT TRAN T
433 SELECT 1 AS IsSuccess, 'Success' AS ResponseMessage
434 END TRY
435 BEGIN CATCH
436 SELECT 0 AS IsSuccess, N'Lỗi rồi.' AS ResponseMessage;
437 THROW;
438 END CATCH
439 DROP TABLE #TableSerial
440 DROP TABLE #TableOpenXml
441END