index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <view class="yd-page-container">
  3. <!-- 顶部导航栏 -->
  4. <wd-navbar
  5. :title="getTitle"
  6. left-arrow placeholder safe-area-inset-top fixed
  7. @click-left="handleBack"
  8. />
  9. <!-- 表单区域 -->
  10. <view>
  11. <wd-form ref="formRef" :model="formData" :rules="formRules">
  12. <wd-cell-group border>
  13. <wd-input
  14. v-model="formData.name"
  15. label="分类名"
  16. label-width="180rpx"
  17. prop="name"
  18. clearable
  19. placeholder="请输入分类名"
  20. />
  21. <wd-input
  22. v-model="formData.code"
  23. label="分类标志"
  24. label-width="180rpx"
  25. prop="code"
  26. clearable
  27. placeholder="请输入分类标志"
  28. />
  29. <wd-textarea
  30. v-model="formData.description"
  31. label="分类描述"
  32. label-width="180rpx"
  33. prop="description"
  34. clearable
  35. placeholder="请输入分类描述"
  36. />
  37. <wd-cell title="分类状态" title-width="180rpx" prop="status" center>
  38. <wd-radio-group v-model="formData.status" shape="button">
  39. <wd-radio
  40. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  41. :key="dict.value"
  42. :value="dict.value"
  43. >
  44. {{ dict.label }}
  45. </wd-radio>
  46. </wd-radio-group>
  47. </wd-cell>
  48. <wd-input
  49. v-model.number="formData.sort"
  50. label="分类排序"
  51. label-width="180rpx"
  52. prop="sort"
  53. type="number"
  54. clearable
  55. placeholder="请输入分类排序"
  56. />
  57. </wd-cell-group>
  58. </wd-form>
  59. </view>
  60. <!-- 底部保存按钮 -->
  61. <view class="yd-detail-footer">
  62. <wd-button
  63. type="primary"
  64. block
  65. :loading="formLoading"
  66. @click="handleSubmit"
  67. >
  68. 保存
  69. </wd-button>
  70. </view>
  71. </view>
  72. </template>
  73. <script lang="ts" setup>
  74. import type { FormInstance } from 'wot-design-uni/components/wd-form/types'
  75. import type { Category } from '@/api/bpm/category'
  76. import { computed, onMounted, ref } from 'vue'
  77. import { useToast } from 'wot-design-uni'
  78. import { createCategory, getCategory, updateCategory } from '@/api/bpm/category'
  79. import { getIntDictOptions } from '@/hooks/useDict'
  80. import { navigateBackPlus } from '@/utils'
  81. import { CommonStatusEnum, DICT_TYPE } from '@/utils/constants'
  82. const props = defineProps<{
  83. id?: number | any
  84. }>()
  85. definePage({
  86. style: {
  87. navigationBarTitleText: '',
  88. navigationStyle: 'custom',
  89. },
  90. })
  91. const toast = useToast()
  92. const getTitle = computed(() => props.id ? '编辑流程分类' : '新增流程分类')
  93. const formLoading = ref(false)
  94. const formData = ref<Category>({
  95. id: undefined,
  96. name: '',
  97. code: '',
  98. status: CommonStatusEnum.ENABLE,
  99. description: '',
  100. sort: 0,
  101. })
  102. const formRules = {
  103. name: [{ required: true, message: '分类名不能为空' }],
  104. code: [{ required: true, message: '分类标志不能为空' }],
  105. status: [{ required: true, message: '分类状态不能为空' }],
  106. }
  107. const formRef = ref<FormInstance>()
  108. /** 返回上一页 */
  109. function handleBack() {
  110. navigateBackPlus('/pages-bpm/category/index')
  111. }
  112. /** 加载流程分类详情 */
  113. async function getDetail() {
  114. if (!props.id) {
  115. return
  116. }
  117. formData.value = await getCategory(props.id)
  118. }
  119. /** 提交表单 */
  120. async function handleSubmit() {
  121. const { valid } = await formRef.value.validate()
  122. if (!valid) {
  123. return
  124. }
  125. formLoading.value = true
  126. try {
  127. if (props.id) {
  128. await updateCategory(formData.value)
  129. toast.success('修改成功')
  130. } else {
  131. await createCategory(formData.value)
  132. toast.success('新增成功')
  133. }
  134. setTimeout(() => {
  135. handleBack()
  136. }, 500)
  137. } finally {
  138. formLoading.value = false
  139. }
  140. }
  141. /** 初始化 */
  142. onMounted(() => {
  143. getDetail()
  144. })
  145. </script>
  146. <style lang="scss" scoped>
  147. </style>