前端样式




jsonschema

{
    "type":"array",
    "items":{
        "type":"object",
        "properties":{
            "category":{"enum":["Interface","Base"]},    //对应UI上的"Interface","Base"
            "program_id":{"type":"string"},              //对应Interface,Base下面的某个tag, 可点击选中选中高亮, 这时右边填写这个程序的信息, 可右键选择编辑和删除, 可以点击下面'+'选择新添加,如果是右键点击加号可以选择直接copy已有某个的program_id的所有参数
            "type": {"enum":{"usim","usignal","pysim","others"}},      //对应 "程序类型"
            "host": {"type":"string"},                                 //对应 "Host"
            "program_path":{"type":"string"},                          //对应 "程序路径"
            "config_xml":{"type":"string"},                            //对应 "配置xml"
            "cwd": {"type": "string"},                                 //程序工作目录
            "on_day":{"type":"string"},                                //对应托管时"on_day"参数，格式为"A" 为一个交易所名或者星期名monday，或者多个组合使用'|'.join起来。
            "start_stop":{"type":"array","items":{"type":"object","properties":{"start": {"type": "string"},"stop": {"type": "string"}, "m": {"type": "int"}: "args": {"type": "string"} }}},  //对应 "服务起止时间", 是list of dict, 就用兼容新版和旧版方式表示
            "in_trust":{"type":"bool"},                                  //对应 "是否托管"
            "restart_policy":{"type":"string"},                          //对应 "重启策略" 也是限定选择
            "a_signalids":{"type":"array","items":["type":"string"]},    //对应 "生产信号", 多个字符串用户可填, 用 分号 分隔, 所有程序的所有a_signalid组成的集合中a_signalid不可重复(前端给限制), 自动更新到左侧"Interface信号" 或 "内部信号" 表中,
                                                                          // Interface程序生产的信号放在Interface信号, Base程序生产的信号放在 "内部信号"
                                                                          // 所谓a_signalid, 意指abstract_signalid, 和已有的signalid概念不同, 它是在一个Signal服务内部代指一个 shmprefix+signalid 的名字, 一个Signal服务的所有a_signalid不重复
            "dependency_signals":{"type":"array","items":["type":"string"]},   //对应 "依赖程序信号" 表示这个程序依赖的a_signalid(s), 必须是本信号服务其他程序产生的a_signalid(前端自动给限制)
            "dependency_quotes":{"type":"array","items":["type":"string"]},   //对应 "依赖行情", 是所需行情服务的名字, 限定这个程序所在host所在集群所拥有的行情服务
            "dependency_damocles":{"type":"array","items":["type":"string"]}, //对应 "依赖damocles", 多个sid(string), 必须是在数据库中查到的这个user_id所有的sid(前端做限制)
            "dependency_tvrs":{"type":"string"},                               //对应 "依赖tvr服务", 必须是在数据库中查到的存在的tvr服务名字
            "udatartserver":{"type":"object", "properties":{"host":{"type": "string"},"port": {"type": "int"} } },  //对应 udatartserver, host port 两个参数 或者为空
            "cpu_num":{"type":"int"},                                        //对应 "cpu个数", 正整数
            "mpimode":{"type":"string"},                                     //对应托管配置的 "mpimode"
            "env":{"type":"string"},                                         //对应托管配置 "env"
      }
    }
}




数据库tables:




表1

表名	表列名	本列数据类型	要求	说明
SignalsNew




	service_id	string	不为空, 不重复	服务名
user_id	string	不为空	用户名
creator_id	string	不为空	创建者(一般指运维)

provider_template_id
	string	不为空, 是表2中某一个provider_template_id	模板名
provider_params_id	string	不为空, provider_template_id + user_id + provider_params_id的组合要出现在表3中	参数集名
extern_match_pattern	string	可为空	外部关联匹配方式




表2

表名	表列名	本列数据类型	要求	说明
SignalsNewTemplates	provider_template_id	string	不为空, 不重复	模板名, 现在只有一个模板名, 值为"template_0"
provider_template	json	不为空, 符合JsonSchema的形式	模板内容, 即上面的jsonschema




表3

表名	表列名	本列数据类型	要求	说明
SignalsNewTemplateParams


	provider_template_id	string	不为空	模板名
user_id	string	不为空	用户名
provider_params_id	string	不为空, 同一个 provider_template_id + user_id 的组合中, 所有的provider_params_id不重复	参数集名
params	json	符合在表2中对应provider_template_id的provider_template提供的JsonSchema	参数集内容




表4

表名	表列名	本列数据类型	要求	说明
SignalsNewSignals








	service_id	string	不为空	服务名
a_signal_id	string	不为空, 同一个service_id下的a_signal_id不同	abstract_signal_id
type	string	不为空, 限定"Interface", "Base"	信号类型
sid	string	可为空	用","隔开多个sid
sigconv_id	string	可为空	汇聚服务id
data_type	string	不为空	数据类型
transfer_params_id	string	不为空	传输信号所需参数集id
src_host	string	不为空	源host
dest_host	string	可为空	目标host
relay_host	string	可为空	中转机, 用","隔开多台host




表5

表名	表列名	本列数据类型	要求	说明
SignalsNewTransferParams





	user_id	string	不为空	用户名
transfer_params_id	string	不为空, 同一user_id下面的params_id不重复	传输信号所需参数集id
gzip	bool	
	

shmprefix	string	不为空	

signalid	string	不为空	

instsnum	int	>0	

ringbuffer	int	>0	





前端到后端所需接口

接口名称	API	类型	GET传入参数 / POST Body	返回	前端最常用位置
Read_SignalHead	/pbSignalsNewConfig/Read_SignalHead	GET	

service_id=xxx

传入service_id

	

{"service_id":"xxx", "user_id":"xxx",  "createor_id":"",,...}

查表1, 对应service_id的一行的数据组成的json

	

Write_SignalHead	/pbSignalsNewConfig/Write_SignalHead	POST	

{"service_id":"xxx", "user_id":"xxx",  "createor_id":"",,...}

与Read_SignalHead的正常返回格式相同

	

{"sucess":"true/false", "e_msg":""}

是否成功写入, 如果没有成功写入, e_msg携带错误信息

	

Read_SignalHeadsAll	/pbSignalsNewConfig/Read_SignalHeadsAll	GET	无	

{{"service_id":"xxx", "user_id":"xxx",  "createor_id":"",,...},...}

返回表1的所有行

	

Read_ProviderParams	/pbSignalsNewConfig/Read_ProviderParams	GET	

provider_template_id=xxx&user_id=xxx&provider_params_id=xxx

传入provider_template_id, user_id, provider_params_id

	表3中对应组合的params列的json字符串	

Read_OneProviderParams	/pbSignalsNewConfig/Read_OneProviderParams	GET	

provider_template_id=xxx&user_id=xxx&provider_params_id=xxx

&program_id=xxx

	{"category":"xxx","program_id":"xxx", ...}
表3中对应组合的params列的json字符串中, 对应program_id的子json	

Write_ProviderParams	/pbSignalsNewConfig/Write_ProviderParams	POST	{"provider_template_id":"xxx", "user_id":"xxx",  "provider_params_id":"", "params":"xxx"}	

{"sucess":"true/false", "e_msg":""}

是否成功写入, 如果没有成功写入, e_msg携带错误信息

	

Read_UserSids	/pbSignalsNewConfig/Read_UserSids	GET	

user_id=xxx

传入user_id

	

["sid_0","sid_1", ...]

这个user的所有sid

	

右侧信号表的sid列的下拉框, 中间依赖damocles

 


Read_Quotes	/pbSignalsNewConfig/Read_Quotes	GET	

host=xxx

传入host

	

["quote_0", "quote_1", ...]

这个host所在集群所拥有的行情服务名list

	

中间"依赖行情"下拉框


Read_ProviderParamsIds	/pbSignalsNewConfig/Read_ProviderParamsIds	GET	

provider_template_id=xxx&user_id=xxx

传入provider_template_id, user_id

	

["provider_params_id_0", "provider_params_id_0", ...]

这个user在这个template下全部的provider_params_id

	

下拉框


Read_TvrServices	/pbSignalsNewConfig/Read_TvrServices	GET	

user_id=xxx

传入user_id

	

["tvrService_id_0", "tvrService_id_1", ...]

这个user的tvr服务list

	


下拉框


Read_Signal	/pbSignalsNewConfig/Read_Signal	GET	service_id="xxx"&a_signal_id="xxx"	

{"service_id":"xxx", "a_signal_id":"xxx", ...}

表4对应service_id和a_signal_id一行的json

	

Write_Signal	/pbSignalsNewConfig/Write_Signal	POST	

{"service_id":"xxx", "a_signal_id":"xxx", ...}

表4一行的json

	

{"sucess":"true/false", "e_msg":""}

是否成功写入, 如果没有成功写入, e_msg携带错误信息

	

Read_SignalsAll	/pbSignalsNewConfig/Read_SignalsAll	GET	

service_id=xxx

传入service_id

	

{{"service_id":"xxx","a_signal_id":"xxx"},...}

表4中所有对应service_id的行组成的json

	

Read_SignalsInterfaceAll	/pbSignalsNewConfig/Read_SignalsInterfaceAll	GET	

service_id=xxx

传入service_id

	

{{"service_id":"xxx","a_signal_id":"xxx"},...}

表4中所有对应service_id且type是Interface的行组成的json

	

Read_SignalsBaseAll	/pbSignalsNewConfig/Read_SignalsBaseAll	GET	

service_id=xxx

传入service_id

	

{{"service_id":"xxx","a_signal_id":"xxx"},...}

表4中所有对应service_id且type是Base的行组成的json

	

Read_TransferParams	/pbSignalsNewConfig/Read_TransferParams	GET	

user_id=xxx&transfer_params_id=xxx

传入user_id和transfer_params_id

	

{"user_id":"xxx","transfer_params_id":"xxx","gzip"="true",...}

表5中对应user_id和transfer_params_id的一行的json

	

Write_TransferParams	/pbSignalsNewConfig/Write_TransferParams	POST	

{"user_id":"xxx","transfer_params_id":"xxx","gzip"="true",...}

表5中的一行的json

	

{"sucess":"true/false", "e_msg":""}

是否成功写入, 如果没有成功写入, e_msg携带错误信息

	


function arrayToOptions(arr) {
  let options = [];
  
  arr.forEach(item => {
    let [parent, child] = item.split('-');
    let parentOption = options.find(option => option.value === parent);
    
    if (!parentOption) {
      parentOption = { value: parent, children: [] };
      options.push(parentOption);
    }
    
    parentOption.children.push({ value: child });
  });
  
  return options;
}

let arr = ['a-b','a-c','b-d','b-d'];
let options = arrayToOptions(arr);

console.log(options);



