101 lines
6.3 KiB
Plaintext
101 lines
6.3 KiB
Plaintext
<cfcomponent extends="taffy.core.resource" taffy:uri="/svcOperationCfsSubparams/compute/{svcOperationCfsSubparamId}" hint="вычисляет выражение в поле expression">
|
||
<!---
|
||
вычисляет выражение в поле expression
|
||
для этого нужен контекст - как минимум, сохраненные параметры, но это не работает при создании нового инстанса,
|
||
поэтому нужно инициализировать контекст и набивать его всей необходимой информацией
|
||
что особенно важно для зависимых параметров - нам нужно положить в контекст все параметры, от которых мы зависим
|
||
чтобы знать, какие параметры передавать - конструкцией для параметра предусмотрено поле depends_on_params (надо будет его сделать вычисляемым), а для субпараметра пока не
|
||
--->
|
||
|
||
<!--- Все методы неявно получают
|
||
arguments.usrId
|
||
arguments.contragentId
|
||
arguments.contractId
|
||
arguments.specificationId
|
||
|
||
arguments.requestArguments.usrId=usrCustomerInfo.usrId; //Integer!
|
||
arguments.requestArguments.contragentId=usrCustomerInfo.contragentId; //Integer
|
||
arguments.requestArguments.contractId=usrCustomerInfo.contractId; //Integer
|
||
arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //Integer
|
||
--->
|
||
|
||
<cfsilent>
|
||
<cfimport prefix="m" taglib="../lib"/>
|
||
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/><!---*** странно, почему мы его видим?---><!---вынести в апп?--->
|
||
</cfsilent>
|
||
|
||
|
||
<cffunction name="get" hint="вычисление возможных значений cубпараметра CFS параметра операции, в текущем контексте">
|
||
<!--- <cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/> а вот ни фига--->
|
||
<!--- *** Важно: мы должны уметь посчитать параметр, если он не сохранен, то есть мы знаем его класс, а не инстанс --->
|
||
<!--- Вероятно, нам не очень нужно вычислять набор значений для инстанса параметра, мы всегда знаем класс --->
|
||
<!--- контест: --->
|
||
<cfargument name="svcOperationCfsSubparamId" type="string" required=true hint="type:integer"/>
|
||
<cfargument name="keys" type="string" default={} hint="type:json keys we depend on: of the param uid itself, or operation uid, instance uid, service operation cfs param - if not all entities intstantiated yet"/>
|
||
<cfargument name="params" type="string" default="{}" hint="type:json any posted parameters we depend on"/>
|
||
|
||
<cftry>
|
||
<cfset this.helper.validateField(arguments, "svcOperationCfsSubparamId", "integer")/>
|
||
<cfset this.helper.validateField(arguments, "keys", "json")/> <!--- *** может, не лучшая идея передавать ключ в контексте --->
|
||
<cfset this.helper.validateField(arguments, "params", "json")/>
|
||
<cfcatch type="invalidParamValue">
|
||
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
|
||
</cfcatch>
|
||
</cftry>
|
||
|
||
<cfset local={}/>
|
||
<cfset "local.expression" = ""/> <!--- нет смысла выносить это в поля класса, оно нужно только локально --->
|
||
<cfset "local.calculatedValueList" = ""/>
|
||
<cfset "local.keys" = deserializeJson(arguments.keys)/>
|
||
<cfset "local.params" = deserializeJson(arguments.params)/>
|
||
|
||
<cfset "local.keys.svcOperationCfsSubparamId" = arguments.svcOperationCfsSubparamId/> <!--- *** сомнительное дело гонять аргументы туда-сюда ---><!--- *** по-моему, не используется, поэтому достанем svcOperationCfsParamId прямо тут --->
|
||
|
||
<cfquery name="local.qCfsSubparam" result="local.result">
|
||
select
|
||
<m:field_set titleMapOut="local.titleMap" lengthOut="fieldCount">
|
||
<m:field>sop.svc_operation_cfs_param_id</m:field>
|
||
<m:field>sop.data_type</m:field>
|
||
<m:field>sop.svc_operation_cfs_subparam</m:field>
|
||
<m:field>sop.expression</m:field>
|
||
</m:field_set>
|
||
from svc_operation_cfs_subparam sop
|
||
where sop.svc_operation_cfs_subparam_id
|
||
= <cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.svcOperationCfsSubparamId# null=#!isValid('integer',arguments.svcOperationCfsSubparamId)#/>
|
||
</cfquery>
|
||
|
||
<cfif local.qCfsSubparam.recordCount EQ 0>
|
||
<cfreturn representationOf(this.helper.formatMessage("Service Operation CFS Parameter Not Found")).withStatus(404)/>
|
||
</cfif>
|
||
|
||
<cfset "local.expression"=local.qCfsSubparam.expression/>
|
||
<cfset "local.keys.svcOperationCfsParamId" = local.qCfsSubparam.svc_operation_cfs_param_id/>
|
||
|
||
<!--- *** можно обратить внимание, что мы инстанциируем не субпараметр, а параметр (цинично пользуясь их функциональной идентичностью... но некрасиво) --->
|
||
<cfif len(local.expression)>
|
||
<cfset local.calculatedValueList=createObject("component","lib.expression_parser")
|
||
.eval(
|
||
local.expression,
|
||
{/*context*/
|
||
component:"resources.instance_operation_cfs_param", /*param, not subparam*/
|
||
keys:#local.keys#,
|
||
params:#local.params#
|
||
}
|
||
)
|
||
/>
|
||
<cfelse>
|
||
<cfreturn representationOf(this.helper.formatMessage("Expression Not Found")).withStatus(404)/>
|
||
</cfif>
|
||
<!--- <cfdump var=#local.keys#/>
|
||
<cfdump var=#local.params#/>
|
||
<cfdump var=#local.calculatedValueList# abort=true/> --->
|
||
<!--- Тут нам еще придется сформатировать лист в массив. Но обошлось довольно просто --->
|
||
<cfset var out=structNew("linked")/>
|
||
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
|
||
<cfset "out.values" = listToArray(local.calculatedValueList)/>
|
||
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
|
||
<cfreturn representationOf(out) />
|
||
</cffunction><!--- get --->
|
||
|
||
</cfcomponent>
|