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