SeparateAccountsModal.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="1150" @ok="handleSubmit">
  3. <BasicForm @register="registerForm" name="SeparateAccountsForm">
  4. <template #SeparateAccounts="{ model, feild }">
  5. <FormItem>
  6. <InputNumber
  7. addonBefore="平台"
  8. addonAfter="%"
  9. v-model:value="model['ptSeparateAccounts']"
  10. class="mr-5"
  11. :precision="2"
  12. :max="ptSeparateAccountsMax"
  13. :min="1"
  14. @change="handleShChange"
  15. placeholder="请输入平台分账比例"
  16. ></InputNumber>
  17. <InputNumber
  18. addonBefore="商户"
  19. addonAfter="%"
  20. v-model:value="model['shSeparateAccounts']"
  21. class="mr-5"
  22. :precision="2"
  23. :max="shSeparateAccountsMax"
  24. :min="1"
  25. placeholder="请输入商户分账比例"
  26. @change="handleShChange"
  27. ></InputNumber>
  28. <InputNumber
  29. addonBefore="门店"
  30. disabled
  31. placeholder="自动计算"
  32. v-model:value="model['mdSeparateAccounts']"
  33. :precision="2"
  34. :min="0"
  35. ></InputNumber>
  36. </FormItem>
  37. </template>
  38. </BasicForm>
  39. </BasicModal>
  40. </template>
  41. <script lang="ts" setup>
  42. import { InputNumber, FormItem } from 'ant-design-vue';
  43. import { ref, computed, unref } from 'vue';
  44. import { BasicModal, useModalInner } from '/@/components/Modal';
  45. import { BasicForm, useForm } from '/@/components/Form/index';
  46. import { formSchema } from '../SeparateAccounts.data';
  47. import { saveOrUpdate } from '../SeparateAccounts.api';
  48. import { useMessage } from '/@/hooks/web/useMessage';
  49. const { createMessage } = useMessage();
  50. // Emits声明
  51. const emit = defineEmits(['register', 'success']);
  52. const isUpdate = ref(true);
  53. const isDetail = ref(false);
  54. const ptSeparateAccountsMax = ref(100);
  55. const shSeparateAccountsMax = ref(100);
  56. //表单配置
  57. const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField, getFieldsValue }] = useForm({
  58. labelWidth: 150,
  59. schemas: formSchema,
  60. showActionButtonGroup: false,
  61. baseColProps: { span: 24 },
  62. });
  63. //表单赋值
  64. const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  65. //重置表单
  66. await resetFields();
  67. setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });
  68. isUpdate.value = !!data?.isUpdate;
  69. isDetail.value = !!data?.showFooter;
  70. if (unref(isUpdate)) {
  71. //表单赋值
  72. await setFieldsValue({
  73. ...data.data,
  74. });
  75. }
  76. // 隐藏底部时禁用整个表单
  77. setProps({ disabled: !data?.showFooter });
  78. });
  79. //设置标题
  80. const title = computed(() => (!unref(isUpdate) ? '添加分账规则' : !unref(isDetail) ? '分账规则详情' : '编辑分账规则'));
  81. //表单提交事件
  82. async function handleSubmit(v) {
  83. try {
  84. let values = await validate();
  85. setModalProps({ confirmLoading: true });
  86. //提交表单
  87. await saveOrUpdate(values, isUpdate.value);
  88. //关闭弹窗
  89. closeModal();
  90. //刷新列表
  91. emit('success');
  92. } catch ({ errorFields }) {
  93. if (errorFields) {
  94. const firstField = errorFields[0];
  95. if (firstField) {
  96. scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  97. }
  98. }
  99. return Promise.reject(errorFields);
  100. } finally {
  101. setModalProps({ confirmLoading: false });
  102. }
  103. }
  104. function handleShChange() {
  105. const field = getFieldsValue();
  106. if (field.ptSeparateAccounts) {
  107. shSeparateAccountsMax.value = 100 - field.ptSeparateAccounts;
  108. }
  109. if (field.shSeparateAccounts) {
  110. ptSeparateAccountsMax.value = 100 - field.shSeparateAccounts;
  111. }
  112. if (field.shSeparateAccounts || field.ptSeparateAccounts) {
  113. const pt = Number(field.ptSeparateAccounts) || 0;
  114. const sh = Number(field.shSeparateAccounts) || 0;
  115. setFieldsValue({
  116. mdSeparateAccounts: 100 - pt - sh,
  117. });
  118. }
  119. }
  120. </script>
  121. <style lang="less" scoped>
  122. /** 时间和数字输入框样式 */
  123. :deep(.ant-input-number) {
  124. width: 100%;
  125. }
  126. :deep(.ant-calendar-picker) {
  127. width: 100%;
  128. }
  129. </style>