From d45a8140c0ba0ff887085c0275f18bf00e11f7cb Mon Sep 17 00:00:00 2001 From: denghy Date: Mon, 11 Feb 2019 10:52:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9C=88=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/CardController.php | 2 +- .../Concerns/OrderCardConcern.php | 2 +- .../create_virtaul_order_cards_func.pgsql | 57 +++++-------------- .../create_virtual_order_cards_table.pgsql | 8 +-- 4 files changed, 19 insertions(+), 50 deletions(-) diff --git a/app/Domains/Virtual/Http/Controllers/CardController.php b/app/Domains/Virtual/Http/Controllers/CardController.php index 4d64ce47..7785d25c 100644 --- a/app/Domains/Virtual/Http/Controllers/CardController.php +++ b/app/Domains/Virtual/Http/Controllers/CardController.php @@ -37,7 +37,7 @@ class CardController extends Controller } $cards = $this->cardService->index($conditions); - + return res($cards, '卡列表', 201); } diff --git a/app/Domains/Virtual/Repositories/Concerns/OrderCardConcern.php b/app/Domains/Virtual/Repositories/Concerns/OrderCardConcern.php index 2dfab413..67d74d6c 100644 --- a/app/Domains/Virtual/Repositories/Concerns/OrderCardConcern.php +++ b/app/Domains/Virtual/Repositories/Concerns/OrderCardConcern.php @@ -74,7 +74,7 @@ trait OrderCardConcern if (isset($conditions['month'])) { $conditions['month'] = (int)Carbon::parse($conditions['month'])->format('Ym'); - $query->whereRaw("timelines_array(sim) @> '{{$conditions['month']}}'"); + $query->whereRaw("timelines_index(id, sim) @> '{{$conditions['month']}}'"); } }); diff --git a/database/migrations/create_virtaul_order_cards_func.pgsql b/database/migrations/create_virtaul_order_cards_func.pgsql index 804278bb..9ccb00e1 100644 --- a/database/migrations/create_virtaul_order_cards_func.pgsql +++ b/database/migrations/create_virtaul_order_cards_func.pgsql @@ -15,6 +15,7 @@ BEGIN END IF; query := 'SELECT + virtual_order_cards_partition.id, virtual_order_cards_partition.type, virtual_order_cards_partition.package_id, virtual_order_cards_partition.created_at, @@ -61,7 +62,7 @@ BEGIN temp_service_end_at := temp_service_start_at + (order_row.service_months || ' month')::INTERVAL + (order_row.delay_months || ' month')::INTERVAL - '1 second'::INTERVAL; END CASE; - temp_text := format('{"sim": %s, "type": %s, "package_id": %s, "service_start_at": "%s", "service_end_at": "%s"}', sim, order_row.type, order_row.package_id, temp_service_start_at, temp_service_end_at); + temp_text := format('{"id": %s, "sim": %s, "type": %s, "package_id": %s, "service_start_at": "%s", "service_end_at": "%s"}', order_row.id, sim, order_row.type, order_row.package_id, temp_service_start_at, temp_service_end_at); timelines := timelines::JSONB || temp_text::JSONB; END LOOP; RETURN timelines; @@ -99,40 +100,7 @@ END; $$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION TIMELINES_ARRAY (sim INT8, activated_at TIMESTAMP) - RETURNS INT[] -AS $$ -DECLARE - timelines INT[] := '{}'; - timelines_json JSONB; - item JSONB; - temp_months INT; - i INT; -BEGIN - IF activated_at IS NULL THEN - RETURN timelines; - END IF; - - timelines_json := vd.TIMELINES_JSON(sim, activated_at); - - FOR item IN SELECT * FROM json_array_elements(timelines_json::JSON) LOOP - temp_months = (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'YYYY')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'YYYY')::INT) * 12 - + (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'MM')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'MM')::INT); - i := 0; - - RAISE NOTICE 'TIMELINES_ARRAY: % - % - %', item->>'sim', item->>'package_id', temp_months; - - WHILE i <= temp_months LOOP - timelines := timelines || TO_CHAR((item->>'service_start_at')::TIMESTAMP + (i || ' month')::INTERVAL, 'YYYYMM')::INT; - i := i + 1; - END LOOP; - END LOOP; - RETURN timelines; -END; -$$ -LANGUAGE plpgsql IMMUTABLE; - -CREATE OR REPLACE FUNCTION TIMELINES_ARRAY (sim INT8) +CREATE OR REPLACE FUNCTION TIMELINES_INDEX (id INT, sim INT8) RETURNS INT[] AS $$ DECLARE @@ -143,18 +111,19 @@ DECLARE i INT; BEGIN timelines_json := vd.TIMELINES_JSON(sim); - FOR item IN SELECT * FROM json_array_elements(timelines_json::JSON) LOOP - temp_months = (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'YYYY')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'YYYY')::INT) * 12 - + (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'MM')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'MM')::INT); - i := 0; + IF item->>'id'::INT = id THEN + temp_months = (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'YYYY')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'YYYY')::INT) * 12 + + (TO_CHAR((item->>'service_end_at')::TIMESTAMP, 'MM')::INT - TO_CHAR((item->>'service_start_at')::TIMESTAMP, 'MM')::INT); + i := 0; - RAISE NOTICE 'TIMELINES_ARRAY: % - % - %', item->>'sim', item->>'package_id', temp_months; + RAISE NOTICE 'TIMELINES_INDEX: % - % - %', item->>'sim', item->>'package_id', temp_months; - WHILE i <= temp_months LOOP - timelines := timelines || TO_CHAR((item->>'service_start_at')::TIMESTAMP + (i || ' month')::INTERVAL, 'YYYYMM')::INT; - i := i + 1; - END LOOP; + WHILE i <= temp_months LOOP + timelines := timelines || TO_CHAR((item->>'service_start_at')::TIMESTAMP + (i || ' month')::INTERVAL, 'YYYYMM')::INT; + i := i + 1; + END LOOP; + END IF; END LOOP; RETURN timelines; END; diff --git a/database/migrations/create_virtual_order_cards_table.pgsql b/database/migrations/create_virtual_order_cards_table.pgsql index d13f9e9f..b4e080e6 100644 --- a/database/migrations/create_virtual_order_cards_table.pgsql +++ b/database/migrations/create_virtual_order_cards_table.pgsql @@ -1,8 +1,8 @@ -- 服务周期索引 -CREATE INDEX "virtual_order_cards_timelines_index" ON "virtual_order_cards" USING GIN (timelines_array(sim)); -CREATE INDEX "virtual_order_renewal_cards_timelines_index" ON "virtual_order_renewal_cards" USING GIN (timelines_array(sim)); -CREATE INDEX "virtual_order_renewal_package_cards_timelines_index" ON "virtual_order_renewal_package_cards" USING GIN (timelines_array(sim)); -CREATE INDEX "virtual_order_flows_package_cards_index" ON "virtual_order_flows_package_cards" USING GIN (timelines_array(sim)); +CREATE INDEX "virtual_order_cards_timelines_index" ON "virtual_order_cards" USING GIN (TIMELINES_INDEX(id, sim)); +CREATE INDEX "virtual_order_renewal_cards_timelines_index" ON "virtual_order_renewal_cards" USING GIN (TIMELINES_INDEX(id, sim)); +CREATE INDEX "virtual_order_renewal_package_cards_timelines_index" ON "virtual_order_renewal_package_cards" USING GIN (TIMELINES_INDEX(id, sim)); +CREATE INDEX "virtual_order_flows_package_cards_index" ON "virtual_order_flows_package_cards" USING GIN (TIMELINES_INDEX(id, sim)); -- 增删改卡表时更新索引 CREATE OR REPLACE FUNCTION REINDEX_TIMELINES ()