informationDetail.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div v-if="eventId" class="common-dialog">
  3. <div class="common-dialog-content">
  4. <div class="common-dialog-title-box">
  5. <h3 class="common-dialog-title">信息详情</h3>
  6. </div>
  7. <div class="common-dialog-box">
  8. <el-form ref="form" :model="formData" :rules="rules" label-width="120px">
  9. <h4 class="common-dialog-title">信息内容</h4>
  10. <div class="box1">
  11. <el-form-item label="标题:" prop="title">
  12. <el-input v-model="formData.title" :disabled="!isEditable" placeholder="请输入标题" style="width: 468px !important" />
  13. </el-form-item>
  14. <el-form-item label="发布单位:" prop="publish_group">
  15. <el-input v-model="formData.publish_group" disabled placeholder="请输入发布单位" style="width: 468px !important" />
  16. </el-form-item>
  17. <el-form-item label="信息模板:" prop="template_id">
  18. <el-radio-group v-model="formData.template_id" :disabled="!isEditable">
  19. <el-radio label="预设模板">预设模板</el-radio>
  20. <el-radio label="自定义模板">自定义模板</el-radio>
  21. </el-radio-group>
  22. </el-form-item>
  23. <el-form-item v-if="formData.template_id === '预设模板'" label="预设模板:" prop="presetTemplate">
  24. <el-select v-model="selectedPresetTemplate" placeholder="请选择预设模板" style="width: 300px !important">
  25. <el-option v-for="option in presetTemplates" :key="option.value" :label="option.label" :value="option.value"></el-option>
  26. </el-select>
  27. <el-text class="common-btn-text-primary" @click="showExample">样例</el-text>
  28. </el-form-item>
  29. <el-form-item v-if="formData.template_id === '自定义模板'" prop="customPageUrl">
  30. <el-input v-model="formData.customPageUrl" placeholder="请输入自定义详情页面链接地址" style="width: 468px !important" />
  31. </el-form-item>
  32. <el-form-item label="信息内容:" prop="content">
  33. <el-input
  34. v-model="formData.content"
  35. type="textarea"
  36. disabled
  37. placeholder="请输入信息内容"
  38. style="width: 468px !important"
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item label="查看附件:">
  42. <ul>
  43. <li v-for="(file, index) in files" :key="index" @click="viewFile(file)">
  44. {{ file.name }}
  45. </li>
  46. </ul>
  47. </el-form-item>
  48. </div>
  49. <h4 class="common-dialog-title">推送配置</h4>
  50. <div class="box1">
  51. <el-form-item label="发布名单:" prop="user_count" style="width: 468px !important">
  52. <span class="highlight-text">已选择{{ formData.user_count }}人</span>
  53. <template v-if="isEditable">
  54. <el-text class="common-btn-text-primary" @click="toggleReleaseList">查看详情</el-text>
  55. </template>
  56. <template v-else>
  57. <span class="common-btn-text-primary disabled">查看详情</span>
  58. </template>
  59. </el-form-item>
  60. <el-row :gutter="18">
  61. <el-col :span="6">
  62. <el-form-item label="发布时间:" prop="releaseTime">
  63. <el-button type="text" :disabled="!isEditable" @click="publishNow">立即发布</el-button>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="13">
  67. <el-form-item label="定时发布:" prop="publish_time">
  68. <el-date-picker v-model="formData.publish_time" type="datetime" :disabled="!isEditable" placeholder="选择发布时间"></el-date-picker>
  69. </el-form-item>
  70. </el-col>
  71. </el-row>
  72. <el-form-item label="消息反馈方式:" prop="response_type" style="width: 468px !important">
  73. <el-select v-model="displayFeedbackText" :disabled="!isEditable" placeholder="请选择消息反馈方式">
  74. <el-option v-for="option in feedbackOptions" :key="option.value" :label="option.label" :value="option.value"></el-option>
  75. </el-select>
  76. </el-form-item>
  77. </div>
  78. <h4 class="common-dialog-title">审核配置</h4>
  79. <div class="box1">
  80. <el-form-item label="审核材料:" prop="materials">
  81. <ul>
  82. <li v-for="(material, index) in auditMaterials" :key="index">
  83. {{ material }}
  84. </li>
  85. </ul>
  86. </el-form-item>
  87. <el-form-item label="审核人:" prop="examine_by">
  88. <el-input v-model="formData.examine_by" disabled placeholder="请输入审核人姓名" style="width: 368px !important" />
  89. </el-form-item>
  90. </div>
  91. </el-form>
  92. <div class="common-dialog-footer">
  93. <el-button @click="closeDialog">返回</el-button>
  94. <el-button @click="submitForm">编辑</el-button>
  95. <el-button type="primary" @click="submitForm">提交</el-button>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <ContactSelect v-model="contactSelectState.show" :tree-data="treeData" :default-check-data="selectData" @confirm="handleData" />
  101. </template>
  102. <script setup lang="ts">
  103. import { reactive, ref, watch } from 'vue';
  104. import { getInformationView, getInformationUpdate } from '@/api/informationissue/informationissue';
  105. import { ElMessage } from 'element-plus';
  106. import ContactSelect from '@/components/ContactSelect/index.vue';
  107. const props = defineProps<{
  108. eventId: string | number;
  109. }>();
  110. const emit = defineEmits<{
  111. (e: 'close'): void;
  112. }>();
  113. const isEditable = ref(false);
  114. const formData = ref({
  115. title: '',
  116. publish_group: '',
  117. template_id: '',
  118. content: '',
  119. user_count: 0,
  120. releaseTime: '',
  121. response_type: '',
  122. examine_by: '',
  123. publish_time: '',
  124. materials: ''
  125. });
  126. const treeData = reactive([
  127. {
  128. id: 1,
  129. label: '茂南区',
  130. deptType: true,
  131. children: [
  132. {
  133. id: 2,
  134. userId: 1,
  135. label: '李里丽'
  136. },
  137. {
  138. id: 3,
  139. userId: 2,
  140. label: '何里'
  141. },
  142. {
  143. id: 4,
  144. userId: 3,
  145. label: '张力'
  146. }
  147. ]
  148. },
  149. {
  150. id: 5,
  151. label: '电白区',
  152. deptType: true,
  153. children: [
  154. {
  155. id: 6,
  156. userId: 4,
  157. label: '王五'
  158. },
  159. {
  160. id: 7,
  161. userId: 5,
  162. label: '冯可'
  163. },
  164. {
  165. id: 8,
  166. userId: 6,
  167. label: '刘森'
  168. },
  169. {
  170. id: 9,
  171. userId: 3,
  172. label: '张力'
  173. }
  174. ]
  175. }
  176. ]);
  177. let contactSelectState = reactive({
  178. show: false,
  179. eventId: ''
  180. });
  181. const selectData = ref([]);
  182. const handleData = (data) => {
  183. selectData.value = data;
  184. formData.value.user_count = data.length;
  185. };
  186. const toggleReleaseList = () => {
  187. contactSelectState.show = !contactSelectState.show;
  188. };
  189. const presetTemplates = [
  190. { value: 'template1', label: '模板一' },
  191. { value: 'template2', label: '模板二' }
  192. ];
  193. const feedbackOptions = [
  194. { value: '仅需阅读', label: '仅需阅读' },
  195. { value: '点击确认', label: '点击确认' },
  196. { value: '签字确认', label: '签字确认' }
  197. ];
  198. const selectedPresetTemplate = ref('');
  199. const files = ref([
  200. { name: '2023年4月29日广东省发布突发事件预警信息.pdf', url: '/path/to/file1.pdf' },
  201. { name: '2023年5月15日广东省发布突发事件预警信息.docx', url: '/path/to/file2.docx' }
  202. ]);
  203. // 在原有的反馈选项数组的基础上,创建一个映射对象(map object)
  204. const feedbackTextMap = {
  205. 0: '仅需阅读',
  206. 1: '点击确认',
  207. 2: '签字确认'
  208. };
  209. // 创建一个计算属性,根据 formData 中的 response_type 返回对应的文本
  210. const displayFeedbackText = computed({
  211. get() {
  212. return feedbackTextMap[formData.value.response_type];
  213. },
  214. set(value) {
  215. // 当选择器的值改变时,将对应的 key 值设置到 formData 中
  216. formData.value.response_type = Object.keys(feedbackTextMap).find((key) => feedbackTextMap[key] === value);
  217. }
  218. });
  219. const auditMaterials = ['2023年4月29日广东省发布突发事件预警信息.pdf', '审核材料2'];
  220. const fetchDetail = async () => {
  221. try {
  222. const response = await getInformationView({ info_id: props.eventId });
  223. if (response.code === 200) {
  224. formData.value = response.data;
  225. } else {
  226. ElMessage.error(response.msg);
  227. }
  228. } catch (error) {
  229. ElMessage.error('获取信息详情失败,请稍后再试');
  230. }
  231. };
  232. watch(
  233. () => props.eventId,
  234. (newVal) => {
  235. if (newVal) {
  236. fetchDetail();
  237. }
  238. },
  239. { immediate: true }
  240. );
  241. const viewFile = (file) => {
  242. window.open(file.url, '_blank'); // 打开新标签页
  243. };
  244. const publishNow = () => {
  245. ElMessage.info('点击了立即发布');
  246. };
  247. const submitForm = async () => {
  248. if (validateFormData()) {
  249. // 如果是编辑状态,则执行保存操作
  250. if (isEditable.value) {
  251. try {
  252. const requestData = { ...formData.value, info_id: props.eventId };
  253. const response = await getInformationUpdate(requestData);
  254. if (response.code === 200) {
  255. ElMessage.success('信息更新成功');
  256. isEditable.value = false; // 保存后重新禁用编辑
  257. } else {
  258. ElMessage.error(response.msg);
  259. }
  260. } catch (error) {
  261. ElMessage.error('更新信息失败,请稍后再试');
  262. }
  263. } else {
  264. // 如果不是编辑状态,则切换到编辑模式
  265. isEditable.value = true;
  266. }
  267. }
  268. };
  269. const validateFormData = (): boolean => {
  270. // 这里添加你的验证逻辑,例如检查是否所有的必填项都有值
  271. if (!formData.value.title.trim()) {
  272. ElMessage.error('标题不能为空');
  273. return false;
  274. }
  275. // 添加其他验证规则
  276. return true;
  277. };
  278. const closeDialog = () => {
  279. emit('close');
  280. };
  281. </script>
  282. <style scoped>
  283. .box1 {
  284. border: 1px solid #dcdfe6; /* 浅灰色边框 */
  285. padding: 10px; /* 可选:为了美观,可以添加一些内边距 */
  286. margin-bottom: 10px;
  287. }
  288. .highlight-text {
  289. font-weight: bold; /* 加粗 */
  290. font-size: 1.2em; /* 放大字体大小 */
  291. }
  292. .common-btn-text-primary {
  293. cursor: pointer;
  294. }
  295. </style>