index.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <script setup>
  2. import { Page } from '@vben/common-ui';
  3. import { requestClient } from '#/api/request';
  4. import { Button, message, Form, InputNumber, RadioGroup, Radio, Drawer, Switch } from 'ant-design-vue';
  5. import { ref, reactive, computed, onMounted, onUnmounted, watch } from 'vue';
  6. const initialFormState = {
  7. innerDefaultAmount: 10000,
  8. // minProfitAmount: 0,
  9. minShowAmount: 0,
  10. innerRebateRatio: 0,
  11. obRebateRatio: 0,
  12. obRebateType: 0,
  13. obMaxDiff: 0,
  14. imRebateRatio: 0,
  15. imRebateType: 0,
  16. imMaxDiff: 0,
  17. hgRebateRatio: 0,
  18. hgRebateType: 0,
  19. hgRebateLower: 0,
  20. hgMaxDiff: 0,
  21. pcRebateRatio: 0,
  22. pcRebateType: 0,
  23. subsidyTime: 0,
  24. subsidyAmount: 0,
  25. subsidyRbWmAmount: 0,
  26. subsidyRbOtAmount: 0,
  27. halfTimeActiveTime: 0,
  28. expireTimeEvents: 0,
  29. expireTimeSpecial: 0,
  30. syncSettingEnabled: false,
  31. runWorkerEnabled: false,
  32. };
  33. const formState = reactive({ ...initialFormState });
  34. const formChangeTimer = ref(null);
  35. const formChanged = computed(() => {
  36. const changed = {};
  37. Object.keys(formState).forEach(key => {
  38. if (formState[key] !== initialFormState[key]) {
  39. changed[key] = formState[key];
  40. }
  41. });
  42. return changed;
  43. });
  44. watch(formState, () => {
  45. if (formChangeTimer.value) {
  46. clearTimeout(formChangeTimer.value);
  47. }
  48. formChangeTimer.value = setTimeout(() => {
  49. if (Object.keys(formChanged.value).length > 0) {
  50. saveSetting(formChanged.value);
  51. }
  52. }, 1000);
  53. }, { deep: true });
  54. const getSetting = async () => {
  55. try {
  56. const data = await requestClient.get('/system/get_setting');
  57. return data;
  58. }
  59. catch (error) {
  60. console.error('Failed to fetch setting:', error);
  61. message.error('获取参数设置失败');
  62. return {};
  63. }
  64. }
  65. const saveSetting = async (changed) => {
  66. try {
  67. await requestClient.post('/system/update_setting', changed);
  68. message.success('保存成功');
  69. syncSetting();
  70. }
  71. catch (error) {
  72. console.error('Failed to save setting:', error);
  73. message.error('保存失败');
  74. }
  75. }
  76. const syncSetting = () => {
  77. getSetting().then(data => {
  78. if (data) {
  79. Object.assign(formState, data);
  80. Object.assign(initialFormState, data);
  81. }
  82. });
  83. }
  84. onMounted(() => {
  85. syncSetting();
  86. });
  87. onUnmounted(() => {
  88. clearTimeout(formChangeTimer.value);
  89. });
  90. </script>
  91. <template>
  92. <Page title="参数设置">
  93. <Form
  94. :model="formState"
  95. layout="horizontal"
  96. :label-col="{ span: 6 }"
  97. :wrapper-col="{ span: 18 }"
  98. class="parameter-form"
  99. >
  100. <Form.Item
  101. label="内盘默认注额"
  102. name="innerDefaultAmount"
  103. >
  104. <InputNumber
  105. v-model:value="formState.innerDefaultAmount"
  106. :min="0"
  107. :step="1000"
  108. style="width: 200px"
  109. />
  110. </Form.Item>
  111. <Form.Item
  112. label="最小展示利润额"
  113. name="minShowAmount"
  114. >
  115. <InputNumber
  116. v-model:value="formState.minShowAmount"
  117. :min="-99999"
  118. :step="1"
  119. style="width: 200px"
  120. />
  121. </Form.Item>
  122. <Form.Item
  123. label="内盘返点比例(%)"
  124. name="innerRebateRatio"
  125. >
  126. <InputNumber
  127. :disabled="formState.syncSettingEnabled"
  128. v-model:value="formState.innerRebateRatio"
  129. :min="0"
  130. :max="100"
  131. :step="0.1"
  132. style="width: 200px"
  133. />
  134. </Form.Item>
  135. <Form.Item
  136. label="OB返点比例(%)"
  137. name="obRebateRatio"
  138. >
  139. <InputNumber
  140. :disabled="formState.syncSettingEnabled"
  141. v-model:value="formState.obRebateRatio"
  142. :min="0"
  143. :max="100"
  144. :step="0.1"
  145. style="width: 200px; vertical-align: middle;"
  146. />
  147. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.obRebateType">
  148. <Radio :value="0">结算</Radio>
  149. <Radio :value="1">本金</Radio>
  150. </RadioGroup>
  151. </Form.Item>
  152. <Form.Item
  153. label="OB赔率差值阈值"
  154. name="obMaxDiff"
  155. >
  156. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.obMaxDiff" :step="0.01" style="width: 200px" />
  157. </Form.Item>
  158. <Form.Item
  159. label="IM返点比例(%)"
  160. name="imRebateRatio"
  161. >
  162. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.imRebateRatio" :min="0" :step="0.1" style="width: 200px" />
  163. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.imRebateType">
  164. <Radio :value="0">结算</Radio>
  165. <Radio :value="1">本金</Radio>
  166. </RadioGroup>
  167. </Form.Item>
  168. <Form.Item
  169. label="IM赔率差值阈值"
  170. name="imMaxDiff"
  171. >
  172. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.imMaxDiff" :step="0.01" style="width: 200px" />
  173. </Form.Item>
  174. <Form.Item
  175. label="HG返点比例(%)"
  176. name="hgRebateRatio"
  177. >
  178. <InputNumber
  179. :disabled="formState.syncSettingEnabled"
  180. v-model:value="formState.hgRebateRatio"
  181. :min="0"
  182. :max="100"
  183. :step="0.1"
  184. style="width: 200px; vertical-align: middle;"
  185. />
  186. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.hgRebateType">
  187. <Radio :value="0">结算</Radio>
  188. <Radio :value="1">本金</Radio>
  189. </RadioGroup>
  190. </Form.Item>
  191. <Form.Item
  192. label="HG低返点比例(%)"
  193. name="hgRebateLower"
  194. >
  195. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.hgRebateLower" :min="0" :step="0.01" style="width: 200px" />
  196. </Form.Item>
  197. <Form.Item
  198. label="HG赔率差值阈值"
  199. name="hgMaxDiff"
  200. >
  201. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.hgMaxDiff" :step="0.01" style="width: 200px" />
  202. </Form.Item>
  203. <Form.Item
  204. label="PC返点比例(%)"
  205. name="pcRebateRatio"
  206. >
  207. <InputNumber :disabled="formState.syncSettingEnabled"
  208. v-model:value="formState.pcRebateRatio"
  209. :min="0"
  210. :step="0.1"
  211. style="width: 200px; vertical-align: middle;"
  212. />
  213. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.pcRebateType">
  214. <Radio :value="0">结算</Radio>
  215. <Radio :value="1">本金</Radio>
  216. </RadioGroup>
  217. </Form.Item>
  218. <Form.Item
  219. label="赛前补水时间(-h)"
  220. name="subsidyTime"
  221. >
  222. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyTime" :min="0" :step="48" style="width: 200px" />
  223. </Form.Item>
  224. <Form.Item
  225. label="赛前补水比例"
  226. name="subsidyAmount"
  227. >
  228. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyAmount" :min="0" :step="0.01" style="width: 200px" />
  229. </Form.Item>
  230. <Form.Item
  231. label="滚球补水(净胜)"
  232. name="subsidyRbWmAmount"
  233. >
  234. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyRbWmAmount" :min="0" :step="0.01" style="width: 200px" />
  235. </Form.Item>
  236. <Form.Item
  237. label="滚球补水(进球)"
  238. name="subsidyRbOtAmount"
  239. >
  240. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyRbOtAmount" :min="0" :step="0.01" style="width: 200px" />
  241. </Form.Item>
  242. <Form.Item
  243. label="上半场激活时间(-h)"
  244. name="halfTimeActiveTime"
  245. >
  246. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.halfTimeActiveTime" :min="0" :max="24" :step="0.5" style="width: 200px" />
  247. </Form.Item>
  248. <Form.Item
  249. label="普通盘过期(ms)"
  250. name="expireTimeEvents"
  251. >
  252. <InputNumber v-model:value="formState.expireTimeEvents" :min="0" :step="1000" style="width: 200px" />
  253. </Form.Item>
  254. <Form.Item
  255. label="特殊盘过期(ms)"
  256. name="expireTimeSpecial"
  257. >
  258. <InputNumber v-model:value="formState.expireTimeSpecial" :min="0" :step="1000" style="width: 200px" />
  259. </Form.Item>
  260. <Form.Item
  261. label="同步 Qboss 配置"
  262. name="syncSettingEnabled"
  263. >
  264. <Switch v-model:checked="formState.syncSettingEnabled" />
  265. </Form.Item>
  266. <Form.Item
  267. label="后台 Worker 开关"
  268. name="runWorkerEnabled"
  269. >
  270. <Switch v-model:checked="formState.runWorkerEnabled" />
  271. </Form.Item>
  272. <!-- <Form.Item :wrapper-col="{ offset: 6, span: 18 }">
  273. <Button type="primary" @click="saveSetting" :disabled="!isFormChanged">保存设置</Button>
  274. </Form.Item> -->
  275. </Form>
  276. </Page>
  277. </template>
  278. <style scoped>
  279. .parameter-form {
  280. max-width: 600px;
  281. }
  282. </style>