AddMoreLogPage.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <template>
  2. <div>
  3. <van-form @submit="onSubmit">
  4. <van-cell-group inset>
  5. <van-field
  6. v-model="name"
  7. name="name"
  8. label="名称"
  9. placeholder="请输入名称"
  10. />
  11. <van-field
  12. v-model="logDay"
  13. name="logDay"
  14. type="number"
  15. label="每月日期"
  16. placeholder="请输入每月日期"
  17. />
  18. <van-field
  19. v-model="totalFee"
  20. name="totalFee"
  21. type="number"
  22. label="数字"
  23. placeholder="请输入消费金额"
  24. />
  25. <div class="types-box">
  26. <van-field
  27. v-model="typeStr"
  28. label="类型"
  29. name="typeStr"
  30. placeholder="请输入类型名称"
  31. />
  32. <div class="types-scroll-box" @click.stop>
  33. <van-tag
  34. type="primary"
  35. @click="setTypes(item)"
  36. mark
  37. v-for="item in typeList"
  38. :key="`tag${item.name}`"
  39. >{{ item.name }}</van-tag
  40. >
  41. </div>
  42. </div>
  43. <br />
  44. <van-field name="uploader" label="文件上传">
  45. <template #input>
  46. <van-uploader
  47. :model-value="files"
  48. multiple
  49. :max-count="5"
  50. :after-read="afterRead"
  51. :before-delete="filesDelete"
  52. />
  53. </template>
  54. </van-field>
  55. <van-field
  56. v-model="newTime"
  57. is-link
  58. readonly
  59. name="newTime"
  60. label="时间区间"
  61. placeholder="点击选择时间"
  62. @click="showCalendar = true"
  63. />
  64. <van-field
  65. v-model="remark"
  66. rows="2"
  67. autosize
  68. name="remark"
  69. label="留言"
  70. type="textarea"
  71. maxlength="50"
  72. placeholder="请输入留言"
  73. show-word-limit
  74. />
  75. </van-cell-group>
  76. <div style="margin: 16px">
  77. <van-button round block type="primary" native-type="submit">
  78. 提交
  79. </van-button>
  80. </div>
  81. </van-form>
  82. <van-calendar
  83. type="range"
  84. :min-date="new Date(2024, 0, 1)"
  85. switch-mode="year-month"
  86. v-model:show="showCalendar"
  87. @confirm="onConfirm"
  88. :default-date="defaultDate"
  89. />
  90. <van-number-keyboard
  91. v-model="totalFee"
  92. :show="showKeyboard"
  93. :maxlength="6"
  94. @blur="showKeyboard = false"
  95. />
  96. </div>
  97. </template>
  98. <script setup>
  99. import { watch, ref, onMounted, toRaw } from 'vue'
  100. import { useRouter, useRoute } from 'vue-router'
  101. import dayjs from 'dayjs'
  102. import {
  103. uploadFile,
  104. addMoreRecordInfo,
  105. editMoreRecordInfo,
  106. getMoreRecordInfo,
  107. getAllType,
  108. getRecordInfo,
  109. putRecordInfo
  110. } from '@/api/api'
  111. import { useCommonStore } from '@/store/common'
  112. const commonStore = useCommonStore()
  113. const router = useRouter()
  114. const route = useRoute()
  115. const files = ref([])
  116. const totalFee = ref()
  117. const showKeyboard = ref(false)
  118. const remark = ref('')
  119. const name = ref('')
  120. const typeStr = ref('')
  121. const logDay = ref(1)
  122. const typeList = ref([])
  123. const defaultDate = ref(null)
  124. const afterRead = async (file) => {
  125. // 将文件上传至服务器
  126. let formData = new FormData()
  127. formData.append('sampleFile', file.file)
  128. const res = await uploadFile(formData)
  129. files.value.push({
  130. // url: window.origin + `/api/v1/files/${res.file_id}`,
  131. url: file.objectUrl,
  132. file_id: res.data.file_id,
  133. isImage: true
  134. })
  135. }
  136. const newTime = ref('')
  137. const showCalendar = ref(false)
  138. const onConfirm = (values) => {
  139. const [start, end] = values
  140. newTime.value = `${dayjs(start).format('YYYY-MM-DD')}至${dayjs(end).format(
  141. 'YYYY-MM-DD'
  142. )}`
  143. showCalendar.value = false
  144. }
  145. const filesDelete = (file) => {
  146. files.value = files.value.filter((elm) => elm.url !== file.url)
  147. }
  148. onMounted(() => {
  149. commonStore.initBook()
  150. setTimeout(() => {
  151. getAllTypeByUser()
  152. if (route.params.more_id) {
  153. editPageInit()
  154. }
  155. }, 300)
  156. })
  157. async function getAllTypeByUser() {
  158. const res = await getAllType(commonStore.bookInfo.id)
  159. typeList.value = res.data
  160. }
  161. const onSubmit = async (values) => {
  162. if (route.params.more_id) {
  163. onEditSubmit(values)
  164. return
  165. }
  166. const [start_time, end_time] = `${values.newTime}`.split('至')
  167. await addMoreRecordInfo({
  168. book_id: commonStore.bookInfo.id,
  169. start_time,
  170. end_time,
  171. total_fee: values.totalFee,
  172. log_day: values.logDay,
  173. type: values.typeStr,
  174. remark: values.remark,
  175. name: values.name,
  176. files: files.value.map((elm) => elm.file_id)
  177. })
  178. router.back()
  179. }
  180. const onEditSubmit = async (values) => {
  181. const [start_time, end_time] = `${values.newTime}`.split('至')
  182. await editMoreRecordInfo(route.params.more_id, {
  183. book_id: commonStore.bookInfo.id,
  184. start_time,
  185. end_time,
  186. total_fee: values.totalFee,
  187. log_day: values.logDay,
  188. type: values.typeStr,
  189. remark: values.remark,
  190. name: values.name,
  191. files: files.value.map((elm) => elm.file_id)
  192. })
  193. router.back()
  194. }
  195. function setTypes(tag) {
  196. typeStr.value = tag.name
  197. }
  198. async function editPageInit() {
  199. const res = await getMoreRecordInfo(route.params.more_id)
  200. console.log(106, res)
  201. totalFee.value = Number(res.data.total_fee)
  202. typeStr.value = res.data.type
  203. remark.value = res.data.remark
  204. name.value = res.data.name
  205. logDay.value = res.data.log_day
  206. defaultDate.value = [
  207. dayjs(res.data.start_time).toDate(),
  208. dayjs(res.data.end_time).toDate()
  209. ]
  210. newTime.value = `${dayjs(res.data.start_time).format('YYYY-MM-DD')}至${dayjs(
  211. res.data.end_time
  212. ).format('YYYY-MM-DD')}`
  213. if (res.data?.files?.length > 0) {
  214. files.value = res.data?.files.map((imgStr) => ({
  215. url: imgStr,
  216. file_id: imgStr.replace(/.*api_files_/, ''),
  217. isImage: true
  218. }))
  219. }
  220. }
  221. </script>
  222. <style lang="scss" scoped>
  223. .types-box {
  224. .types-scroll-box {
  225. padding-left: 100px;
  226. text-align: left;
  227. padding-top: 10px;
  228. padding-bottom: 10px;
  229. max-height: 60px;
  230. overflow-x: scroll;
  231. > * {
  232. margin-bottom: 10px;
  233. margin-right: 10px;
  234. }
  235. // display: flex;
  236. // overflow-y: scroll;
  237. // flex-wrap: nowrap;
  238. // margin-left: 24px;
  239. }
  240. }
  241. </style>