diff --git a/Application.cfc b/Application.cfc index 1a1b707..6b9cc58 100644 --- a/Application.cfc +++ b/Application.cfc @@ -87,7 +87,7 @@ - + diff --git a/inc/menu.cfm b/inc/menu.cfm index e24c4a5..6552fe0 100644 --- a/inc/menu.cfm +++ b/inc/menu.cfm @@ -18,27 +18,18 @@ - - + - - + + - + - select k.id_klienta as wz, k.__id::text as contragent_uid, p.code, p.price, p.discount, k.__name as contragent, a.__name as contract, a.__id::text as contract_uid, d.__name as deal, d.__id::text as deal_uid, siv.abstractive_service as abstract_service, siv.modifier, siv.user_description, siv.hash as line_key + select k.id_klienta as wz, k.__id::text as contragent_uid, + p.code, + SUBSTRING(p.code FROM 1 FOR LENGTH(p.code) - 2) as service_code, + p.price, p.discount, k.__name as contragent, a.__name as contract, a.__id::text as contract_uid, d.__name as deal, d.__id::text as deal_uid, siv.abstractive_service as abstract_service, siv.modifier, siv.user_description, siv.hash as line_key ,siv.date_nop as dt_from, siv.date_end as dt_to, siv.discount as service_discount, siv.cnt as service_quantity - /*,p.__name as line_key*/, p.ed_izm, p.name as component, p.type, aa.__name as additional_agreement, aa.__id::text as additional_agreement_uid + /*,p.__name as line_key*/, p.ed_izm, p.name as component, p.type, p.cnt*coalesce(siv.cnt,1) as component_quantity, + aa.__name as additional_agreement, aa.__id::text as additional_agreement_uid --, aa.is_actual ,siv.end_customer as end_customer_uid ,z.id_klienta as end_customer_wz @@ -63,6 +67,8 @@ where p.type IN (2,3) AND aa.is_actual AND siv.date_nop < AND (siv.date_end > OR siv.date_end IS NULL)/*****/ + --AND k.id_klienta='WZ01031' + --AND k.id_klienta='WZ01112' order by k.id_klienta, p.code @@ -80,7 +86,7 @@ - select m.clientid as wz, vdc.name as vdc_name, + select m.clientid as wz, vdc.name as vdc, case WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29' WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31' @@ -123,7 +129,7 @@ - select m.clientid as wz, vdc.name as vdc_name, + select m.clientid as wz, vdc.name as vdc, case WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29' WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31' @@ -133,13 +139,13 @@ WHEN vdc.name LIKE '%-v1cl7%' THEN 'iaas.ngc.a40' -- *** смапить все кластера ELSE '['||vdc.name||']' END || CASE - WHEN storage_profile_types.name ILIKE '%FASTSSD%' THEN '.fstssd-m' - WHEN storage_profile_types.name ILIKE '%SSD%' THEN '.ssd-m' - WHEN storage_profile_types.name ILIKE '%SAS%' THEN '.sas-m' - WHEN storage_profile_types.name ILIKE '%SATA%' THEN '.sata-m' + WHEN storage_profile_types.name ILIKE '%FASTSSD%' THEN '.fstssd' + WHEN storage_profile_types.name ILIKE '%SSD%' THEN '.ssd' + WHEN storage_profile_types.name ILIKE '%SAS%' THEN '.sas' + WHEN storage_profile_types.name ILIKE '%SATA%' THEN '.sata' ELSE '.['|| storage_profile_types.name ||']' END as code, - storage_profile_types.name, -- *** это не тип, а профайл + storage_profile_types.name as profile, sum("limit")/1024./4./720. as gb_m_limit, -- 4 потому, что сбор раз в 15 минут sum(used)/1024./4./720. as gb_m_used -- 720 это количество часов в условном месяце from ngcloud_ru.capacity_storage @@ -190,15 +196,15 @@ HOT_FREE_LIMIT 1 10 1 100 else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code ,bucket_stat.placement_id ,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ - + ,bucket_info.name as bucket from s3billing.bucket_stat join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id where bucket_stat.placement_id in (1,2) AND bucket_stat.timestamp_addition >= AND bucket_stat.timestamp_addition < - group by bucket_stat.owner, bucket_stat.placement_id - order by bucket_stat.owner, bucket_stat.placement_id; + group by bucket_stat.owner, bucket_stat.placement_id, bucket_info.name + order by bucket_stat.owner, bucket_stat.placement_id, bucket_info.name; qS3Vol:#getTickCount()-request.startTickCount# @@ -275,7 +281,8 @@ select when bucket_info.placement_id = 2 then 'paas.s3.cphc' else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint ,bucket_info.placement_id - --category.name, bucket_info.name + --category.name + , bucket_info.name as bucket ,'WZ'||lpad(user_info.name, 5, '0') as wz from s3billing.usage_bucket_by_user join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id @@ -285,8 +292,8 @@ select where 1=1 AND usage_bucket_by_user.time >= AND usage_bucket_by_user.time < - group by user_info.name, bucket_info.placement_id - order by user_info.name, bucket_info.placement_id; + group by user_info.name, bucket_info.placement_id, bucket_info.name + order by user_info.name, bucket_info.placement_id, bucket_info.name; qS3OpsTrf:#getTickCount()-request.startTickCount# @@ -304,36 +311,37 @@ select -select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric, 'core-h' as unit +select wz, code || '.vcpu' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric, 'core-h' as unit, vdc as dimension1 from qComputing union all -select wz, code || '.ram-m', gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric, 'GByte-h' as unit +select wz, code || '.ram', gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric, 'GByte-h' as unit, vdc as dimension1 from qComputing union all -select wz, code, gb_m_used as raw_metric, gb_m_used as metric, gb_m_used as chargeable_metric, 'GByte-m' as unit +select wz, code, gb_m_used as raw_metric, gb_m_used as metric, gb_m_used as chargeable_metric, 'GByte-m' as unit, vdc ||':'|| profile as dimension1 from qStorage union all -select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric, 'GByte-m' as unit +select wz, code || '.vol', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric, 'GByte-m' as unit, bucket as dimension1 from qS3Vol union all -select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric, '10k' as unit +select wz, code || '.get', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric, '10k' as unit, bucket as dimension1 from qS3OpsTrf union all -select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric, '10k' as unit +select wz, code || '.put', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric, '10k' as unit, bucket as dimension1 from qS3OpsTrf union all -select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric, 'GByte' as unit +select wz, code || '.trf', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric, 'GByte' as unit, bucket as dimension1 from qS3OpsTrf order by wz, code - + qUnifiedMetric:#getTickCount()-request.startTickCount# @@ -353,23 +361,33 @@ order by wz, code SELECT coalesce(coalesce(c.wz, m.wz), s.wz) as wz + + s.wz as wzs + c.wz as wzc + + m.wz as wzm s.end_customer_wz as wze - coalesce(m.code, s.code) as code - f.code as f_code + coalesce(s.code, m.code) as code + s.code as s_code + s.component_quantity + m.code as m_code + m.dimension1 + s.type ceiling(m.chargeable_metric) as chargeable_metric m.unit s.ed_izm s.service_quantity*(100-s.service_discount)/100*s.price*(100-s.discount)/100 as discounted_price - s.service_quantity*(100-s.service_discount)/100*s.price*(100-s.discount)/100*ceiling(m.chargeable_metric) as charge + CASE WHEN s.type=3 THEN s.service_quantity*(100-s.service_discount)/100*s.price*(100-s.discount)/100*ceiling(m.chargeable_metric) ELSE NULL END as charge s.dt_from s.dt_to s.line_key - s.price + s.price s.discount m.raw_metric m.metric - coalesce(c.contragent,cs.contragent) as contragent - coalesce(c.contragent_uid,cs.contragent_uid) as contragent_uid + + c.contragent + c.contragent_uid s.contract s.contract_uid s.additional_agreement @@ -382,27 +400,26 @@ SELECT s.user_description FROM qUnifiedMetric m -FULL JOIN qSpec s ON (m.wz=s.wz AND m.code=s.code) -LEFT JOIN qSpec f ON (m.wz=f.wz AND m.code=f.code AND f.type=2) -LEFT JOIN qContragent c ON (m.wz=c.wz) -LEFT JOIN qContragent cs ON (s.wz=cs.wz) -- неуклюже, но иначе контрагент теряется -WHERE 1=1 AND s.type=3 +FULL JOIN qSpec s ON (m.wz=s.wz AND m.code=s.service_code) -- или компонент, но не цена +LEFT JOIN qContragent c ON (trim(coalesce(s.wz,m.wz))=trim(c.wz)) -- пробелы тут стоили нескольких часов работы + +WHERE 1=1 --AND (s.type=3 OR NOT m.metric IS NULL) AND EXISTS(select * from qSpec qs where qs.wz=m.wz AND qs.type=3) + +--AND s.wz='WZ01031' --AND s.wz='WZ01762' -ORDER BY wz,code +ORDER BY coalesce(coalesce(c.wz, m.wz), s.wz), coalesce(s.code, m.code) - - qCharge:#getTickCount()-request.startTickCount# - + @@ -455,8 +472,11 @@ S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M - Артикул - Кол-во (метрика) + Артикул спец. + Кол-во спец. + Артикул метр. + + Кол-во метр. Ед.изм. Цена ₽ со скид., с НДС Стоимость ₽ с НДС @@ -501,9 +521,12 @@ S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M class="gray"> #currentRow# - #code# (#f_code#) + style="background:lightgreen;color:black;">#s_code# + #component_quantity# + #m_code# + #dimension1# #request.roundSafe(chargeable_metric,3)# - #len(unit)?unit:'['& ed_izm &']'# + #unit# [#ed_izm#] #gaussianRoundSafe(discounted_price,2)# #gaussianRoundSafe(charge,2)# @@ -530,7 +553,7 @@ S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M - Итого #wz# #contragent#: + Итого #wz# #contragent#: #NumFmt(acc,2)# diff --git a/test_storage_rpt.cfm b/test_storage_rpt.cfm new file mode 100644 index 0000000..f3bd9ef --- /dev/null +++ b/test_storage_rpt.cfm @@ -0,0 +1,136 @@ + + + + + + + + + + + + + +SELECT + + t.name AS tenant + m.clientid AS wz + m.status + m.end_test_date + v.name AS vdc + p.name AS provider_vdc + CASE + WHEN v.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29' + WHEN v.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31' + WHEN v.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28' + WHEN v.name LIKE '%-v1cl5%' THEN 'iaas.ngc.a45' + WHEN v.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28' + WHEN v.name LIKE '%-v1cl7%' THEN 'iaas.ngc.a40' + ELSE '['||v.name||']' + END AS code + sp.name AS storage_profile + round(AVG(c."limit")/1024.) AS limit_gb + round(AVG(c."used")/1024.) AS alloc_gb + tm.ts + +FROM ngcloud_ru.capacity_storage c +JOIN ngcloud_ru.storage_profile_types sp ON c.storage_profile_types_id = sp.id +JOIN ngcloud_ru.vdc v ON c.vdc_id = v.id +JOIN ngcloud_ru.provider_vdc p ON v.provider_vdc_id = p.id +JOIN ngcloud_ru.tenant t ON t.id = v.tenant_id +LEFT JOIN LATERAL ( + SELECT tm.ts, tm.metadata_id + FROM ngcloud_ru.tenant_metadata tm + WHERE tm.tenant_id = t.id + ORDER BY tm.ts DESC, tm.metadata_id DESC + LIMIT 1 +) tm ON true +LEFT JOIN ngcloud_ru.metadata m ON tm.metadata_id = m.id +WHERE c.timestamp >= +GROUP BY + m.clientid, v.name, p.name, sp.name, t.name, + m.status, m.end_test_date, tm.ts +ORDER BY + + + + + + + + + + + + + + + + Тесты и хранение + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + class="b">#status# + class="b err">#end_test_date# + + + + + class="b err">#limit_gb# + class="b err">#alloc_gb# + + + + + +
#tenant##wz##VDC##provider_vdc##code##storage_profile##dateFormaT(ts,"YYYY-MM-DD")# #timeFormaT(ts,"HH-MM")#
+ + + +