index.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { defineComponent, reactive, ref, onMounted, computed } from "vue";
  2. import styles from "./index.module.less";
  3. import { Button, Cell, Field, Tab, Tabs, showToast, DropdownMenu, DropdownItem, Uploader } from "vant";
  4. import { sysSuggestionAdd, getSuggestionList } from "/src/page-instrument/api";
  5. import { storeData } from "/src/store";
  6. import state, { IPlatform } from "/src/state";
  7. import { headImg } from "/src/page-instrument/header-top/image";
  8. import { fileUpload } from "/src/helpers/oss-file-upload"
  9. export default defineComponent({
  10. name: "recommendation",
  11. emits: ["close"],
  12. setup(props, { emit }) {
  13. const suggestionTypeList = ref<any[]>([]);
  14. const recommenData = reactive({
  15. message: "",
  16. suggestId: "",
  17. });
  18. const fileList = ref<any[]>([]) // 上传列表
  19. // 获取建议类别
  20. const getTypeList = async () => {
  21. try {
  22. const res = await getSuggestionList({ rows: 9999, page: 1, useClient: "SMART_PRACTICE" });
  23. const data = res.data.rows || [];
  24. suggestionTypeList.value = data.map((item:any) => {
  25. return {
  26. text: item.name,
  27. value: item.id
  28. }
  29. })
  30. } catch (e) {
  31. //
  32. }
  33. };
  34. /** 提交意见反馈 */
  35. const handleSubmit = async () => {
  36. if (!recommenData.message || !recommenData.suggestId) {
  37. const desc = !recommenData.suggestId ? '请先选择反馈类型' : '请先填写意见反馈'
  38. showToast({
  39. message: desc,
  40. position: "top",
  41. });
  42. return;
  43. }
  44. try {
  45. const attachmentUrlsArr = fileList.value.reduce((arr,item)=>{
  46. item.url && arr.push(item.url)
  47. return arr
  48. },[])
  49. await sysSuggestionAdd({
  50. content: recommenData.message,
  51. type: "SMART_PRACTICE",
  52. suggestionTypeId: recommenData.suggestId,
  53. mobileNo: storeData.user?.phone,
  54. attachmentUrls: attachmentUrlsArr.join(",")
  55. });
  56. showToast({
  57. message: "意见反馈已提交",
  58. position: "top",
  59. });
  60. emit("close");
  61. recommenData.suggestId = ""
  62. recommenData.message = ''
  63. fileList.value = []
  64. } catch (error) {}
  65. };
  66. const currItem = computed(()=>{
  67. const currItem = suggestionTypeList.value.find((item:any)=>{
  68. return item.value === recommenData.suggestId
  69. })
  70. return currItem
  71. })
  72. /* 文件上传 */
  73. const afterRead = (file:any[]|Record<string,any>) => {
  74. let files:any[] = []
  75. if(Array.isArray(file)){
  76. files = file.map(item =>{
  77. item.status = 'uploading';
  78. item.message = '上传中...';
  79. item.key = new Date().getTime() + item.file.name
  80. return item
  81. })
  82. } else {
  83. file.status = 'uploading';
  84. file.message = '上传中...';
  85. file.key = new Date().getTime() + file.file.name
  86. files.push(file)
  87. }
  88. files.map(async item=>{
  89. try {
  90. const url = await fileUpload(item.key,item.file)
  91. item.status = ""
  92. item.url = url
  93. }catch{
  94. item.status = "failed"
  95. item.message = "上传失败"
  96. }
  97. })
  98. };
  99. const maxSize = 5
  100. const onOversize = () => {
  101. showToast(`文件大小不能超过 ${maxSize}M`);
  102. };
  103. onMounted(() => {
  104. getTypeList();
  105. });
  106. return () => (
  107. <div class={[styles.recommendation,styles[state.modeType]]}>
  108. <div class={styles.head}>
  109. <img class={styles.headTit} src={headImg("recommendationName.png")} />
  110. <img class={styles.closeImg} src={headImg("closeImg.png")} onClick={()=>{ emit("close") }} />
  111. </div>
  112. <div class={styles.content}>
  113. <div class={styles.conBox}>
  114. <DropdownMenu class={[styles.dropdownMenu, currItem.value && styles.currItem]} overlay={false}>
  115. <DropdownItem class={['recommendationDropdownItem']} title={ currItem.value?currItem.value.name:"请选择反馈类型"} v-model={recommenData.suggestId} options={suggestionTypeList.value}/>
  116. </DropdownMenu>
  117. <Field
  118. class={styles.field}
  119. v-model={recommenData.message}
  120. border={false}
  121. type="textarea"
  122. maxlength={200}
  123. placeholder="请详细描述您遇到的问题,以便我们尽快为您解决"
  124. />
  125. <Uploader accept=".jpg,jpeg,.png" class={styles.uploader} max-size={maxSize * 1024 * 1024} onOversize={onOversize} v-model={fileList.value} after-read={afterRead} multiple max-count={4}>
  126. <div class={styles.uploaderbox}>
  127. <img class={styles.img} src={headImg("photo.png")}></img>
  128. <div>上传图片</div>
  129. </div>
  130. </Uploader>
  131. <div class={styles.btnCon}>
  132. <img class={styles.img} src={headImg("qx.png")} onClick={()=>{ emit("close") }}></img>
  133. <img class={styles.img} src={headImg("tj.png")} onClick={handleSubmit}></img>
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. );
  139. },
  140. });