浏览代码

施工进度统计

wangzhe 10 月之前
父节点
当前提交
00f84c7a27

+ 71 - 0
src/api/zdsz/bigscreen.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 施工进度统计
+export function getConstructionProgress(query) {
+  return request({
+    url: '/zdsz/bigscreen/getConstructionProgress',
+    method: 'get',
+    params: query
+  })
+}
+// 工程状态统计
+export function getProjectStatus(query) {
+  return request({
+    url: '/zdsz/bigscreen/getProjectStatus',
+    method: 'get',
+    params: query
+  })
+}
+// 今日施工数
+export function getCountEngineering(query) {
+  return request({
+    url: '/zdsz/bigscreen/getCountEngineering',
+    method: 'get',
+    params: query
+  })
+}
+// 今日使用人数
+export function getCountPerson(query) {
+  return request({
+    url: '/zdsz/bigscreen/getCountPerson',
+    method: 'get',
+    params: query
+  })
+}
+// 地图施工数据分布
+export function getConstructionMap(query) {
+  return request({
+    url: '/zdsz/bigscreen/getConstructionMap',
+    method: 'get',
+    params: query
+  })
+}
+// 各个区今日施工数
+export function getConstructionNew(query) {
+  return request({
+    url: '/zdsz/bigscreen/getConstructionNew',
+    method: 'get',
+    params: query
+  })
+}
+// 各个区今日旧改施工数
+export function getConstructionOld(query) {
+  return request({
+    url: '/zdsz/bigscreen/getConstructionOld',
+    method: 'get',
+    params: query
+  })
+}
+
+export function formatTimestampToDateString(timestamp) {
+  let date = new Date(timestamp);
+  let year = date.getFullYear();
+  let month = date.getMonth() + 1;
+  let day = date.getDate();
+
+  function addLeadingZero(number) {
+    return number < 10 ? '0' + number : number;
+  }
+
+  return year + '-' + addLeadingZero(month) + '-' + addLeadingZero(day);
+}

文件差异内容过多而无法显示
+ 27 - 0
src/api/zdsz/china.js


二进制
src/assets/images/logo.jpg


+ 18 - 1
src/components/EngineePipe/index.vue

@@ -121,6 +121,19 @@
           </el-row>
           <el-row :gutter="20">
             <el-col :span="24">
+              <el-form-item label="是否完工" prop="isDone">
+                <el-radio-group v-model="queryParams.isDone">
+                  <el-radio
+                      v-for="dict in dict.type.sys_yes_no"
+                      :key="dict.value"
+                      :label="dict.value"
+                  >{{dict.label}}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="24">
               <el-form-item label="文件" prop="" v-if="currentType=='put'">
                 <ObsFileUpload ref="obsFileUpload" :file-size="100" :file-type="['dwg','dwt','doc','docx','xls','xlsx','png', 'jpg', 'jpeg','mp4']" :limit="9999"  :value="queryParams.pics" :disabled="title == '添加用料' "
                 ></ObsFileUpload>
@@ -185,7 +198,7 @@ export default {
     EngineeNode,
     EnginNodeInfo
   },
-  dicts: ['pipe_jack', 'district'],
+  dicts: ['sys_yes_no', 'pipe_jack', 'district'],
   data() {
     return {
       // 按钮loading
@@ -212,6 +225,7 @@ export default {
       // 查询参数
       queryParams: {
         files:[],
+        isDone: 'N',                  // 是否完工
         enginId: null,               // 外建工程
         enginName: '',               // 工程名称
         enginAddre: '',              // 工程地址
@@ -260,6 +274,9 @@ export default {
       form: {},
       // 表单校验
       rules: {
+        isDone: [
+          {required: true, message: "完工状态不能为空", trigger: "blur"}
+        ],
         constructSchedule: [
           {required: true, message: "施工进度不能为空", trigger: 'blur'}
         ],

+ 42 - 0
src/views/zdsz/area/index.vue

@@ -47,6 +47,20 @@
             @keyup.enter.native="handleQuery"
           />
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="queryParams.isDone"
+            placeholder="请选择完工状态"
+            clearable
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -158,6 +172,16 @@
         </template>
       </el-table-column>
       <el-table-column label="管理所" align="center" prop="administrative" show-overflow-tooltip/>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -455,6 +479,22 @@ export default {
     this.getList();
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let rowTemp = Object.assign({}, row);
+      // let rowTemp = row;
+      rowTemp.source = null;
+      // alert(row.source)
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        row = null;
+        return updateArea(rowTemp);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     /** 查询小区管理列表 */
     getList() {
       this.loading = true;
@@ -483,6 +523,7 @@ export default {
         releaseIs: undefined,
         releaseBy: undefined,
         district: undefined,
+        isDone: undefined,
         calculateDistrict: undefined,
         source: undefined,
         remark: undefined,
@@ -514,6 +555,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.form.isDone = "N";
       this.open = true;
       this.title = "添加小区管理";
     },

+ 884 - 0
src/views/zdsz/bigscreen/index.vue

@@ -0,0 +1,884 @@
+<!--
+   *@description: 贞达公司工程管理平台
+   *@author: Zhe
+   *@date: 2024-08-02 15:58:59
+   *@version: V1.0.0
+   -->
+
+<template>
+  <div class="app-container">
+    <!-- 标题开始 -->
+    <div class="mainTitle">
+
+    </div>
+    <!-- 标题结束 -->
+      <!-- 上边五个 -->
+    <div class="mainTop">
+      <!-- 左边俩 -->
+      <div class="mainLeft">
+        <!-- 左上图一 -->
+        <div class="mainLeft_1">
+          <div class="title">施工进度统计</div>
+          <div class="header">钢管总数{{ progress.ironTotal }} PE总数{{ progress.peTotal }}</div>
+          <div id="echartsLeft_1"></div>
+        </div>
+        <!-- 左上图二 -->
+        <div class="mainLeft_2">
+          <div class="title">工程状态统计</div>
+          <div class="header">开工{{ projectStatus.todo }} 在建{{ projectStatus.doing }} 完工{{ projectStatus.done }}</div>
+        </div>
+      </div>
+      <!-- 左边俩 结束 -->
+      <!-- 中间地图 -->
+      <div id="echartsMap" class="mainMap" ref="mainMap"></div>
+      <!-- 中间地图 结束 -->
+      <!-- 右边俩 -->
+      <div class="mainRight">
+        <!-- 右上图一 -->
+        <div class="mainRight_1">
+          <div class="title">今日施工数</div>
+          <div class="header">今日施工数{{ totalRight_1 }}</div>
+          <div id="echartsRight_1"></div>
+        </div>
+        <!-- 右上图二 -->
+        <div class="mainRight_2">
+          <div class="title">今日使用人数</div>
+          <div class="header">今日施工人数{{ totalRight_2 }}人</div>
+          <div id="echartsRight_2"></div>
+        </div>
+      </div>
+      <!-- 右边俩 结束 -->
+    </div>
+    <!-- 上边五个 结束 -->
+    <!-- 下边俩 -->
+    <div class="mainBottom">
+      <!-- 下边图一 -->
+      <div class="mainBottom_1">
+        <div class="title">各个区今日施工数</div>
+        <div id="echartsBottom_1"></div>
+      </div>
+      <!-- 下边图二 -->
+      <div class="mainBottom_2">
+        <div class="title">各个区今日旧改施工数</div>
+        <div id="echartsBottom_2"></div>
+      </div>
+    </div>
+    <!-- 下边俩 结束 -->
+  </div>
+</template>
+<script>
+  import * as echarts from "echarts";
+  import '@/api/zdsz/china.js' // 引入中国地图数据
+  import {
+    getConstructionProgress,
+    getProjectStatus,
+    getCountEngineering,
+    getCountPerson,
+    getConstructionMap,
+    getConstructionNew,
+    getConstructionOld,
+    formatTimestampToDateString,
+  } from '@/api/zdsz/bigscreen'
+  export default {
+    name: "bigScreen",
+    dicts: ['project_head', 'design_unit', 'supervision_unit', 'district'],
+    components: {},
+    data() {
+      return {
+        queryParams:{
+          time: formatTimestampToDateString(new Date()), // 当日日期
+          beginTime: '2024-08-03', // 开始时间
+          endTime: '2024-08-05', // 结束时间
+        },
+        progress: {
+          names: ['不锈钢波纹管', '螺旋焊管', '无缝钢管', '镀锌钢管', '燃气用埋地聚乙烯管'],
+          values: [],
+          ironTotal: 1600, // 钢管总数
+          peTotal: 1600, // PE总数
+        },
+        projectStatus: {
+          todo: 658, // 开工
+          doing: 658, // 在建
+          done: 658, // 完工
+        },
+        totalRight_1: 1111, // 今日施工数
+        totalRight_2: 1111, // 今日施工人数
+        zgns_newlst:[],
+      };
+    },
+    created() {
+      // alert(this.queryParams.time)
+      this.getConstructionProgress(); // 施工进度统计
+      this.getProjectStatus(); // 工程状态统计
+      this.getCountEngineering(); // 今日施工数
+      this.getCountPerson(); // 今日使用人数
+      // this.getConstructionMap(); // 地图施工数据分布
+      // this.getConstructionNew(); // 各个区今日施工数
+      this.getConstructionOld(); // 各个区今日旧改施工数
+    },
+    mounted() {
+      let _this = this;
+      setTimeout(function() {
+        _this.echartsMap();
+      },1)
+    },
+    methods: {
+      getConstructionProgress(){ // 施工进度统计
+        getConstructionProgress(this.queryParams).then(res => {
+          console.log("施工进度统计", res);
+          let names = [];
+          let values = [];
+          let datas = [];
+          let result = res.data;
+          for (let key in result) {
+          let data = {
+            name: key,
+            value: result[key],
+          }
+            datas.push(data);
+          }
+          datas.shift();
+          datas.shift();
+          for (let i = 0; i < this.progress.names.length; i++) {
+            datas[i].name = this.progress.names[i];
+          }
+          this.echartsLeft_1(datas);
+        })
+      },
+      getProjectStatus(){ // 工程状态统计
+        getProjectStatus(this.queryParams).then(res => {
+          console.log("工程状态统计", res);
+          this.projectStatus = res.data;
+        })
+      },
+      getCountEngineering(){ // 今日施工数
+        getCountEngineering(this.queryParams).then(res => {
+          console.log("今日施工数", res);
+          let names = [];
+          let values = [];
+          let data = {
+            name: names,
+            value: values,
+          }
+          let result = res.data;
+          for (let key in result) {
+            names.push(key);
+            values.push(result[key]);
+          }
+          console.log("datadatadatadata",data)
+          this.echartsRight_1(data);
+        })
+      },
+      getCountPerson(){ // 今日使用人数
+        getCountPerson(this.queryParams).then(res => {
+          console.log("今日使用人数", res);
+          let names = [];
+          let values = [];
+          let data = {
+            name: names,
+            value: values,
+          }
+          let result = res.data;
+          for (let key in result) {
+            names.push(key);
+            values.push(result[key]);
+          }
+          this.echartsRight_2(data);
+        })
+      },
+      getConstructionMap(){ // 地图施工数据分布
+        getConstructionMap(this.queryParams).then(res => {
+          console.log("地图施工数据分布", res);
+
+        })
+      },
+      getConstructionNew(){ // 各个区今日施工数
+        getConstructionNew(this.queryParams).then(res => {
+          console.log("各个区今日施工数", res);
+          // this.echartsBottom_1(res.data);
+        })
+      },
+      getConstructionOld(){ // 各个区今日旧改施工数
+        getConstructionOld(this.queryParams).then(res => {
+          console.log("各个区今日旧改施工数", res);
+          this.echartsBottom_1(res.data);
+          this.echartsBottom_2(res.data);
+        })
+      },
+      echartsLeft_1(data){
+        let myChart = echarts.init(document.getElementById('echartsLeft_1'));
+        let option = {
+          title: {
+            text: 'Referer of a Website',
+            subtext: 'Fake Data',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'item'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left'
+          },
+          series: [
+            {
+              // name: 'Access From',
+              name: '',
+              type: 'pie',
+              radius: '50%',
+              data: data,
+              //   [
+              //   { value: 1048, name: 'Search Engine' },
+              //   { value: 735, name: 'Direct' },
+              //   { value: 580, name: 'Email' },
+              //   { value: 484, name: 'Union Ads' },
+              //   { value: 300, name: 'Video Ads' }
+              // ],
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        };
+        if (option && typeof option === "object") {
+          myChart.setOption(option);
+        }
+      },
+      echartsLeft_2(){
+
+      },
+      echartsRight_1(data){
+        let names = ['民用工程', '工业工程', '市政工程', '碰口作业', '基建工程', '顶管工程'];
+        let values = [120, 200, 150, 80, 70, 110, 130];
+        // names = data.name;
+        values = data.value;
+        let myChart = echarts.init(document.getElementById('echartsRight_1'));
+        let option = {
+          xAxis: {
+            type: 'category',
+            data: names
+          },
+          yAxis: {
+            type: 'value'
+          },
+          series: [
+            {
+              data: values,
+              type: 'bar'
+            }
+          ]
+        };
+        if (option && typeof option === "object") {
+          myChart.setOption(option);
+        }
+      },
+      echartsRight_2(data){
+        let names = ['民用工程', '工业工程', '市政工程', '碰口作业', '基建工程', '顶管工程'];
+        let values = [120, 200, 150, 80, 70, 110, 130];
+        // names = data.name;
+        values = data.value;
+        let myChart = echarts.init(document.getElementById('echartsRight_2'));
+        let option = {
+          xAxis: {
+            type: 'category',
+            data: names
+          },
+          yAxis: {
+            type: 'value'
+          },
+          series: [
+            {
+              data: values,
+              type: 'bar'
+            }
+          ]
+        };
+        if (option && typeof option === "object") {
+          myChart.setOption(option);
+        }
+      },
+      echartsBottom_1(data){
+        let names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
+        let values = [120, 200, 150, 80, 70, 110, 130];
+        names = data.name;
+        values = data.value;
+        let myChart = echarts.init(document.getElementById('echartsBottom_1'));
+        let option = {
+          xAxis: {
+            type: 'category',
+            data: names
+          },
+          yAxis: {
+            type: 'value'
+          },
+          series: [
+            {
+              data: values,
+              type: 'bar'
+            }
+          ]
+        };
+        if (option && typeof option === "object") {
+          myChart.setOption(option);
+        }
+      },
+      echartsBottom_2(data){
+        let names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
+        let values = [120, 200, 150, 80, 70, 110, 130];
+        names = data.name;
+        values = data.value;
+        let myChart = echarts.init(document.getElementById('echartsBottom_2'));
+        let option = {
+          xAxis: {
+            type: 'category',
+            data: names
+          },
+          yAxis: {
+            type: 'value'
+          },
+          series: [
+            {
+              data: values,
+              type: 'bar'
+            }
+          ]
+        };
+        if (option && typeof option === "object") {
+          myChart.setOption(option);
+        }
+      },
+      echartsMap() {
+        let myChart = echarts.init(document.getElementById('echartsMap'));
+        window.onresize = myChart.resize;
+        var namedata = [{name: '1双阳区良园老年公寓火灾'}, {name: '2双阳区良园老年公寓火灾'}, {name: '3双阳区良园老年公寓火灾'}, {name: '4双阳区良园老年公寓火灾'}, {name: '5双阳区良园老年公寓火灾'}, {name: '双阳区良园老年公寓火灾'}, {name: '周'}, {name: '赵'}, {name: '钱'}, {name: '孙'},
+          {name: '吴'}, {name: '郑'}, {name: '王'}, {name: '冯'}, {name: '陈'}, {name: '杨'}, {name: '朱'}, {name: '双阳区良园老年公寓火灾'}, {name: '双阳区良园老年公寓火灾'}, {name: '双阳区良园老年公寓火灾'},
+          {name: '何'}, {name: '曹'}, {name: '陶'}, {name: '邹'}, {name: '苏'}, {name: '范'}, {name: '彭'}, {name: '双阳区良园老年公寓火灾'}, {name: '双阳区良园老年公寓火灾'}, {name: '方'},
+          {name: '唐'}, {name: '顾'}];
+        var option = null;
+        var geoCoordMap = {
+          '上海': [119.1803, 31.2891],
+          "福建": [119.4543, 25.9222],
+          "重庆": [108.384366, 30.439702],
+          '北京': [116.4551, 40.2539],
+          "辽宁": [123.1238, 42.1216],
+          "河北": [114.4995, 38.1006],
+          "天津": [117.4219, 39.4189],
+          "山西": [112.3352, 37.9413],
+          "陕西": [109.1162, 34.2004],
+          "甘肃": [103.5901, 36.3043],
+          "宁夏": [106.3586, 38.1775],
+          "青海": [101.4038, 36.8207],
+          "新疆": [87.9236, 43.5883],
+          "西藏": [91.11, 29.97],
+          "四川": [103.9526, 30.7617],
+          "吉林": [125.8154, 44.2584],
+          "山东": [117.1582, 36.8701],
+          "河南": [113.4668, 34.6234],
+          "江苏": [118.8062, 31.9208],
+          "安徽": [117.29, 32.0581],
+          "湖北": [114.3896, 30.6628],
+          "浙江": [119.5313, 29.8773],
+          '内蒙古': [110.3467, 41.4899],
+          "江西": [116.0046, 28.6633],
+          "湖南": [113.0823, 28.2568],
+          "贵州": [106.6992, 26.7682],
+          "云南": [102.9199, 25.4663],
+          "广东": [113.12244, 23.009505],
+          "广西": [108.479, 23.1152],
+          "海南": [110.3893, 19.8516],
+          '黑龙江': [127.96888, 45.368],
+          '台湾': [121.4648, 25.5630]
+        };
+        var chinaDatas = [
+          {
+            name: '北京',
+            value: 86
+          },
+          {
+            name: '福建',
+            value: 65
+          },
+          {
+            name: '广东',
+            value: 53
+          },
+          {
+            name: '上海',
+            value: 48
+          },
+
+          {
+            name: '河北',
+            value: 2
+          },
+          {
+            name: '天津',
+            value: 6
+          },
+          {
+            name: '山西',
+            value: 0
+          },
+          {
+            name: '陕西',
+            value: 2
+          },
+          {
+            name: '甘肃',
+            value: 4
+          },
+          {
+            name: '宁夏',
+            value: 5
+          },
+          {
+            name: '青海',
+            value: 3
+          },
+          {
+            name: '新疆',
+            value: 0.4
+          },
+          {
+            name: '西藏',
+            value: 0.3
+          },
+          {
+            name: '四川',
+            value: 22
+          },
+          {
+            name: '重庆',
+            value: 12
+          },
+          {
+            name: '山东',
+            value: 9
+          },
+          {
+            name: '河南',
+            value: 0.9
+          },
+          {
+            name: '江苏',
+            value: 24
+          },
+          {
+            name: '安徽',
+            value: 15
+          },
+          {
+            name: '湖北',
+            value: 6
+          },
+          {
+            name: '浙江',
+            value: 15
+          },
+          {
+            name: '内蒙古',
+            value: 0.3
+          },
+          {
+            name: '江西',
+            value: 34
+          },
+          {
+            name: '湖南',
+            value: 12
+          },
+          {
+            name: '贵州',
+            value: 0.8
+          },
+          {
+            name: '广西',
+            value: 16
+          },
+          {
+            name: '海南',
+            value: 37
+          },
+          {
+            name: '辽宁',
+            value: 0.2
+          },
+          {
+            name: '吉林',
+            value: 0.4
+          },
+          {
+            name: '云南',
+            value: 34
+          },
+          {
+            name: '黑龙江',
+            value: 5
+          },
+          {
+            name: '台湾',
+            value: 43
+          }
+        ];
+
+        let myOption = { // 进行相关配置
+          tooltip: {// 鼠标移到图里面的浮动提示框
+            show: true
+          },
+          visualMap: {
+            show: false,
+            min: 0,
+            max: 200,
+            calculable: true,
+            seriesIndex: [1],
+            inRange: {
+              color: ['#01073f', '#000960'] // 深蓝到淡蓝 地图背景色
+            }
+          },
+          geo: {// 这个是重点配置区
+            map: "china",// 表示中国地图
+            roam: false, //关闭鼠标缩放和漫游
+            zoom: 1, //地图缩放级别
+            selectedMode: false, //选中模式:single | multiple
+            layoutCenter: ["50%", "49%"], //设置后left/right/top/bottom等属性无效
+            layoutSize: "120%",
+            label: {
+              normal: {//静态的时候显示的默认样式
+                show: true, //是否显示地图省份得名称
+                textStyle: {
+                  color: 'rgba(255,255,255,0.7)' // 地图名颜色
+                }
+              },
+              emphasis: { //动态展示的样式
+                color: '#43d0d6',
+              },
+            },
+            itemStyle: {
+              normal: {
+                //静态的时候显示的默认样式
+                areaColor: '#010742',//地图区域背景色
+                borderColor: '#0847f5',//地图边框颜色
+              },
+              emphasis: {
+                //鼠标移入动态的时候显示的默认样式
+                areaColor: '#010e8a',
+                borderWidth: '2',
+              }
+            }
+          },
+          series: [{
+            type: 'scatter',
+            coordinateSystem: 'geo' // 对应上方配置
+          },
+            {
+              name: '启动次数', // 浮动框的标题
+              type: 'map',
+              geoIndex: 0,
+              data: [{
+                "name": "北京",
+                "value": 599
+              }, {
+                "name": "上海",
+                "value": 142
+              }, {
+                "name": "黑龙江",
+                "value": 44
+              }, {
+                "name": "深圳",
+                "value": 92
+              }, {
+                "name": "湖北",
+                "value": 810
+              }, {
+                "name": "四川",
+                "value": 453
+              }]
+            },
+            {
+              type: 'effectScatter',
+              coordinateSystem: 'geo',
+              z: 1,
+              data: [
+                {
+                  zgns_dept: "南关区今日施工",
+                  zgns_time: "",
+                  zgns_msg: "190****4387",
+                  value: [119.1803, 31.2891]
+                }
+              ],
+              // data: this.zgns_newlst,
+              symbolSize: 14,
+              label: {
+                normal: {
+                  show: true,
+                  formatter: function (params) {
+                    //return '{fline|' + params.data.username + '}\n {fcine|' + params.data.telphone + '}\n{tline|' + params.data.address + '}';
+                    return '{fline|' + params.data.zgns_dept + '}\n {fcine|' + params.data.zgns_time + '}\n{tline|' + params.data.zgns_msg + '}';
+                  },
+                  position: 'top',
+                  backgroundColorAnnotation: '#090d73', // 气泡 背景颜色
+                  backgroundColor: 'rgba(9,13,115,.8)',
+                  // backgroundColor: 'rgba(1,5,42,.8)',
+                  padding: [0, 0],
+                  //borderRadius: 3,
+                  lineHeight: 32+10, // 气泡框高度
+                  color: '#f7fafb',
+                  borderWidth: '1',
+                  borderColor: '#0989e2',
+                  rich: {
+                    fline: {
+                      padding: [0, 10, 20, 10],
+                      color: '#0f0',
+                      fontSize: 18,
+                    },
+                    fcine: {
+                      padding: [0, 10, 0, 10],
+                      color: '#fff',
+                    },
+                    tline: {
+                      padding: [15, 10, 0, 10],
+                      color: '#fff'
+                    }
+                  }
+                },
+                emphasis: {
+                  show: true
+                }
+              },
+              itemStyle: {
+                color: '#0ff',
+                color: '#f40 ',
+                color: '#feae21',
+              }
+            },
+          ]
+        }
+        if (myOption && typeof myOption === "object") {
+          // myChart.setOption(myOption);
+          myChart.setOption(myOption, true);
+        }
+
+        function getTel() {
+          var n = 2, telstr = '1';
+          while (n < 12) {
+            if (n < 3) {
+              while (1) {
+                var nums = Math.floor(Math.random() * 10);
+                if (nums !== 0 && nums !== 1 && nums !== 2 && nums !== 3 && nums !== 4 && nums !== 6) {
+                  telstr += nums;
+                  break;
+                }
+              }
+            } else if (n > 3 && n < 8) {
+              telstr += '*';
+            } else {
+              telstr += Math.floor(Math.random() * 10);
+            }
+            n++;
+          }
+          return telstr;
+        }
+
+        function getName(type) {
+          var name = '';
+          var roundnum = Math.floor(Math.random() * 32);
+          switch (type) {
+            case 1:
+              name = namedata[roundnum].name;
+              break;
+            default:
+              name = namedata[roundnum].name;
+              break;
+          }
+          return name;
+        }
+
+        function getAddress(num, type) {
+          var addstr = '';
+          switch (type) {
+            case 1:
+              addstr = '在' + chinaDatas[num].name + '-保时捷4S店购买车辆';
+              break;
+            case 2:
+              addstr = '在' + chinaDatas[num].name + '-奔驰4S店购买车辆';
+              break;
+            default:
+              addstr = '在' + chinaDatas[num].name + '-法拉利4S店购买车辆';
+              break;
+          }
+          return addstr;
+        }
+
+        /*var timer = setInterval(() => {
+          //数据情况重绘,清除formatter移动效果,也可根据自身需求是否需要,删除这两行代码
+          /*option.series[seriesjson[runidx].createType-1].data = [];
+          myChart.setOption(option, true);
+          var runidx = Math.floor(Math.random() * 3);
+          var typeidx = Math.floor(Math.random() * 3);
+          var dataidx = Math.floor(Math.random() * 32);
+          var ranval = Math.floor(Math.random() * 10);
+          chinaDatas[dataidx].value = chinaDatas[dataidx].value + ranval;
+          var valarr = geoCoordMap[chinaDatas[dataidx].name];
+          valarr.push(ranval);
+          myOption.series[typeidx].data = [{
+            name: '',
+            username: getName(runidx),
+            telphone: getTel(),
+            address: getAddress(dataidx, typeidx),
+            value: valarr
+          }];
+          myChart.setOption(myOption, true);
+        }, 3000);*/
+      },
+    }
+  };
+</script>
+
+
+<style lang="scss" scoped>
+  .mainTitle{
+    width: 1920px;
+    height: 62px;
+    margin-bottom: 10px;
+    background: url("../../../assets/images/logo.jpg");
+  }
+  /*1920 * 929 Google Chrome*/
+  /*1920 * 69 Title*/
+  /*1920 * 560 Top share 860 */
+  /*1920 * 280 Bottom share 860*/
+  /*1920 * 20 Remain */
+  .mainTop{
+    width: 1920px;
+    height: 560px;
+    margin: 0 auto 20px;
+    .mainLeft{
+      float: left;
+      width: 640px;
+      margin-left: 20px;
+      .mainLeft_1{ // 施工进度统计
+        background-color: #04183e;
+        margin-bottom: 10px;
+        width: 100%;
+        height: 285px;
+        .title{
+          width: 640px;
+          height:47px;
+        }
+        .header{
+          width: 640px;
+          height:48px;
+        }
+        #echartsLeft_1{
+          width: 640px;
+          height: 190px;
+        }
+      }
+      .mainLeft_2{ // 工程状态统计
+        background-color: #04183e;
+        width: 100%;
+        height: 265px;
+        .title{
+          width: 640px;
+          height:47px;
+        }
+        .header{
+          width: 640px;
+          height: 218px;
+        }
+      }
+    }
+    .mainRight{
+      float: left;
+      width: 640px;
+      margin-left: 20px;
+      .mainRight_1{ // 今日施工数
+        margin-bottom: 10px;
+        width: 100%;
+        height: 275px;
+        .title{
+          width: 640px;
+          height:47px;
+        }
+        .header{
+          width: 640px;
+          height:48px;
+        }
+        #echartsRight_1{
+          width: 640px;
+          height: 180px;
+        }
+      }
+      .mainRight_2{ // 今日施工人数
+        width: 100%;
+        height: 275px;
+        .title{
+          width: 640px;
+          height:47px;
+        }
+        .header{
+          width: 640px;
+          height:48px;
+        }
+        #echartsRight_2{
+          width: 640px;
+          height: 180px;
+        }
+      }
+    }
+    .mainMap{
+      float: left;
+      width: 560px;
+      height: 560px;
+      margin-left: 20px;
+    }
+  }
+  .mainBottom{
+    width: 1920px;
+    height: 277px;
+    .mainBottom_1{
+      float: left;
+      width: 930px;
+      height: 100%;
+      margin-left: 20px;
+      .title{
+        width: 930px;
+        height:47px;
+      }
+      #echartsBottom_1{
+        width: 930px;
+        height: 230px;
+      }
+    }
+    .mainBottom_2{
+      float: left;
+      width: 930px;
+      height: 100%;
+      margin-left: 20px;
+      .title{
+        width: 930px;
+        height:47px;
+      }
+      #echartsBottom_2{
+        width: 930px;
+        height: 230px;
+      }
+    }
+  }
+  .mainLeft_1, .mainLeft_2, .mainRight_1, .mainRight_2, .mainBottom_1, .mainBottom_2, .mainMap{
+    background-color: #04183e;
+  }
+  .app-container{
+    margin: 0;
+    padding: 0;
+  }
+  .mainTop, .mainBottom, .app-container{
+    background-color: #0a1426;
+    /*background-color: #000;*/
+    /*background-color: red;*/
+  }
+</style>
+

+ 59 - 1
src/views/zdsz/engineeringGY/index.vue

@@ -42,6 +42,20 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="searchParams.isDone"
+            placeholder="请选择完工状态"
+            clearable
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -151,6 +165,16 @@
           </div>
         </template>
       </el-table-column>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template v-slot="scope">
           <el-button
@@ -357,6 +381,15 @@
           <el-input v-model="form.gcPreset" placeholder="请填写钢材预设" maxlength="13" oninput="value=value.match(/\d+(\.\d{0,1})?/) ? value.match(/\d+(\.\d{0,1})?/)[0] : ''"
                     :readonly="title == '添加用料' "></el-input>
         </el-form-item>
+        <el-form-item label="是否完工" prop="isDone">
+          <el-radio-group v-model="form.isDone">
+            <el-radio
+                v-for="dict in dict.type.sys_yes_no"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="工程分类" prop="enginType" v-hasPermi="['zdsz:engineeringgy:add']">
           <el-select v-model="form.enginType" placeholder="请选择工程分类" style="width: 100%"
                      :disabled="title == '添加用料' ">
@@ -558,6 +591,15 @@
           <el-input v-model="form.supervisionPhone" placeholder="请填写监理联系电话" maxlength="13"
                     :readonly="title == '添加用料' "></el-input>
         </el-form-item>
+        <el-form-item label="是否完工" prop="isDone">
+          <el-radio-group v-model="form.isDone">
+            <el-radio
+                v-for="dict in dict.type.sys_yes_no"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="工程分类" prop="enginType" >
           <el-select v-model="form.enginType" placeholder="请选择工程分类" style="width: 100%"
                      :disabled="title == '添加用料' ">
@@ -743,7 +785,7 @@ import EnginNodeInfo from "@/components/EnginNodeInfo/indexGY.vue";
 
 export default {
   name: "工业",
-  dicts: ['project_head', 'design_unit', 'supervision_unit', 'district'],
+  dicts: ['sys_yes_no', 'project_head', 'design_unit', 'supervision_unit', 'district'],
   components: {
     EnginNodeInfo,
     ConstructionDetails,
@@ -809,6 +851,7 @@ export default {
       MaterVisible: false, // 用料信息dialog
       // 表单参数
       form: {
+        isDone: '', // 是否完工
         files: [], // 附件
         pics: [], // 附件返回
         type: '', // 用来区分工业工程、工业工程
@@ -866,6 +909,9 @@ export default {
       specificationsList: [], // 用料规格List
       // 表单校验
       rules: {
+        isDone: [
+          {required: true, message: "完工状态不能为空", trigger: "blur"}
+        ],
         district: [
           {required: true, message: "行政区不能为空", trigger: "change"}
         ],
@@ -944,6 +990,17 @@ export default {
     });
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        return EditEngineeEngineeIndustry(row);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     getDictChild(dict){
       let str = '';
       if (dict == '室内管线') {
@@ -1292,6 +1349,7 @@ export default {
       this.title = "新增工业工程";
       this.currentType = 'add'
       // this.open = true;
+      this.form.isDone = "N";
       this.openadd = true;
     },
     removeFile(val) {

+ 50 - 1
src/views/zdsz/engineeringIndustry/index.vue

@@ -32,6 +32,20 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="searchParams.isDone"
+            placeholder="请选择完工状态"
+            clearable
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -145,6 +159,16 @@
           </div>
         </template>
       </el-table-column>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template v-slot="scope">
           <el-button
@@ -315,6 +339,15 @@
         <!--            ></el-option>-->
         <!--          </el-select>-->
         <!--        </el-form-item>-->
+        <el-form-item label="是否完工" prop="isDone">
+          <el-radio-group v-model="form.isDone">
+            <el-radio
+                v-for="dict in dict.type.sys_yes_no"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="附件" v-if="form.id" style="width: 100%">
@@ -491,7 +524,7 @@ import EnginNodeInfo from "@/components/EnginNodeInfo/indexSZ.vue";
 
 export default {
   name: "市政",
-  dicts: ['engin_classification', 'district'],
+  dicts: ['sys_yes_no', 'engin_classification', 'district'],
   components: {
     EnginNodeInfo,
     ConstructionDetails,
@@ -550,6 +583,7 @@ export default {
       MaterVisible: false, // 用料信息dialog
       // 表单参数
       form: {
+        isDone: '', // 完工状态
         files: [], // 附件
         pics: [], // 附件返回
         type: '', // 用来区分工业工程、市政工程
@@ -602,6 +636,9 @@ export default {
       specificationsList: [], // 用料规格List
       // 表单校验
       rules: {
+        isDone: [
+          {required: true, message: "完工状态不能为空", trigger: "blur"}
+        ],
         district: [
           {required: true, message: "行政区不能为空", trigger: "change"}
         ],
@@ -648,6 +685,17 @@ export default {
     });
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        return UpdateEngineeIndustry(row);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     downloadZip(name) {
       this.$download.zip(`/zdsz/engineeringPipeJacking/downloadZip/${'市政工程'}/${name}`, name);
     },
@@ -942,6 +990,7 @@ export default {
       this.gc = true
       this.title = "新增市政工程";
       this.currentType = 'add'
+      this.form.isDone = "N";
       this.open = true;
     },
     removeFile(val) {

+ 58 - 8
src/views/zdsz/engineeringInfrastructure/index.vue

@@ -22,6 +22,20 @@
       <el-form-item label="工程名称" prop="enginName">
         <el-input v-model="searchParams.enginName" placeholder="请输入工程名称" ></el-input>
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="searchParams.isDone"
+            placeholder="请选择完工状态"
+            clearable
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -108,6 +122,16 @@
           </div>
         </template>
       </el-table-column>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="400">
         <template slot-scope="scope">
             <el-button
@@ -232,15 +256,15 @@
         <el-form-item label="计划工期" prop="plannedDuration">
           <el-input v-model="queryParams.plannedDuration" placeholder="请输入计划工期" maxlength="50" :disabled="title == '添加用料' "></el-input>
         </el-form-item>
-        <el-form-item label="文件" prop="files" v-if="queryParams.id">
-          <ObsFileUpload ref="obsFileUpload" :disabled="title == '添加用料' " :file-size="100" :file-type="['dwg','dwt','doc','docx','xls','xlsx','png', 'jpg', 'jpeg','mp4']" :limit="9999"  :value="queryParams.pics" @input="filesUpload"
-          ></ObsFileUpload>
+        <el-form-item label="是否完工" prop="isDone">
+          <el-radio-group v-model="queryParams.isDone">
+            <el-radio
+                v-for="dict in dict.type.sys_yes_no"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
         </el-form-item>
-        <el-form-item label="文件" prop="files" v-else>
-          <ObsFileUpload :disabled="title == '添加用料' " ref="obsFileUpload" :file-size="100" :file-type="['dwg','dwt','doc','docx','xls','xlsx','png', 'jpg', 'jpeg','mp4']" :limit="9999"  :value="queryParams.files" @input="filesUpload"
-          ></ObsFileUpload>
-        </el-form-item>
-
         <el-form-item label="工程内容" prop="enginContent">
           <el-input
             :disabled="title == '添加用料' "
@@ -251,6 +275,15 @@
             maxlength="200"
             />
         </el-form-item>
+        <el-form-item label="文件" prop="files" v-if="queryParams.id">
+          <ObsFileUpload ref="obsFileUpload" :disabled="title == '添加用料' " :file-size="100" :file-type="['dwg','dwt','doc','docx','xls','xlsx','png', 'jpg', 'jpeg','mp4']" :limit="9999"  :value="queryParams.pics" @input="filesUpload"
+          ></ObsFileUpload>
+        </el-form-item>
+        <el-form-item label="文件" prop="files" v-else>
+          <ObsFileUpload :disabled="title == '添加用料' " ref="obsFileUpload" :file-size="100" :file-type="['dwg','dwt','doc','docx','xls','xlsx','png', 'jpg', 'jpeg','mp4']" :limit="9999"  :value="queryParams.files" @input="filesUpload"
+          ></ObsFileUpload>
+        </el-form-item>
+
         <el-form-item label="环节" prop="currentCheckList" style="width: 100%;margin-left: 0;" v-if="title!=='修改基建工程'">
           <el-checkbox-group v-model="currentCheckList" @change="console.log(currentCheckList)" :rules="{required: true, message: '请输入材质', trigger: 'blur'}">
             <el-checkbox
@@ -331,6 +364,7 @@ import ConstructionDetails from "@/components/ConstructionDetails"
 export default {
   name: "openrepair",
   dicts:[
+         'sys_yes_no',
          'district',
          "engineering_infrastructure",
       ],
@@ -600,6 +634,9 @@ export default {
       houses: [],
       // 表单校验
       rules: {
+        isDone: [
+          {required: true, message: "完工状态不能为空", trigger: "blur"}
+        ],
         district: [
           {required: true, message: "行政区不能为空", trigger: "change"}
         ],
@@ -777,6 +814,17 @@ export default {
     this.checkList = this.dict.type.engineering_infrastructure
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        return putEngineeringInfrastructure(row);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     download(name){
       // downloadZip('基建工程',name)
       this.$download.zip(`/zdsz/engineeringPipeJacking/downloadZip/基建工程/${name}`, name);
@@ -1170,6 +1218,7 @@ export default {
       this.form = {
         id: undefined,
         district: undefined,
+        isDone: undefined,
         areaId: undefined,
         buildingId: undefined,
         unitId: undefined,
@@ -1241,6 +1290,7 @@ export default {
     handleAdd() {
       this.reset();
       this.currentCheckingEnginList = []
+      this.queryParams.isDone = "N";
       this.open = true;
       this.enginNodeStatus == '新增'
       this.title = "新增工程";

+ 38 - 0
src/views/zdsz/engineeringPipeJacking/index.vue

@@ -22,6 +22,20 @@
       <el-form-item label="工程名称" prop="enginName">
         <el-input v-model="queryParams1.enginName" placeholder="请输入工程名称" clearable></el-input>
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="queryParams1.isDone"
+            placeholder="请选择完工状态"
+            clearable
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -118,6 +132,16 @@
           </div>
         </template>
       </el-table-column>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <!--            <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>-->
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="300">
         <template slot-scope="scope">
@@ -562,6 +586,17 @@ export default {
     this.getList();
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        return putEngineeringPipeJacking(row);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     downloadZip(name){
       this.$download.zip(`/zdsz/engineeringPipeJacking/downloadZip/顶管工程/${name}`, name);
     },
@@ -735,7 +770,9 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
+      this.queryParams1.district = ''
       this.queryParams1.enginName = ''
+      this.queryParams1.isDone = ''
       this.handleQuery();
     },
     // 多选框选中数据
@@ -747,6 +784,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.form.isDone = "N";
       this.open = true;
       this.title = "新增工程";
     },

+ 54 - 1
src/views/zdsz/touchOperationEngineering/index.vue

@@ -37,6 +37,21 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="完工状态" prop="isDone">
+        <el-select
+            v-model="queryParams.isDone"
+            placeholder="请选择完工状态"
+            clearable
+            style="width: 240px"
+        >
+          <el-option
+              v-for="dict in dict.type.sys_yes_no"
+              :key="dict.value"
+              :label="dict.label == '是' ? '完工' : '非完工'"
+              :value="dict.value"
+          />
+        </el-select>
+      </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>
@@ -138,6 +153,16 @@
           </div>
         </template>
       </el-table-column>
+      <el-table-column label="是否完工" align="center" key="isDone">
+        <template slot-scope="scope">
+          <el-switch
+              v-model="scope.row.isDone"
+              active-value="Y"
+              inactive-value="N"
+              @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -261,6 +286,17 @@
                         :disabled="title == '添加碰口作业用料信息'" maxlength="200" rows="5"/>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否完工" prop="isDone">
+              <el-radio-group v-model="form.isDone">
+                <el-radio
+                    v-for="dict in dict.type.sys_yes_no"
+                    :key="dict.value"
+                    :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row v-if="title=='添加碰口作业用料信息'">
           <el-col :span="24">
@@ -325,7 +361,7 @@ import {insertReview} from "@/api/zdsz/enginee";
 export default {
   name: "TouchOperationEngineering",
   components: {ConstructionDetails, EnginNodeInfo},
-  dicts: ['tapping_operation', 'bury_the_wrench_hole', 'aerial_wrench_hole', 'shutdown_operation', 'pe_plugging', 'the_steel_pipe_sealed_with_gas', 'district'],
+  dicts: ['sys_yes_no', 'tapping_operation', 'bury_the_wrench_hole', 'aerial_wrench_hole', 'shutdown_operation', 'pe_plugging', 'the_steel_pipe_sealed_with_gas', 'district'],
   data() {
     return {
       // 按钮loading
@@ -360,6 +396,7 @@ export default {
         modeOperation: undefined,
         enginName: undefined,
         locations: undefined,
+        isDone: undefined,
       },
       // 表单参数
       form: {},
@@ -380,6 +417,9 @@ export default {
         locations: [
           {required: true, message: "工程地点不能为空", trigger: "blur"}
         ],
+        isDone: [
+          {required: true, message: "完工状态不能为空", trigger: "blur"}
+        ],
       }
     };
   },
@@ -387,6 +427,17 @@ export default {
     this.getList();
   },
   methods: {
+    // 完工状态修改
+    handleStatusChange(row) {
+      let text = row.isDone === "Y" ? "完工" : "非完工";
+      this.$modal.confirm('确认要修改工程为"' + text + '"状态吗?').then(function() {
+        return updateTouchOperationEngineering(row);
+      }).then(() => {
+        this.$modal.msgSuccess("设置工程" + text + "状态成功!");
+      }).catch(function() {
+        row.isDone = row.isDone === "N" ? "Y" : "N";
+      });
+    },
     downloadZip(name) {
       this.$download.zip(`/zdsz/engineeringPipeJacking/downloadZip/${'碰口工程'}/${name}`, name);
     },
@@ -536,6 +587,7 @@ export default {
         modeOperation: undefined,
         enginName: undefined,
         locations: undefined,
+        isDone: undefined,
         remark: undefined,
         delFlag: undefined,
         createBy: undefined,
@@ -565,6 +617,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.form.isDone = "N";
       this.open = true;
       this.title = "添加碰口作业";
     },