199 intermediate, state navigation
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<!--- Вот здесь мы могли бы строить URI /instances/{instanceUid}/instanceOperations/{instanceOperationUid}/CfsParams, но это создает избыточность, у нас простые суррогатные первичные ключи. С другой стороны, контекст инстанса и операции у клиента всегда имеется. Но стоит ли передавать избыточную информацию? Это иногда провоцирует путаницу. Для POST мы можем передать необходимый контекст в теле запроса, а можем в URL.
|
||||
В данном случае никакого смысла смотреть на все CFS параметры нет, только в рамках операции
|
||||
Но: мы не хотели бы менять положение сущности в дереве. Либо она в корне, либо она ниже. И получится, когда мы выбираем один параметр, нам ни к чему контекст - мы к нему однозначно адресуемся.
|
||||
Проголосуем за отсутстие избыточности?
|
||||
Проголосуем против избыточности?
|
||||
--->
|
||||
|
||||
<!--- Все методы неявно получают
|
||||
@@ -21,6 +21,362 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In
|
||||
<cfimport prefix="m" taglib="../lib"/>
|
||||
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/><!---*** странно, почему мы его видим?---><!---вынести в апп?--->
|
||||
</cfsilent>
|
||||
<!--- cfproperty использовать не надо, это для веб сервисов --->
|
||||
|
||||
|
||||
<cffunction name="init">
|
||||
<!--- для нового инстанса нам нужно знать хотя бы его класс (сервис) --->
|
||||
<cfargument name="keys" type="struct" required=true/>
|
||||
<cfargument name="params" type="struct" required=true/>
|
||||
<!--- *** возможно, заранее разрешать все ключи - лишнее --->
|
||||
<cfset this.keys = arguments.keys/>
|
||||
<cfset this.params = arguments.params/>
|
||||
<cfset this.instance_operation_cfs_param_uid = "00000000-0000-0000-0000-000000000000"/><!--- *** костыль default=--->
|
||||
<cfset this.instance_operation_uid = "00000000-0000-0000-0000-000000000000"/><!--- *** костыль default=--->
|
||||
<cfset this.instance_uid = "00000000-0000-0000-0000-000000000000"/><!--- *** костыль default=--->
|
||||
|
||||
<cfif structKeyExists(arguments.keys,"instanceOperationCfsParamUid")>
|
||||
<cfset this.instance_operation_cfs_param_uid=arguments.keys.instanceOperationCfsParamUid/>
|
||||
<cfquery name="local.qResolve">
|
||||
select p.instance_operation_uid, o.instance_uid, p.svc_operation_cfs_param_id
|
||||
from instance_operation_cfs_param p
|
||||
join instance_operation o on (p.instance_operation_uid=o.instance_operation_uid)
|
||||
where p.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.keys.instanceOperationCfsParamUid# null=#!isValid("guid", arguments.keys.instanceOperationCfsParamUid)#/>
|
||||
</cfquery>
|
||||
<cfset this.instance_operation_uid=toString(local.qResolve.instance_operation_uid)/><!--- toString, чтобы не засорять вывод cfdump классами --->
|
||||
<cfset this.instance_uid=toString(local.qResolve.instance_uid)/>
|
||||
<cfset this.svc_operation_cfs_param_id = local.qResolve.svc_operation_cfs_param_id/>
|
||||
</cfif>
|
||||
<!--- *** обратить внимание, тут возможны конфликты противоречивых ключей, мы никак не контролируем. но если ресолвить в обратном порядке, они хотя бы будут согласованными (хотя могут отличаться от аргументов... пойми что лучше... или проверять и бросать исключение --->
|
||||
<cfif structKeyExists(arguments.keys,"instanceOperationUid")>
|
||||
<cfset this.instance_operation_uid=arguments.keys.instanceOperationUid/>
|
||||
<cfquery name="local.qResolve">
|
||||
select o.instance_uid
|
||||
from instance_operation o
|
||||
where o.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.keys.instanceOperationUid# null=#!isValid("guid", arguments.keys.instanceOperationUid)#/>
|
||||
</cfquery>
|
||||
<cfset this.instance_uid=toString(local.qResolve.instance_uid)/>
|
||||
</cfif>
|
||||
<cfif structKeyExists(arguments.keys,"instanceUid")>
|
||||
<cfset this.instance_uid=arguments.keys.instanceUid/>
|
||||
</cfif>
|
||||
<cfif structKeyExists(arguments.keys,"svcOperationCfsParamId")><!--- хотя вот этот ключ известен всегда... но для известного параметра мы же можем его не передавать--->
|
||||
<cfset this.svc_operation_cfs_param_id=arguments.keys.svcOperationCfsParamId/>
|
||||
</cfif>
|
||||
<cfif structKeyExists(arguments.params,"resourceRealm")>
|
||||
<cfset this.resourceRealm=arguments.params.resourceRealm/>
|
||||
</cfif>
|
||||
<!--- <cfdump var=#this# abort=true/> --->
|
||||
<cfreturn this>
|
||||
</cffunction>
|
||||
|
||||
<!--- ---------------------------------------------------------------------- --->
|
||||
<!--- Прикладные функции, которые можно использовать в составе выражений. Аргументами им могут служить параметры, от которых мы зависим --->
|
||||
<!--- Добавить обработку исключений --->
|
||||
|
||||
<cffunction name="dummy" returntype="any" access="public">
|
||||
<cfargument name="arg" type="any"/>
|
||||
<cfreturn arg/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="concat" returntype="string" access="public">
|
||||
<cfset var local={}/>
|
||||
<cfset var s=""/>
|
||||
<cfloop array=#arguments# item="local.chunk">
|
||||
<cfset s&="#local.chunk#"/>
|
||||
</cfloop>
|
||||
<cfreturn s/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getValue"><!--- используем пока только для параметров, в принципе может видеть больше, чем положено --->
|
||||
<cfargument name="token" type="string"/>
|
||||
<!--- тут такой странный синтаксис: для скоупа params подставляем getCfsParam --->
|
||||
<cfset var scope = trim(listGetAt(arguments.token,1,'.'))/>
|
||||
<cfset var name = trim(listGetAt(arguments.token,2,'.'))/>
|
||||
<cfif scope EQ "params">
|
||||
<cfif listLen(arguments.token,'.') GT 2><!--- *** неуклюже. ради субпараметров --->
|
||||
<cfreturn getCfsParam(name, trim(listGetAt(arguments.token,3,'.')))/>
|
||||
<cfelse>
|
||||
<cfreturn getCfsParam(name)/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
<cfreturn variables[scope][name]/><!--- *** вряд ли это отработает для субпараметров --->
|
||||
</cffunction>
|
||||
|
||||
<!--- может быть, обобщить для наследуемых параметров... или для всех вообще --->
|
||||
<cffunction name="getResourceRealm">
|
||||
<!--- нужна отдельная функция, потому что resourceRealm может браться из параметров операции, а может наследоваться от родительского инстанса --->
|
||||
<!--- *** отдельный вопрос - как мы получим предка, если у нас операция еще не сохранена? На фронте мы хотим в один прием сохранить и операцию и параметры (на самом деле для операции create - даже инстанс, операцию и параметры) --->
|
||||
<!--- если операция не сохранена - мы как узнаем, есть у нее параметр resourceRealm, или нет? наверно, простой джойн тут не поможет
|
||||
но никто не мешает спросить отдельно--->
|
||||
<!--- *** тут возникает определенная путаница из-за того, что часть данных берется из параметров операции, а часть из параметров инстанса (кумулятивных) --->
|
||||
<!--- <cfdump var=#this#/> --->
|
||||
<cfif structKeyExists(this,"resourceRealm") AND len(this.resourceRealm)><!--- может быть, понятнее было бы брать прямо из параметров --->
|
||||
<cfreturn this.resourceRealm/>
|
||||
</cfif>
|
||||
<!--- ищем у даннной операции CFS параметр resourceRealm ---><!--- <cfdump var=#this#/><cfabort/> --->
|
||||
<cfquery name="local.qCfsParam">
|
||||
select p.param_value
|
||||
from svc_operation_cfs_param s
|
||||
join instance_operation_cfs_param p on (s.svc_operation_cfs_param_id = p.svc_operation_cfs_param_id)
|
||||
where s.svc_operation_cfs_param = 'resourceRealm'
|
||||
AND p.instance_operation_uid = <cfqueryparam cfsqltype="cf_sql_other" value=#this.instance_operation_uid# null=#!isValid('guid',this.instance_operation_uid)#/>
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#local.qCfsParam#/> --->
|
||||
<!--- --->
|
||||
<cfif local.qCfsParam.recordCount>
|
||||
<!--- параметр определен в операции сервиса. Если его не нашли - значит, не судьба --->
|
||||
<cfreturn local.qCfsParam.param_value/>
|
||||
<cfelse>
|
||||
<!--- у операции сервиса нет такого параметра - тогда по соглашению он определен в инстансе-предке. Тут нам надо знать хотя бы родительский инстанс --->
|
||||
<!--- внимание, сложность. Для получения resourceRealm для параметра вновь создаваемого инстанса нам нужно ориентироваться на параметр - ссылку на родительский инстанс (пример - vdc), потому что текущего инстанса еще нет! --->
|
||||
<!--- напоминание:
|
||||
не путать родительский инстанс (связан параметром с инстансом - владельцем операции - владельцем данного параметра)
|
||||
и инстанс-операцию-параметр (регулярная реляционная иерархия)
|
||||
хотя инстанс и операция есть в параметрах (некоторое дублирование, потому что оркестратору все передается через параметры)
|
||||
--->
|
||||
|
||||
<cfset local.instance_uid = this.instance_uid/>
|
||||
<cfif !isValid("guid", local.instance_uid) OR local.instance_uid EQ "00000000-0000-0000-0000-000000000000">
|
||||
<!--- тогда нам нужно найти параметр-референс и взять его значение --->
|
||||
<!--- тот случай, когда нужно знать класс параметра и операции --->
|
||||
<cfquery name="local.qRefParam">
|
||||
select r.svc_operation_cfs_param
|
||||
from svc_operation_cfs_param r
|
||||
join svc_operation o on (r.svc_operation_id=o.svc_operation_id)
|
||||
join svc_operation_cfs_param p on (o.svc_operation_id=p.svc_operation_id)
|
||||
where p.svc_operation_cfs_param_id = <cfqueryparam cfsqltype="cf_sql_integer" value=#this.svc_operation_cfs_param_id# null=#!isValid('integer',this.svc_operation_cfs_param_id)#/>
|
||||
AND r.ref_svc_id > 0
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#local.qRefParam#/> --->
|
||||
<cfloop query="local.qRefParam">
|
||||
<cfif structKeyExists(this.params, local.qRefParam.svc_operation_cfs_param) AND isValid('guid', this.params[local.qRefParam.svc_operation_cfs_param])>
|
||||
<cfset local.instance_uid = this.params[local.qRefParam.svc_operation_cfs_param]/>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<!--- можно и более изощренно поступать, вызывая в этом цикле функцию рекурсивного поиска resourceRealm для каждого из референсных параметров, пока не найдем.
|
||||
но пока если видим находим в параметрах ссылку на родителя - ищем там платформу, и все --->
|
||||
<!--- вообще идея наследования платформы кажется не очень корректной - мы же можем ссылаться на нескольких предков... и реализация тяжеловесная
|
||||
*** может быть, нужно метод получения платформы сделать всем инстансам, пусть сам знает, из какого параметра брать... это можно сделать конфигурируемым.
|
||||
в обычной жизни брать из параметра
|
||||
Можно сделать дополнительную фильтрацию по типу справочника (resourceRealm)
|
||||
--->
|
||||
</cfif>
|
||||
|
||||
<!--- внимание! мы тут опрашиваем параметры инстанса, а не операции! --->
|
||||
<!--- *** тут возникает непонятная ссылка на себя, впрочем, она не мешает --->
|
||||
<cfquery name="local.qCfsParam">
|
||||
WITH RECURSIVE r AS (
|
||||
SELECT
|
||||
1 AS i
|
||||
,e.display_name
|
||||
,s.svc
|
||||
,p.param
|
||||
,p.param_value
|
||||
,p.instance_uid::text
|
||||
FROM instance e
|
||||
JOIN instance_cfs_param p on (e.instance_uid=p.instance_uid)
|
||||
JOIN svc s on (e.service_id=s.svc_id)
|
||||
JOIN instance_operation_cfs_param op on (p.instance_operation_cfs_param_uid=op.instance_operation_cfs_param_uid)
|
||||
LEFT JOIN svc_operation_cfs_param sp on (op.svc_operation_cfs_param_id=sp.svc_operation_cfs_param_id)
|
||||
LEFT JOIN instance_cfs_param rp on (e.instance_uid=rp.instance_uid )
|
||||
LEFT JOIN instance ri on (rp.instance_uid=ri.instance_uid)
|
||||
WHERE e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#local.instance_uid# null=#!isValid('guid',local.instance_uid)#/>
|
||||
|
||||
UNION
|
||||
|
||||
SELECT
|
||||
i+1 AS i
|
||||
,e.display_name
|
||||
,s.svc
|
||||
,p.param
|
||||
,p.param_value
|
||||
,p.instance_uid::text
|
||||
FROM instance_cfs_param p
|
||||
JOIN instance e on (p.instance_uid=e.instance_uid)
|
||||
JOIN svc s on (e.service_id=s.svc_id)
|
||||
JOIN r on (r.param_value=p.instance_uid::text)
|
||||
WHERE r.i < 10
|
||||
)
|
||||
select param, param_value from r
|
||||
order by r.i desc
|
||||
</cfquery>
|
||||
|
||||
<cfif local.qCfsParam.recordCount EQ 0>
|
||||
<!--- тогда зайдем от параметров операции (только в данном экземпляре, зависимости все должны быть уже созданы) --->
|
||||
<cfquery name="local.qCfsParam">
|
||||
WITH RECURSIVE r AS (
|
||||
SELECT
|
||||
1 AS i
|
||||
,e.display_name
|
||||
,s.svc
|
||||
,sp.svc_operation_cfs_param as param
|
||||
,p.param_value::text
|
||||
,o.instance_uid::text
|
||||
FROM instance e
|
||||
JOIN instance_operation o ON (e.instance_uid=o.instance_uid AND o.operation='create')
|
||||
JOIN instance_operation_cfs_param p on (o.instance_operation_uid=p.instance_operation_uid)
|
||||
JOIN svc s on (e.service_id=s.svc_id)
|
||||
--JOIN instance_operation_cfs_param op on (p.instance_operation_cfs_param_uid=op.instance_operation_cfs_param_uid)
|
||||
JOIN svc_operation_cfs_param sp on (p.svc_operation_cfs_param_id=sp.svc_operation_cfs_param_id AND sp.ref_svc_id > 0)
|
||||
--LEFT JOIN instance_cfs_param rp on (e.instance_uid=rp.instance_uid )
|
||||
--LEFT JOIN instance ri on (rp.instance_uid=ri.instance_uid)
|
||||
WHERE e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#local.instance_uid# null=#!isValid('guid',local.instance_uid)#/>
|
||||
|
||||
UNION
|
||||
|
||||
SELECT
|
||||
i+1 AS i
|
||||
,e.display_name
|
||||
,s.svc
|
||||
,p.param
|
||||
,p.param_value
|
||||
,p.instance_uid::text
|
||||
FROM instance_cfs_param p
|
||||
JOIN instance e on (p.instance_uid=e.instance_uid)
|
||||
JOIN svc s on (e.service_id=s.svc_id)
|
||||
JOIN r on (r.param_value=p.instance_uid::text)
|
||||
WHERE r.i < 10
|
||||
)
|
||||
select param, param_value from r
|
||||
order by r.i desc
|
||||
</cfquery>
|
||||
</cfif>
|
||||
<!--- <cfdump var=#local.qCfsParam#/>--->
|
||||
<cfloop query="local.qCfsParam">
|
||||
<cfif local.qCfsParam.param EQ "resourceRealm">
|
||||
<cfreturn local.qCfsParam.param_value/>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<cfreturn "Resource Realm Not Found"/>
|
||||
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getCfsParam">
|
||||
<cfargument name="param" type="string"/>
|
||||
<cfargument name="subparam" type="string" required=false/>
|
||||
<!--- Секретность игнорируется. Все секреты доступны, как есть --->
|
||||
<!--- правда, мы тут можем работать только с сохраненными параметрами. Можем попробовать полагаться на правило: зависимые параметры всегда позже (не факт, что это получится при конкурентном сохранении) --->
|
||||
<!--- проблема: нам нужен тут instance_operation_uid, но таскать его в аргументах по всей цепочке вызовов неудобно. Если бы это у нас был метод CFS параметра, все было бы просто - это у нас поле параметра --->
|
||||
<cfif structKeyExists(this.params,arguments.param)><!--- AND len(this.params[arguments.param]) --->
|
||||
<cfif structKeyExists(arguments,"subparam")><!--- *** не изящно, но просто и понятно --->
|
||||
<cfreturn deserializeJson(this.params[arguments.param])[arguments.subparam]/>
|
||||
<cfelse>
|
||||
<cfreturn this.params[arguments.param]/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
<cfquery name="local.qCfsParam">
|
||||
select p.param_value
|
||||
from instance_operation_cfs_param p
|
||||
join svc_operation_cfs_param s on (p.svc_operation_cfs_param_id = s.svc_operation_cfs_param_id)
|
||||
where p.instance_operation_uid = <cfqueryparam cfsqltype="cf_sql_other" value=#this.instance_operation_uid# null=#!isValid('guid',this.instance_operation_uid)#/>
|
||||
AND s.svc_operation_cfs_param = <cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.param#/>
|
||||
</cfquery>
|
||||
<cfif structKeyExists(arguments,"subparam")><!--- *** не изящно, но просто и понятно --->
|
||||
<cfreturn deserializeJson(local.qCfsParam.param_value)[arguments.subparam]/>
|
||||
<cfelse>
|
||||
<cfreturn local.qCfsParam.param_value/>
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getValueFromStruct" returntype="string" hint="returns scalar">
|
||||
<cfargument name="struct" type="struct" required="true"/>
|
||||
<cfargument name="path" type="string" required="true"/>
|
||||
|
||||
<cftry>
|
||||
<cfreturn structGet("arguments.struct.#arguments.path#")/>
|
||||
<cfcatch type="any">
|
||||
<!--- можно ожидать ошибки, если по указанному пути расположена не структура --->
|
||||
<cfreturn cfcatch.message/><!--- халява, для упрощения диагностики --->
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getKeyListFromStruct" returntype="string" hint="returns list">
|
||||
<cfargument name="struct" type="struct" required="true"/>
|
||||
<cfargument name="path" type="string" required="true"/>
|
||||
|
||||
<cftry>
|
||||
<cfreturn structKeyList(structGet("arguments.struct.#arguments.path#"))/>
|
||||
<cfcatch type="any">
|
||||
<!--- можно ожидать ошибки, если по указанному пути расположена не структура --->
|
||||
<cfrethrow/>
|
||||
<cfreturn "#cfcatch.message# #cfcatch.detail#"/><!--- халява, для упрощения диагностики --->
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getArrayAsListFromStruct" returntype="string" hint="returns list">
|
||||
<cfargument name="struct" type="struct" required="true"/>
|
||||
<cfargument name="path" type="string" required="true"/>
|
||||
|
||||
<cftry>
|
||||
<cfreturn arrayToList(structGet("arguments.struct.#arguments.path#"))/>
|
||||
<cfcatch type="any">
|
||||
<!--- можно ожидать ошибки, если по указанному пути расположена не структура --->
|
||||
<cfrethrow/>
|
||||
<cfreturn "#cfcatch.message# #cfcatch.detail#"/><!--- халява, для упрощения диагностики --->
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getInstanceState" returntype="struct">
|
||||
<cfargument name="instanceUid" type="guid" required="true"/>
|
||||
|
||||
<cfset var local={}/>
|
||||
<cfquery name="local.qInstance" datasource="cmdb">
|
||||
select g.instance_state_uid, g.version, g.dt_state, g.instance_data, g.is_test, g.instance_uid
|
||||
from instance_state g
|
||||
where g.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceUid#/>
|
||||
order by g.version desc
|
||||
limit 1
|
||||
</cfquery>
|
||||
<cfreturn deserializeJson(local.qInstance.instance_data)/>
|
||||
<cftry>
|
||||
<cfset var structConfig = deserializeJson(local.qInstance.instance_data)/>
|
||||
<cfcatch type="ANY">
|
||||
<cfreturn {"error":"error parsing state"}/>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
<cfif len(structConfig)>
|
||||
<cfreturn structConfig/>
|
||||
</cfif>
|
||||
<cfreturn {}/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getResourceRealmConfig" returntype="struct">
|
||||
<cfargument name="resourceRealm" type="string" required="true"/><!--- платформа может быть определена для родительского инстанса где то в иерархии --->
|
||||
|
||||
<cfset var local={}/>
|
||||
<cfquery name="local.qResourceRealm" datasource="cmdb">
|
||||
select r.resource_realm_id, r.properties
|
||||
from resource_realm r
|
||||
where r.resource_realm=<cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.resourceRealm#/>
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#arguments#/>
|
||||
<cfdump var=#local.qResourceRealm#/> --->
|
||||
<cftry>
|
||||
<cfset var structConfig = deserializeJson(local.qResourceRealm.properties)/>
|
||||
<cfcatch type="ANY">
|
||||
<cfreturn {"error":"error parsing resource realm properties"}/>
|
||||
<!--- вообще-то такого быть не должно: свойства хранятся в поле jsonb --->
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
<cfif len(structConfig)>
|
||||
<cfreturn structConfig/>
|
||||
</cfif>
|
||||
<cfreturn {}/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--- ReST methods --->
|
||||
|
||||
<!--- ----------------------------------------------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------------------------------------------- --->
|
||||
|
||||
|
||||
<cffunction name="get" hint="CFS параметр операции инстанса">
|
||||
@@ -105,7 +461,7 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In
|
||||
<cfset local.qCfsParam.value_list = getListFromState(currentState, local.qCfsParam.state_path)/>
|
||||
</cfif>
|
||||
|
||||
<cfif local.qCfsParam.data_type EQ "map" OR data_type EQ "map-fixed" OR data_type EQ "array-map-fixed">
|
||||
<cfif local.qCfsParam.data_type EQ "map" OR local.qCfsParam.data_type EQ "map-fixed" OR local.qCfsParam.data_type EQ "array-map-fixed">
|
||||
<cfset processMap(local.qCfsParam)/><!--- query passed by reference --->
|
||||
</cfif>
|
||||
|
||||
@@ -487,6 +843,18 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In
|
||||
</cffunction>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</cfcomponent>
|
||||
<!--- [{"b":"12","secret1":"preved"},{"b":"13","secret1":"preved404"},{"b":"14","secret1":"preved402"}] --->
|
||||
Reference in New Issue
Block a user