From 602bade2ff9a1b8a7c686e73a74e589ad64b1eda Mon Sep 17 00:00:00 2001 From: denghy Date: Wed, 24 Apr 2019 16:24:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/FlowPoolController.php | 1 + .../create_virtual_order_cards_func.pgsql | 60 ++++++++++--------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/app/Domains/Virtual/Http/Controllers/FlowPoolController.php b/app/Domains/Virtual/Http/Controllers/FlowPoolController.php index 78e9d5fd..8adc09bc 100644 --- a/app/Domains/Virtual/Http/Controllers/FlowPoolController.php +++ b/app/Domains/Virtual/Http/Controllers/FlowPoolController.php @@ -183,6 +183,7 @@ class FlowPoolController extends Controller */ public function flows() { + begin_time_consuming(); $pool_id = $this->request->get('pool_id'); $month = $this->request->time('month'); diff --git a/database/migrations/create_virtual_order_cards_func.pgsql b/database/migrations/create_virtual_order_cards_func.pgsql index 381a16fd..a8b5dc8d 100644 --- a/database/migrations/create_virtual_order_cards_func.pgsql +++ b/database/migrations/create_virtual_order_cards_func.pgsql @@ -22,12 +22,13 @@ CREATE OR REPLACE FUNCTION GET_TIMELINES(INT8[]) service_start_at TIMESTAMP, service_end_at TIMESTAMP ) -AS $$ +AS +$$ DECLARE - activate_cards JSONB := '[]'; - packages JSONB := '[]'; + activate_cards JSONB := '[]'; + packages JSONB := '[]'; query TEXT; - package_row JSONB := '[]'; + package_row JSONB := '[]'; orders JSON[] := '{}'; order_row RECORD; temp_service_start_at TIMESTAMP; @@ -35,28 +36,25 @@ DECLARE activated_at TIMESTAMP; BEGIN SELECT array_to_json(array_agg(row_to_json(t))) INTO activate_cards - FROM (SELECT cards.sim, cards.virtual_activated_at FROM vd.cards WHERE cards.sim = ANY ($1)) t; + FROM (SELECT cards.sim, cards.virtual_activated_at FROM vd.cards WHERE cards.sim = ANY ($1)) t; SELECT array_to_json(array_agg(row_to_json(t))) INTO packages - FROM (SELECT virtual_packages.id, virtual_packages.service_months, virtual_packages.effect_months, virtual_packages.effect_months FROM vd.virtual_packages) t; + FROM (SELECT virtual_packages.id, + virtual_packages.service_months, + virtual_packages.effect_months, + virtual_packages.delay_months + FROM vd.virtual_packages) t; query := 'SELECT id, type, sim, package_id, created_at, counts, service_start_at, service_end_at FROM vd.virtual_order_cards_partition WHERE sim = ANY($1) ORDER BY sim ASC, created_at ASC'; - SELECT array_agg(row_to_json(t)) INTO orders - FROM EXECUTE query; - - - RAISE NOTICE '%s', orders; - - FOR order_row IN EXECUTE query USING $1 LOOP - SELECT value->>'virtual_activated_at' INTO activated_at - FROM json_array_elements(activate_cards::JSON) - WHERE value->>'sim' = order_row.sim::TEXT; + SELECT value ->> 'virtual_activated_at' INTO activated_at + FROM json_array_elements(activate_cards::JSON) + WHERE value ->> 'sim' = order_row.sim::TEXT; IF NOT FOUND THEN temp_service_start_at := NULL; @@ -66,25 +64,27 @@ BEGIN temp_service_end_at := NULL; ELSE SELECT value INTO package_row - FROM json_array_elements(packages::JSON) - WHERE value->>'id' = order_row.package_id::TEXT; + FROM json_array_elements(packages::JSON) + WHERE value ->> 'id' = order_row.package_id::TEXT; -- 服务时间 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; + 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) 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 + (package_row->>'effect_months' || ' month')::INTERVAL, - 'YYYY-MM-01 00:00:00'); + temp_service_start_at := + TO_CHAR(order_row.created_at + (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 * (package_row->>'service_months' || ' month')::INTERVAL + - (package_row->>'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; + temp_service_start_at + + order_row.counts * (package_row ->> 'service_months' || ' month')::INTERVAL + + (package_row ->> 'delay_months' || ' month')::INTERVAL - '1 second'::INTERVAL; ELSE -- 先购买了加油包后再激活的 IF (order_row.created_at < activated_at) THEN @@ -95,15 +95,17 @@ BEGIN ELSE -- 延时生效 temp_service_start_at := - TO_CHAR(activated_at + (package_row->>'effect_months' || ' month')::INTERVAL, 'YYYY-MM-01 00:00:00'); + 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 + (package_row->>'effect_months' || ' month')::INTERVAL, - 'YYYY-MM-01 00:00:00'); + temp_service_start_at := + TO_CHAR(order_row.created_at + (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; + 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;