43 speed and filter and totals

This commit is contained in:
2026-04-13 23:18:41 +03:00
parent 515b6cd90d
commit ade4071eb8
4 changed files with 317 additions and 171 deletions
+238 -135
View File
@@ -8,110 +8,212 @@
<m:prepare_ls entity="crm2cloud" settingsKey="crm2cloud" accessObject="" pageInfoOut="pageInfo" trackOut="tr"/>
<!--- *** нуждается в оптимизации, чтобы фильтр по контрагенту ускорял селект --->
<cfquery name="qRead" cachedWithin=#createTimeSpan(0, 0, 25, 0)#>
WITH
status(status, status_id, probability_pc) as (VALUES
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
),
line as (
SELECT siv.__id as siv_uid, siv.discount, siv.type as line_pricing_model_id
,siv.hash as line_key, siv.is_actual as siv_is_actual
,siv.version::numeric as line_version
,d.__index as deal_index
,d._companies
,a.index as agreement_version
,siv.date_nop::date as dt_from
,siv.date_end::date as dt_to
,siv.is_easy as is_simple
,siv.cnt -- should mutiliply
,s.probability_pc
,a.__id as agreement_uid, a.contract_uid, a.is_actual as agreement_is_actual, a.deal_uid
,d.__name as deal, d.__status_status as deal_status_id
--,c.__name as contract
,siv.user_description
,siv.params
--,(SELECT sum(p.price*p.cnt*(100.0-COALESCE(p.discount,0.0))/100.0) FROM elma.service_parametrs p WHERE(p.__id = ANY (siv.params))) as cost
FROM elma.deals_services siv
JOIN elma.deals d on (d.__id = ANY(siv.deal))
JOIN status s on (d.__status_status=s.status_id)
LEFT OUTER JOIN elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement))
WHERE siv.is_actual AND siv."__deletedAt" IS NULL AND d."__deletedAt" IS NULL AND a."__deletedAt" IS NULL
AND a.is_actual
AND siv.type IN (2,3)
),
component as (
SELECT
price*cnt*(100.0-COALESCE(discount,0))/100.0 as cost
,price
,cnt
,code
,__id
FROM elma.service_parametrs
where "__deletedAt" IS NULL
),
stair as ( -- рабочая лесенка (инстансы строк, имеющие нетривиальную вероятность)
select * FROM (
SELECT *,
MIN(dt_from) OVER (PARTITION BY line_key ORDER BY deal_index desc) running_min_dt
FROM line WHERE probability_pc > 0
) t
WHERE t.dt_from = t.running_min_dt
AND t.dt_to > CURRENT_TIMESTAMP OR t.dt_to IS NULL
),
alloc as (select c."WZ" as wz
, round(sum(c."VM_RAM_Allocated")) as ram
, round(sum(CASE WHEN "VM_is_ON" > 0 THEN c."VM_RAM_Allocated" ELSE 0 END)) as ram_on
, round(sum(c."VM_vCPU_count")) as cpu
, round(sum(CASE WHEN "VM_is_ON" > 0 THEN c."VM_vCPU_count" ELSE 0 END)) as cpu_on
from vmreports.compute c
where ts=(select max(ts) from vmreports.compute)
group by c."WZ"
),
disk_alloc as (select c."WZ" as wz
, round(sum(c."Disk_Allocated")) as disk_alloc
from vmreports.storage c
where ts=(select max(ts) from vmreports.storage)
group by c."WZ"
),
sold_ram as (SELECT
z.id_klienta as WZ, z.__name as client, z.__id as company_uid, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next, o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code SIMILAR TO 'iaas.(ngc|dcp).%.ram-_' AND c.cnt <> 0 AND o.cnt <> 0
GROUP BY z.id_klienta, z.__id, z.__name
),
sold_cpu as (SELECT
z.id_klienta as WZ, z.__name as client, z.__id as company_uid, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next, o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code SIMILAR TO 'iaas.(ngc|dcp).%.vcpu%-_' AND c.cnt <> 0 AND o.cnt <> 0
GROUP BY z.id_klienta, z.__id, z.__name
),
sold_disk as (SELECT
z.id_klienta as WZ, z.__name as client, z.__id as company_uid, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next, o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code SIMILAR TO 'iaas.(ngc|dcp).%.(ssd|fstssd|sata)-_' AND c.cnt <> 0 AND o.cnt <> 0
GROUP BY z.id_klienta, z.__id, z.__name
),
deal_stat as (
select
STRING_AGG(distinct deal_status_id::text,', ') as status_ids
,STRING_AGG(distinct line_pricing_model_id::text,', ') as line_pricing_model_ids
,z.id_klienta as WZ
from line o join elma.companies z on (o._companies=z.__id)
GROUP BY z.id_klienta
)
status(status, status_id, probability_pc) as
(
VALUES
('Закрыта неуспешно',7,0) ,
('Закрыта успешно',6,100) ,
('Договор подписан',5,100) ,
('Договор на подписании',15,90) ,
('Договор на согласовании',12,70),
('Тестирование',8,50) ,
('Отправлено ТКП',10,20) ,
('Внутреннее согласование',37,10),
('Проработка решения',4,10) ,
('Сбор потребностей',1,0)
),
line_expanded as
(
SELECT
siv.__id as siv_uid ,
siv.discount ,
siv.type as line_pricing_model_id ,
siv.hash as line_key ,
siv.is_actual as siv_is_actual ,
siv.version::numeric as line_version ,
d.__index as deal_index ,
d._companies ,
a.index as agreement_version ,
siv.date_nop::date as dt_from ,
siv.date_end::date as dt_to ,
siv.is_easy as is_simple ,
siv.cnt ,
s.probability_pc ,
a.__id as agreement_uid ,
a.contract_uid ,
a.is_actual as agreement_is_actual ,
a.deal_uid ,
d.__name as deal ,
d.__status_status as deal_status_id ,
siv.user_description ,
unnest(siv.params) as param_id
FROM
elma.deals_services siv
JOIN elma.deals d on (d.__id = ANY(siv.deal))
JOIN status s on (d.__status_status=s.status_id)
LEFT JOIN elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement))
WHERE
siv.is_actual
AND siv."__deletedAt" IS NULL
and d."__deletedAt" IS NULL
and a."__deletedAt" IS NULL
and a.is_actual
and siv.type IN (2,3)
),
component as
(
SELECT
price*cnt*(100.0-COALESCE(discount,0))/100.0 as cost ,
price ,
cnt ,
code ,
__id
FROM
elma.service_parametrs
where
"__deletedAt" IS NULL
),
stair as
(
select
*
FROM
(
SELECT
*,
MIN(dt_from) OVER (PARTITION BY line_key ORDER BY deal_index desc) running_min_dt
FROM
line_expanded
--line
WHERE
probability_pc > 0
) t
WHERE
t.dt_from = t.running_min_dt
AND t.dt_to > CURRENT_TIMESTAMP
OR t.dt_to IS NULL
),
alloc as
(
select
c."WZ" as wz ,
round(sum(c."VM_RAM_Allocated")) as ram ,
round(sum(CASE WHEN "VM_is_ON" > 0 THEN c."VM_RAM_Allocated" ELSE 0 END)) as ram_on ,
round(sum(c."VM_vCPU_count")) as cpu ,
round(sum(CASE WHEN "VM_is_ON" > 0 then c."VM_vCPU_count" ELSE 0 END)) as cpu_on
from
vmreports.compute c
where
ts= (select max(ts) from vmreports.compute)
group by c."WZ"
),
disk_alloc as
(
select
c."WZ" as wz ,
round(sum(c."Disk_Allocated")) as disk_alloc
from
vmreports.storage c
where
ts= (select max(ts) from vmreports.compute)
group by
c."WZ" ),
sold_ram as
(
SELECT
z.id_klienta as WZ ,
z.__name as client ,
z.__id as company_uid,
round(sum(c.cnt*o.cnt)) as quantity ,
count(*) as lines ,
STRING_AGG( distinct c.code,', ' order by c.code) as codes
FROM
stair o
JOIN elma.companies z on o._companies=z.__id
LEFT JOIN component c on c.__id = o.param_id
--LEFT JOIN component c on (c.__id = ANY (o.params))
WHERE
--c.code SIMILAR TO 'iaas.(ngc|dcp).%.ram-_'
(c.code LIKE 'iaas.ngc.%.ram-_' OR c.code LIKE 'iaas.dcp.%.ram-_')
AND c.cnt <> 0
AND o.cnt <> 0
GROUP BY
z.id_klienta,
z.__id ,
z.__name
),
sold_cpu as
(
SELECT
z.id_klienta as WZ ,
z.__name as client ,
z.__id as company_uid,
round(sum(c.cnt*o.cnt)) as quantity ,
count(*) as lines ,
STRING_AGG(c.code,', ' order by c.code) as codes
FROM
stair o
JOIN
elma.companies z on (o._companies=z.__id)
LEFT JOIN component c on c.__id = o.param_id
--LEFT JOIN component c on (c.__id = ANY (o.params))
WHERE
c.code SIMILAR TO 'iaas.(ngc|dcp).%.vcpu%-_'
--(c.code LIKE 'iaas.ngc.%.vcpu%-_' OR c.code LIKE 'iaas.dcp.%.vcpu%-_')
AND c.cnt <> 0
AND o.cnt <> 0
GROUP BY
z.id_klienta,
z.__id ,
z.__name
),
sold_disk as
(
SELECT
z.id_klienta as WZ ,
z.__name as client ,
z.__id as company_uid,
round(sum(c.cnt*o.cnt)) as quantity ,
count(*) as lines ,
STRING_AGG(c.code,', ' order by c.code) as codes
FROM
stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT JOIN component c on c.__id = o.param_id
--LEFT JOIN component c on (c.__id = ANY (o.params))
WHERE
--c.code SIMILAR TO 'iaas.(ngc|dcp).%.(ssd|fstssd|sata)-_'
(c.code LIKE 'iaas.ngc.%.ssd-_' OR c.code LIKE 'iaas.dcp.%.ssd-_'
or c.code LIKE 'iaas.ngc.%.fstssd-_' OR c.code LIKE 'iaas.dcp.%.fstssd-_'
or c.code LIKE 'iaas.ngc.%.sata-_' OR c.code LIKE 'iaas.dcp.%.sata-_'
)
AND c.cnt <> 0
AND o.cnt <> 0
GROUP BY
z.id_klienta,
z.__id ,
z.__name
),
deal_stat as
(
select
STRING_AGG(distinct deal_status_id::text,', ' order by deal_status_id::text) as status_ids,
ARRAY_AGG(distinct deal_status_id order by deal_status_id) as ar_status_ids,
STRING_AGG(distinct line_pricing_model_id::text,', ' order by line_pricing_model_id::text) as line_pricing_model_ids ,
ARRAY_AGG(distinct line_pricing_model_id order by line_pricing_model_id) as ar_line_pricing_model_id,
z.id_klienta as WZ
from
line_expanded o
--line o
join elma.companies z on (o._companies=z.__id)
GROUP BY
z.id_klienta
)
select
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
@@ -134,6 +236,7 @@ select
<d:field title="Диски Cloud">da.disk_alloc</d:field>
<d:field>z.__name as alloc_company</d:field>
<d:field>z.__id as alloc_company_uid</d:field>
<d:field>ds.ar_status_ids</d:field>
</d:field_set>
from sold_ram r
join deal_stat ds on (lower(r.wz)=lower(ds.wz))
@@ -147,7 +250,7 @@ order by <m:order_build sortArray=#pageInfo.settings.sort.sortArray# fieldCount=
</cfquery>
<!--- <cfdump var=#qRead#> --->
<cfif isDefined("output_xls")>
@@ -221,9 +324,7 @@ S3 операции и трафик: <b>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M
<cfflush/>
<cfoutput query="qRead">
<cfoutput query="qRead">
<tr>
<td>#wz_sold#</td>
<td>
@@ -251,39 +352,41 @@ S3 операции и трафик: <b>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M
<td class="r"<cfif disk_sold GT disk_alloc> style="background:lightgreen;"</cfif>>#disk_sold#</td>
<td class="r"<cfif disk_sold LT disk_alloc> style="background:lightcoral;"</cfif>>#disk_alloc#</td>
</tr>
<!---
<td class="r" style="font-size:120%; padding:0 1em;">#chargeable_metric#</td>
<td class="c" style="font-size:90%;">#ed_izm#</td>
<td class="r">#discounted_price#</td>
<td class="r">#charge#</td>
</cfoutput>
<cfquery name="qTotal" dbtype="query">
select
sum(cpu_sold) as cpu_sold
,sum(cpu_alloc) as cpu_alloc
,sum(cpu_alloc_on) as cpu_alloc_on
,sum(ram_sold) as ram_sold
,sum(ram_alloc) as ram_alloc
,sum(ram_alloc_on) as ram_alloc_on
,sum(disk_sold) as disk_sold
,sum(disk_alloc) as disk_alloc
from qRead
</cfquery>
<cfoutput query="qTotal">
<tr class="b r">
<td colspan="6">Итого</td>
<td class="r"<cfif cpu_sold GT ram_alloc> style="background:lightgreen;"</cfif>>#cpu_sold#</td>
<td class="r"<cfif cpu_sold LT cpu_alloc> style="background:lightcoral;"</cfif>>#cpu_alloc#</td>
<td class="r"<cfif cpu_sold LT cpu_alloc_on> style="background:lightcoral;"</cfif>>#cpu_alloc_on#</td>
<td></td>
<td class="r"<cfif ram_sold GT ram_alloc> style="background:lightgreen;"</cfif>>#ram_sold#</td>
<td class="r"<cfif ram_sold LT ram_alloc> style="background:lightcoral;"</cfif>>#ram_alloc#</td>
<td class="r"<cfif ram_sold LT ram_alloc_on> style="background:lightcoral;"</cfif>>#ram_alloc_on#</td>
<td>#abstract_service# #modifier#</td>
<td>#component#</td>
<td>#user_description#</td>
<td class="r">#price#</td>
<td class="r">#discount#</td>
<td class="r">#dateFormat(dt_from,'YYYY-MM-DD')#</td>
<td class="r">#dateFormat(dt_to,'YYYY-MM-DD')#</td>
<td class="r">#line_key#</td>
<td class="r" style="color:##bbb">#raw_metric#</td>
<td class="r">#metric#</td>
<td><a href="contract.cfm?__id=#contract_uid#&#tr.fwx#">#contract#</a></td>
<td><a href="additional_agreement.cfm?__id=#additional_agreement_uid#&#tr.fwx#">#additional_agreement#</a></td>
<td><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#">#deal#</a></td>
</tr> --->
</cfoutput>
<td></td>
<td class="r"<cfif disk_sold GT disk_alloc> style="background:lightgreen;"</cfif>>#disk_sold#</td>
<td class="r"<cfif disk_sold LT disk_alloc> style="background:lightcoral;"</cfif>>#disk_alloc#</td>
</tr>
</cfoutput>
</table>
<!--- <cfdump var=#qCharge#/> --->
<layout:page section="footer"/>