TaskDelivery.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <Dialog v-model="dialogVisible" type="xl" :title="props.title" @close="closeDialog">
  3. <div class="content">
  4. <el-skeleton :loading="loading" animated>
  5. <template #template>
  6. <div v-for="n in 3" :key="n" class="task-item">
  7. <el-skeleton-item variant="p" style="width: 80%" />
  8. <el-skeleton-item variant="p" style="margin-top: 16px" />
  9. </div>
  10. </template>
  11. <template #default>
  12. <div v-for="(task, index) in tasks" :key="index" class="task-item">
  13. <div class="task-header">
  14. <p class="unit-name">{{ task.dept_name }}</p>
  15. <div class="common-btn-primary2" @click="handleShowApprove(task)">领导批示</div>
  16. </div>
  17. <p class="task-description">{{ task.content }}</p>
  18. <p v-if="!!task.comment" class="task-text">领导批示:{{ task.comment }}</p>
  19. <div v-if="task.show" class="form-box">
  20. <el-input v-model="task.content2" class="custom-input" placeholder="请输入领导审批意见" />
  21. <div class="form-footer">
  22. <div class="common-btn" @click="handleCancel(task)">取消</div>
  23. <div class="common-btn-primary" @click="handleSubmit(task)">确定</div>
  24. </div>
  25. </div>
  26. </div>
  27. </template>
  28. </el-skeleton>
  29. </div>
  30. <template #footer>
  31. <div class="dialog-footer" style="margin-right:8px">
  32. <div class="common-btn" @click="closeDialog" style="margin-right: 20px">取 消</div>
  33. <div class="common-btn-primary2" @click="sendTasks">确认发送H5短信</div>
  34. </div>
  35. </template>
  36. </Dialog>
  37. </template>
  38. <script lang="ts" setup>
  39. import { defineProps, defineEmits, ref, watch } from 'vue';
  40. import { ElMessage } from 'element-plus';
  41. import { unitTask, sendTask } from '@/api/duty/eventing';
  42. interface Props {
  43. modelValue: boolean;
  44. title: string;
  45. planId?: string;
  46. eventId?: string;
  47. }
  48. const props = defineProps<Props>();
  49. const emit = defineEmits(['update:modelValue']);
  50. const dialogVisible = ref(props.modelValue);
  51. const tasks = ref([]);
  52. const loading = ref(false);
  53. watch(
  54. () => props.modelValue,
  55. (newValue) => {
  56. dialogVisible.value = newValue;
  57. if (newValue && props.planId && props.eventId) {
  58. fetchDataWithLoading(/*props.planId, props.eventId*/);
  59. }
  60. }
  61. );
  62. const closeDialog = () => {
  63. dialogVisible.value = false; // 直接更新
  64. emit('update:modelValue', false);
  65. };
  66. const fetchDataWithLoading = async () => {
  67. loading.value = true;
  68. try {
  69. const response = await unitTask({ plan_id: props.planId });
  70. if (response && response.data && Array.isArray(response.data)) {
  71. tasks.value = response.data;
  72. } else {
  73. ElMessage.error('未能从服务器获取有效任务数据');
  74. }
  75. } catch (error) {
  76. // ElMessage.error('获取任务数据失败');
  77. } finally {
  78. loading.value = false;
  79. }
  80. };
  81. const sendTasks = () => {
  82. if (!props.eventId) {
  83. ElMessage.error('事件ID未定义,无法发送任务!');
  84. return;
  85. }
  86. // 领导批示内容
  87. let task_list = {};
  88. tasks.value.map((v)=>{
  89. if(v.content2 && v.content2 != "") {
  90. task_list[v.dept_id] = v.content2
  91. }
  92. })
  93. // console.log(tasks.value);
  94. sendTask({ eventId: props.eventId, tasks: task_list })
  95. .then(() => {
  96. ElMessage.success('任务已成功发送!');
  97. closeDialog(); // 使用关闭方法
  98. })
  99. .catch(() => {
  100. //ElMessage.error('发送任务失败,请稍后再试!');
  101. });
  102. };
  103. const handleShowApprove = (item) => {
  104. item.show = !!!item.show;
  105. };
  106. const handleCancel = (item) => {
  107. item.content2 = "";
  108. item.comment = "";
  109. item.show = false;
  110. };
  111. const handleSubmit = (item) => {
  112. item.comment = item.content2;
  113. item.show = false;
  114. };
  115. </script>
  116. <style lang="scss" scoped>
  117. .dialog-footer {
  118. display: flex;
  119. align-items: center;
  120. }
  121. .task-item {
  122. display: block;
  123. padding: 10px;
  124. margin-bottom: 10px;
  125. background-color: rgba(255, 255, 255, 0.1);
  126. border: 1px solid rgba(255, 255, 255, 0.3);
  127. border-radius: 4px;
  128. .task-header {
  129. display: flex;
  130. justify-content: space-between;
  131. align-items: center;
  132. }
  133. .task-text {
  134. color: red;
  135. }
  136. .form-box {
  137. .form-footer {
  138. display: flex;
  139. justify-content: flex-end;
  140. align-items: center;
  141. margin-top: 10px;
  142. }
  143. }
  144. }
  145. .unit-name {
  146. font-weight: bold;
  147. margin-bottom: 5px;
  148. word-break: break-all;
  149. }
  150. .task-description {
  151. word-break: break-all;
  152. white-space: pre-wrap;
  153. }
  154. .dialog-footer {
  155. display: flex;
  156. justify-content: flex-end;
  157. padding: 10px;
  158. }
  159. </style>