riku
2025-04-25 4a836815f12e8ba717702cc8ed431e1b4f96134c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<template>
  <div class="fy-h2">线索问题</div>
  <template v-if="questionList.length > 0">
    <template v-for="(item, index) in questionList" :key="index">
      <DescriptionsList :title="item.cqUid">
        <template #extra>
          <div>
            <el-button
              v-if="!clueData.cuploaded"
              type="danger"
              size="small"
              icon="Delete"
              @click="deleteQuestion(item)"
            ></el-button>
            <el-button
              type="primary"
              size="small"
              @click="checkQuestion(item)"
              >{{
                clueData.cuploaded ? '问题详情' : '修改问题'
              }}</el-button
            >
          </div>
        </template>
        <DescriptionsListItem
          label="问题名称"
          :content="item.cqName"
        />
        <DescriptionsListItem
          label="所在街镇"
          :content="item.cqStreet"
        />
        <DescriptionsListItem
          label="问题描述"
          :content="item.cqDescription"
        />
      </DescriptionsList>
      <!-- <el-divider /> -->
    </template>
    <div class="btn-wrap">
      <el-button
        v-if="!clueData.cuploaded"
        type="primary"
        @click="openDialog"
        >添加问题</el-button
      >
    </div>
  </template>
  <div v-else class="fy-dashed-border">
    <el-empty :image-size="50" description="无线索问题">
      <el-button type="primary" @click="openDialog"
        >反馈上报</el-button
      >
    </el-empty>
  </div>
  <QuestionDetail
    :clueData="clueData"
    :uploaded="clueData.cuploaded"
    v-model:show="dialogShow"
    :question="selectedQuestion"
    @on-submit="getQuestion"
  ></QuestionDetail>
</template>
 
<script setup>
import { ref, watch, computed, inject } from 'vue';
import clueQuestionApi from '@/api/clue/clueQuestionApi';
import QuestionDetail from './QuestionDetail.vue';
import {
  useMessageBoxTip,
  useMessageBox
} from '@/composables/messageBox';
 
// 决定当前是否是内部线索相关操作
const isInternal = inject('isInternal', false);
 
const props = defineProps({
  // clueId: Number,
  clueData: {
    type: Object,
    default: () => {
      return {};
    }
  }
});
 
// 线索结论
const questionList = ref([]);
// 上报弹出框
const dialogShow = ref(false);
const selectedQuestion = ref();
const deleteLoading = ref(false);
 
watch(
  () => props.clueData,
  () => {
    getQuestion();
  }
);
 
// 打开上报反馈对话框
function openDialog() {
  selectedQuestion.value = undefined;
  dialogShow.value = true;
}
 
// 查看问题详情
function checkQuestion(item) {
  selectedQuestion.value = item;
  dialogShow.value = true;
}
 
// 删除问题
function deleteQuestion(item) {
  useMessageBoxTip({
    confirmMsg: '确认是否删除问题',
    confirmTitle: '删除问题',
    onConfirm: () => {
      return clueQuestionApi
        .deleteQuestion(item.cqId)
        .then((res) => {
          if (res) {
            const index = questionList.value.indexOf(item);
            questionList.value.splice(index, 1);
          }
        })
        .finally(() => (deleteLoading.value = true));
    }
  });
}
 
/**
 * 获取线索结论
 */
function getQuestion() {
  clueQuestionApi
    .getQuestion(props.clueData.cid, isInternal)
    .then((res) => {
      questionList.value = res;
    });
}
 
function pushQuestion(item) {
  clueQuestionApi.pushQuestion([item.cqId]).then(() => {
    item.pushing = true;
  });
}
</script>
<style scoped>
.btn-wrap {
  display: flex;
  justify-content: center;
  padding: 16px;
}
</style>