CREATE DEFINER=`sas_settle`@`%` PROCEDURE `P_CREATE_ACCOUNT_CARRIER_TASK`() BEGIN DECLARE done INT DEFAULT 0; DECLARE v_flow_id VARCHAR(10); -- 流水號 DE... ...
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 #如果是一單一結那一條賬單對應一條訂單