IF OBJECT_ID(N'[dbo].[proc_add_in_job]', N'P') IS NOT NULL DROP PROCEDURE [dbo].[proc_add_in_job] GO CREATE PROCEDURE [dbo].[proc_add_in_job] @tray_code NVARCHAR(255), @warehouse_id NVARCHAR(255), @user_id INT, @dept_id INT, @v_result INT OUTPUT, @v_resultmsg VARCHAR(80) OUTPUT AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @task_no varchar(255), @job_id varchar(255), @now DATETIME = GETDATE(); DECLARE @row_idx INT = 1, @job_detail_id NVARCHAR(80), @product_id NVARCHAR(255), @product_name NVARCHAR(255), @lot_no NVARCHAR(80), @quantity DECIMAL(18), @stockin_id NVARCHAR(80), @stockin_detail_id NVARCHAR(255); IF NOT EXISTS (SELECT 1 FROM dbo.in_tray_msg WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id) BEGIN SET @v_result = 0; SET @v_resultmsg = '错误:托盘无绑定数据'; RETURN; END IF EXISTS (SELECT 1 FROM dbo.mydo_job WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id) BEGIN SET @v_result = 0; SET @v_resultmsg = '错误:该托盘已生成作业'; RETURN; END BEGIN TRY DECLARE cur_tray CURSOR LOCAL FAST_FORWARD FOR SELECT tm.product_id, ISNULL(d.product_name, ''), ISNULL(d.lot_no, ''), tm.quantity, ISNULL(d.stockin_id, ''), tm.stockin_detail_id FROM dbo.in_tray_msg tm LEFT JOIN dbo.in_stockin_detail d ON tm.stockin_detail_id = d.stockin_detail_id WHERE tm.tray_code = @tray_code AND tm.warehouse_id = @warehouse_id; BEGIN TRANSACTION; EXEC dbo.util_serial_job 'RK', @job_id OUTPUT; EXEC dbo.util_serial_task '1', @task_no OUTPUT; INSERT INTO dbo.mydo_job ( job_id, status, task_no, in_or_out, execution_phase, tray_code, warehouse_id, create_time, user_id, dept_id, priority, height, weight ) VALUES ( @job_id, '1', @task_no, 1, '0', @tray_code, @warehouse_id, @now, @user_id, @dept_id, 10, 0.00, 0.00 ); OPEN cur_tray; FETCH NEXT FROM cur_tray INTO @product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id; WHILE @@FETCH_STATUS = 0 BEGIN SET @job_detail_id = @job_id + '-' + CAST(@row_idx AS VARCHAR); -- stockin_id/stockin_detail_id 为入库单追溯字段;in_or_out_id/in_or_out_d_id 为通用出入库追溯字段。 INSERT INTO dbo.mydo_job_detail ( job_detail_id, job_id, product_id, product_name, lot_no, in_quantity, in_or_out_id, in_or_out_d_id, stockin_id, stockin_detail_id ) VALUES ( @job_detail_id, @job_id, @product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id, @stockin_id, @stockin_detail_id ); SET @row_idx += 1; FETCH NEXT FROM cur_tray INTO @product_id, @product_name, @lot_no, @quantity, @stockin_id, @stockin_detail_id; END CLOSE cur_tray; DEALLOCATE cur_tray; DELETE FROM dbo.in_tray_msg WHERE tray_code = @tray_code AND warehouse_id = @warehouse_id; COMMIT TRANSACTION; SET @v_result = 1; SET @v_resultmsg = '成功:入库作业生成完成'; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; IF CURSOR_STATUS('local','cur_tray') >= 0 BEGIN CLOSE cur_tray; DEALLOCATE cur_tray; END SET @v_result = 0; SET @v_resultmsg = LEFT(ERROR_MESSAGE(), 80); END CATCH END GO