UserForm.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <Dialog v-model="dialogVisible" title="借款申请-核销">
  3. <el-form
  4. ref="formRef"
  5. v-loading="formLoading"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="100px"
  9. >
  10. <el-row>
  11. <el-col :span="12">
  12. <el-form-item label="借款人" prop="worker">
  13. <el-input v-model="formData.worker" disabled />
  14. </el-form-item>
  15. </el-col>
  16. <el-col :span="12">
  17. <el-form-item label="所在部门" prop="workerDept">
  18. <el-input v-model="formData.workerDept" disabled />
  19. </el-form-item>
  20. </el-col>
  21. </el-row>
  22. <el-row>
  23. <el-col :span="12">
  24. <el-form-item label="已核销金额" prop="verifyAmount">
  25. <el-input
  26. v-model="formData.verifyAmount"
  27. placeholder="请输入已核销金额"
  28. @change="changeVerify"
  29. type="number"
  30. />
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="12">
  34. <el-form-item label="未核销金额" prop="loanAmount">
  35. <el-input v-model="formData.loanBalance" type="text" disabled />
  36. </el-form-item>
  37. </el-col>
  38. </el-row>
  39. <el-row>
  40. <el-col :span="12">
  41. <el-form-item label="核销时间" prop="verifyDate">
  42. <el-date-picker
  43. v-model="formData.verifyDate"
  44. type="date"
  45. value-format="YYYY-MM-DD"
  46. placeholder="选择核销时间"
  47. clearable
  48. :default-time="new Date()"
  49. class="!w-240px"
  50. />
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. <el-row>
  55. <el-col :span="24">
  56. <el-form-item label="备注">
  57. <el-input v-model="formData.verifyBz" placeholder="请输入内容" type="textarea" />
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. </el-form>
  62. <template #footer>
  63. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  64. <el-button @click="dialogVisible = false">取 消</el-button>
  65. </template>
  66. </Dialog>
  67. </template>
  68. <script lang="ts" setup>
  69. import { CommonStatusEnum } from '@/utils/constants'
  70. import * as PostApi from '@/api/system/post'
  71. import * as DeptApi from '@/api/system/dept'
  72. import * as UserApi from '@/api/system/user'
  73. import moment from 'moment'
  74. import request from '@/config/axios'
  75. defineOptions({ name: 'SystemUserForm' })
  76. const { t } = useI18n() // 国际化
  77. const message = useMessage() // 消息弹窗
  78. const dialogVisible = ref(false) // 弹窗的是否展示
  79. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  80. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  81. const formData = ref({
  82. verifyAmount: '',
  83. verifyDate: '',
  84. verifyBz: '',
  85. id: undefined
  86. })
  87. const checkAge = (rule: any, value: any, callback: any) => {
  88. if (!value) {
  89. return callback(new Error('请输入核销金额'))
  90. }
  91. setTimeout(() => {
  92. if (value < 0) {
  93. callback(new Error('核销金额必须大于0'))
  94. } else if (value > formData.value.loanAmount) {
  95. callback(new Error('核销金额不能大于总金额'))
  96. } else {
  97. callback()
  98. }
  99. }, 1000)
  100. }
  101. const formRules = reactive({
  102. verifyAmount: [{ validator: checkAge, trigger: 'blur' }]
  103. })
  104. const formRef = ref() // 表单 Ref
  105. /** 打开弹窗 */
  106. const open = async (row: object) => {
  107. row.loanBalance = row.loanAmount - row.verifyAmount
  108. if (!row.verifyDate) {
  109. row.verifyDate = moment().format('YYYY-MM-DD')
  110. }
  111. dialogVisible.value = true
  112. resetForm()
  113. // 修改时,设置数据
  114. if (row) {
  115. formLoading.value = true
  116. try {
  117. formData.value = row
  118. } finally {
  119. formLoading.value = false
  120. }
  121. }
  122. }
  123. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  124. /** 提交表单 */
  125. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  126. const submitForm = async () => {
  127. // 校验表单
  128. if (!formRef) return
  129. const valid = await formRef.value.validate()
  130. if (!valid) return
  131. // 提交请求
  132. formLoading.value = true
  133. try {
  134. const urlApi = `/Loan/update`
  135. const sendData = {
  136. verifyAmount: formData.value.verifyAmount,
  137. verifyDate: formData.value.verifyDate,
  138. verifyBz: formData.value.verifyBz,
  139. id: formData.value.id
  140. }
  141. if (formData.value.loanBalance == 0) {
  142. sendData.isVerify = 1
  143. }
  144. const result = await request.post({ url: urlApi, data: sendData }, '/business')
  145. message.success(t('核销成功'))
  146. dialogVisible.value = false
  147. // 发送操作成功的事件
  148. emit('success')
  149. } finally {
  150. formLoading.value = false
  151. }
  152. }
  153. const changeVerify = () => {
  154. formData.value.loanBalance = formData.value.loanAmount - formData.value.verifyAmount
  155. if (formData.value.loanBalance < 0) {
  156. formData.value.loanBalance = 0
  157. }
  158. }
  159. /** 重置表单 */
  160. const resetForm = () => {
  161. formData.value = {
  162. verifyAmount: '',
  163. verifyDate: '',
  164. bz1: '',
  165. id: undefined
  166. }
  167. formRef.value?.resetFields()
  168. }
  169. </script>