RenWuGengXin.vue 7.4 KB

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