RenWuGengXin.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <template>
  2. <Dialog v-model="visible" type="sm" title="任务反馈" class="box1">
  3. <div class="dialog-content">
  4. <div class="dialog-body">
  5. <el-form ref="taskForm" :model="newTask">
  6. <el-row :gutter="20">
  7. <el-col :span="24">
  8. <el-form-item label="任务描述:">
  9. <div class="display-field">{{ newTask.task_description }}</div>
  10. </el-form-item>
  11. </el-col>
  12. <el-col :span="24">
  13. <el-form-item label="任务类型:">
  14. <div class="display-field">{{ get_task_type_text(newTask.task_type) }}</div>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="24">
  18. <el-form-item label="执行人:">
  19. <div class="display-field">{{ newTask.registrar }}</div>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="24">
  23. <el-form-item label="执行单位:">
  24. <div class="display-field">{{ newTask.unit_name }}</div>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="24">
  28. <el-form-item label="预估完成时间:">
  29. <div class="display-field">{{ newTask.complete_time }}</div>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="24">
  33. <el-form-item label="反馈人:">
  34. <div class="display-field">{{ newTask.registrar }}</div>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="24">
  38. <el-form-item label="反馈内容:">
  39. <el-input v-model="newTask.feedback_content" class="custom-input2" clearable placeholder="请输入反馈内容"></el-input>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="24">
  43. <el-form-item label="完成进度">
  44. <el-select
  45. v-model="newTask.processing_status"
  46. class="custom-select"
  47. size="large"
  48. :teleported="false"
  49. popper-class="custom-select-popper"
  50. >
  51. <el-option v-for="unit in units" :key="unit" :label="unit" :value="unit"></el-option>
  52. </el-select>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="24">
  56. <el-form-item label="上传图片">
  57. <!-- <el-upload-->
  58. <!-- v-model="newTask.attachments"-->
  59. <!-- action="/uploadAttachments"-->
  60. <!-- list-type="picture-card"-->
  61. <!-- :teleported="false"-->
  62. <!-- auto-upload="true"-->
  63. <!-- limit="9"-->
  64. <!-- :teleported="false"-->
  65. <!-- popper-class="custom-uploadper"-->
  66. <!-- class="custom-upload"-->
  67. <!-- :teleported="false"-->
  68. <!-- clearable-->
  69. <!-- filterable-->
  70. <!-- >-->
  71. <!-- <el-upload-list-item v-for="file in newTask.attachments" :key="file.name">-->
  72. <!-- <el-icon name="el-icon-upload" class="upload-icon"></el-icon>-->
  73. <!-- <el-button type="danger" size="mini" @click="removeAttachment(file)">移除</el-button>-->
  74. <!-- </el-upload-list-item>-->
  75. <!-- </el-upload>-->
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. </el-form>
  80. </div>
  81. <div class="footer">
  82. <div class="flex">
  83. <div class="common-btn-primary" :disabled="!isFormValid" @click="confirmRegister">确定</div>
  84. <div class="common-btn" @click="closeDialog">取消</div>
  85. </div>
  86. </div>
  87. </div>
  88. </Dialog>
  89. </template>
  90. <script lang="ts" setup>
  91. import { ref, reactive, defineEmits, computed, watch } from 'vue';
  92. import { updateTaskRegistration } from '@/api/emergencyCommandMap/JointDuty.ts';
  93. const props = defineProps({
  94. modelValue: { type: Boolean, required: true },
  95. task: { type: Object, default: () => ({ task_id: '', task_description: '', unit_name: '', registrar: '', processing_status: '' }) },
  96. eventId: { type: String, required: true }
  97. });
  98. const emit = defineEmits(['update:modelValue', 'update-success']);
  99. const newTask = reactive({ ...props.task });
  100. const units = ref(['待处理', '已完成']);
  101. const opt_task_type = [
  102. { text: "全部", value: "" },
  103. { text: "事件处置", value: "0" },
  104. { text: "防范措施", value: "1" },
  105. { text: "险情处理", value: "2" },
  106. { text: "督办任务", value: "3" }
  107. ];
  108. const get_task_type_text = (val) => {
  109. return opt_task_type.find(item => item.value == val).text
  110. }
  111. const visible = computed({
  112. get: () => props.modelValue,
  113. set: (val) => {
  114. emit('update:modelValue', val);
  115. if (!val) resetForm();
  116. }
  117. });
  118. const isFormValid = computed(() => newTask.registrar !== '');
  119. const resetForm = () => {
  120. newTask.task_description = '';
  121. newTask.unit_name = '';
  122. newTask.registrar = '';
  123. newTask.processing_status = '';
  124. };
  125. // 任务进度更新
  126. const confirmRegister = async () => {
  127. console.log('任务进度更新:', newTask);
  128. try {
  129. const response = await updateTaskRegistration({
  130. task_id: newTask.task_id,
  131. processing_status: newTask.processing_status,
  132. event_code: props.eventId
  133. });
  134. if (response.code === 200) {
  135. emit('update-success', newTask);
  136. closeDialog();
  137. } else {
  138. console.error('任务进度更新失败:', response.msg);
  139. }
  140. } catch (error) {
  141. console.error('请求任务进度更新失败:', error);
  142. }
  143. };
  144. const closeDialog = () => {
  145. visible.value = false;
  146. };
  147. watch(
  148. () => props.task,
  149. (newTaskData) => {
  150. Object.assign(newTask, newTaskData);
  151. },
  152. { immediate: true }
  153. );
  154. </script>
  155. <style lang="scss" scoped>
  156. .custom-select {
  157. //width: 500px !important; // 使用 !important 强制覆盖默认样式
  158. }
  159. .dialog-body {
  160. padding: 20px;
  161. }
  162. /* 新增样式,用于显示字段 */
  163. .display-field {
  164. padding: 6px 12px;
  165. //border: 1px solid #dcdfe6; /* 确保边框颜色与输入框一致 */
  166. border-radius: 4px;
  167. //background-color: #f5f7fa;
  168. // 背景颜色透明
  169. background-color: transparent;
  170. min-height: 32px;
  171. line-height: 32px;
  172. font-size: 40px; /* 确保字体大小与输入框一致 */
  173. color: #ffffff; /* 确保字体颜色与输入框一致 */
  174. //字体加粗
  175. //font-weight: bold;
  176. }
  177. .footer {
  178. display: flex;
  179. justify-content: flex-end;
  180. margin-top: 20px;
  181. .flex {
  182. display: flex;
  183. align-items: center;
  184. .common-btn-primary,
  185. .common-btn {
  186. margin-left: 10px;
  187. cursor: pointer;
  188. }
  189. }
  190. }
  191. </style>