index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. <template>
  2. <div class="taskadd">
  3. <el-form :model="taskinfo" label-width="120px">
  4. <el-row>
  5. <el-col :span="12">
  6. <el-form-item label="工单号:">
  7. <el-input v-model="taskinfo.taskCode" />
  8. </el-form-item>
  9. </el-col>
  10. <el-col :span="12">
  11. <el-form-item label="行政区:">
  12. <el-select
  13. v-model="taskinfo.taskArea"
  14. class="m-1"
  15. placeholder="请选择"
  16. >
  17. <el-option
  18. v-for="item in sys_area"
  19. :label="item.label"
  20. :value="item.value"
  21. ></el-option>
  22. </el-select>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="12">
  26. <el-form-item label="其他工单号">
  27. <el-input v-model="taskinfo.taskOtherId" />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="12">
  31. <el-form-item label="事件来源:">
  32. <el-select
  33. v-model="taskinfo.taskType"
  34. class="m-1"
  35. placeholder="请选择"
  36. >
  37. <el-option
  38. v-for="item in task_type"
  39. :label="item.label"
  40. :value="parseInt(item.value)"
  41. ></el-option>
  42. </el-select>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12">
  46. <el-form-item label="道路名">
  47. <el-input v-model="taskinfo.taskAddrRoad" />
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="12">
  51. <el-form-item label="投诉人电话">
  52. <el-input v-model="taskinfo.taskComplainConnect" />
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="12">
  56. <el-form-item label="班组区域:">
  57. <el-tree-select
  58. v-model="taskinfo.taskDeptRange"
  59. multiple
  60. :data="treedept"
  61. check-strictly="true"
  62. />
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="12">
  66. <el-form-item label="来件时间:">
  67. <el-date-picker
  68. v-model="taskinfo.taskTime"
  69. type="datetime"
  70. placeholder="请选择"
  71. />
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="12">
  75. <el-form-item label="要求完成时间:">
  76. <el-date-picker
  77. v-model="taskinfo.taskReqCompleteTime"
  78. type="datetime"
  79. placeholder="请选择"
  80. />
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="12">
  84. <el-form-item label="事件分类:">
  85. <el-select
  86. v-model="taskinfo.taskEventCategory"
  87. class="m-1"
  88. placeholder="请选择"
  89. >
  90. <el-option
  91. v-for="item in task_event_category"
  92. :label="item.label"
  93. :value="parseInt(item.value)"
  94. ></el-option>
  95. </el-select>
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="12">
  99. <el-form-item label="事件类型:">
  100. <el-select
  101. v-model="taskinfo.taskEventType"
  102. class="m-1"
  103. placeholder="请选择"
  104. >
  105. <el-option
  106. v-for="item in task_event_type"
  107. :label="item.label"
  108. :value="parseInt(item.value)"
  109. ></el-option>
  110. </el-select>
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="12">
  114. <el-form-item label="任务内容:">
  115. <el-input v-model="taskinfo.taskContent" />
  116. </el-form-item>
  117. </el-col>
  118. <!-- <el-col :span="12">
  119. <el-form-item label="设施编号:">
  120. <el-input v-model="taskinfo.taskFacilitieCode" />
  121. </el-form-item>
  122. </el-col> -->
  123. <el-col :span="12">
  124. <el-form-item label="是否需要确认:">
  125. <el-select
  126. v-model="taskinfo.remark"
  127. class="m-1"
  128. placeholder="请选择"
  129. >
  130. <el-option label="是" value="1"></el-option>
  131. <el-option label="否" value="0"></el-option>
  132. </el-select>
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="12">
  136. <el-form-item label="接单人员">
  137. <el-select
  138. v-model="taskinfo.taskReporter"
  139. placeholder="请选择人员"
  140. style="width: 100%"
  141. filterable
  142. allow-create
  143. >
  144. <el-option
  145. v-for="item in allusers"
  146. :label="item.nickName"
  147. :value="item.userId"
  148. />
  149. </el-select>
  150. </el-form-item>
  151. </el-col>
  152. <el-col :span="24">
  153. <el-form-item label="来件备注:">
  154. <el-input v-model="taskinfo.taskFromRemark" />
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="12">
  158. <el-form-item label="事件地址">
  159. <div style="position: relative; width: 100%">
  160. <div style="width: 80%">
  161. <el-input v-model="taskinfo.taskAddr" />
  162. </div>
  163. <el-button
  164. type="primary"
  165. style="position: absolute; right: 0; top: 0"
  166. @click="searchaddr"
  167. >查询</el-button
  168. >
  169. </div>
  170. </el-form-item>
  171. </el-col>
  172. <el-col :span="12">
  173. <el-form-item label="照片附件(4张)"> </el-form-item>
  174. </el-col>
  175. <el-col :span="12">
  176. <div style="padding-left: 30px">
  177. <MapSelect ref="mapSelect" v-model:formv="formlocation"></MapSelect>
  178. </div>
  179. </el-col>
  180. <el-col :span="12">
  181. <div style="padding-left: 120px">
  182. <ImageUpload v-model="fileList"></ImageUpload>
  183. </div>
  184. </el-col>
  185. </el-row>
  186. </el-form>
  187. </div>
  188. </template>
  189. <script>
  190. import { ref, watch, defineComponent, onMounted } from "vue";
  191. import { listTask } from "@/api/system/task";
  192. import {
  193. changeUserStatus,
  194. listUser,
  195. resetUserPwd,
  196. delUser,
  197. getUser,
  198. updateUser,
  199. addUser,
  200. } from "@/api/system/user";
  201. import { useDict } from "@/utils/dict";
  202. import { cloneDeep } from "lodash";
  203. import { listDept, getDept } from "@/api/system/dept";
  204. import MapSelect from "@/components/MapSelect";
  205. import { Plus } from "@element-plus/icons-vue";
  206. // 文件上传组件
  207. import ImageUpload from "@/components/ImageUpload";
  208. import moment from "moment";
  209. import { treeselect as deptTreeselect } from "@/api/system/dept";
  210. export default defineComponent({
  211. name: "taskadd",
  212. components: { MapSelect },
  213. props: {
  214. taskinfo: Object,
  215. },
  216. setup(props, context) {
  217. const mapSelect = ref(null);
  218. const formlocation = ref({ addr: "", locations: "" });
  219. const {
  220. task_status,
  221. task_type,
  222. task_event_type,
  223. task_event_category,
  224. sys_area,
  225. } = useDict(
  226. "task_status",
  227. "task_type",
  228. "task_event_type",
  229. "task_event_category",
  230. "sys_area"
  231. );
  232. const taskinfo = ref({});
  233. listTask({ taskCode: moment().year() + "" }).then((res) => {
  234. taskinfo.value.taskCode =
  235. moment().year() + (Array(3).join(0) + (res.total + 1)).slice(-3);
  236. });
  237. watch(
  238. () => formlocation.value.addr,
  239. () => {
  240. taskinfo.value.taskAddr = formlocation.value.addr;
  241. }
  242. );
  243. watch(
  244. () => formlocation.value.locations,
  245. () => {
  246. taskinfo.value.taskLocation = formlocation.value.locations;
  247. if (formlocation.value.locations != "") {
  248. mapSelect.value.getlocationaddr(
  249. formlocation.value.locations,
  250. (data) => {
  251. var qu = data.regeocode.addressComponent.district;
  252. if (qu) {
  253. for (var i in sys_area.value) {
  254. if (sys_area.value[i].label == qu) {
  255. taskinfo.value.taskArea = sys_area.value[i].value;
  256. }
  257. }
  258. }
  259. }
  260. );
  261. }
  262. }
  263. );
  264. const store = useStore();
  265. const getters = computed(() => store.getters);
  266. const searchaddr = () => {
  267. if (taskinfo.value.taskAddr) {
  268. mapSelect.value.searchaddr(taskinfo.value.taskAddr);
  269. } else {
  270. ElMessage.warning("请输入地址");
  271. }
  272. };
  273. const alldept = ref([]);
  274. listDept().then((response) => {
  275. alldept.value = cloneDeep(response.data);
  276. });
  277. const allusers = ref([]);
  278. listUser({ pageSize: 1000 }).then((res) => {
  279. allusers.value = res.rows;
  280. });
  281. const doinit = (data) => {
  282. // console.log(getters.value)
  283. taskinfo.value = data;
  284. if (data.taskId == null) {
  285. fileList.value = "";
  286. formlocation.value = { addr: "", locations: "" };
  287. taskinfo.value.taskReporter = getters.value.userId;
  288. } else {
  289. if (
  290. taskinfo.value.taskDeptRange != null &&
  291. taskinfo.value.taskDeptRange != "" &&
  292. taskinfo.value.taskDeptRange != undefined &&
  293. !Array.isArray(taskinfo.value.taskDeptRange)
  294. ) {
  295. taskinfo.value.taskDeptRange = taskinfo.value.taskDeptRange
  296. .split(",")
  297. .map((i) => parseInt(i));
  298. }
  299. if (taskinfo.value.taskReporter == null ||
  300. taskinfo.value.taskReporter == "" ||
  301. taskinfo.value.taskReporter == undefined) {
  302. taskinfo.value.taskReporter = getters.value.userId;
  303. }
  304. if (
  305. taskinfo.value.taskPics != null &&
  306. taskinfo.value.taskPics != "" &&
  307. taskinfo.value.taskPics != undefined
  308. ) {
  309. fileList.value = taskinfo.value.taskPics;
  310. }
  311. if (
  312. taskinfo.value.taskAddr != null &&
  313. taskinfo.value.taskAddr != "" &&
  314. taskinfo.value.taskAddr != undefined
  315. ) {
  316. formlocation.value.addr = taskinfo.value.taskAddr;
  317. formlocation.value.locations = taskinfo.value.taskLocation;
  318. }
  319. }
  320. };
  321. onMounted(() => {
  322. doinit(props.taskinfo);
  323. });
  324. const fileList = ref([]);
  325. watch(
  326. () => fileList.value,
  327. () => {
  328. taskinfo.value.taskPics = fileList.value;
  329. }
  330. );
  331. const updateallvalue = () => {
  332. context.emit("update:taskinfo", taskinfo.value);
  333. };
  334. function setdatakey(dept) {
  335. if (dept.children) {
  336. dept.children = dept.children.map((i) => {
  337. return setdatakey(i);
  338. });
  339. }
  340. dept["value"] = dept.id;
  341. return dept;
  342. }
  343. const treedept = ref([
  344. {
  345. value: "1",
  346. label: "ss",
  347. },
  348. {
  349. value: "2",
  350. label: "ss1",
  351. },
  352. ]);
  353. deptTreeselect().then((res) => {
  354. treedept.value = [setdatakey(res.data[0])];
  355. });
  356. return {
  357. mapSelect,
  358. MapSelect,
  359. formlocation,
  360. taskinfo,
  361. searchaddr,
  362. alldept,
  363. allusers,
  364. treedept,
  365. task_status,
  366. task_type,
  367. task_event_type,
  368. task_event_category,
  369. sys_area,
  370. fileList,
  371. doinit,
  372. updateallvalue,
  373. };
  374. },
  375. });
  376. </script>
  377. <style lang="scss" scoped>
  378. .taskadd {
  379. .el-select {
  380. width: 100% !important;
  381. }
  382. }
  383. </style>
  384. <style>
  385. .el-date-editor {
  386. width: 100% !important;
  387. }
  388. .el-upload--picture-card {
  389. --el-upload-picture-card-size: 100px !important;
  390. }
  391. .el-upload-list--picture-card {
  392. --el-upload-list-picture-card-size: 100px;
  393. }
  394. </style>