wenhongquan 3 жил өмнө
parent
commit
74be5bb52d

+ 44 - 0
src/api/system/facilities.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询设施列表
+export function listFacilities(query) {
+  return request({
+    url: '/system/facilities/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询设施详细
+export function getFacilities(id) {
+  return request({
+    url: '/system/facilities/' + id,
+    method: 'get'
+  })
+}
+
+// 新增设施
+export function addFacilities(data) {
+  return request({
+    url: '/system/facilities',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改设施
+export function updateFacilities(data) {
+  return request({
+    url: '/system/facilities',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除设施
+export function delFacilities(id) {
+  return request({
+    url: '/system/facilities/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/system/log.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】列表
+export function listLog(query) {
+  return request({
+    url: '/system/log/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】详细
+export function getLog(id) {
+  return request({
+    url: '/system/log/' + id,
+    method: 'get'
+  })
+}
+
+// 新增任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】
+export function addLog(data) {
+  return request({
+    url: '/system/log',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】
+export function updateLog(data) {
+  return request({
+    url: '/system/log',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】
+export function delLog(id) {
+  return request({
+    url: '/system/log/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/system/task.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询工单任务列表
+export function listTask(query) {
+  return request({
+    url: '/system/task/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询工单任务详细
+export function getTask(taskId) {
+  return request({
+    url: '/system/task/' + taskId,
+    method: 'get'
+  })
+}
+
+// 新增工单任务
+export function addTask(data) {
+  return request({
+    url: '/system/task',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改工单任务
+export function updateTask(data) {
+  return request({
+    url: '/system/task',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除工单任务
+export function delTask(taskId) {
+  return request({
+    url: '/system/task/' + taskId,
+    method: 'delete'
+  })
+}

+ 118 - 108
src/layout/index.vue

@@ -1,108 +1,118 @@
-<template>
-  <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
-    <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
-    <sidebar v-if="!sidebar.hide" class="sidebar-container" />
-    <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
-      <div :class="{ 'fixed-header': fixedHeader }">
-        <navbar @setLayout="setLayout" />
-        <tags-view v-if="needTagsView" />
-      </div>
-      <app-main />
-      <settings ref="settingRef" />
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { useWindowSize } from '@vueuse/core'
-import Sidebar from './components/Sidebar/index.vue'
-import { AppMain, Navbar, Settings, TagsView } from './components'
-import defaultSettings from '@/settings'
-
-const store = useStore();
-const theme = computed(() => store.state.settings.theme);
-const sideTheme = computed(() => store.state.settings.sideTheme);
-const sidebar = computed(() => store.state.app.sidebar);
-const device = computed(() => store.state.app.device);
-const needTagsView = computed(() => store.state.settings.tagsView);
-const fixedHeader = computed(() => store.state.settings.fixedHeader);
-
-const classObj = computed(() => ({
-  hideSidebar: !sidebar.value.opened,
-  openSidebar: sidebar.value.opened,
-  withoutAnimation: sidebar.value.withoutAnimation,
-  mobile: device.value === 'mobile'
-}))
-
-const { width, height } = useWindowSize();
-const WIDTH = 992; // refer to Bootstrap's responsive design
-
-watchEffect(() => {
-  if (device.value === 'mobile' && sidebar.value.opened) {
-    store.dispatch('app/closeSideBar', { withoutAnimation: false })
-  }
-  if (width.value - 1 < WIDTH) {
-    store.dispatch('app/toggleDevice', 'mobile')
-    store.dispatch('app/closeSideBar', { withoutAnimation: true })
-  } else {
-    store.dispatch('app/toggleDevice', 'desktop')
-  }
-})
-
-function handleClickOutside() {
-  store.dispatch('app/closeSideBar', { withoutAnimation: false })
-}
-
-const settingRef = ref(null);
-function setLayout() {
-  settingRef.value.openSetting();
-}
-</script>
-
-<style lang="scss" scoped>
-  @import "@/assets/styles/mixin.scss";
-  @import "@/assets/styles/variables.module.scss";
-
-.app-wrapper {
-  @include clearfix;
-  position: relative;
-  height: 100%;
-  width: 100%;
-
-  &.mobile.openSidebar {
-    position: fixed;
-    top: 0;
-  }
-}
-
-.drawer-bg {
-  background: #000;
-  opacity: 0.3;
-  width: 100%;
-  top: 0;
-  height: 100%;
-  position: absolute;
-  z-index: 999;
-}
-
-.fixed-header {
-  position: fixed;
-  top: 0;
-  right: 0;
-  z-index: 9;
-  width: calc(100% - #{$base-sidebar-width});
-  transition: width 0.28s;
-}
-
-.hideSidebar .fixed-header {
-  width: calc(100% - 54px);
-}
-
-.sidebarHide .fixed-header {
-  width: 100%;
-}
-
-.mobile .fixed-header {
-  width: 100%;
-}
-</style>
+<template>
+    <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
+
+        <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
+
+        <sidebar v-if="!sidebar.hide" class="sidebar-container" />
+
+        <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
+
+            <div :class="{ 'fixed-header': fixedHeader }">
+
+                <navbar @setLayout="setLayout" />
+
+                <tags-view v-if="needTagsView" />
+
+            </div>
+
+            <app-main />
+
+            <settings ref="settingRef" />
+
+        </div>
+
+    </div>
+</template>
+
+<script setup>
+import { useWindowSize } from '@vueuse/core'
+import Sidebar from './components/Sidebar/index.vue'
+import { AppMain, Navbar, Settings, TagsView } from './components'
+import defaultSettings from '@/settings'
+
+const store = useStore();
+const theme = computed(() => store.state.settings.theme);
+const sideTheme = computed(() => store.state.settings.sideTheme);
+const sidebar = computed(() => store.state.app.sidebar);
+const device = computed(() => store.state.app.device);
+const needTagsView = computed(() => store.state.settings.tagsView);
+const fixedHeader = computed(() => store.state.settings.fixedHeader);
+
+const classObj = computed(() => ({
+    hideSidebar: !sidebar.value.opened,
+    openSidebar: sidebar.value.opened,
+    withoutAnimation: sidebar.value.withoutAnimation,
+    mobile: device.value === 'mobile'
+}))
+
+const { width, height } = useWindowSize();
+const WIDTH = 992; // refer to Bootstrap's responsive design
+
+watchEffect(() => {
+    if (device.value === 'mobile' && sidebar.value.opened) {
+        store.dispatch('app/closeSideBar', { withoutAnimation: false })
+    }
+    if (width.value - 1 < WIDTH) {
+        store.dispatch('app/toggleDevice', 'mobile')
+        store.dispatch('app/closeSideBar', { withoutAnimation: true })
+    } else {
+        store.dispatch('app/toggleDevice', 'desktop')
+    }
+})
+
+function handleClickOutside() {
+    store.dispatch('app/closeSideBar', { withoutAnimation: false })
+}
+
+const settingRef = ref(null);
+
+function setLayout() {
+    settingRef.value.openSetting();
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/mixin.scss";
+@import "@/assets/styles/variables.module.scss";
+.app-wrapper {
+    @include clearfix;
+    position: relative;
+    height: 100%;
+    width: 100%;
+    &.mobile.openSidebar {
+        position: fixed;
+        top: 0;
+    }
+}
+
+.drawer-bg {
+    background: #000;
+    opacity: 0.3;
+    width: 100%;
+    top: 0;
+    height: 100%;
+    position: absolute;
+    z-index: 999;
+}
+
+.fixed-header {
+    position: fixed;
+    top: 0;
+    right: 0;
+    z-index: 9;
+    width: calc(100% - #{$base-sidebar-width});
+    transition: width 0.28s;
+}
+
+.hideSidebar .fixed-header {
+    width: calc(100% - 54px);
+}
+
+.sidebarHide .fixed-header {
+    width: 100%;
+}
+
+.mobile .fixed-header {
+    width: 100%;
+}
+</style>

+ 357 - 0
src/views/system/facilities/index.vue

@@ -0,0 +1,357 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="区属" prop="areaDes">
+        <el-input
+          v-model="queryParams.areaDes"
+          placeholder="请输入区属"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="行政区属" prop="areaAdDes">
+        <el-input
+          v-model="queryParams.areaAdDes"
+          placeholder="请输入行政区属"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="扩展序号" prop="exId">
+        <el-input
+          v-model="queryParams.exId"
+          placeholder="请输入扩展序号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设施名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入设施名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="路名" prop="roadName">
+        <el-input
+          v-model="queryParams.roadName"
+          placeholder="请输入路名"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="性质(雨水、污水)" prop="nature">
+        <el-input
+          v-model="queryParams.nature"
+          placeholder="请输入性质(雨水、污水)"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设施起点" prop="addrFrom">
+        <el-input
+          v-model="queryParams.addrFrom"
+          placeholder="请输入设施起点"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设施终点" prop="addrEnd">
+        <el-input
+          v-model="queryParams.addrEnd"
+          placeholder="请输入设施终点"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="扩展编号1" prop="exId1">
+        <el-input
+          v-model="queryParams.exId1"
+          placeholder="请输入扩展编号1"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:facilities:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:facilities:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:facilities:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:facilities:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="facilitiesList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="区属" align="center" prop="areaDes" />
+      <el-table-column label="行政区属" align="center" prop="areaAdDes" />
+      <el-table-column label="扩展序号" align="center" prop="exId" />
+      <el-table-column label="设施名称" align="center" prop="name" />
+      <el-table-column label="路名" align="center" prop="roadName" />
+      <el-table-column label="性质(雨水、污水)" align="center" prop="nature" />
+      <el-table-column label="设施起点" align="center" prop="addrFrom" />
+      <el-table-column label="设施终点" align="center" prop="addrEnd" />
+      <el-table-column label="扩展编号1" align="center" prop="exId1" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:facilities:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:facilities:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改设施对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="区属" prop="areaDes">
+          <el-input v-model="form.areaDes" placeholder="请输入区属" />
+        </el-form-item>
+        <el-form-item label="行政区属" prop="areaAdDes">
+          <el-input v-model="form.areaAdDes" placeholder="请输入行政区属" />
+        </el-form-item>
+        <el-form-item label="扩展序号" prop="exId">
+          <el-input v-model="form.exId" placeholder="请输入扩展序号" />
+        </el-form-item>
+        <el-form-item label="设施名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入设施名称" />
+        </el-form-item>
+        <el-form-item label="路名" prop="roadName">
+          <el-input v-model="form.roadName" placeholder="请输入路名" />
+        </el-form-item>
+        <el-form-item label="性质(雨水、污水)" prop="nature">
+          <el-input v-model="form.nature" placeholder="请输入性质(雨水、污水)" />
+        </el-form-item>
+        <el-form-item label="设施起点" prop="addrFrom">
+          <el-input v-model="form.addrFrom" placeholder="请输入设施起点" />
+        </el-form-item>
+        <el-form-item label="设施终点" prop="addrEnd">
+          <el-input v-model="form.addrEnd" placeholder="请输入设施终点" />
+        </el-form-item>
+        <el-form-item label="扩展编号1" prop="exId1">
+          <el-input v-model="form.exId1" placeholder="请输入扩展编号1" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listFacilities, getFacilities, delFacilities, addFacilities, updateFacilities } from "@/api/system/facilities";
+
+export default {
+  name: "Facilities",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 设施表格数据
+      facilitiesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        areaDes: null,
+        areaAdDes: null,
+        exId: null,
+        name: null,
+        roadName: null,
+        nature: null,
+        addrFrom: null,
+        addrEnd: null,
+        exId1: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询设施列表 */
+    getList() {
+      this.loading = true;
+      listFacilities(this.queryParams).then(response => {
+        this.facilitiesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        areaDes: null,
+        areaAdDes: null,
+        exId: null,
+        name: null,
+        roadName: null,
+        nature: null,
+        addrFrom: null,
+        addrEnd: null,
+        exId1: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加设施";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getFacilities(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改设施";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateFacilities(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addFacilities(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除设施编号为"' + ids + '"的数据项?').then(function() {
+        return delFacilities(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/facilities/export', {
+        ...this.queryParams
+      }, `facilities_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 270 - 0
src/views/system/log/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="任务编号" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入任务编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:log:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:log:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:log:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:log:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="logList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="任务编号" align="center" prop="taskId" />
+      <el-table-column label="任务状态" align="center" prop="taskStatus" />
+      <el-table-column label="任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容均以json记录【该数据为内容数据】" align="center" prop="logDes" />
+      <el-table-column label="日志图片" align="center" prop="logPics" />
+      <el-table-column label="日志视频" align="center" prop="logVideos" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:log:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:log:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="任务编号" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入任务编号" />
+        </el-form-item>
+        <el-form-item label="日志图片" prop="logPics">
+          <el-input v-model="form.logPics" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="日志视频" prop="logVideos">
+          <el-input v-model="form.logVideos" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLog, getLog, delLog, addLog, updateLog } from "@/api/system/log";
+
+export default {
+  name: "Log",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】表格数据
+      logList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskId: null,
+        taskStatus: null,
+        logDes: null,
+        logPics: null,
+        logVideos: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】列表 */
+    getList() {
+      this.loading = true;
+      listLog(this.queryParams).then(response => {
+        this.logList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskId: null,
+        taskStatus: 0,
+        logDes: null,
+        logPics: null,
+        logVideos: null,
+        createTime: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLog(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLog(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除任务日志【任务日志内容 ,任务派发内容,任务驳回内容,任务跟踪内容,任务处置内容,任务核查内容】编号为"' + ids + '"的数据项?').then(function() {
+        return delLog(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/log/export', {
+        ...this.queryParams
+      }, `log_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 425 - 0
src/views/system/task/index.vue

@@ -0,0 +1,425 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="任务名称" prop="taskName">
+        <el-input
+          v-model="queryParams.taskName"
+          placeholder="请输入任务名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务编号" prop="taskCode">
+        <el-input
+          v-model="queryParams.taskCode"
+          placeholder="请输入任务编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务事件类型 参见字典task_event_category" prop="taskEventCategory">
+        <el-input
+          v-model="queryParams.taskEventCategory"
+          placeholder="请输入任务事件类型 参见字典task_event_category"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务时间" prop="taskTime">
+        <el-date-picker clearable
+          v-model="queryParams.taskTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择任务时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="任务要求完成时间" prop="taskReqCompleteTime">
+        <el-date-picker clearable
+          v-model="queryParams.taskReqCompleteTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择任务要求完成时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="创建人" prop="taskCreater">
+        <el-input
+          v-model="queryParams.taskCreater"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="上报人" prop="taskReporter">
+        <el-input
+          v-model="queryParams.taskReporter"
+          placeholder="请输入上报人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务投诉人电话" prop="taskComplainConnect">
+        <el-input
+          v-model="queryParams.taskComplainConnect"
+          placeholder="请输入任务投诉人电话"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:task:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:task:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:task:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:task:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="任务编号" align="center" prop="taskId" />
+      <el-table-column label="任务名称" align="center" prop="taskName" />
+      <el-table-column label="任务内容" align="center" prop="taskContent" />
+      <el-table-column label="任务地址" align="center" prop="taskAddr" />
+      <el-table-column label="任务经纬度" align="center" prop="taskLocation" />
+      <el-table-column label="任务编号" align="center" prop="taskCode" />
+      <el-table-column label="任务类型 参见字典task_type" align="center" prop="taskType" />
+      <el-table-column label="任务事件类型 参见字典task_event_type" align="center" prop="taskEventType" />
+      <el-table-column label="任务事件类型 参见字典task_event_category" align="center" prop="taskEventCategory" />
+      <el-table-column label="任务接收时备注" align="center" prop="taskFromRemark" />
+      <el-table-column label="任务发生道路" align="center" prop="taskAddrRoad" />
+      <el-table-column label="其他工单号" align="center" prop="taskOtherId" />
+      <el-table-column label="任务时间" align="center" prop="taskTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.taskTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="任务要求完成时间" align="center" prop="taskReqCompleteTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.taskReqCompleteTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="任务状态" align="center" prop="status" />
+      <el-table-column label="创建人" align="center" prop="taskCreater" />
+      <el-table-column label="上报人" align="center" prop="taskReporter" />
+      <el-table-column label="图片" align="center" prop="taskPics" />
+      <el-table-column label="视频" align="center" prop="taskVideos" />
+      <el-table-column label="任务投诉人电话" align="center" prop="taskComplainConnect" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:task:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:task:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改工单任务对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="任务名称" prop="taskName">
+          <el-input v-model="form.taskName" placeholder="请输入任务名称" />
+        </el-form-item>
+        <el-form-item label="任务内容">
+          <editor v-model="form.taskContent" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="任务地址" prop="taskAddr">
+          <el-input v-model="form.taskAddr" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="任务经纬度" prop="taskLocation">
+          <el-input v-model="form.taskLocation" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="任务编号" prop="taskCode">
+          <el-input v-model="form.taskCode" placeholder="请输入任务编号" />
+        </el-form-item>
+        <el-form-item label="任务事件类型 参见字典task_event_category" prop="taskEventCategory">
+          <el-input v-model="form.taskEventCategory" placeholder="请输入任务事件类型 参见字典task_event_category" />
+        </el-form-item>
+        <el-form-item label="任务接收时备注" prop="taskFromRemark">
+          <el-input v-model="form.taskFromRemark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="任务发生道路" prop="taskAddrRoad">
+          <el-input v-model="form.taskAddrRoad" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="其他工单号" prop="taskOtherId">
+          <el-input v-model="form.taskOtherId" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="任务时间" prop="taskTime">
+          <el-date-picker clearable
+            v-model="form.taskTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择任务时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="任务要求完成时间" prop="taskReqCompleteTime">
+          <el-date-picker clearable
+            v-model="form.taskReqCompleteTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择任务要求完成时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="创建人" prop="taskCreater">
+          <el-input v-model="form.taskCreater" placeholder="请输入创建人" />
+        </el-form-item>
+        <el-form-item label="上报人" prop="taskReporter">
+          <el-input v-model="form.taskReporter" placeholder="请输入上报人" />
+        </el-form-item>
+        <el-form-item label="图片" prop="taskPics">
+          <el-input v-model="form.taskPics" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="视频" prop="taskVideos">
+          <el-input v-model="form.taskVideos" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="任务投诉人电话" prop="taskComplainConnect">
+          <el-input v-model="form.taskComplainConnect" placeholder="请输入任务投诉人电话" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTask, getTask, delTask, addTask, updateTask } from "@/api/system/task";
+
+export default {
+  name: "Task",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 工单任务表格数据
+      taskList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskName: null,
+        taskContent: null,
+        taskAddr: null,
+        taskLocation: null,
+        taskCode: null,
+        taskType: null,
+        taskEventType: null,
+        taskEventCategory: null,
+        taskFromRemark: null,
+        taskAddrRoad: null,
+        taskOtherId: null,
+        taskTime: null,
+        taskReqCompleteTime: null,
+        status: null,
+        taskCreater: null,
+        taskReporter: null,
+        taskPics: null,
+        taskVideos: null,
+        taskComplainConnect: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询工单任务列表 */
+    getList() {
+      this.loading = true;
+      listTask(this.queryParams).then(response => {
+        this.taskList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        taskId: null,
+        taskName: null,
+        taskContent: null,
+        taskAddr: null,
+        taskLocation: null,
+        taskCode: null,
+        taskType: null,
+        taskEventType: null,
+        taskEventCategory: null,
+        taskFromRemark: null,
+        taskAddrRoad: null,
+        taskOtherId: null,
+        taskTime: null,
+        createTime: null,
+        taskReqCompleteTime: null,
+        updateTime: null,
+        status: 0,
+        taskCreater: null,
+        taskReporter: null,
+        taskPics: null,
+        taskVideos: null,
+        taskComplainConnect: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.taskId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加工单任务";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const taskId = row.taskId || this.ids
+      getTask(taskId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改工单任务";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.taskId != null) {
+            updateTask(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTask(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const taskIds = row.taskId || this.ids;
+      this.$modal.confirm('是否确认删除工单任务编号为"' + taskIds + '"的数据项?').then(function() {
+        return delTask(taskIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/task/export', {
+        ...this.queryParams
+      }, `task_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 1 - 1
vite.config.js

@@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => {
             proxy: {
                 // 'http://nnbpbg.xt.wenhq.top:8083'
                 "/dev-api": {
-                    target: "http://127.0.0.1:8080/",
+                    target: "http://localhost:8080/",
                     changeOrigin: true,
                     rewrite: (p) => p.replace(/^\/dev-api/, ""),
                 },