index.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. hgRebateRatio: 0,
  14. hgRebateType: 0,
  15. subsidyTime: 0,
  16. subsidyAmount: 0,
  17. subsidyRbWmAmount: 0,
  18. subsidyRbOtAmount: 0,
  19. expireTimeEvents: 0,
  20. expireTimeSpecial: 0,
  21. syncSettingEnabled: false,
  22. runWorkerEnabled: false,
  23. };
  24. const formState = reactive({ ...initialFormState });
  25. const formChangeTimer = ref(null);
  26. const formChanged = computed(() => {
  27. const changed = {};
  28. Object.keys(formState).forEach(key => {
  29. if (formState[key] !== initialFormState[key]) {
  30. changed[key] = formState[key];
  31. }
  32. });
  33. return changed;
  34. });
  35. watch(formState, () => {
  36. if (formChangeTimer.value) {
  37. clearTimeout(formChangeTimer.value);
  38. }
  39. formChangeTimer.value = setTimeout(() => {
  40. if (Object.keys(formChanged.value).length > 0) {
  41. saveSetting(formChanged.value);
  42. }
  43. }, 1000);
  44. }, { deep: true });
  45. const getSetting = async () => {
  46. try {
  47. const data = await requestClient.get('/system/get_setting');
  48. return data;
  49. }
  50. catch (error) {
  51. console.error('Failed to fetch setting:', error);
  52. message.error('获取参数设置失败');
  53. return {};
  54. }
  55. }
  56. const saveSetting = async (changed) => {
  57. try {
  58. await requestClient.post('/system/update_setting', changed);
  59. message.success('保存成功');
  60. syncSetting();
  61. }
  62. catch (error) {
  63. console.error('Failed to save setting:', error);
  64. message.error('保存失败');
  65. }
  66. }
  67. const syncSetting = () => {
  68. getSetting().then(data => {
  69. if (data) {
  70. Object.assign(formState, data);
  71. Object.assign(initialFormState, data);
  72. }
  73. });
  74. }
  75. onMounted(() => {
  76. syncSetting();
  77. });
  78. onUnmounted(() => {
  79. clearTimeout(formChangeTimer.value);
  80. });
  81. </script>
  82. <template>
  83. <Page title="参数设置">
  84. <Form
  85. :model="formState"
  86. layout="horizontal"
  87. :label-col="{ span: 6 }"
  88. :wrapper-col="{ span: 18 }"
  89. class="parameter-form"
  90. >
  91. <Form.Item
  92. label="内盘默认注额"
  93. name="innerDefaultAmount"
  94. >
  95. <InputNumber
  96. v-model:value="formState.innerDefaultAmount"
  97. :min="0"
  98. :step="1000"
  99. style="width: 200px"
  100. />
  101. </Form.Item>
  102. <!-- <Form.Item
  103. label="最小单关利润额"
  104. name="minProfitAmount"
  105. >
  106. <InputNumber
  107. v-model:value="formState.minProfitAmount"
  108. :min="-99999"
  109. :step="1"
  110. style="width: 200px"
  111. />
  112. </Form.Item> -->
  113. <Form.Item
  114. label="最小展示利润额"
  115. name="minShowAmount"
  116. >
  117. <InputNumber
  118. v-model:value="formState.minShowAmount"
  119. :min="-99999"
  120. :step="1"
  121. style="width: 200px"
  122. />
  123. </Form.Item>
  124. <Form.Item
  125. label="内盘返点比例(%)"
  126. name="innerRebateRatio"
  127. >
  128. <InputNumber
  129. :disabled="formState.syncSettingEnabled"
  130. v-model:value="formState.innerRebateRatio"
  131. :min="0"
  132. :max="100"
  133. :step="0.1"
  134. style="width: 200px"
  135. />
  136. </Form.Item>
  137. <Form.Item
  138. label="OB返点比例(%)"
  139. name="obRebateRatio"
  140. >
  141. <InputNumber
  142. :disabled="formState.syncSettingEnabled"
  143. v-model:value="formState.obRebateRatio"
  144. :min="0"
  145. :max="100"
  146. :step="0.1"
  147. style="width: 200px; vertical-align: middle;"
  148. />
  149. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.obRebateType">
  150. <Radio :value="0">结算</Radio>
  151. <Radio :value="1">本金</Radio>
  152. </RadioGroup>
  153. </Form.Item>
  154. <Form.Item
  155. label="HG返点比例(%)"
  156. name="hgRebateRatio"
  157. >
  158. <InputNumber
  159. :disabled="formState.syncSettingEnabled"
  160. v-model:value="formState.hgRebateRatio"
  161. :min="0"
  162. :max="100"
  163. :step="0.1"
  164. style="width: 200px; vertical-align: middle;"
  165. />
  166. <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.hgRebateType">
  167. <Radio :value="0">结算</Radio>
  168. <Radio :value="1">本金</Radio>
  169. </RadioGroup>
  170. </Form.Item>
  171. <Form.Item
  172. label="早盘补水时间(-h)"
  173. name="subsidyTime"
  174. >
  175. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyTime" :min="0" :step="48" style="width: 200px" />
  176. </Form.Item>
  177. <Form.Item
  178. label="早盘补水比例"
  179. name="subsidyAmount"
  180. >
  181. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyAmount" :min="0" :step="0.01" style="width: 200px" />
  182. </Form.Item>
  183. <Form.Item
  184. label="滚球补水(净胜)"
  185. name="subsidyRbWmAmount"
  186. >
  187. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyRbWmAmount" :min="0" :step="0.01" style="width: 200px" />
  188. </Form.Item>
  189. <Form.Item
  190. label="滚球补水(进球)"
  191. name="subsidyRbOtAmount"
  192. >
  193. <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.subsidyRbOtAmount" :min="0" :step="0.01" style="width: 200px" />
  194. </Form.Item>
  195. <Form.Item
  196. label="普通盘过期(ms)"
  197. name="expireTimeEvents"
  198. >
  199. <InputNumber v-model:value="formState.expireTimeEvents" :min="0" :step="1000" style="width: 200px" />
  200. </Form.Item>
  201. <Form.Item
  202. label="特殊盘过期(ms)"
  203. name="expireTimeSpecial"
  204. >
  205. <InputNumber v-model:value="formState.expireTimeSpecial" :min="0" :step="1000" style="width: 200px" />
  206. </Form.Item>
  207. <Form.Item
  208. label="同步 Qboss 配置"
  209. name="syncSettingEnabled"
  210. >
  211. <Switch v-model:checked="formState.syncSettingEnabled" />
  212. </Form.Item>
  213. <Form.Item
  214. label="后台 Worker 开关"
  215. name="runWorkerEnabled"
  216. >
  217. <Switch v-model:checked="formState.runWorkerEnabled" />
  218. </Form.Item>
  219. <!-- <Form.Item :wrapper-col="{ offset: 6, span: 18 }">
  220. <Button type="primary" @click="saveSetting" :disabled="!isFormChanged">保存设置</Button>
  221. </Form.Item> -->
  222. </Form>
  223. </Page>
  224. </template>
  225. <style scoped>
  226. .parameter-form {
  227. max-width: 600px;
  228. }
  229. </style>