RenWuDengJi.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template>
  2. <Dialog custom-show type="sm" title="任务下达" height="630px" @confirm="confirmRegister" @close="closeDialog">
  3. <div class="dialog-content">
  4. <div class="dialog-body">
  5. <el-form ref="taskFormRef" :model="form" :rules="rules">
  6. <el-form-item label="任务内容:" label-width="80px" prop="task_description">
  7. <el-input v-model="form.task_description" class="custom-input2" clearable placeholder="请输入相关任务描述" />
  8. </el-form-item>
  9. <el-form-item label="任务类型:" label-width="80px" prop="task_type">
  10. <el-select
  11. v-model="form.task_type"
  12. placeholder="选择任务类型"
  13. class="custom-select"
  14. size="large"
  15. popper-class="custom-select-popper"
  16. :teleported="false"
  17. clearable
  18. filterable
  19. >
  20. <el-option v-for="type in opt_task_type" :key="type.value" :label="type.text" />
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="执行单位:" label-width="80px" prop="unit_name">
  24. <el-select
  25. v-model="form.unit_name"
  26. placeholder="选择执行单位"
  27. class="custom-select"
  28. size="large"
  29. popper-class="custom-select-popper"
  30. :teleported="false"
  31. clearable
  32. filterable
  33. @change="handleUnitChange"
  34. >
  35. <el-option v-for="unit in filteredUnits" :key="unit.unitId" :label="unit.unit_name" :value="unit.unit_name" />
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="执行人:" label-width="80px" prop="executor">
  39. <el-select
  40. v-model="form.executor"
  41. placeholder="请选择执行人"
  42. class="custom-select"
  43. size="large"
  44. popper-class="custom-select-popper"
  45. :teleported="false"
  46. clearable
  47. filterable
  48. >
  49. <el-option v-for="user in executorList" :key="user.userId" :label="user.nickName" :value="user.nickName" />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="登记人:" label-width="80px" prop="registrar">
  53. <el-input v-model="form.registrar" class="custom-input2" type="text" readonly />
  54. </el-form-item>
  55. <el-form-item label="联系电话:" label-width="80px" prop="contact_phone">
  56. <el-input v-model="form.contact_phone" class="custom-input2" placeholder="发布人的联系电话" />
  57. </el-form-item>
  58. <el-form-item label="完成时限:" label-width="80px" prop="expire_time">
  59. <el-date-picker
  60. v-model="form.expire_time"
  61. type="date"
  62. value-format="YYYY-MM-DD"
  63. class="common-date-picker"
  64. popper-class="common-date-popper"
  65. placeholder="选择完成时限"
  66. style="width: 100%"
  67. />
  68. </el-form-item>
  69. <el-form-item label="上传图片:" label-width="80px" prop="imgList">
  70. <FileUpload v-model="form.imgList" :file-type="['jpg', 'jpeg', 'png']" :limit="9" :file-size="5" class="upload-box" />
  71. </el-form-item>
  72. <el-form-item label="上传文件:" label-width="80px" prop="fileList">
  73. <FileUpload v-model="form.fileList" :file-type="['mp4', 'avi', 'wmv']" :limit="6" :file-size="1024" class="upload-box" />
  74. </el-form-item>
  75. </el-form>
  76. </div>
  77. </div>
  78. </Dialog>
  79. </template>
  80. <script lang="ts" setup>
  81. import { ref, reactive, onMounted } from 'vue';
  82. import { addTask, getUnits, getUser, getUserList } from '@/api/emergencyCommandMap/JointDuty';
  83. const proxy = getCurrentInstance()?.proxy;
  84. const opt_task_type = [
  85. { text: '事件处置', value: '0' },
  86. { text: '防范措施', value: '1' },
  87. { text: '险情处理', value: '2' },
  88. { text: '督办任务', value: '3' }
  89. ];
  90. // 表单初始数据
  91. const initFormData = {
  92. task_description: '',
  93. task_type: '',
  94. unit_name: '',
  95. registrar: '',
  96. executor: '',
  97. contact_phone: '',
  98. expire_time: '',
  99. event_code: '',
  100. imgList: [],
  101. fileList: []
  102. };
  103. const data = reactive({
  104. form: { ...initFormData },
  105. rules: {
  106. task_description: [{ required: true, message: '任务描述不能为空', trigger: 'blur' }],
  107. task_type: [{ required: true, message: '任务类型不能为空', trigger: 'blur' }],
  108. unit_name: [{ required: true, message: '执行单位不能为空', trigger: 'blur' }],
  109. registrar: [{ required: true, message: '登记人不能为空', trigger: 'blur' }],
  110. executor: [{ required: true, message: '执行人不能为空', trigger: 'blur' }],
  111. contact_phone: [{ required: true, message: '联系电话不能为空', trigger: 'blur' }],
  112. expire_time: [{ required: true, message: '完成时限不能为空', trigger: 'blur' }]
  113. }
  114. });
  115. const taskFormRef = ref();
  116. const filteredUnits = ref([]);
  117. const executorList = ref([]);
  118. const { form, rules } = toRefs(data);
  119. const props = defineProps<{
  120. eventId?: string;
  121. }>();
  122. // 获取当前登录用户信息
  123. const fetchUser = async () => {
  124. try {
  125. const response = await getUser({});
  126. if (response.code === 200) {
  127. form.value.registrar = response.data.user.nickName;
  128. form.value.contact_phone = response.data.user.phonenumber;
  129. } else {
  130. console.error('获取用户信息失败:', response.msg);
  131. }
  132. } catch (error) {
  133. console.error('请求用户信息失败:', error);
  134. }
  135. };
  136. const fetchUnits = async () => {
  137. try {
  138. const response = await getUserList({});
  139. if (response.code === 200) {
  140. const units = new Map();
  141. response.rows.forEach((unit) => {
  142. if (!units.has(unit.deptName)) {
  143. units.set(unit.deptName, {
  144. unitId: unit.deptId,
  145. unit_name: unit.deptName
  146. });
  147. }
  148. });
  149. filteredUnits.value = Array.from(units.values());
  150. } else {
  151. console.error('获取单位数据失败:', response.msg);
  152. }
  153. } catch (error) {
  154. console.error('请求单位数据失败:', error);
  155. }
  156. };
  157. const fetchUsers = async (deptId) => {
  158. try {
  159. const response = await getUserList({ deptId });
  160. if (response.code === 200 && response.rows && Array.isArray(response.rows)) {
  161. executorList.value = response.rows.map((user) => ({
  162. userId: user.userId,
  163. nickName: user.nickName
  164. }));
  165. } else {
  166. console.error('获取用户列表失败:', response);
  167. }
  168. } catch (error) {
  169. console.error('请求用户列表失败:', error);
  170. }
  171. };
  172. const handleUnitChange = async (newUnitName) => {
  173. const selectedUnit = filteredUnits.value.find((unit) => unit.unit_name === newUnitName);
  174. if (selectedUnit) {
  175. await fetchUsers(selectedUnit.unitId);
  176. }
  177. };
  178. const emit = defineEmits(['update:show']);
  179. const closeDialog = () => {
  180. emit('update:show', false);
  181. };
  182. const confirmRegister = () => {
  183. taskFormRef.value?.validate((valid) => {
  184. if (valid) {
  185. form.value.event_code = props.eventId;
  186. addTask(form.value).then((response) => {
  187. if (response.code === 200) {
  188. proxy?.$modal.msgSuccess('任务登记成功');
  189. closeDialog();
  190. } else {
  191. console.error('任务登记失败:', response.msg);
  192. }
  193. });
  194. }
  195. });
  196. };
  197. onMounted(() => {
  198. fetchUser();
  199. fetchUnits();
  200. fetchUsers();
  201. });
  202. </script>
  203. <style lang="scss" scoped>
  204. .dialog-content {
  205. :deep(.el-form) {
  206. .el-form-item__label {
  207. color: #fff !important;
  208. font-weight: bold !important;
  209. margin-right: 5px !important;
  210. }
  211. }
  212. .upload-box {
  213. :deep(.el-upload__tip) {
  214. color: #ffffff !important;
  215. }
  216. }
  217. }
  218. </style>