index.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 });
  23. const data = res.data || [];
  24. suggestionTypeList.value = data.map((item:any) => {
  25. return {
  26. text: item.type,
  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: 'APP',
  52. suggestionType: recommenData.suggestId,
  53. mobileNo: storeData.user?.phone,
  54. url: 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. function beforeRead(file:any[]){
  107. if(file.length + fileList.value.length > 5){
  108. showToast(`最多只能选择5张图片`);
  109. }
  110. return true
  111. }
  112. return () => (
  113. <div class={[styles.recommendation,styles[state.modeType]]}>
  114. <div class={[styles.head, "top_draging"]}>
  115. <img class={styles.headTit} src={headImg("recommendationName.png")} />
  116. <img class={styles.closeImg} src={headImg("closeImg.png")} onClick={()=>{ emit("close") }} />
  117. </div>
  118. <div class={styles.content}>
  119. <div class={styles.conBox}>
  120. <div class={styles.rowCon}>
  121. <DropdownMenu class={[styles.dropdownMenu, currItem.value && styles.currItem]} overlay={false}>
  122. <DropdownItem class={['recommendationDropdownItem']} title={ currItem.value?currItem.value.name:"请选择反馈类型"} v-model={recommenData.suggestId} options={suggestionTypeList.value}/>
  123. </DropdownMenu>
  124. <div class={styles.tit}>{`${recommenData.message.length >= 200 ? 200 : recommenData.message.length }/200`}</div>
  125. </div>
  126. <Field
  127. class={styles.field}
  128. v-model={recommenData.message}
  129. border={false}
  130. type="textarea"
  131. maxlength={200}
  132. placeholder="请详细描述您遇到的问题,以便我们尽快为您解决"
  133. />
  134. <Uploader accept=".jpg,jpeg,.png" class={styles.uploader} max-size={maxSize * 1024 * 1024} onOversize={onOversize} v-model={fileList.value} beforeRead={beforeRead} after-read={afterRead} multiple max-count={5}>
  135. <div class={styles.uploaderbox}>
  136. <img class={styles.img} src={headImg("photo.png")}></img>
  137. <div>上传图片</div>
  138. </div>
  139. </Uploader>
  140. <div class={styles.btnCon}>
  141. <img class={styles.img} src={headImg("qx.png")} onClick={()=>{ emit("close") }}></img>
  142. <img class={styles.img} src={headImg("tj.png")} onClick={handleSubmit}></img>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. );
  148. },
  149. });