复杂存储收藏

----------------------------------------------------------------------------
TRD_StockMgr_PurchaseArrivalMgr_ModifyArrivalConfirmByID
作    者:
创建日期:2015-7-10
功能描述:修改采购到货-按订单到货确认
参数描述:
调用示例:
修改: 添加有备货与无备货确认到货行为。
declare @counts int
set @counts=0
exec TRD_StockMgr_PurchaseArrivalMgr_ModifyArrivalConfirmByID '10','','1','',,'3'@counts output
select @counts
----------------------------------------------------------------------------
*/
ALTER PROCEDURE [dbo].[TRD_ModifyArrivalConfirmByID]
(
    @OPER_USER_ID            INT,                            --添加人ID
    @OPER_USER_NAME            VARCHAR(50),                    --添加人
    @XML                    XML    ,                            --到货xml
    @ORDERID                INT,                            --订单主表ID
    @MSG                    NVARCHAR(100)=N'' OUTPUT,        --返回信息
    @OFCIDS                    NVARCHAR(MAX)=N'' OUTPUT        --备货到货返回到货ID拼接字符串
)
AS
BEGIN 
    --日志记录参数------------
    DECLARE @_opertype INT = 0
    DECLARE @_desc VARCHAR(400)
    DECLARE @_title VARCHAR(400)
    ----------------------------

        --定义临时表
        DECLARE @TEMP TABLE 
        (
            ID INT,
            AMOUNT NUMERIC(18,4),
            BATCH_NO NVARCHAR(200) DEFAULT '',
            STERILIZATION_BATCH_NO NVARCHAR(200) DEFAULT '',
            VAILD_DATE NVARCHAR(200),
            PRODUCTION_DATE NVARCHAR(200),
            INVOICE_NO NVARCHAR(200),
            PN NVARCHAR(200) DEFAULT '',
            SN NVARCHAR(200) DEFAULT '',
            REMARK NVARCHAR(1024)
        )
        --XML数据插入临时表
        INSERT INTO @TEMP(ID,AMOUNT,BATCH_NO,STERILIZATION_BATCH_NO,VAILD_DATE,PRODUCTION_DATE,INVOICE_NO,PN,SN,REMARK)
        SELECT 
                m.value('(ID)[1]','INT'),                
                m.value('(AMOUNT)[1]','NUMERIC(18,4)'),
                m.value('(BATCH_NO)[1]','NVARCHAR(200)'),
                m.value('(STERILIZATION_BATCH_NO)[1]','NVARCHAR(200)'),
                m.value('(VAILD_DATE)[1]','NVARCHAR(200)'),
                m.value('(PRODUCTION_DATE)[1]','NVARCHAR(200)'),
                m.value('(INVOICE_NO)[1]','NVARCHAR(200)'),
                m.value('(PN)[1]','NVARCHAR(200)'),
                m.value('(SN)[1]','NVARCHAR(200)'),
                m.value('(REMARK)[1]','NVARCHAR(1024)')
         FROM @XML.nodes('/ROOT/PurchaseConfirmEntity') T(m)
        
        --插入订单明细内容修正表
        INSERT INTO [dbo].[TRD_ORDERFORM_CONTENT_LOG]
                        ([ORDERFORM_CONTENT_ID]
                        ,[SENDER_CONTENT_ID]
                        ,[ORDER_DETAIL_ID]
                        ,DC_ORG_ID          --中心机构ID
                        ,SENDER_ID          --配送商ID
                        ,DC_PRODUCT_ID      --中心产品ID
                        ,[PUR_CMMD_ID]
                        ,[BATCH_NO]
                        ,[STERILIZATION_BATCH_NO]
                        ,[VAILD_DATE]
                        ,[PRODUCTION_DATE]
                        ,[PN]
                        ,[SN]
                        ,[OLD_BATCH_NO]
                        ,[OLD_STERILIZATION_BATCH_NO]
                        ,[OLD_VAILD_DATE]
                        ,[OLD_PRODUCTION_DATE]
                        ,[OLD_PN]
                        ,[OLD_SN]
                        ,[MIRROR_BALL]
                        ,[CONCAVE_CYLINDER]
                        ,[INVOICE_NO]
                        ,OLD_INVOICE_NO
                        ,[SEND_AMOUNT]
                        ,[SEND_SUM]
                        ,[OVER_AMOUNT]
                        ,[OVER_SUM]
                        ,[CREATE_USER_ID]
                        ,[CREATE_USER]
                        ,[CREATE_DATE])
                SELECT TOC.ID,                                
                        TOC.SENDER_CONTENT_ID,
                        TOC.ORDER_DETAIL_ID,
                        TOG.DC_ORG_ID,          --中心机构ID
                        TOD.SENDER_ID ,         --配送商ID
                        TOD.DC_PRODUCT_ID,      --中心产品ID
                        TOC.PUR_CMMD_ID,
                        TMP.BATCH_NO,
                        TMP.STERILIZATION_BATCH_NO,
                        CASE WHEN LTRIM(RTRIM(TMP.VAILD_DATE))='' THEN CAST('1900-01-01 00:00:00.000' AS DATETIME) ELSE TMP.VAILD_DATE END ,
                        CASE WHEN LTRIM(RTRIM( TMP.PRODUCTION_DATE))='' THEN CAST('1900-01-01 00:00:00.000' AS DATETIME) ELSE  TMP.PRODUCTION_DATE END,
                        TMP.PN,
                        TMP.SN,
                        TOC.BATCH_NO,
                        TOC.STERILIZATION_BATCH_NO,
                        TOC.VAILD_DATE,
                        TOC.PRODUCTION_DATE,
                        TOC.PN,
                        TOC.SN,
                        TOC.MIRROR_BALL,
                        TOC.CONCAVE_CYLINDER,
                        TMP.INVOICE_NO,
                        TOC.INVOICE_NO,
                        TOC.SEND_AMOUNT,
                        TOC.SEND_SUM,
                        TMP.AMOUNT,
                        TMP.AMOUNT*TOD.TRD_PRICE,--*TOD.SEND_MEASURE_EX,
                        @OPER_USER_ID,
                        @OPER_USER_NAME,
                        GETDATE()
                    FROM @TEMP AS TMP
                    INNER JOIN TRD_ORDERFORM_CONTENT AS TOC
                    ON TMP.ID=TOC.ID
                    INNER JOIN TRD_ORDER_DETAIL AS TOD
                    ON TOC.    ORDER_DETAIL_ID=TOD.ID
                    INNER JOIN TRD_ORG AS TOG
                    ON TOG.ID = TOD.SENDER_ID 
                    WHERE TMP.ID=TOC.ID AND 
                            (ISNULL(TMP.BATCH_NO,'')<>LTRIM(RTRIM(ISNULL(TOC.BATCH_NO,''))) 
                            OR ISNULL(TMP.STERILIZATION_BATCH_NO,'')<>LTRIM(RTRIM(ISNULL(TOC.STERILIZATION_BATCH_NO,''))) 
                            OR REPLACE(TMP.VAILD_DATE,'-','')<>CONVERT(VARCHAR(8),CASE WHEN RTRIM(LTRIM(ISNULL(TOC.VAILD_DATE,'')))='' THEN '19000101' ELSE TOC.VAILD_DATE END,112) 
                            OR REPLACE(TMP.PRODUCTION_DATE,'-','')<>CONVERT(VARCHAR(8),CASE WHEN RTRIM(LTRIM(ISNULL(TOC.PRODUCTION_DATE,'')))='' THEN '19000101' ELSE TOC.PRODUCTION_DATE END,112)
                            OR TMP.PN<>LTRIM(RTRIM(ISNULL(TOC.PN,'')))
                            OR TMP.SN<>LTRIM(RTRIM(ISNULL(TOC.SN,'')))
                            OR TMP.INVOICE_NO<>LTRIM(RTRIM(ISNULL(TOC.INVOICE_NO,'')))
                            ) 

        --信息字段发生改变后,更新表字段信息
        UPDATE TRD_OrderForm_Content
        SET TRD_OrderForm_Content.BATCH_NO=TMP.BATCH_NO,
        TRD_OrderForm_Content.STERILIZATION_BATCH_NO=TMP.STERILIZATION_BATCH_NO,
        TRD_OrderForm_Content.VAILD_DATE=CASE WHEN RTRIM(LTRIM(TMP.VAILD_DATE))='' THEN CAST('1900-01-01 00:00:00.000' AS DATETIME) ELSE TMP.VAILD_DATE END ,
        TRD_OrderForm_Content.PRODUCTION_DATE=CASE WHEN RTRIM(LTRIM(TMP.PRODUCTION_DATE))='' THEN CAST('1900-01-01 00:00:00.000' AS DATETIME) ELSE TMP.PRODUCTION_DATE END,
        TRD_OrderForm_Content.INVOICE_NO=TMP.INVOICE_NO,
        TRD_OrderForm_Content.PN=TMP.PN,
        TRD_OrderForm_Content.SN=TMP.SN
        FROM @TEMP AS TMP
        INNER JOIN TRD_ORDERFORM_CONTENT AS TOC
        ON TMP.ID=TOC.ID
        WHERE TMP.ID=TOC.ID AND 
                            (ISNULL(TMP.BATCH_NO,'')<>LTRIM(RTRIM(ISNULL(TOC.BATCH_NO,''))) 
                            OR ISNULL(TMP.STERILIZATION_BATCH_NO,'')<>LTRIM(RTRIM(ISNULL(TOC.STERILIZATION_BATCH_NO,''))) 
                            OR REPLACE(TMP.VAILD_DATE,'-','')<>CONVERT(VARCHAR(8),CASE WHEN RTRIM(LTRIM(ISNULL(TOC.VAILD_DATE,'')))='' THEN '19000101' ELSE TOC.VAILD_DATE END,112) 
                            OR REPLACE(TMP.PRODUCTION_DATE,'-','')<>CONVERT(VARCHAR(8),CASE WHEN RTRIM(LTRIM(ISNULL(TOC.PRODUCTION_DATE,'')))='' THEN '19000101' ELSE TOC.PRODUCTION_DATE END,112)
                            OR TMP.PN<>LTRIM(RTRIM(ISNULL(TOC.PN,'')))
                            OR TMP.SN<>LTRIM(RTRIM(ISNULL(TOC.SN,'')))
                            OR TMP.INVOICE_NO<>LTRIM(RTRIM(ISNULL(TOC.INVOICE_NO,'')))
                            ) ;


        --无备货情况
        IF EXISTS(SELECT TOP 1 1 FROM TRD_ORDER WHERE ID=@ORDERID AND [TYPE]<>20)
            BEGIN    

                --验证是否重复到货
                IF EXISTS (SELECT TOP 1 1 
                           FROM  @TEMP AS T 
                           INNER JOIN TRD_ORDERFORM_CONTENT AS TOC
                           ON T.ID=TOC.ID AND TOC.[STATE]=30

                                    )
                BEGIN
                    SET  @MSG='该订单下包含已到货的数据,请刷新后重新到货。'
                    RETURN ;
                END
                

                --修改订单明细内容表,主要是更新状态,到货数量,到户金额
                UPDATE TRD_OrderForm_Content
                SET TRD_OrderForm_Content.OVER_AMOUNT=TMP.AMOUNT,
                TRD_OrderForm_Content.OVER_SUM=TMP.AMOUNT*TOD.TRD_PRICE,--*TOD.SEND_MEASURE_EX,
                TRD_OrderForm_Content.ARRIVAL_REMARK=TMP.REMARK,
                STATE=30,
                LAST_UPDATE_USER_ID=@OPER_USER_ID,
                LAST_UPDATE_USER=@OPER_USER_NAME,
                LAST_UPDATE_DATE=GETDATE()        
                FROM @TEMP AS TMP
                INNER JOIN TRD_ORDERFORM_CONTENT AS TOC
                ON TMP.ID=TOC.ID
                INNER JOIN TRD_ORDER_DETAIL AS TOD
                ON TOC.    ORDER_DETAIL_ID=TOD.ID;



                --根据订单明细内容表状态修改订单明细表状态
                WITH    T AS (
                        SELECT   ORDER_DETAIL_ID ,
                                 STATE ,
                                 COUNT(1) Qty
                        FROM     TRD_OrderForm_Content T WHERE T.STATE IN(20,30)
                        GROUP BY ORDER_DETAIL_ID ,
                                STATE
                        )
                UPDATE TRD_ORDER_DETAIL
                SET    STATE = CASE WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_DETAIL_ID = TRD.ID AND
                                                T.STATE IN ( 20 , 30 )
                                        ) = 2 THEN 40--部分发货
                                    WHEN 20=ALL ( SELECT STATE
                                                    FROM   T
                                                    WHERE  T.ORDER_DETAIL_ID = TRD.ID ) THEN 20--卖家已发货
                                    WHEN 30=ALL ( SELECT    STATE
                                                    FROM      T
                                                    WHERE     T.ORDER_DETAIL_ID = TRD.ID ) THEN 50--50已到货
                            END
                FROM   TRD_ORDER_DETAIL TRD
                JOIN   T
                ON     T.ORDER_DETAIL_ID = TRD.ID
                WHERE TRD.STATE <> 30 AND TRD.STATE<>70;--新加条件


                --根据订单明细表状态更新订单表状态
                WITH    T AS (
                        SELECT   ORDER_ID ,
                                 STATE ,
                                 COUNT(1) Qty
                        FROM     TRD_ORDER_DETAIL T WHERE T.STATE IN(10,20,30,40,50)
                        GROUP BY ORDER_ID ,
                                STATE
                        )
                UPDATE TRD_ORDER
                SET    STATE = CASE 
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 20 , 10 )--卖家已发货和卖家未阅读
                                        ) = 2 THEN 30--已发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 10 , 40 )--卖家未阅读和部分到货
                                        ) = 2 THEN 50--部分发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 10 , 50 )--卖家未阅读和已到货
                                        ) = 2 THEN 50--部分发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 20 , 40 )--卖家已发货和部分到货
                                        ) = 2 THEN 50--部分发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 20 , 30 )--卖家已发货和处理中
                                        ) = 2 THEN 40--处理中
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 40 , 30 )--部分到货和处理中
                                        ) = 2 THEN 40--处理中
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 20 , 50 )--卖家已发货和已到货
                                        ) = 2 THEN 50--部分发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 40 , 50 )--部分到货和已到货
                                        ) = 2 THEN 50--部分发货
                                    WHEN (
                                        SELECT  COUNT(1)
                                        FROM    T
                                        WHERE   T.ORDER_ID = TRD.ID AND
                                                T.STATE IN ( 30 , 50 )--处理中和已到货
                                        ) = 2 THEN 40--处理中
                                    WHEN 10=ALL ( SELECT STATE
                                                    FROM   T
                                                    WHERE  T.ORDER_ID = TRD.ID ) THEN 10--卖家未阅读
                                    WHEN 20=ALL ( SELECT STATE
                                                    FROM   T
                                                    WHERE  T.ORDER_ID = TRD.ID ) THEN 30--卖家已发货
                                    WHEN 40=ALL ( SELECT    STATE
                                                    FROM      T
                                                    WHERE     T.ORDER_ID = TRD.ID ) THEN 50--部分发货
                                    WHEN 50=ALL ( SELECT    STATE
                                                    FROM      T
                                                    WHERE     T.ORDER_ID = TRD.ID ) THEN 60--已到货
                                    WHEN 30=ALL ( SELECT    STATE
                                                    FROM      T
                                                    WHERE     T.ORDER_ID = TRD.ID ) THEN 40--处理中
                            END
                FROM   TRD_ORDER TRD
                JOIN   T
                ON     T.ORDER_ID = TRD.ID
                WHERE TRD.STATE <> 40 AND TRD.STATE<>80; --新加条件 

                --未全部到货的订单明细和订单数据状态为处理中
                UPDATE TRD_ORDER_DETAIL SET STATE=30
                FROM TRD_ORDERFORM_CONTENT AS T
                JOIN TRD_ORDER_DETAIL AS T1 
                ON T.ORDER_DETAIL_ID=T1.ID
                JOIN TRD_ORDER AS T2
                ON T1.ORDER_ID=T2.ID
                WHERE T.SEND_AMOUNT>T.OVER_AMOUNT AND T.OVER_AMOUNT<>0

                UPDATE TRD_ORDER SET STATE=40
                FROM TRD_ORDERFORM_CONTENT AS T
                JOIN TRD_ORDER_DETAIL AS T1 
                ON T.ORDER_DETAIL_ID=T1.ID
                JOIN TRD_ORDER AS T2
                ON T1.ORDER_ID=T2.ID
                WHERE T.SEND_AMOUNT>T.OVER_AMOUNT AND T.OVER_AMOUNT<>0;


                

                --SET @MSG='到货成功。'

                --赋值日志记录参数------------
                SET @_opertype=20
                SET @_title='按订单到货确认'
                SET @_desc='订单ID为:'+CAST(@ORDERID AS VARCHAR(20)) +'的订单信息'
                ----------------------------
        END
    ELSE
        BEGIN
                --返回到货ID拼接字符串
                SET @OFCIDS=''

                DECLARE @TB TABLE (
                                    PO_ID                INT,                    --采购单ID
                                    PO_ITEM_ID            INT,                    --采购明细ID
                                    OF_ID                INT,                    --订单ID
                                    OF_ITEM_ID            INT,                    --订单明细ID
                                    OFC_ID                INT,                    --订单明细内容ID
                                    PUR_CMMD_ID            INT,                    --可采购商品ID
                                    AMOUNT                NUMERIC(18,4),            --入库数量
                                    CODE                VARCHAR(32)                --单号
                                  )
                
                INSERT INTO @TB(PO_ID,PO_ITEM_ID,OF_ID,OF_ITEM_ID,OFC_ID,PUR_CMMD_ID,AMOUNT) 
                SELECT TOD.PURCHASE_ID,TOD.PURCHASE_DETAIL_ID,TOD.ORDER_ID,TOD.ID,TOC.ID,TOC.PUR_CMMD_ID,CAST(TEM.AMOUNT AS NUMERIC(18,4))
                FROM @TEMP AS TEM
                INNER JOIN TRD_ORDERFORM_CONTENT    AS TOC        --订单明细内容表
                ON TEM.ID=TOC.ID
                INNER JOIN TRD_ORDER_DETAIL    AS TOD            --订单明细表
                ON TOC.ORDER_DETAIL_ID=TOD.ID

                --验证是否重复到货
                IF EXISTS (SELECT TOP 1 1 
                           FROM  @TB AS T 
                           INNER JOIN TRD_ORDERFORM_CONTENT AS TOC
                           ON T.OFC_ID=TOC.ID AND TOC.[STATE]=40

                                    )
                BEGIN
                    SET  @MSG='该订单下包含已到货的数据,请刷新后重新到货。'
                    RETURN ;
                END


                --------------------------------批量更新订单明细内容表【开始】---------------------------------------------------------
                --更新订单内容表状态为【完成】、到货数量、到货金额
                UPDATE TRD_ORDERFORM_CONTENT
                SET [STATE]=40,
                    [OVER_AMOUNT]=TB.AMOUNT,
                    OVER_SUM=TB.AMOUNT*TOD.TRD_PRICE,--*TOD.SEND_MEASURE_EX,
                    LAST_UPDATE_USER_ID=@OPER_USER_ID,
                    LAST_UPDATE_USER=@OPER_USER_NAME,
                    LAST_UPDATE_DATE=GETDATE()
                FROM @TB AS TB 
                INNER JOIN TRD_ORDER_DETAIL AS TOD        --订单明细表
                ON TB.OF_ITEM_ID=TOD.ID
                WHERE TRD_ORDERFORM_CONTENT.ID=TB.OFC_ID
                --------------------------------批量更新订单明细内容表【结束】---------------------------------------------------------


                --定义保存订单明细的表变量。到货的批次可能对应多个订单明细。
                 DECLARE @TB_GROUP TABLE(
                                             OF_ID INT,                        --订单ID
                                             OF_ITEM_ID INT,                --订单明细ID
                                             CON_AMOUNT NUMERIC(18,4),        --入库数量的和
                                             PO_ID INT,                        --采购单ID
                                             PO_ITEM_ID INT                    --采购单明细ID
                                           )

                 --向订单明细的表变量插入数据
                 INSERT INTO @TB_GROUP(OF_ID ,OF_ITEM_ID ,CON_AMOUNT ,PO_ID ,PO_ITEM_ID)
                 SELECT OF_ID,OF_ITEM_ID,SUM(AMOUNT) ,PO_ID ,PO_ITEM_ID
                 FROM @TB 
                 GROUP BY OF_ID,OF_ITEM_ID ,PO_ID ,PO_ITEM_ID

                -----------------------------------批量更新订单明细表:更新到货金额、到货数量、状态【开始】----------------------------

                --批量更新订单明细
                --说明:如果某订单明细下内容表数据的到到货数量大于订单明细的采购数量
                --      (暂时不考虑这种情况--->>并且内容表数据的状态没有小于40的,则将订单明细状态更新为70【完成】,否则为40【部分到货】)
                UPDATE TRD_ORDER_DETAIL    --订单明细表
                SET TRD_ORDER_DETAIL.OVER_AMOUNT= ISNULL(TRD_ORDER_DETAIL.OVER_AMOUNT,0) +TMP.CON_AMOUNT, --到货数量
                    TRD_ORDER_DETAIL.OVER_SUM=ISNULL(TRD_ORDER_DETAIL.OVER_SUM,0)+TRD_ORDER_DETAIL.TRD_PRICE*TMP.CON_AMOUNT,--*TRD_ORDER_DETAIL.SEND_MEASURE_EX,--到货金额
                    TRD_ORDER_DETAIL.[STATE]= (CASE WHEN TRD_ORDER_DETAIL.AMOUNT<=(ISNULL(TRD_ORDER_DETAIL.OVER_AMOUNT,0) +TMP.CON_AMOUNT) 
                                                    --AND  NOT EXISTS(SELECT TOP 1 1 FROM TRD_ORDERFORM_CONTENT WHERE ORDER_DETAIL_ID=TMP.OF_ITEM_ID  AND [STATE]<40) 
                                                 THEN 70 ELSE 40  END),--状态
                    TRD_ORDER_DETAIL.LAST_UPDATE_USER_ID = @OPER_USER_ID, 
                    TRD_ORDER_DETAIL.LAST_UPDATE_USER     = @OPER_USER_NAME,    
                    TRD_ORDER_DETAIL.LAST_UPDATE_DATE = GETDATE()
                FROM 
                    (
                        SELECT SUM(CON_AMOUNT) AS CON_AMOUNT ,OF_ITEM_ID 
                        FROM @TB_GROUP
                        GROUP BY OF_ITEM_ID ) AS TMP
                WHERE TRD_ORDER_DETAIL.ID=TMP.OF_ITEM_ID 

                -----------------------------------批量更新订单明细表:更新到货金额、到货数量、状态【结束】----------------------------


                -----------------------------------批量更新订单:更新到货金额、到货数量、状态【开始】-----------------------------------

                /*
                    更新说明:
                    1.汇总某订单下订单明细状态为【完成】的订单明细的到货金额,然后更新某订单的到货金额。
                    2.如果某订单下存在<60状态的订单明细则更新该订单为【50:部分到货】状态,否则更新为【80:完成】。
                */

                 UPDATE TRD_ORDER    --订单表
                 SET TRD_ORDER.OVER_ACCOUNT=TB.OVER_AllSUM,
                    [STATE]=CASE WHEN NOT EXISTS(SELECT TOP 1 1 FROM TRD_ORDER_DETAIL WHERE ORDER_ID=TB.ORDER_ID AND [STATE]<60)  THEN 80 ELSE 50 END,
                    TRD_ORDER.LAST_UPDATE_USER_ID = @OPER_USER_ID, 
                    TRD_ORDER.LAST_UPDATE_USER     = @OPER_USER_NAME,    
                    TRD_ORDER.LAST_UPDATE_DATE = GETDATE()
                 FROM (
                            SELECT  TOD.ORDER_ID,SUM(ISNULL(TOD.OVER_SUM,0)) AS OVER_AllSUM 
                            FROM TRD_ORDER_DETAIL AS TOD ,
                            ( 
                                SELECT TOP 1 OF_ID FROM @TB_GROUP
                            ) AS TMP
                            WHERE TOD.ORDER_ID=TMP.OF_ID  AND TOD.[STATE]!=60  --统计完成的订单明细到货金额 
                            GROUP BY TOD.ORDER_ID 
                      ) AS TB 
                 WHERE TRD_ORDER.ID=TB.ORDER_ID  

                -----------------------------------批量更新订单:更新到货金额、到货数量、状态【结束】------------------------------------


                
                -----------------------------------批量更新采购单明细表采购到货数量、采购到货金额【开始】-------------------------------------

                UPDATE TRD_PURCHASE_DETAIL  --采购单明细表
                SET TRD_PURCHASE_DETAIL.OVER_AMOUNT = TRD_PURCHASE_DETAIL.OVER_AMOUNT + TB.CON_AMOUNT,
                     TRD_PURCHASE_DETAIL.OVER_ACCOUNT = TRD_PURCHASE_DETAIL.OVER_ACCOUNT + TRD_PURCHASE_DETAIL.PRICE * TB.CON_AMOUNT,-- * TRD_PURCHASE_DETAIL.SEND_MEASURE_EX,
                     TRD_PURCHASE_DETAIL.LAST_UPDATE_USER_ID = @OPER_USER_ID, 
                     TRD_PURCHASE_DETAIL.LAST_UPDATE_USER     = @OPER_USER_NAME,    
                     TRD_PURCHASE_DETAIL.LAST_UPDATE_DATE = GETDATE()
                FROM 
                    (    
                        SELECT SUM(CON_AMOUNT) AS CON_AMOUNT ,PO_ITEM_ID FROM @TB_GROUP
                        GROUP BY PO_ITEM_ID 
                    ) AS TB
                WHERE TRD_PURCHASE_DETAIL.ID=TB.PO_ITEM_ID
                

                
                -----------------------------------------------------

                -----------------------------------批量更新采购单明细表采购到货数量、采购到货金额【结束】-------------------------------------

                -----------------------------------更新采购单主表状态【开始】-----------------------------------------------------------------

                /*
                    说明:
                        获取该采购单下的所有订单,统计其订单状态的最小值,
                        如果最小值>=70,那么说明该采购单下的订单已完成,可以把该采购单关闭
                        否则,把该采购单的状态置成【50,处理中状态】
                */

                UPDATE TRD_PURCHASE
                SET TRD_PURCHASE.[STATE]=CASE WHEN TEMP.[STATE]>=70  THEN 60 ELSE 50 END,
                    TRD_PURCHASE.LAST_UPDATE_USER_ID = @OPER_USER_ID, 
                    TRD_PURCHASE.LAST_UPDATE_USER     = @OPER_USER_NAME,    
                    TRD_PURCHASE.LAST_UPDATE_DATE = GETDATE()
                FROM 
                (
                    SELECT MIN(TOR.[STATE]) AS [STATE] ,TG.PO_ID 
                    FROM (
                            SELECT TOP 1 PO_ID  FROM @TB_GROUP ) AS TG,TRD_ORDER  AS TOR
                    WHERE TG.PO_ID=TOR.PURCHASE_ID 
                    GROUP BY  TG.PO_ID
                ) AS  TEMP
                WHERE TRD_PURCHASE.ID=TEMP.PO_ID

                -----------------------------------更新采购单主表状态【结束】------------------------------------------------------------------

                -----------------------------------插入到货单表数据【开始】------------------------------------------------------------------------

                DECLARE @ASO_CODE VARCHAR(32)=''    --到货单编码
                DECLARE @OFC_ID    INT                --订单明细内容ID

                --定义游标
                DECLARE UPDATE_CODE_CURSOR CURSOR  LOCAL FORWARD_ONLY FOR
                SELECT OFC_ID FROM @TB

                OPEN UPDATE_CODE_CURSOR        --打开游标

                FETCH NEXT FROM UPDATE_CODE_CURSOR INTO @OFC_ID

                WHILE @@FETCH_STATUS=0
                    BEGIN

                        --生成到货单编码
                        EXEC SYS_Common_CreateCode 'TRD_ASO','DH',@ASO_CODE OUTPUT
            
                        --更新到货单单号
                        UPDATE @TB
                        SET CODE=@ASO_CODE
                        WHERE OFC_ID=@OFC_ID

                        --SET @OFCIDS=@OFCIDS+CAST(@OFC_ID AS VARCHAR(24))+',';

                        FETCH NEXT FROM UPDATE_CODE_CURSOR INTO @OFC_ID
                    END

                CLOSE UPDATE_CODE_CURSOR        --关闭游标
                DEALLOCATE UPDATE_CODE_CURSOR    --释放游标占用资源


                --插入到货单
                INSERT INTO TRD_ASO
                (
                    PLAT_ID,                    --平台ID
                    [TYPE],                        --到货类型
                    CODE,                        --到货单编码
                    OF_ID,                        --订单ID
                    OF_ITEM_ID,                    --订单明细ID
                    OF_ITEM_CONTENT_ID,            --订单内容明细ID
                    DC_BUYER_ID,                --中心买方ID
                    BUYER_NAME,                    --买方名称
                    SENDER_ID,                    --配送商ID
                    SENDER_NAME,                --配送商名称
                    SENDER_ABBR,                --配送商简称
                    DC_PRODUCT_ID,                --中心产品ID
                    PUR_CMMD_ID,                --可采购商品ID
                    PRODUCT_NAME,                --产品名
                    COMMERCE_NAME,                --商品名
                    COMMON_NAME,                --通用名
                    BRAND,                        --品牌
                    BASE_MEASURE,                --基本计量单位
                    SPEC,                        --规格
                    BATCH_NO,                    --生产批号
                    STERILIZATION_BATCH_NO,        --灭菌批号
                    VAILD_DATE,                    --失效日期
                    PRODUCTION_DATE,            --生产日期
                    --DEGREE,                        --度数
                    MIRROR_BALL,                --球镜
                    CONCAVE_CYLINDER,            --柱镜
                    PN,                            --主码
                    SN,                            --次码
                    Invoice_No,                    --发票号
                    MANU_ID,                    --生产企业ID
                    MANU_NAME,                    --生产企业名称
                    MANU_ABBR,                    --生产企业简称
                    SEND_MEASURE,                --到货计量单位
                    SEND_MEASURE_EX,            --到货单位转换率
                    ARRIVE_DATE,                --到货时间
                    CER_NO,                        --证书号
                    CER_VALID_DATE,                --证书效期
                    REG_START_DATE,                --证书有效期开始日期
                    CER_PRODUCT_NAME,            --证书产品名称
                    QUALITY_LEVEL,                --质量层次
                    DESCRIPTIONS,                --产品描述
                    --STORE_ID,                    --到货库房ID
                    --STORE_NAME,                    --到货库房名称
                    --DEPOT_ID,                    --货位ID
                    --DEPOT_NAME,                    --货位名称
                    FACT_AMOUNT,                --实际到货数量
                    PRICE,                        --采购价格
                    FACT_ACCOUNT,                --实际到货金额
                    [STATE],                    --到货单状态
                    --SEND_OPERATOR_NAME,            --卖方发货人
                    --SEND_OPERATE_DATE,            --卖方发货人发货时间
                    INSTORE_OPERATOR_ID,        --买方收货人ID
                    INSTORE_OPERATOR_NAME,        --买方收货人
                    BACK_AMOUNT,                --退货数量
                    BACK_ACCOUNT,                --退货金额
                    MODIFIER_ID,                --修改人ID
                    MODIFIER,                    --修改人
                    MODIFY_DATE                    --修改时间

                )
                SELECT 
                TOE.PLAT_ID,
                20,                            --高值类到货单
                TMP.CODE,
                TOE.ID,
                TOD.ID,
                TOC.ID,
                TOD.DC_BUYER_ID,
                TOE.BUYER_NAME,
                TOD.SENDER_ID,
                TOD.SENDER_NAME,
                TOD.SENDER_ABBR,
                TOD.DC_PRODUCT_ID,
                TOD.PUR_CMMD_ID,
                TOD.PRODUCT_NAME,
                TOD.COMMERCE_NAME,
                TOD.COMMON_NAME,
                TOD.BRAND,
                TOD.BASE_MEASURE,
                TOD.SPEC,
                TOC.BATCH_NO,
                TOC.STERILIZATION_BATCH_NO,
                ISNULL(TOC.VAILD_DATE,'1900-01-01'),
                ISNULL(TOC.PRODUCTION_DATE,'1900-01-01'),
                --TOC.DEGREE,
                ISNULL(TOC.MIRROR_BALL,''),
                ISNULL(TOC.CONCAVE_CYLINDER,''),
                ISNULL(TOC.PN,'') AS PN,
                ISNULL(TOC.SN,'') AS SN,
                --CASE WHEN RTRIM(LTRIM(ISNULL(TOC.PN,'')))='' THEN '0' ELSE TOC.PN END  AS PN,
                --CASE WHEN RTRIM(LTRIM(ISNULL(TOC.SN,'')))='' THEN '0' ELSE TOC.SN END AS SN,
                TOC.INVOICE_NO,
                TOD.MANU_ID,
                TOD.MANU_NAME,
                TOD.MANU_ABBR,
                TOD.SEND_MEASURE,
                TOD.SEND_MEASURE_EX,
                GETDATE(),
                TOD.CER_NO,
                TOD.CER_VALID_DATE,
                TOD.CER_START_DATE,
                TOD.CER_PRODUCT_NAME,
                TOD.QUALITY_LEVEL,
                TOD.DESCRIPTIONS,
                --@STOCK_ID,
                --@STOCK_NAME,
                --@DEPOT_ID,
                --@DEPOT_NAME,
                TMP.AMOUNT,
                TOD.TRD_PRICE,
                TMP.AMOUNT*TOD.TRD_PRICE,--*TOD.SEND_MEASURE_EX,
                10,--完成
                @OPER_USER_ID,
                @OPER_USER_NAME,
                0,
                0,
                @OPER_USER_ID,
                @OPER_USER_NAME,
                GETDATE()

            FROM @TB AS TMP
            INNER JOIN TRD_ORDERFORM_CONTENT AS TOC --订单明细内容表
            ON TMP.OFC_ID=TOC.ID
            INNER JOIN TRD_ORDER_DETAIL AS TOD    --订单明细表
            ON TOC.ORDER_DETAIL_ID=TOD.ID
            INNER JOIN TRD_ORDER AS TOE --订单表
            ON TOD.ORDER_ID=TOE.ID

            -----------------------------------插入到货单表数据【结束】--------------------------------------------------------------------------
        
              
                DECLARE  @oneStroe        INT        --一级库ID
                DECLARE  @oneStroeName    NVARCHAR(128) --一级库名称
                DECLARE  @oneDepot        INT        --一级库货位
                DECLARE     @oneDepotName    NVARCHAR(128)    --一级货位名称

                --获取一级库房
                SELECT TOP 1 @oneStroe=ID,@oneStroeName=NAME
                FROM TRD_STORE 
                WHERE ONE_LIBRARY_FLAG=1

                --获取一级库房货位
                SELECT TOP 1 @oneDepot=ID,@oneDepotName=NAME
                FROM TRD_DEPOT 
                WHERE STORE_ID=(SELECT TOP 1 ID FROM TRD_STORE WHERE ONE_LIBRARY_FLAG=1)


                DECLARE @PREPARE_CODE VARCHAR(32)=''    --到货单编码

                --生成备货单编码
                EXEC SYS_Common_CreateCode 'TRD_PREPARE','BH',@PREPARE_CODE OUTPUT
                --备货单表
                INSERT INTO TRD_PREPARE
                    (
                        PREPARE_CODE,           --备货单号
                        [STATE],                --状态
                        RELATED_ID,                --关联单据ID
                        RELATED_CODE,            --关联单据号
                        STORE_ID,
                        STORE_NAME,
                        SENDER_ID,                --配送商ID
                        SENDER_NAME,            --配送商名称
                        SENDER_ABBR,            --配送商简称
                        AMOUNT,                    --数量
                        ACCOUNT,                --金额
                        CONFIRMED_AMOUNT,        --确认数量
                        CONFIRMED_ACCOUNT,        --确认金额
                        USED_AMOUNT,            --使用数量
                        USED_ACCOUNT,            --使用金额
                        REJECT_AMOUNT,            --退货数量
                        REJECT_ACCOUNT,            --退货金额
                        IS_SETTLEMENT,            --是否结算
                        REMARK,                    --备注
                        CREATE_USER_ID,            --创建人ID
                        CREATE_USER,            --创建人
                        CREATE_DATE,            --创建时间
                        LAST_UPDATE_USER_ID,    --最后修改人ID
                        LAST_UPDATE_USER,        --最后修改人
                        LAST_UPDATE_DATE        --最后修时间
                    )
                SELECT TOP 1  @PREPARE_CODE,
                        30,
                        TOR.ID,
                        TOR.CODE,
                        @oneStroe,
                        @oneStroeName,
                        TOR.SENDER_ID,
                        TOR.SENDER_NAME,
                        TOR.SENDER_ABBR,
                        SUM(TEM.AMOUNT),
                        SUM(TEM.AMOUNT*TOD.TRD_PRICE),
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        1,
                        '采购到货插入备货单主表',
                        @OPER_USER_ID,
                        @OPER_USER_NAME,
                        GETDATE(),
                        @OPER_USER_ID,
                        @OPER_USER_NAME,
                        GETDATE()
                FROM @TEMP  AS TEM
                INNER JOIN TRD_ORDERFORM_CONTENT AS TOC --订单明细内容表
                ON TEM.ID=TOC.ID
                INNER JOIN TRD_ORDER_DETAIL AS TOD    -- 订单明细表
                ON TOC.ORDER_DETAIL_ID=TOD.ID
                INNER JOIN TRD_ORDER AS TOR     --订单表
                ON TOD.ORDER_ID=TOR.ID
                GROUP BY TOR.ID,TOR.CODE,TOR.SENDER_ID,TOR.SENDER_NAME,TOR.SENDER_ABBR

                DECLARE  @rtnID            INT  --返回备货单主表ID
                        
                --获取新增行ID
                SET @rtnID = SCOPE_IDENTITY()
                SET @OFCIDS= CAST(@rtnID AS VARCHAR(24))+''
                --备货单明细表
                INSERT INTO TRD_PREPARE_DETAIL
                    (
                         PREPARE_ID,
                        [STATE],                --状态
                        RELATED_ID,                --关联单据ID
                        RELATED_DETAIL_ID,        --关联单据明细ID
                        STORE_ID,
                        STORE_NAME,
                        DEPOT_ID,
                        DEPOT_NAME,
                        AMOUNT,                    --数量
                        PRICE,                    --单价
                        ACCOUNT,                --金额
                        CONFIRMED_AMOUNT,        --确认数量
                        CONFIRMED_ACCOUNT,        --确认金额
                        USED_AMOUNT,            --使用数量
                        USED_ACCOUNT,            --使用金额
                        REJECT_AMOUNT,            --退货数量
                        REJECT_ACCOUNT,            --退货金额
                        MANU_ID,                --生产企业ID
                        MANU_NAME,                --生产企业名称
                        MANU_ABBR,                --生产企业简称
                        REMARK,                    --备注
                        CREATE_USER_ID,            --创建人ID
                        CREATE_USER,            --创建人
                        CREATE_DATE,            --创建时间
                        LAST_UPDATE_USER_ID,    --最后修改人ID
                        LAST_UPDATE_USER,        --最后修改人
                        LAST_UPDATE_DATE,        --最后修改时间
                        SENDER_ID,                --配送商ID
                        SENDER_NAME,            --配送商名称
                        SENDER_ABBR,            --配送商简称
                        DC_PRODUCT_ID,            --中心产品ID
                        PUR_CMMD_ID,            --可采购商品ID
                        PRODUCT_NAME,            --产品名
                        COMMERCE_NAME,            --商品名
                        COMMON_NAME,            --通用名
                        BRAND,                    --品牌
                        BASE_MEASURE,            --基本计量单位
                        SPEC,                    --规格
                        BATCH_NO,                --生产批号
                        STERILIZATION_BATCH_NO,    --灭菌批号
                        VAILD_DATE,                --失效日期
                        PRODUCTION_DATE,        --生产日期
                        MIRROR_BALL,            --球镜
                        CONCAVE_CYLINDER,        --柱镜
                        PN,                        --主码
                        SN                        --次码

                    )
                SELECT  @rtnID,
                        10,
                        TOR.ID,
                        TOC.ID,
                        @oneStroe,
                        @oneStroeName,
                        @oneDepot,
                        @oneDepotName,
                        TEM.AMOUNT,
                        TOD.TRD_PRICE,
                        TEM.AMOUNT*TOD.TRD_PRICE,--*TOD.SEND_MEASURE_EX,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        TOD.MANU_ID,
                        TOD.MANU_NAME,
                        TOD.MANU_ABBR,
                        TEM.REMARK,
                        @OPER_USER_ID,
                        @OPER_USER_NAME,
                        GETDATE(),
                        @OPER_USER_ID,
                        @OPER_USER_NAME,
                        GETDATE(),
                        TOD.SENDER_ID,
                        TOD.SENDER_NAME,
                        TOD.SENDER_ABBR,
                        TOD.DC_PRODUCT_ID,
                        TOD.PUR_CMMD_ID,
                        TOD.PRODUCT_NAME,
                        TOD.COMMERCE_NAME,
                        TOD.COMMON_NAME,
                        TOD.BRAND,
                        TOD.BASE_MEASURE,
                        TOD.SPEC,
                        TOC.BATCH_NO,
                        TOC.STERILIZATION_BATCH_NO,
                        ISNULL(TOC.VAILD_DATE,'1900-01-01'),
                        ISNULL(TOC.PRODUCTION_DATE,'1900-01-01'),
                        TOC.MIRROR_BALL,
                        TOC.CONCAVE_CYLINDER,
                        ISNULL(TOC.PN,'') AS PN,
                        ISNULL(TOC.SN,'') AS SN
                        --CASE WHEN RTRIM(LTRIM(ISNULL(TOC.PN,'')))='' THEN '0' ELSE TOC.PN END  AS PN,
                        --CASE WHEN RTRIM(LTRIM(ISNULL(TOC.SN,'')))='' THEN '0' ELSE TOC.SN END AS SN
                        
                FROM @TEMP  AS TEM
                INNER JOIN TRD_ORDERFORM_CONTENT AS TOC --订单明细内容表
                ON TEM.ID=TOC.ID
                INNER JOIN TRD_ORDER_DETAIL AS TOD    -- 订单明细表
                ON TOC.ORDER_DETAIL_ID=TOD.ID
                INNER JOIN TRD_ORDER AS TOR     --订单表
                ON TOD.ORDER_ID=TOR.ID



                --赋值日志记录参数------------
                SET @_opertype=10
                SET @_title='有备货,插入备货表、修改订单内容表、订单明细表、订单表、采购明细表、采购表、插入到货单表'
                SET @_desc='订单ID为:'+CAST(@ORDERID AS VARCHAR(20)) +'的订单信息'
                ----------------------------
        END

        EXEC  TRD_Common_TradeLog_Insert
              @ORG_ID = 0, 
              @TITLE = '采购到货',   
              @PLAT_ID = 0, 
              @TYPE = 0,    
              @DESCRIPTION = @_desc,  
              @OPERATOR_ID = @OPER_USER_ID, 
              @OPERATOR = @OPER_USER_NAME  
     
END

 

posted @ 2017-02-20 15:09  安之&若素  阅读(158)  评论(0)    收藏  举报