diff --git a/database/migrations/create_virtual_order_cards_func.pgsql b/database/migrations/create_virtual_order_cards_func.pgsql index 6db97557..49c3bac3 100644 --- a/database/migrations/create_virtual_order_cards_func.pgsql +++ b/database/migrations/create_virtual_order_cards_func.pgsql @@ -62,50 +62,55 @@ BEGIN FOR i IN 1..array_length(orders, 1) LOOP order_row := orders [ i]; - activated_at := activate_cards -> (order_row->>'sim'); - package_row := packages -> (order_row->>'package_id'); - -- 服务时间 - CASE (order_row->>'type') - WHEN '0' THEN - temp_service_start_at := TO_CHAR(activated_at, 'YYYY-MM-01 00:00:00'); - temp_service_end_at := temp_service_start_at + (package_row->>'service_months' || ' month')::INTERVAL + - (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; - WHEN '1', '2' THEN - IF (temp_service_end_at > (order_row->>'created_at')::TIMESTAMP) THEN - temp_service_start_at := TO_CHAR(temp_service_end_at + '1 month'::INTERVAL, 'YYYY-MM-01 00:00:00'); - ELSE - temp_service_start_at := - TO_CHAR( - (order_row->>'created_at')::TIMESTAMP + (package_row->>'effect_months' || ' month')::INTERVAL, - 'YYYY-MM-01 00:00:00'); - END IF; - temp_service_end_at := - temp_service_start_at + (order_row->>'counts')::INT * (package_row->>'service_months' || ' month')::INTERVAL + - (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; - ELSE - -- 先购买了加油包后再激活的 - IF ((order_row->>'created_at')::TIMESTAMP < activated_at) THEN - IF ((order_row->>'created_at')::TIMESTAMP <= - TO_CHAR(activated_at - '1 month'::INTERVAL, 'YYYY-MM-01 00:00:00')::TIMESTAMP) THEN - -- 购买时间小于一个月的,直接生效 - temp_service_start_at := TO_CHAR(activated_at, 'YYYY-MM-01 00:00:00'); - ELSE - -- 延时生效 - temp_service_start_at := - TO_CHAR(activated_at + (package_row->>'effect_months' || ' month')::INTERVAL, - 'YYYY-MM-01 00:00:00'); - END IF; - ELSE - -- 延时生效 - temp_service_start_at := - TO_CHAR( - (order_row->>'created_at')::TIMESTAMP + (package_row->>'effect_months' || ' month')::INTERVAL, - 'YYYY-MM-01 00:00:00'); - END IF; - temp_service_end_at := temp_service_start_at + (package_row->>'service_months' || ' month')::INTERVAL + - (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; - END CASE; + activated_at := (activate_cards->>(order_row->>'sim'))::TIMESTAMP; + package_row := packages->(order_row->>'package_id'); + IF activated_at IS NULL THEN + temp_service_start_at := NULL; + temp_service_end_at := NULL; + ELSE + -- 服务时间 + CASE (order_row->>'type') + WHEN '0' THEN + temp_service_start_at := TO_CHAR(activated_at, 'YYYY-MM-01 00:00:00'); + temp_service_end_at := temp_service_start_at + (package_row->>'service_months' || ' month')::INTERVAL + + (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; + WHEN '1', '2' THEN + IF (temp_service_end_at > (order_row->>'created_at')::TIMESTAMP) THEN + temp_service_start_at := TO_CHAR(temp_service_end_at + '1 month'::INTERVAL, 'YYYY-MM-01 00:00:00'); + ELSE + temp_service_start_at := + TO_CHAR( + (order_row->>'created_at')::TIMESTAMP + (package_row->>'effect_months' || ' month')::INTERVAL, + 'YYYY-MM-01 00:00:00'); + END IF; + temp_service_end_at := + temp_service_start_at + (order_row->>'counts')::INT * (package_row->>'service_months' || ' month')::INTERVAL + + (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; + ELSE + -- 先购买了加油包后再激活的 + IF ((order_row->>'created_at')::TIMESTAMP < activated_at) THEN + IF ((order_row->>'created_at')::TIMESTAMP <= + TO_CHAR(activated_at - '1 month'::INTERVAL, 'YYYY-MM-01 00:00:00')::TIMESTAMP) THEN + -- 购买时间小于一个月的,直接生效 + temp_service_start_at := TO_CHAR(activated_at, 'YYYY-MM-01 00:00:00'); + ELSE + -- 延时生效 + temp_service_start_at := + TO_CHAR(activated_at + (package_row->>'effect_months' || ' month')::INTERVAL, + 'YYYY-MM-01 00:00:00'); + END IF; + ELSE + -- 延时生效 + temp_service_start_at := + TO_CHAR( + (order_row->>'created_at')::TIMESTAMP + (package_row->>'effect_months' || ' month')::INTERVAL, + 'YYYY-MM-01 00:00:00'); + END IF; + temp_service_end_at := temp_service_start_at + (package_row->>'service_months' || ' month')::INTERVAL + + (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; + END CASE; + END IF; temp_service_start_at := COALESCE((order_row->>'service_start_at')::TIMESTAMP, temp_service_start_at::TIMESTAMP); temp_service_end_at := COALESCE((order_row->>'service_end_at')::TIMESTAMP, temp_service_end_at::TIMESTAMP); @@ -127,12 +132,8 @@ BEGIN service_end_at := (order_row->>'service_end_at')::TIMESTAMP; RETURN NEXT; END LOOP; - END IF; - - END IF; - END; $$ LANGUAGE plpgsql;