|
|
@@ -0,0 +1,240 @@
|
|
|
+<template>
|
|
|
+ <lay-layer :title="modelConfig.title" v-model="modelConfig.visible" area="auto" :btn="operator">
|
|
|
+ <div class="width-800 custom-layer" style="padding: 20px">
|
|
|
+ <lay-form :model="modelParams" ref="modelFormRef">
|
|
|
+ <lay-row space="10">
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="名称" prop="name">
|
|
|
+ <lay-input v-model="modelParams.name" />
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="初始金额" prop="startAmount">
|
|
|
+ <lay-input v-model="modelParams.startAmount" />
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="服务器" prop="serverId">
|
|
|
+ <lay-select v-model="modelParams.serverId" :show-search="true">
|
|
|
+ <lay-select-option v-for="item in serverList" :value="item.id" :label="item.value" />
|
|
|
+ </lay-select>
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="通讯端口" prop="callPort">
|
|
|
+ <lay-input v-model="modelParams.callPort" />
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="策略" prop="strategyId">
|
|
|
+ <lay-select v-model="modelParams.strategyId" @change="strategyHandleChange">
|
|
|
+ <lay-select-option v-for="item in strategyList" :value="item.id" :label="item.value" />
|
|
|
+ </lay-select>
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item label="策略版本" prop="strategyProgramId">
|
|
|
+ <lay-select v-model="modelParams.strategyProgramId" @change="strategyProgramHandleChange">
|
|
|
+ <lay-select-option v-for="item in strategyProgramList" :value="item.id" :label="item.value" />
|
|
|
+ </lay-select>
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ <div>
|
|
|
+ <template v-for="item in strategyParameterList">
|
|
|
+ <lay-col md="12" sm="12" xs="24">
|
|
|
+ <lay-form-item :label="item.name" :prop="`robotConfigs.${item.code}`">
|
|
|
+ <lay-input v-if="item.valType == 0" v-model="modelParams.robotConfigs[item.code]" />
|
|
|
+ <lay-input type="number" v-if="item.valType == 1" v-model="modelParams.robotConfigs[item.code]" />
|
|
|
+ <lay-switch v-if="item.valType == 2" v-model="modelParams.robotConfigs[item.code]" />
|
|
|
+ <lay-select v-if="item.valType == 3" v-model="modelParams.robotConfigs[item.code]" :show-search="true">
|
|
|
+ <lay-select-option v-for="items in item.contentVal.split(',')" :value="items" :label="items" />
|
|
|
+ </lay-select>
|
|
|
+ <lay-select v-if="item.valType == 5" v-model="modelParams.robotConfigs[item.code]" :options="apikeyList" :show-search="true" />
|
|
|
+ </lay-form-item>
|
|
|
+ <lay-form-item v-if="item.code == 'open'" label="开仓递增" :prop="`robotConfigs.openIntervals`">
|
|
|
+ <lay-input v-model="modelParams.robotConfigs.openIntervals" />
|
|
|
+ </lay-form-item>
|
|
|
+ <lay-form-item v-if="item.code == 'close'" label="平仓递增" :prop="`robotConfigs.closeIntervals`">
|
|
|
+ <lay-input v-model="modelParams.robotConfigs.closeIntervals" />
|
|
|
+ </lay-form-item>
|
|
|
+ </lay-col>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </lay-row>
|
|
|
+ </lay-form>
|
|
|
+ </div>
|
|
|
+ </lay-layer>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { ref, reactive, getCurrentInstance } from "vue";
|
|
|
+import { update_robot_batch, get_server_select, get_strategy_select, get_strategy_program_select, get_strategy_parameter_select, get_apikey_select } from "@/api";
|
|
|
+
|
|
|
+const { proxy }: any = getCurrentInstance();
|
|
|
+
|
|
|
+const modelFormRef = ref();
|
|
|
+
|
|
|
+interface ModelConfig {
|
|
|
+ title: string;
|
|
|
+ visible: boolean;
|
|
|
+ isUpdate: boolean;
|
|
|
+ loading: boolean;
|
|
|
+}
|
|
|
+interface ModelParams {
|
|
|
+ id?: number;
|
|
|
+ name?: string;
|
|
|
+ serverId?: number;
|
|
|
+ strategyId?: number;
|
|
|
+ strategyProgramId?: number;
|
|
|
+ startAmount?: number;
|
|
|
+ callPort?: number;
|
|
|
+ remark?: string;
|
|
|
+ robotConfigs?: any;
|
|
|
+}
|
|
|
+
|
|
|
+let modelParams = ref<ModelParams>({});
|
|
|
+let modelConfig: ModelConfig = reactive({ title: "", visible: false, isUpdate: false, loading: false });
|
|
|
+
|
|
|
+let handleResult = reactive<{ resolve?: any; reject?: any }>({});
|
|
|
+
|
|
|
+let serverList = ref();
|
|
|
+let strategyList = ref();
|
|
|
+let strategyProgramList = ref();
|
|
|
+let strategyParameterList = ref();
|
|
|
+let apikeyList = ref();
|
|
|
+
|
|
|
+let botDetailList = ref();
|
|
|
+
|
|
|
+const show = async (params?: any) => {
|
|
|
+ initData();
|
|
|
+ get_server_list();
|
|
|
+ get_strategy_list();
|
|
|
+ get_apikey();
|
|
|
+ modelConfig.visible = true;
|
|
|
+ modelConfig.title = "批量设置机器人";
|
|
|
+
|
|
|
+ modelParams.value = { strategyId: params[0].strategyId, strategyProgramId: params[0].strategyProgramId, robotConfigs: {} };
|
|
|
+ botDetailList.value = params;
|
|
|
+ strategyHandleChange(modelParams.value.strategyId);
|
|
|
+ strategyProgramHandleChange(modelParams.value.strategyProgramId);
|
|
|
+ return new Promise(async (resolve, reject) => {
|
|
|
+ handleResult.resolve = resolve;
|
|
|
+ handleResult.reject = reject;
|
|
|
+ });
|
|
|
+};
|
|
|
+// 获取服务器列表
|
|
|
+const get_server_list = () => {
|
|
|
+ const params = {};
|
|
|
+ get_server_select(params, (data: any) => {
|
|
|
+ serverList.value = data.data;
|
|
|
+ });
|
|
|
+};
|
|
|
+// 获取策略列表
|
|
|
+const get_strategy_list = () => {
|
|
|
+ const params = {};
|
|
|
+ get_strategy_select(params, (data: any) => {
|
|
|
+ strategyList.value = data.data;
|
|
|
+ });
|
|
|
+};
|
|
|
+// 获取策略版本列表
|
|
|
+const get_strategy_program_list = (value: number) => {
|
|
|
+ const params = { strategyId: value };
|
|
|
+ get_strategy_program_select(params, (data: any) => {
|
|
|
+ strategyProgramList.value = data.data;
|
|
|
+ });
|
|
|
+};
|
|
|
+// 获取策略版本参数下拉
|
|
|
+const get_strategy_parameter = (value: number) => {
|
|
|
+ const params = { programId: value };
|
|
|
+ get_strategy_parameter_select(params, (data: any) => {
|
|
|
+ strategyParameterList.value = data.data;
|
|
|
+ });
|
|
|
+};
|
|
|
+// 获取APIKEY参数下拉
|
|
|
+const get_apikey = () => {
|
|
|
+ const params = {};
|
|
|
+ get_apikey_select(params, (data: any) => {
|
|
|
+ apikeyList.value = data.data.map((item: any) => ({ label: item.value, value: item.id }));
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 选择策略操作
|
|
|
+const strategyHandleChange = (e: any) => {
|
|
|
+ get_strategy_program_list(e);
|
|
|
+};
|
|
|
+// 选择策略版本操作
|
|
|
+const strategyProgramHandleChange = (e: any) => {
|
|
|
+ get_strategy_parameter(e);
|
|
|
+};
|
|
|
+
|
|
|
+const handleParams = (value: any) => {
|
|
|
+ let openIntervals = 0;
|
|
|
+ let closeIntervals = 0;
|
|
|
+ return botDetailList.value.map((item: any) => {
|
|
|
+ let configs = item.configList.map((item: any) => {
|
|
|
+ delete item.deleted;
|
|
|
+ delete item.id;
|
|
|
+ delete item.robotId;
|
|
|
+ let result = { ...item, val: value.robotConfigs[item.code] || item.val };
|
|
|
+ if (result.code == "open") {
|
|
|
+ result.val = result.val * 1 + openIntervals * 1;
|
|
|
+ openIntervals += value.robotConfigs.openIntervals * 1;
|
|
|
+ }
|
|
|
+ if (result.code == "close") {
|
|
|
+ result.val = result.val * 1 + closeIntervals * 1;
|
|
|
+ closeIntervals += value.robotConfigs.closeIntervals * 1;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ id: item.id,
|
|
|
+ name: value.name || item.name,
|
|
|
+ serverId: value.serverId || item.serverId,
|
|
|
+ strategyId: value.strategyId || item.strategyId,
|
|
|
+ strategyProgramId: value.strategyProgramId || item.strategyProgramId,
|
|
|
+ callPort: value.callPort || item.callPort,
|
|
|
+ startAmount: value.startAmount || item.startAmount,
|
|
|
+ remark: item.remark,
|
|
|
+ robotConfigs: configs,
|
|
|
+ };
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const initData = () => {
|
|
|
+ serverList.value = [];
|
|
|
+ strategyList.value = [];
|
|
|
+ strategyProgramList.value = [];
|
|
|
+ strategyParameterList.value = [];
|
|
|
+ apikeyList.value = [];
|
|
|
+};
|
|
|
+
|
|
|
+const operator = reactive([
|
|
|
+ {
|
|
|
+ text: "确认",
|
|
|
+ callback: () => {
|
|
|
+ modelFormRef.value.validate((isValidate: boolean) => {
|
|
|
+ if (isValidate) {
|
|
|
+ const params = handleParams(modelParams.value);
|
|
|
+ modelConfig.loading = true;
|
|
|
+ update_robot_batch(params, (data: any) => {
|
|
|
+ modelConfig.loading = false;
|
|
|
+ if (data.code == 200) {
|
|
|
+ proxy.$message("批量修改成功!");
|
|
|
+ modelConfig.visible = false;
|
|
|
+ handleResult.resolve(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: "取消",
|
|
|
+ callback: () => {
|
|
|
+ modelConfig.visible = false;
|
|
|
+ handleResult.resolve(false);
|
|
|
+ },
|
|
|
+ },
|
|
|
+]);
|
|
|
+defineExpose({ show });
|
|
|
+</script>
|