项目存储过程记录

CREATE DEFINER=`sas_settle`@`%` PROCEDURE `P_CREATE_ACCOUNT_CARRIER_TASK`()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE v_flow_id VARCHAR(10);                        -- 流水号
    DECLARE v_prefix VARCHAR(10) DEFAULT 'JS'; -- 业务前缀
    
    #账期任务字段
    DECLARE v_belong VARCHAR(20);            -- 帐号
    DECLARE v_parent_id VARCHAR(20);    -- 父帐号
    DECLARE v_member_name VARCHAR(50); -- 结算商家
    DECLARE v_title_type INT;    -- 结算类型
    DECLARE v_title VARCHAR(2);            -- 结算日
    DECLARE v_year VARCHAR(4);                -- 年度
    DECLARE v_month VARCHAR(2);    -- 月度
    DECLARE v_set_no_type VARCHAR(2);      -- 账户类型(0:铁运 1:非铁运)
    DECLARE v_vip_type VARCHAR(2);        -- 用户类型    1:个人;2:企业
    DECLARE v_start_date DATE DEFAULT NOW(); -- 结算起始日期
    DECLARE v_end_date DATE DEFAULT NOW(); -- 结算结束日期
    DECLARE v_last_period_end DATE ; -- 上期结算结束日期
    DECLARE v_flag INT DEFAULT 0; -- 是否生成任务
    DECLARE v_last_title_type INT;-- 上期任务的结算类型
    DECLARE v_count INT DEFAULT 0; -- 同一个用户未执行任务存在的数目

    DECLARE y_year VARCHAR(4) DEFAULT YEAR(NOW()); -- 年份
    DECLARE i INT DEFAULT 0; -- 遍历标识
    #声明游标:所有年份
        #DECLARE y_cursor CURSOR FOR 
            #SELECT y.`YEAR` FROM sas_year y;
    
    #声明游标:清算日为当天且未生成任务的用户
    DECLARE v_cursor CURSOR FOR
        SELECT
            ME.BELONG,
            me.MEMBER_NAME,
            me.PARENT_ID,
            mri.TITLE,
            mri.TITLE_TYPE,
            mri.VIP_TYPE,
            mri.ACCOUNT_TYPE,
            YEAR (NOW()) YY,
            (SELECT tt.PERIOD_END FROM sas_task_carrier_pay_order_period tt 
                WHERE tt.BELONG = me.BELONG 
                ORDER BY tt.CREATE_TIME DESC LIMIT 0,1) last_period_end,
            (SELECT tt.SET_TYPE FROM sas_task_carrier_pay_order_period tt 
                WHERE tt.BELONG = me.BELONG 
                ORDER BY tt.CREATE_TIME DESC LIMIT 0,1) last_title_type
        FROM sas_member ME
        LEFT JOIN sas_member_rule_info mri ON (
            me.PARENT_ID = mri.USER_ID
            OR me.BELONG = mri.USER_ID
        ) AND mri.ENABLE_STATUS = 1
        WHERE me.ENABLE_STATUS = 1 
         AND NOT EXISTS (
            SELECT 1
            FROM sas_task_account_carrier_period t
            WHERE t.BELONG = me.BELONG
            #结算日为当天(月结周结)
            AND CASE WHEN mri.TITLE_TYPE = '10' THEN t.SET_DATE = WEEKDAY(now()) + 1 and t.SET_TYPE=10 and DATE_SUB(str_to_date(NOW(),'%Y-%m-%d'),INTERVAL 1 day) =t.PERIOD_END
            WHEN mri.TITLE_TYPE = '20' THEN t.SET_DATE = DAYOFMONTH(now()) and t.SET_TYPE=20  and DATE_SUB(str_to_date(NOW(),'%Y-%m-%d'),INTERVAL 1 day) =t.PERIOD_END
            #一单一结
            WHEN mri.TITLE_TYPE = '1' THEN t.TASK_STATUS = 0 and t.SET_TYPE=1
            END
        ) AND EXISTS(
            SELECT 1
            FROM sas_order_reports r
            #清算报表存在没出账单、未生成账单,没生成过账单,并且是非铁路的账单
            WHERE r.belong=me.belong and r.order_set_status ='10' and r.is_create_account='10' and r.have_create_account='10' and r.IS_RAILWAY!='01'
        )    AND CASE WHEN mri.TITLE_TYPE = '10' OR mri.TITLE_TYPE = '20' THEN
            EXISTS(
            SELECT 1
            FROM sas_order_reports r
            #清算报表存在没出账单、未生成账单,没生成过账单,并且是非铁路的账单
            WHERE r.belong=me.belong and r.order_set_status ='10' and r.is_create_account='10' and r.have_create_account='10' and r.IS_RAILWAY!='01' and r.create_time<=DATE_SUB(str_to_date(NOW(),'%Y-%m-%d'),INTERVAL 1 day)
            ) END;
        
        #如果是一单一结 只生成有账单,且已审核的,且未生成过付款单的
        /*AND CASE WHEN mri.TITLE_TYPE='1' THEN EXISTS (SELECT id from sas_set_account_carrier_2016 s
            where s.BELONG =me.BELONG AND s.set_status='20' AND s.IS_PAYMENT!='1') END;*/
            
    
    
    /* 声明Continue Handler: 当游标到达尾部时,mysql自动设置done=1 */     
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    OPEN v_cursor;
    curLoop:LOOP
        FETCH v_cursor INTO v_belong, v_member_name, v_parent_id, v_title,v_title_type,
        v_vip_type,v_set_no_type,v_year,v_last_period_end,v_last_title_type;
        
        IF done=1 THEN
            LEAVE curLoop;
        END IF;
        SET v_flag = 0;
        #月结
        IF v_title_type IS NOT NULL AND v_title_type = 20 THEN
            
            #账期为当天
            IF v_title IS NOT NULL AND DAY(NOW()) = v_title THEN
                SET v_flag = 1;
                SET v_start_date = DATE_SUB(NOW(), INTERVAL 1 MONTH);
                SET v_end_date = DATE_SUB(NOW(), INTERVAL 1 DAY);
            
            #当帐期为31日时,当月只有30天情况,则本次帐期默认为30日
            ELSEIF v_title IS NOT NULL AND DAY(NOW()) = DAY(LAST_DAY(now())) AND v_title > DAY(LAST_DAY(now())) THEN
                SET v_flag = 1;
                SET v_title = DAY(LAST_DAY(now()));
                SET v_start_date = DATE_SUB(NOW(), INTERVAL 1 MONTH);
                SET v_end_date = DATE_SUB(NOW(), INTERVAL 1 DAY);
            END IF;

        #周结
        ELSEIF v_title_type IS NOT NULL AND v_title_type = 10 THEN
            #结算日为当天
            IF v_title IS NOT NULL AND v_title = WEEKDAY(NOW()) + 1 THEN
                SET v_flag = 1;
                SET v_end_date = DATE_SUB(NOW(), INTERVAL 1 DAY);
                SET v_start_date = DATE_SUB(NOW(), INTERVAL 1 WEEK);
            END IF;
        
        #一单一结
        ELSEIF v_title_type IS NOT NULL AND v_title_type= 1 THEN 
            #账期为清算报表的创建时间(后修改为账期为现在的时间)
            SELECT min(NOW()) INTO v_end_date FROM sas_order_reports r where r.belong=v_belong and r.is_create_account='10' and r.have_create_account='10';
            SET v_start_date=v_end_date;
            SET v_flag=1;
        END IF;


        #如果上期结算结束日期有值,且不是一单一结,则本期账单开始日期 = 上期结束日期 + 1天
        IF v_last_period_end IS NOT NULL AND v_last_period_end <> '' AND v_last_title_type !=1 THEN
            SET v_start_date = DATE_ADD(v_last_period_end, INTERVAL 1 DAY);
        ELSEIF  v_last_period_end IS NOT NULL AND v_last_period_end <> '' AND v_last_title_type =1 THEN
            SET v_start_date =v_last_period_end;
        END IF;
        
        #如果开始时间大于结束时间,设置开始时间等于结束时间
        IF v_start_date>v_end_date THEN
            SET v_start_date=v_end_date;
        END IF;
        
        #排除帐期为空的数据
        IF v_flag = 1 THEN
        
            #获取流水号
            CALL P_GET_SEQNO(v_prefix,'4','0','2',v_flow_id);
            SET v_month = MONTH(v_start_date);
            
            #流水号转换为纯数字
            SET v_flow_id=v_flow_id+0;

            #查询任务重复的数量
            SELECT COUNT(1) into v_count FROM sas_task_account_carrier_period
            WHERE BELONG = v_belong and TASK_STATUS='0' and DATE_FORMAT(CREATE_TIME,'%Y-%m-%d')=DATE_FORMAT(SYSDATE(),'%Y-%m-%d');
            
            #不存在重复才生成
            IF v_count=0 THEN
            #生成任务
            INSERT INTO sas_task_account_carrier_period
            ( `YEAR`,
                `MONTH`,
                PERIOD_START,
                PERIOD_END,
                BELONG,
                PARENT_ID,
                MEMBER_NAME,
                SET_TYPE,
                SET_DATE,
                SET_NO_TYPE,
                TASK_STATUS,
                VIP_TYPE,
                CREATE_BY,
                CREATE_TIME,
                LAST_UPDATE_BY,
                LAST_UPDATE_TIME,
                ENABLE_STATUS,
                FLOW_ID
            ) VALUES (    
                v_year,
                v_month,
                v_start_date,
                v_end_date,
                v_belong,
                v_parent_id,
                v_member_name,
                v_title_type,
                v_title,
                v_set_no_type,
                0,
                v_vip_type,
                'system',SYSDATE(),'system',SYSDATE(),1,v_flow_id
            );
            END IF;
        END IF;
    END LOOP curLoop;

    COMMIT;
END
CREATE DEFINER=`sas_settle`@`%` PROCEDURE `P_CREATE_ACCOUNT_CARRIER`(IN p_task_id INT, -- 任务primary key
    IN p_user_id VARCHAR(20), -- 用户id
    IN p_belong VARCHAR(20), -- 母账号
    IN p_title_type VARCHAR(2), -- 结算类型:'10'周结,'20'月结,'1'现结
    IN p_title VARCHAR(2), -- 结算日
    IN p_set_start DATETIME, -- 账单开始日
    IN p_set_end DATETIME, -- 账单结束日
    IN p_year VARCHAR(4), -- 账单年份
    IN p_month VARCHAR(2), -- 账单月份
    IN p_vip_type VARCHAR(2), -- 用户类型
    IN p_flow_no VARCHAR(10))
BEGIN
    -- 辅助字段
    DECLARE v_table_c varchar(50) DEFAULT 'sas_not_railway_account_carrier_month_pay'; -- 非铁路承运商帐单表
    DECLARE v_table_c_com VARCHAR(50) DEFAULT 'sas_not_railway_account_carrier_month_pay_detail'; -- 非铁路承运商帐单明细表
    DECLARE v_prefix VARCHAR(10) DEFAULT 'JS';-- 业务前缀
    DECLARE v_tmp_count int default 0; -- 临时表数据量
    DECLARE v_min_id INT DEFAULT 1;
    DECLARE v_max_id INT DEFAULT 1;
    DECLARE v_report_id  INT UNSIGNED; -- 清算报表id
    DECLARE v_exception VARCHAR(10) DEFAULT ''; -- 异常处理
    
-- 表头数据

    DECLARE v_sys_code VARCHAR(10) DEFAULT '10';-- 系统来源',
    DECLARE v_member_name VARCHAR(50); -- 清算对象
    DECLARE v_pay_way VARCHAR(2) DEFAULT '1'; -- 账单类型
    DECLARE v_belong VARCHAR(20); -- 用户ID
    DECLARE v_set_date datetime DEFAULT NOW(); -- 账单时间
    DECLARE v_audit_time datetime; -- 审核时间
    DECLARE v_set_no  varchar(30); -- 清算账单号
    -- DECLARE v_p_order_no VARCHAR(30); -- 母订单号
    -- DECLARE v_order_no VARCHAR(30); -- 子订单号
    -- DECLARE v_trans_no VARCHAR(64); -- 运单号
    DECLARE v_pay_money NUMERIC(20,2);-- 账单金额
    DECLARE v_set_status VARCHAR(2) DEFAULT '10'; -- 账单状态
    DECLARE v_pay_status VARCHAR(2) DEFAULT '10'; -- 支付状态
    DECLARE v_is_print_pay VARCHAR(2) DEFAULT '10'; -- 付款单
    DECLARE v_carrier_org_level_code VARCHAR(20) DEFAULT '0001'; -- 承运商组织层级编码

-- 明细数据
  -- DECLARE v_set_no VARCHAR(30); -- 清算账单号,
  DECLARE v_order_no VARCHAR(30); -- 子订单号,
  DECLARE v_trans_no VARCHAR(30); -- 运单号,
  DECLARE v_p_order_no VARCHAR(30); -- 母订单号,
  DECLARE v_year VARCHAR(4) DEFAULT year(NOW()); -- 会计年度,
  DECLARE v_month VARCHAR(2) DEFAULT month(NOW()); -- 会计月度,
  DECLARE v_order_time datetime; -- 订单生成时间,
  DECLARE v_order_money NUMERIC(20,2); -- 订单金额,
  DECLARE v_claiming_value NUMERIC(20,2); -- 声明价值(元),
  DECLARE v_insurance_fee NUMERIC(20,2); -- 保价费,
  DECLARE v_premium NUMERIC(20,2); -- 保价差额,
  DECLARE v_basic_price NUMERIC(20,2); -- 基本运费,
  DECLARE v_rise_price NUMERIC(20,2); -- 上浮运费,
  DECLARE v_platform_buckle_point NUMERIC(20,3); -- 平台扣点,
  DECLARE v_platform_buckle_point_fee NUMERIC(20,2); -- 平台扣点费,
  DECLARE v_rebates_rate NUMERIC(20,3); -- 返点费率,
  DECLARE v_rebates_rate_fee NUMERIC(20,2); -- 返 点 费(母账号),
  DECLARE v_arbitrage_code VARCHAR(30); -- 仲裁单号,
  DECLARE v_carrier_rec_pay NUMERIC(20,2); -- 承运商收赔费,
  DECLARE v_supply_pay NUMERIC(20,2); -- 发货方应付,
  DECLARE v_carrier_verification_freight NUMERIC(20,2); -- 已核销运费(承运商),
  DECLARE v_carrier_denghexiao_money NUMERIC(20,2); -- 等核销金额(承运商),
  DECLARE v_carrier_com_rec NUMERIC(20,2); -- 公司应收(承运商),
  DECLARE v_reverse_money NUMERIC(20,2) DEFAULT 0; -- 冲销金额,
  DECLARE v_platform_discount_rate NUMERIC(20,2); -- 平台扣点折扣率,
  DECLARE v_platform_discount_fee NUMERIC(20,2); -- 平台扣点折扣费,
  DECLARE v_actual_platform_discount_fee NUMERIC(20,2); -- 实际平台扣点费,
  DECLARE v_create_by VARCHAR(20) DEFAULT 'system'; -- 创建人
  DECLARE v_create_time DATETIME DEFAULT NOW(); -- 创建时间
  DECLARE v_enable_status INT DEFAULT 1; -- 数据有效性:默认有效
    
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET v_exception = 'error';
  -- 启动事务
  -- START TRANSACTION; 
  
  -- 创建临时表,用于临时存储承运商账单明细表数据
  DROP TEMPORARY TABLE IF EXISTS account_detail_tmp;
  CREATE TEMPORARY TABLE account_detail_tmp(
      id INT UNSIGNED NOT NULL AUTO_INCREMENT, -- 自增ID
      belong VARCHAR(20), -- 用户ID
      member_name VARCHAR(50), -- 清算对象
      -- set_no VARCHAR(30), -- 清算单号,
      order_no VARCHAR(30), -- 子订单号,
      p_order_no VARCHAR(30), -- 母订单号,
      trans_no VARCHAR(30), -- 运单号,
      -- year VARCHAR(4), -- 会计年度,
      -- month VARCHAR(2), -- 会计月度,
      order_time datetime, -- 订单生成时间,
      order_money NUMERIC(20,2), -- 订单金额,
      claiming_value NUMERIC(20,2), -- 声明价值(元),
      insurance_fee NUMERIC(20,2), -- 保价费,
      premium NUMERIC(20,2), -- 保价差额,
      basic_price NUMERIC(20,2), -- 基本运费,
      rise_price NUMERIC(20,2), -- 上浮运费,
      platform_buckle_point NUMERIC(20,3), -- 平台扣点,
      platform_buckle_point_fee NUMERIC(20,2), -- 平台扣点费,
      rebates_rate NUMERIC(20,3), -- 返点费率,
      rebates_rate_fee NUMERIC(20,2), -- 返 点 费(母账号),
      arbitrage_code VARCHAR(30), -- 仲裁单号,
      carrier_rec_pay NUMERIC(20,2), -- 承运商收赔费,
      supply_pay NUMERIC(20,2), -- 发货方应付,
      carrier_verification_freight NUMERIC(20,2), -- 已核销运费(承运商),
      carrier_denghexiao_money NUMERIC(20,2), -- 等核销金额(承运商),
      carrier_com_rec NUMERIC(20,2), -- 公司应收(承运商),
      platform_discount_rate NUMERIC(20,2), -- 平台扣点折扣率,
      platform_discount_fee NUMERIC(20,2), -- 平台扣点折扣费,
      actual_platform_discount_fee NUMERIC(20,2), -- 实际平台扣点费,
      report_id  INT , -- 清算报表id
      reverse_money NUMERIC(20,2), -- 冲销金额,
      -- create_by VARCHAR(20) DEFAULT 'system', -- 创建人
      -- create_time DATETIME DEFAULT NOW(), -- 创建时间
      -- enable_status INT DEFAULT 1, -- 数据有效性:默认有效
      primary key(id)
  );
      
    IF p_belong IS NOT NULL AND p_belong <> '' THEN
        SET v_belong = p_belong;
    ELSEIF p_user_id IS NOT NULL AND p_user_id <> '' THEN
        SET v_belong = p_user_id;
    END IF;
  
    
    #将清算周期内清算报表的数据插入到临时表
    #为了防止漏单,数据取清算周期最晚时间之前所有没生成过账单的清算报表数据,不需区分清算周期(月结、周结、一单一结)
    SET @insert_tmp_table = CONCAT('insert into account_detail_tmp(belong,member_name,order_no,p_order_no,trans_no,',
            ' order_time,order_money,claiming_value,insurance_fee,premium,basic_price,rise_price,platform_buckle_point,',
            ' platform_buckle_point_fee,rebates_rate,rebates_rate_fee,arbitrage_code,carrier_rec_pay,supply_pay,',
            ' carrier_verification_freight,carrier_denghexiao_money,carrier_com_rec,platform_discount_rate,',
            ' platform_discount_fee,actual_platform_discount_fee,report_id,reverse_money) ',
            ' select r.BELONG,',
            ' (select CARRIER_NAME FROM sas_order_reports WHERE BELONG=',v_belong, ' order by id desc limit 1 ),',
            ' r.ORDER_NO,r.P_ORDER_NO,r.WAYBILL_NO,',
            ' r.ORDER_TIME,r.ORDER_MONEY,r.CLAIMING_VALUE,r.INSURANCE_FEE,r.PREMIUM,r.BASIC_PRICE,r.RISE_PRICE,r.PLATFORM_BUCKLE_POINT,',
            ' r.PLATFORM_BUCKLE_POINT_FEE,r.REBATES_RATE,r.REBATES_RATE_FEE,r.ARBITRAGE_CODE,r.CARRIER_REC_PAY,r.SUPPLY_PAY,',
            ' r.CARRIER_VERIFICATION_FREIGHT,r.CARRIER_DENGHEXIAO_MONEY,r.CARRIER_COM_REC,r.PLATFORM_DISCOUNT_RATE,',
            ' r.PLATFORM_DISCOUNT_FEE,r.ACTUAL_PLATFORM_DISCOUNT_FEE,r.ID,r.REVERSE_MONEY from sas_order_reports r where r.belong = ',v_belong,
            ' and r.ORDER_SET_STATUS !=20 and r.IS_CREATE_ACCOUNT !=20 and r.HAVE_CREATE_ACCOUNT!=20 and r.IS_RAILWAY!=\'01\' and ',
            ' str_to_date(r.create_time,\'%Y-%m-%d\') <= str_to_date(\'',p_set_end,'\',\'%Y-%m-%d\') order by r.id');
    PREPARE insert_tmp_table_stmt FROM @insert_tmp_table;
    EXECUTE insert_tmp_table_stmt;
    
    DEALLOCATE PREPARE insert_tmp_table_stmt;
    
    #查询临时表数据数量
    SELECT COUNT(1) INTO v_tmp_count FROM account_detail_tmp;
            SELECT v_tmp_count;
    
    #如果临时表有数据,正常账单
    IF v_tmp_count>0 THEN
        
        #如果是一单一结那一条账单对应一条订单
        IF p_title_type=1 THEN
        
            #取出临时表的最小id和最大id,用于循环插入明细表
            SELECT min(id) INTO v_min_id FROM account_detail_tmp;
            SELECT max(id) INTO v_max_id FROM account_detail_tmp;
            
            #从临时表查询数据,保存到明细表
            WHILE v_min_id - 1 < v_max_id DO
                
                #获取订单总金额及公共信息(承运商、belong等)用于生成账单表头
                select SUM(carrier_denghexiao_money),member_name,belong,SUM(IFNULL(reverse_money,0)) into v_pay_money,v_member_name,v_belong,v_reverse_money from account_detail_tmp  WHERE id=v_min_id;
                SET v_pay_money = v_pay_money - v_reverse_money;
                #清算账单号
                IF p_flow_no IS NULL THEN
                    CALL P_GET_SEQNO(v_prefix,'4','0','2',p_flow_no);
                END IF;
                
                SET v_set_no = CONCAT(v_prefix, DATE_FORMAT(NOW(),'%Y%m%d%H%i%S'), LPAD(v_min_id, 4, '0'));

                #生成承运商账单(非铁路)表头
                SET @insert_head_sql=CONCAT('insert into ', v_table_c, ' (SYS_CODE,SET_NO,BELONG,MEMBER_NAME,SET_DAY,',
                                    ' SET_TYPE,SET_START,SET_END,YEAR,MONTH,PAY_WAY,SET_DATE,PAY_MONEY,SET_STATUS,PAY_STATUS,',
                                    ' IS_PRINT_PAY,CARRIER_ORG_LEVEL_CODE,CREATE_BY,CREATE_TIME,ENABLE_STATUS) '
                                    ' values(\'',v_sys_code,'\',\'',v_set_no,'\',\'',v_belong,'\',\'',v_member_name,'\',\'',p_title,
                                    ' \',\'',p_title_type,'\',\'',p_set_start,'\',\'',p_set_end,'\',\'',v_year,'\',\'',v_month,'\',\'',v_pay_way,'\',\'',v_set_date,'\',\'',v_pay_money,'\',\'',v_set_status,'\',\'',v_pay_status,
                                    ' \',\'',v_is_print_pay,'\',\'',v_carrier_org_level_code,'\',\'',v_create_by,'\',\'',v_create_time,'\',\'',v_enable_status,'\')');
                PREPARE insert_head_stmt FROM @insert_head_sql;
                EXECUTE insert_head_stmt;
                DEALLOCATE PREPARE insert_head_stmt;
                
                #账单id赋值
            SELECT report_id INTO v_report_id FROM account_detail_tmp WHERE id=v_min_id;
                #生成承运商账单明细(非铁路)
                    SET @insert_detail_sql=CONCAT('insert into ',v_table_c_com,
                        ' (SET_NO,ORDER_NO,TRANS_NO,P_ORDER_NO,YEAR,MONTH,ORDER_TIME,ORDER_MONEY,CLAIMING_VALUE,',
                        ' INSURANCE_FEE,PREMIUM,BASIC_PRICE,RISE_PRICE,PLATFORM_BUCKLE_POINT,PLATFORM_BUCKLE_POINT_FEE,',
                        ' REBATES_RATE,REBATES_RATE_FEE,ARBITRAGE_CODE,CARRIER_REC_PAY,SUPPLY_PAY,CARRIER_VERIFICATION_FREIGHT,',
                        ' CARRIER_DENGHEXIAO_MONEY,CARRIER_COM_REC,CREATE_BY,CREATE_TIME,ENABLE_STATUS,',
                        ' PLATFORM_DISCOUNT_RATE,PLATFORM_DISCOUNT_FEE,ACTUAL_PLATFORM_DISCOUNT_FEE)',
                        ' select \'',v_set_no,'\',order_no,trans_no,p_order_no,','\'',v_year,'\',\'',v_month,'\',order_time,order_money,claiming_value,',
                        ' insurance_fee,premium,basic_price,rise_price,platform_buckle_point,platform_buckle_point_fee,',
                        ' rebates_rate,rebates_rate_fee,arbitrage_code,carrier_rec_pay,supply_pay,carrier_verification_freight,',
                        ' carrier_denghexiao_money,carrier_com_rec,','\'',v_create_by,'\',\'',v_create_time,'\',\'',v_enable_status,
                        ' \', platform_discount_rate,platform_discount_fee,actual_platform_discount_fee from account_detail_tmp where id=', v_min_id);
                    
                PREPARE insert_detail_stmt FROM @insert_detail_sql;
                EXECUTE insert_detail_stmt;
                
                #更新清算报表状态为已生成账单、已生成过账单、已出账单
                SET @update_report_sql=CONCAT('update sas_order_reports set IS_CREATE_ACCOUNT =\'20\', HAVE_CREATE_ACCOUNT=\'20\',ORDER_SET_STATUS=\'20\', LAST_UPDATE_TIME=SYSDATE(),LAST_UPDATE_BY=\'system\'  where id=',v_report_id);
                PREPARE update_report_stmt FROM @update_report_sql;
                EXECUTE update_report_stmt;
                
                SET v_min_id = v_min_id + 1;
            
            
            END WHILE;
            
                #释放资源
                DEALLOCATE PREPARE insert_detail_stmt;
                DEALLOCATE PREPARE update_report_stmt;
            
        
        #月结或周结一个账单对应多个订单
        ELSEIF p_title_type !=1 THEN
    
            
            #明细表
            #取出临时表的最小id和最大id,用于循环插入明细表
            SELECT min(id) INTO v_min_id FROM account_detail_tmp;
            SELECT max(id) INTO v_max_id FROM account_detail_tmp;

#获取订单总金额及公共信息(承运商、belong等)用于生成账单表头
            select SUM(carrier_denghexiao_money),member_name,belong,SUM(IFNULL(reverse_money,0)) into v_pay_money,v_member_name,v_belong,v_reverse_money from account_detail_tmp;
            SET v_pay_money = v_pay_money - v_reverse_money;
            SELECT v_reverse_money,v_pay_money;
            #清算账单号
            IF p_flow_no IS NULL THEN
                CALL P_GET_SEQNO(v_prefix,'4','0','2',p_flow_no);
            END IF;
            
            SET v_set_no = CONCAT(v_prefix, DATE_FORMAT(NOW(),'%Y%m%d%H%i%S'), LPAD(p_flow_no, 4, '0'));

            #生成承运商账单(非铁路)表头
            SET @insert_head_sql=CONCAT('insert into ', v_table_c, ' (SYS_CODE,SET_NO,BELONG,MEMBER_NAME,SET_DAY,',
                                ' SET_TYPE,SET_START,SET_END,YEAR,MONTH,PAY_WAY,SET_DATE,PAY_MONEY,SET_STATUS,PAY_STATUS,',
                                ' IS_PRINT_PAY,CARRIER_ORG_LEVEL_CODE,CREATE_BY,CREATE_TIME,ENABLE_STATUS) '
                                ' values(\'',v_sys_code,'\',\'',v_set_no,'\',\'',v_belong,'\',\'',v_member_name,'\',\'',p_title,
                                ' \',\'',p_title_type,'\',\'',p_set_start,'\',\'',p_set_end,'\',\'',v_year,'\',\'',v_month,'\',\'',v_pay_way,'\',\'',v_set_date,'\',\'',v_pay_money,'\',\'',v_set_status,'\',\'',v_pay_status,
                                ' \',\'',v_is_print_pay,'\',\'',v_carrier_org_level_code,'\',\'',v_create_by,'\',\'',v_create_time,'\',\'',v_enable_status,'\')');
            PREPARE insert_head_stmt FROM @insert_head_sql;
            EXECUTE insert_head_stmt;
            DEALLOCATE PREPARE insert_head_stmt;
            
            #从临时表查询数据,保存到明细表
            WHILE v_min_id - 1 < v_max_id DO
                    
            #账单id赋值
            SELECT report_id INTO v_report_id FROM account_detail_tmp WHERE id=v_min_id;
                #生成承运商账单明细(非铁路)
                    SET @insert_detail_sql=CONCAT('insert into ',v_table_c_com,
                        ' (SET_NO,ORDER_NO,TRANS_NO,P_ORDER_NO,YEAR,MONTH,ORDER_TIME,ORDER_MONEY,CLAIMING_VALUE,',
                        ' INSURANCE_FEE,PREMIUM,BASIC_PRICE,RISE_PRICE,PLATFORM_BUCKLE_POINT,PLATFORM_BUCKLE_POINT_FEE,',
                        ' REBATES_RATE,REBATES_RATE_FEE,ARBITRAGE_CODE,CARRIER_REC_PAY,SUPPLY_PAY,CARRIER_VERIFICATION_FREIGHT,',
                        ' CARRIER_DENGHEXIAO_MONEY,CARRIER_COM_REC,CREATE_BY,CREATE_TIME,ENABLE_STATUS,',
                        ' PLATFORM_DISCOUNT_RATE,PLATFORM_DISCOUNT_FEE,ACTUAL_PLATFORM_DISCOUNT_FEE)',
                        ' select \'',v_set_no,'\',order_no,trans_no,p_order_no,','\'',v_year,'\',\'',v_month,'\',order_time,order_money,claiming_value,',
                        ' insurance_fee,premium,basic_price,rise_price,platform_buckle_point,platform_buckle_point_fee,',
                        ' rebates_rate,rebates_rate_fee,arbitrage_code,carrier_rec_pay,supply_pay,carrier_verification_freight,',
                        ' carrier_denghexiao_money,carrier_com_rec,','\'',v_create_by,'\',\'',v_create_time,'\',\'',v_enable_status,
                        ' \', platform_discount_rate,platform_discount_fee,actual_platform_discount_fee from account_detail_tmp where id=', v_min_id);
                    
                PREPARE insert_detail_stmt FROM @insert_detail_sql;
                EXECUTE insert_detail_stmt;
                DEALLOCATE PREPARE insert_head_stmt;
                
                #更新清算报表状态为已生成账单、已生成过账单、已出账单
                SET @update_report_sql=CONCAT('update sas_order_reports set IS_CREATE_ACCOUNT =\'20\', HAVE_CREATE_ACCOUNT=\'20\',ORDER_SET_STATUS=\'20\', LAST_UPDATE_TIME=SYSDATE(),LAST_UPDATE_BY=\'system\'  where id=',v_report_id);
                PREPARE update_report_stmt FROM @update_report_sql;
                EXECUTE update_report_stmt;
                
                SET v_min_id = v_min_id + 1;
            END WHILE;
            
                #释放资源
                DEALLOCATE PREPARE insert_detail_stmt;
                DEALLOCATE PREPARE update_report_stmt;
        END IF;
    END IF;
    
        #删除临时表
        TRUNCATE TABLE account_detail_tmp;
        DROP TEMPORARY TABLE IF EXISTS account_detail_tmp;
    
        #更新任务状态为“已处理”
        UPDATE sas_task_account_carrier_period 
        SET TASK_STATUS = '1', LAST_UPDATE_TIME = SYSDATE(), LAST_UPDATE_BY = 'system'
        WHERE ID = p_task_id;
    IF v_exception<>'' THEN    /*异常 :回滚*/
        ROLLBACK;
    ELSE
    #提交事务
        COMMIT;
    END IF;
END

 

posted @ 2017-08-14 17:53  Againn  阅读(599)  评论(0编辑  收藏  举报