singleProblem.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div
  3. class="single-item"
  4. :style="`padding-bottom:${props.problemData.problemStatus === STATUS.handled ? '0px' : '38px'}`"
  5. >
  6. <div style="display: flex; font-size: 12px">
  7. <img src="@/assets/icons/phone.png" alt="" />
  8. <div class="single-contact">联系方式:{{ props.problemData.mobile }}</div>
  9. <div style="color: #00000073"
  10. >人员:{{ props.problemData.submitterUsername }}-{{ props.problemData.submitterNickname }}
  11. </div>
  12. <div style="margin-left: 20px; color: #00000073">日期:{{ props.problemData.createdAt }}</div>
  13. </div>
  14. <el-button v-if="props.isHandle" type="primary" class="single-handle" @click="handleProblem"
  15. >处理</el-button
  16. >
  17. <el-divider />
  18. <div class="problem-type">
  19. <div>问题类型:</div>
  20. <div class="type-content">{{ problemType[props.problemData.problemType] }}</div>
  21. </div>
  22. <div class="problem-describe">
  23. <div>问题描述:</div>
  24. <div class="problem-content">{{ props.problemData.problemDescription }}</div>
  25. </div>
  26. <div class="problem-picture">
  27. <div class="picture-content" v-for="(item, index) in problemImageUrls" :key="index">
  28. <el-image
  29. style="width: 80px; height: 80px"
  30. :src="item"
  31. :zoom-rate="1.2"
  32. :max-scale="7"
  33. :min-scale="0.2"
  34. :preview-src-list="problemImageUrls"
  35. :initial-index="index"
  36. fit="cover"
  37. />
  38. </div>
  39. </div>
  40. <el-collapse v-if="props.problemData.problemStatus === STATUS.handled" v-model="activeNames">
  41. <el-collapse-item name="1">
  42. <template #title>
  43. <div class="problem-describe">
  44. <div>处理人:</div>
  45. <div class="problem-content">{{ props.problemData.processorName }}</div>
  46. </div>
  47. </template>
  48. <div class="problem-describe">
  49. <div>处理措施:</div>
  50. <div class="problem-content">{{ props.problemData.dealMethod }}</div>
  51. </div>
  52. </el-collapse-item>
  53. </el-collapse>
  54. </div>
  55. </template>
  56. <script setup lang="ts">
  57. import { ref, computed } from 'vue';
  58. import { useRouter } from 'vue-router';
  59. import { Records, STATUS } from '@/api/feedback/feedback';
  60. import useHandleStore from '../useHandleStore';
  61. import { storeToRefs } from 'pinia';
  62. import { problemType } from '../constant';
  63. const useSingle = useHandleStore();
  64. const { singleFeedback } = storeToRefs(useSingle);
  65. const router = useRouter();
  66. const props = defineProps<{
  67. problemData: Records;
  68. isHandle: boolean;
  69. }>();
  70. const activeNames = ref<string>('');
  71. const problemImageUrls = computed(() => {
  72. const imageUrlString = props.problemData.problemImageUrl;
  73. return imageUrlString ? imageUrlString.split(',') : [];
  74. });
  75. const handleProblem = () => {
  76. singleFeedback.value = props.problemData;
  77. router.push('/feedback/handle');
  78. };
  79. </script>
  80. <style scoped>
  81. .single-item {
  82. background: #ffffff;
  83. box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.09);
  84. border-radius: 6px;
  85. padding: 16px 12px 0px 12px;
  86. position: relative;
  87. }
  88. .single-contact {
  89. margin-left: 10px;
  90. margin-right: 40px;
  91. }
  92. .single-handle {
  93. position: absolute;
  94. top: 11px;
  95. right: 12px;
  96. }
  97. .el-divider--horizontal {
  98. margin: 16px 0;
  99. }
  100. .problem-type,
  101. .problem-describe {
  102. font-size: 14px;
  103. white-space: nowrap;
  104. word-break: break-word;
  105. display: flex;
  106. margin-bottom: 8px;
  107. }
  108. .type-content,
  109. .problem-content {
  110. white-space: pre-wrap;
  111. word-break: break-word;
  112. }
  113. .type-content {
  114. font-weight: 600;
  115. }
  116. .problem-picture{
  117. display: flex;
  118. gap: 20px;
  119. }
  120. :deep(.el-collapse-item__header) {
  121. border-bottom: none;
  122. }
  123. :deep(.el-collapse-item__wrap) {
  124. border-bottom: none;
  125. }
  126. :deep(.el-collapse-item__content) {
  127. padding-bottom: 0px;
  128. }
  129. :deep(.el-collapse) {
  130. border-top: none;
  131. }
  132. </style>