ソースを参照

Merge branch 'master' into 'test'

# Conflicts:
#   src/components/deptTreeOnly.vue
韩兵 3 年 前
コミット
3fc1a9a4b4
36 ファイル変更12283 行追加3757 行削除
  1. 2 0
      .env.development
  2. 2 0
      .env.production
  3. BIN
      dist.zip
  4. 1 1
      package.json
  5. 2 2
      public/index.html
  6. 154 135
      src/components/deptTreeOnly.vue
  7. 1 1
      src/components/myMessage.vue
  8. 27 5
      src/components/upload.vue
  9. 37 0
      src/pages/main/advertising/acceptanceSituation.vue
  10. 123 6
      src/pages/main/advertising/businessHall.vue
  11. 272 0
      src/pages/main/busitime/busiTime.vue
  12. 371 0
      src/pages/main/busitime/busiTimeout.vue
  13. 517 500
      src/pages/main/competitor/addCompetitor.vue
  14. 754 0
      src/pages/main/competitor/addCompetitorNew.vue
  15. 793 0
      src/pages/main/competitor/changeCompetNew.vue
  16. 410 0
      src/pages/main/competitor/competitorInfoNew.vue
  17. 1234 499
      src/pages/main/competitor/index.vue
  18. 21 16
      src/pages/main/cooOperation/index.vue
  19. 1964 1018
      src/pages/main/demandDevelop/index.vue
  20. 321 261
      src/pages/main/demandDevelop/ywStanding.vue
  21. 1165 0
      src/pages/main/file/flieList.vue
  22. 26 0
      src/pages/main/funcInit/manageLnit.vue
  23. 502 0
      src/pages/main/gridDivision/approvalExamination.vue
  24. 809 0
      src/pages/main/gridDivision/workersList.vue
  25. 177 0
      src/pages/main/performance/components/deptTreeOnly.vue
  26. 75 79
      src/pages/main/performance/components/form.vue
  27. 999 449
      src/pages/main/performance/components/sheet.vue
  28. 224 149
      src/pages/main/performance/components/table.vue
  29. 644 219
      src/pages/main/performance/department.vue
  30. 4 4
      src/pages/main/performance/index.vue
  31. 2 0
      src/pages/main/performance/issue.vue
  32. 318 250
      src/pages/main/performance/mould.vue
  33. 209 135
      src/pages/main/performance/reply.vue
  34. 2 0
      src/plugins/element-ui.js
  35. 59 3
      src/router/index.js
  36. 62 25
      vue.config.js

+ 2 - 0
.env.development

@@ -0,0 +1,2 @@
+VUE_APP_FILE_API = http://192.168.1.9:9114
+VUE_APP_GRID_API = http://192.168.1.19:9114

+ 2 - 0
.env.production

@@ -0,0 +1,2 @@
+VUE_APP_FILE_API =
+VUE_APP_GRID_API =

BIN
dist.zip


+ 1 - 1
package.json

@@ -25,6 +25,7 @@
     "luckyexcel": "^1.0.1",
     "moment": "^2.29.1",
     "qs": "^6.9.1",
+    "sass": "^1.46.0",
     "tinymce": "^5.7.1",
     "vue": "^2.6.11",
     "vue-axios": "^2.1.5",
@@ -44,7 +45,6 @@
     "compression-webpack-plugin": "^3.0.1",
     "eslint": "^5.16.0",
     "eslint-plugin-vue": "^5.0.0",
-    "node-sass": "^4.14.1",
     "sass-loader": "^8.0.0",
     "script-loader": "^0.7.2",
     "vue-template-compiler": "^2.6.11",

+ 2 - 2
public/index.html

@@ -6,7 +6,7 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
   <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-  <title>业务服务工作台</title>
+  <title>市场经营管理平台</title>
   <script src="static/js/crypoto-js.js"></script>
 
   <script src="/static/js/luckysheet/plugins/js/plugin.js"></script>
@@ -25,7 +25,7 @@
   <div id="app"></div>
   <!-- built files will be auto injected -->
   <script type="text/javascript">
-    window.staticHost = 'http://10.230.26.15:8000/spfm'; // 正式
+    window.staticHost = 'http://10.230.26.15:8000/mkt'; // 正式
     // window.staticHost = 'http://10.149.85.90:8000/spfm'; // 测试
     // window.staticHost = 'http://192.168.0.103:9600/';
     // window.staticHost = 'http://192.168.2.142:9600/';

+ 154 - 135
src/components/deptTreeOnly.vue

@@ -1,147 +1,166 @@
 <template>
-    <div class="treebox" v-loading="loading">
-        <el-input
-        placeholder="输入关键字进行过滤"
-        v-model="filterText">
-        </el-input>
-        <el-tree :highlight-current="true" :check-strictly="true" ref="tree" :data="treeList" node-key="o"
-            :default-checked-keys="defaultListc" :default-expanded-keys="defaultListc" @node-click="handleNodeClick" :filter-node-method="filterNode">
-
-            <span class="custom-tree-node" slot-scope="{ node, data }">
-                <em style="display: inline-block;width: 20px;" v-if="node.data.haveUserFlag == 'N'&& node.data.children.length == 0"></em>
-                <i class="el-icon-caret-right" v-if="node.data.haveUserFlag == 'Y' && node.data.children.length == 0"></i>
-                <el-checkbox @change="handleCheckChange(node)" style="margin-right: 10px;" v-model="node.checked" v-if="node.data.type == 1"></el-checkbox>
-                <span>{{ node.label }}</span>
-            </span>
-
-        </el-tree>
-    </div>
+  <div class="treebox" v-loading="loading">
+    <el-input placeholder="输入关键字进行过滤" v-model="filterText"> </el-input>
+    <el-tree
+      :highlight-current="true"
+      :check-strictly="true"
+      ref="tree"
+      :data="treeList"
+      node-key="o"
+      :default-checked-keys="defaultListc"
+      :default-expanded-keys="defaultListc"
+      @node-click="handleNodeClick"
+      :filter-node-method="filterNode"
+    >
+      <span class="custom-tree-node" slot-scope="{ node, data }">
+        <em
+          style="display: inline-block; width: 20px"
+          v-if="node.data.haveUserFlag == 'N' && node.data.children.length == 0"
+        ></em>
+        <i
+          class="el-icon-caret-right"
+          v-if="node.data.haveUserFlag == 'Y' && node.data.children.length == 0"
+        ></i>
+        <el-checkbox
+          @change="handleCheckChange(node)"
+          style="margin-right: 10px"
+          v-model="node.checked"
+          v-if="node.data.type == 1"
+        ></el-checkbox>
+        <span>{{ node.label }}</span>
+      </span>
+    </el-tree>
+  </div>
 </template>
 
 <script>
-    export default {
-        props: ["defaultList", "type","closeList"],
-        data() {
-            return {
-                treeList: [],
-                opt: [],
-                defaultProps: {
-                    children: 'children',
-                    label: 'label'
-                },
-                defaultListc: [],
-                loading:false,
-                filterText: '',
-            };
+export default {
+  props: ["defaultList", "type", "closeList"],
+  data() {
+    return {
+      filterText: "",
+      treeList: [],
+      opt: [],
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      defaultListc: [],
+      loading: false,
+    };
+  },
+  methods: {
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    getTree(v) {
+      this.loading = true;
+      this.$http({
+        url: "/sysmgr/csysdept/queryAllList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
         },
-        methods: {
-            filterNode(value, data) {
-                if (!value) return true;
-                return data.label.indexOf(value) !== -1;
-            },
-            getTree(v) {
-                this.loading = true;
-                this.$http({
-                    url: "/sysmgr/csysdept/queryAllList",
-                    method: "post",
-                    headers: {
-                        "Content-Type": "application/json",
-                    },
-                    data: {
-                        parentorgid: v
-                    },
-                }).then((res) => {
-                    this.treeList = res.data;
-                    this.loading = false;
-                });
-            },
-            handleNodeClick(v) {
-                let s = false;
-                if(v.children && v.children.length == 0){
-                    s = true;
-                }
-                if (v.type) {
-                    return
-                }
-                if (v.children && v.children.length > 0 && v.children[v.children.length - 1].type == 1) {
-                    return
-                }
-                console.log(v)
-                this.$http({
-                    url: "/sysmgr/sysuserinfo/queryList",
-                    method: "post",
-                    headers: {
-                        "Content-Type": "application/json",
-                    },
-                    data: {
-                        groupId: v.o
-                    },
-                }).then((res) => {
-                    v.children = v.children?v.children:[];
-                    res.data.forEach(item=>{
-                        v.children.push({
-                            id:item.groupId,
-                            label:item.loginNameStr,
-                            type:1,
-                            displayname:v.displayname,
-                            loginNoStr:item.loginNoStr,
-                            o:item.id,
-                        });
-                    })
-                });
-                for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
-                    if(s && v.o == this.$refs.tree.store._getAllNodes()[i].data.o){
-                        this.$refs.tree.store._getAllNodes()[i].expanded = true;
-                    }
-                }
-            },
-            handleCheckChange(v){
-                console.log(v)
-                let opt = {
-                    leaderAuditNo:v.data.loginNoStr,
-                    leaderAuditName:v.data.label,
-                    displayname:v.data.displayname,
-                    groupId:v.data.o
-                }
-                this.$emit("treeCheck", opt);
-                for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
-                    if(v.data.o == this.$refs.tree.store._getAllNodes()[i].data.o){
-                        this.$refs.tree.store._getAllNodes()[i].checked = true;
-                    }else{
-                        this.$refs.tree.store._getAllNodes()[i].checked = false;
-                    }
-                }
-                this.$forceUpdate()
-            }
+        data: {
+          parentorgid: v,
         },
-        created() {
-            this.getTree();
-            this.defaultListc = this.defaultList;
+      }).then((res) => {
+        this.treeList = res.data;
+        this.loading = false;
+      });
+    },
+    handleNodeClick(v) {
+      let s = false;
+      if (v.children && v.children.length == 0) {
+        s = true;
+      }
+      if (v.type) {
+        return;
+      }
+      if (
+        v.children &&
+        v.children.length > 0 &&
+        v.children[v.children.length - 1].type == 1
+      ) {
+        return;
+      }
+      console.log(v);
+      this.$http({
+        url: "/sysmgr/sysuserinfo/queryList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
         },
-        watch: {
-            filterText(val) {
-                this.$refs.tree.filter(val);
-            },
-            type() {
-                this.defaultListc = this.defaultList;
-                this.$forceUpdate()
-            },
-            defaultList() {
-                this.$forceUpdate()
-            },
-            closeList() {
-                this.$refs.tree.setCheckedNodes([]);
-            },
+        data: {
+          groupId: v.o,
+        },
+      }).then((res) => {
+        v.children = v.children ? v.children : [];
+        res.data.forEach((item) => {
+          v.children.push({
+            id: item.groupId,
+            label: item.loginNameStr,
+            type: 1,
+            displayname: v.displayname,
+            loginNoStr: item.loginNoStr,
+            o: item.id,
+          });
+        });
+      });
+      for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
+        if (s && v.o == this.$refs.tree.store._getAllNodes()[i].data.o) {
+          this.$refs.tree.store._getAllNodes()[i].expanded = true;
         }
-    };
+      }
+    },
+    handleCheckChange(v) {
+      console.log(v);
+      let opt = {
+        leaderAuditNo: v.data.loginNoStr,
+        leaderAuditName: v.data.label,
+        displayname: v.data.displayname,
+        groupId: v.data.o,
+      };
+      this.$emit("treeCheck", opt);
+      for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
+        if (v.data.o == this.$refs.tree.store._getAllNodes()[i].data.o) {
+          this.$refs.tree.store._getAllNodes()[i].checked = true;
+        } else {
+          this.$refs.tree.store._getAllNodes()[i].checked = false;
+        }
+      }
+      this.$forceUpdate();
+    },
+  },
+  created() {
+    this.getTree();
+    this.defaultListc = this.defaultList;
+  },
+  watch: {
+    type() {
+      this.defaultListc = this.defaultList;
+      this.$forceUpdate();
+    },
+    defaultList() {
+      this.$forceUpdate();
+    },
+    closeList() {
+      this.$refs.tree.setCheckedNodes([]);
+    },
+    filterText(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+};
 </script>
 
 <style scoped lang="scss">
-    .el-icon-caret-right{
-        color: #ccc;
-        margin:0 5px;
-    }
-    .treebox {
-        border: 1px solid #ddd;
-    }
+.el-icon-caret-right {
+  color: #ccc;
+  margin: 0 5px;
+}
+.treebox {
+  border: 1px solid #ddd;
+}
 </style>

+ 1 - 1
src/components/myMessage.vue

@@ -17,7 +17,7 @@
 
 <script>
     export default {
-        props: ["centerDialogVisible","messTit"],
+        props: ["centerDialogVisible","messTit",'type'],
         data() {
             return {
 

+ 27 - 5
src/components/upload.vue

@@ -16,7 +16,7 @@
 </template>
 <script>
     export default {
-        props: ['fileInfo', 'fileList'],
+        props: ['fileInfo', 'fileList','type'],
         data() {
             return {
                 fileLists: [],
@@ -121,10 +121,32 @@
                     if (this.fileInfo.type === 'btn') {
                         this.$refs['upload'].clearFiles();
                         this.$emit('uploadBack',res)
-                        _this.$message({
-                            message: res.data.desc,
-                            type: 'success'
-                        });
+                        if(res.data.result==0){
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'success'
+                            });
+                        }else if(res.data.result==1){
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'error'
+                            });
+                        }else if(res.data.result==2){
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'warning'
+                            });
+                        }else if(res.data.result==3){
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'info'
+                            });
+                        }else{
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'success'
+                            });
+                        }
                         this.num--;
                         if (this.num == 0) {
                             this.loading = false;

+ 37 - 0
src/pages/main/advertising/acceptanceSituation.vue

@@ -2,6 +2,8 @@
     <fullscreen :fullscreen.sync="fullscreen" class="container">
         <div class="container-box">
             <div class="section2">
+                <el-button class="btn-check" size="medium" type="primary" @click="outlist" style="width: 100px;margin-right: 20px;margin-bottom: 20px;">导出
+                </el-button>
                 <el-button
                     type="primary"
                     @click="dialogApplication(1)"
@@ -537,7 +539,42 @@ export default {
         },
         getUser() {
             this.userInfo = JSON.parse(window.sessionStorage.userInfo);
+        },
+        outlist() {
+
+            let data = this.params;
+            console.log(data);
+            // return
+            this.$http({
+                url: "/market/advSubtask/excelExport",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                responseType: "blob",
+                data: data,
+            }).then((response) => {
+                if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                    let blob = new Blob([response.data], {
+                        type: 'application/vnd.ms-excel'
+                    })
+                    window.navigator.msSaveOrOpenBlob(blob,
+                        new Date().getTime() + '.xlsx')
+                } else {
+                    /* 火狐谷歌的文件下载方式 */
+                    var blob = new Blob([response.data])
+                    var downloadElement = document.createElement('a')
+                    var href = window.URL.createObjectURL(blob)
+                    downloadElement.href = href
+                    downloadElement.download = new Date().getTime() + '.xlsx'
+                    document.body.appendChild(downloadElement)
+                    downloadElement.click()
+                    document.body.removeChild(downloadElement)
+                    window.URL.revokeObjectURL(href)
+                }
+            });
         }
+    
     },
     mounted() {
         //地址栏不带参

+ 123 - 6
src/pages/main/advertising/businessHall.vue

@@ -2,6 +2,24 @@
     <fullscreen :fullscreen.sync="fullscreen" class="container">
         <div class="container-box">
             <toolList @iconCli="iconCli" :tooltit="tooltit"></toolList>
+            <div class="search" style="justify-content: flex-start;">
+                <el-button class="btn-check" size="medium" type="primary" @click="outlist">导出
+                </el-button>
+                <el-button class="btn-check" size="medium" type="primary" @click="exportTempletelist">下载导入模板
+                </el-button>
+                <myUpload style="display:inline-block;" :fileInfo="fileInfot"
+                        :fileList="fileInfot.fileList" @uploadBack='uploadBack'></myUpload>
+                <el-button
+                    class="btn-check"
+                    size="medium"
+                    type="primary"
+                    @click="dialogCheck(3)"
+                    v-if="
+                        userInfo.countyName != null || userInfo.cityName != null
+                    "
+                    >添加
+                </el-button>
+            </div>
             <div class="search">
                 <mySearch
                     :searchList="searchList"
@@ -433,12 +451,14 @@
 import mySearch from "../../../components/search.vue";
 import myMessage from "../../../components/myMessage.vue";
 import toolList from "../../../components/toolList";
+import myUpload from "../../../components/upload.vue";
 
 export default {
     components: {
         mySearch,
         myMessage,
-        toolList
+        toolList,
+        myUpload
     },
     data() {
         //地市名称
@@ -649,25 +669,37 @@ export default {
                     type: "input",
                     tit: "地市名称",
                     value: "",
-                    width: "24%"
+                    width: "16%"
                 },
                 {
                     type: "input",
                     tit: "区县名称",
                     value: "",
-                    width: "24%"
+                    width: "16%"
                 },
                 {
                     type: "input",
                     tit: "渠道名称",
                     value: "",
-                    width: "24%"
+                    width: "16%"
                 },
                 {
                     type: "input",
                     tit: "场景",
                     value: "",
-                    width: "24%"
+                    width: "16%"
+                },
+                {
+                    type: "input",
+                    tit: "物料类别",
+                    value: "",
+                    width: "16%"
+                },
+                {
+                    type: "input",
+                    tit: "物料名称",
+                    value: "",
+                    width: "16%"
                 }
             ],
             tooltit: "物料基础信息维护",
@@ -794,7 +826,16 @@ export default {
             metirialTypeopt: [],
             materialNameopt: [],
             metirialInfoSingle: [],
-            quantityDisabled: true
+            quantityDisabled: true,
+            fileInfot: {
+                    type: 'btn',
+                    typename: '导入',
+                    btntype: 'primary',
+                    limit: 1,
+                    url: '/market/cadvBusiMetirial/import',
+                    fileList: [],
+                    woNo: "",
+                },
         };
     },
     computed: {
@@ -902,6 +943,9 @@ export default {
             v[1] ? (this.params.countyName = v[1]) : "";
             v[2] ? (this.params.channelName = v[2]) : "";
             v[3] ? (this.params.sceneName = v[3]) : "";
+            //新增物料类别和物料名称模糊查询
+            v[4] ? (this.params.metirialType = v[4]) : "";
+            v[5] ? (this.params.metirialName = v[5]) : "";
             this.getList(this.params, this.pageSize);
         },
         //获取列表
@@ -1083,7 +1127,14 @@ export default {
         },
         //文件返回值
         uploadBack(v) {
+            let that = this;
             console.log(v);
+            if(v.data.result==0){
+                that.getList({}, 1);
+                that.getUser();
+                that.getMetirialType();
+                that.getMetirialInfo();
+            }
         },
         //功能栏
         iconCli(v) {
@@ -1204,6 +1255,72 @@ export default {
             }).then(res => {
                 this.materialNameopt = res.data;
             });
+        },
+        outlist() {
+            let data = this.params;
+            console.log(data);
+            // return
+            this.$http({
+                url: "/market/cadvBusiMetirial/excelExportBase",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                responseType: "blob",
+                data: data,
+            }).then((response) => {
+                if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                    let blob = new Blob([response.data], {
+                        type: 'application/vnd.ms-excel'
+                    })
+                    window.navigator.msSaveOrOpenBlob(blob,
+                        new Date().getTime() + '.xlsx')
+                } else {
+                    /* 火狐谷歌的文件下载方式 */
+                    var blob = new Blob([response.data])
+                    var downloadElement = document.createElement('a')
+                    var href = window.URL.createObjectURL(blob)
+                    downloadElement.href = href
+                    downloadElement.download = new Date().getTime() + '.xlsx'
+                    document.body.appendChild(downloadElement)
+                    downloadElement.click()
+                    document.body.removeChild(downloadElement)
+                    window.URL.revokeObjectURL(href)
+                }
+            });
+        },
+        exportTempletelist() {
+            let data = this.params;
+            console.log(data);
+            // return
+            this.$http({
+                url: "/market/cadvBusiMetirial/excelExportTemplete",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                responseType: "blob",
+                data: data,
+            }).then((response) => {
+                if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                    let blob = new Blob([response.data], {
+                        type: 'application/vnd.ms-excel'
+                    })
+                    window.navigator.msSaveOrOpenBlob(blob,
+                        new Date().getTime() + '.xlsx')
+                } else {
+                    /* 火狐谷歌的文件下载方式 */
+                    var blob = new Blob([response.data])
+                    var downloadElement = document.createElement('a')
+                    var href = window.URL.createObjectURL(blob)
+                    downloadElement.href = href
+                    downloadElement.download = new Date().getTime() + '.xlsx'
+                    document.body.appendChild(downloadElement)
+                    downloadElement.click()
+                    document.body.removeChild(downloadElement)
+                    window.URL.revokeObjectURL(href)
+                }
+            });
         }
     },
     mounted() {

+ 272 - 0
src/pages/main/busitime/busiTime.vue

@@ -0,0 +1,272 @@
+<template>
+    <div class="container">
+        <fullscreen :fullscreen.sync="fullscreen" class="container-box">
+            <div class="titbox">
+                <h2>业务时长查询</h2>
+                <div>
+                    <i class="el-icon-download" @click="iconCli(3)"></i>
+                    <i class="el-icon-refresh" @click="iconCli(1)"></i>
+                    <i class="el-icon-full-screen" @click="iconCli(2)"></i>
+                </div>
+            </div>
+            <div class="search">
+                <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
+            </div>
+            <div class="tabbox">
+
+                    <el-table height="100%" v-loading="loading" class="com-table" ref="multipleTable"
+                              :data="tableData" tooltip-effect="dark" size="small" border style="width: 100%">
+                    <el-table-column prop="region" fixed label="地市"> </el-table-column>
+                    <el-table-column align="center" label="业务办理平均时长(秒)-自有渠道">
+                        <el-table-column prop="zyYxhdbl" label="营销活动办理" width="100px"></el-table-column>
+                        <el-table-column prop="zyZfbg" label="资费变更"></el-table-column>
+                        <el-table-column prop="zyPtjf" label="普通缴费"></el-table-column>
+                        <el-table-column prop="zyKh" label="开户"></el-table-column>
+                        <el-table-column prop="zyBk" label="补卡"></el-table-column>
+                        <el-table-column prop="zyYxhdqx" label="营销活动取消" width="100px"></el-table-column>
+                        <el-table-column prop="zyZnzwjz" label="智能组网加装业务受理" width="150px"></el-table-column>
+                        <el-table-column prop="zyXhzwkh" label="携号转网开户" width="100px"></el-table-column>
+                        <el-table-column prop="zyJtcygl" label="家庭成员管理" width="100px"></el-table-column>
+                        <el-table-column prop="zyGh" label="过户"></el-table-column>
+                        <el-table-column prop="zyYhmmgq" label="用户密码修改" width="100px"></el-table-column>
+                        <el-table-column prop="zyXh" label="销户"></el-table-column>
+                        <el-table-column prop="zyLlgx" label="流量共享业务" width="100px"></el-table-column>
+                        <el-table-column prop="zyRhkd" label="融合宽带业务" width="100px"></el-table-column>
+                    </el-table-column>
+                    <el-table-column align="center" label="业务办理平均时长(秒)-社会渠道">
+                        <el-table-column prop="shYxhdbl" label="营销活动办理" width="100px"></el-table-column>
+                        <el-table-column prop="shZfbg" label="资费变更"></el-table-column>
+                        <el-table-column prop="shPtjf" label="普通缴费"></el-table-column>
+                        <el-table-column prop="shKh" label="开户"></el-table-column>
+                        <el-table-column prop="shBk" label="补卡"></el-table-column>
+                        <el-table-column prop="shYxhdqx" label="营销活动取消" width="100px"></el-table-column>
+                        <el-table-column prop="shZnzwjz" label="智能组网加装业务受理" width="150px"></el-table-column>
+                        <el-table-column prop="shXhzwkh" label="携号转网开户" width="100px"></el-table-column>
+                        <el-table-column prop="shJtcygl" label="家庭成员管理" width="100px"></el-table-column>
+                        <el-table-column prop="shGh" label="过户"></el-table-column>
+                        <el-table-column prop="shYhmmgq" label="用户密码修改" width="100px"></el-table-column>
+                        <el-table-column prop="shXh" label="销户"></el-table-column>
+                        <el-table-column prop="shLlgx" label="流量共享业务" width="100px"></el-table-column>
+                        <el-table-column prop="shRhkd" label="融合宽带业务" width="100px"></el-table-column>
+                    </el-table-column>
+                </el-table>
+
+            </div>
+        </fullscreen>
+    </div>
+</template>
+
+
+
+<script>
+import mySearch from "../../../components/search";
+export default {
+  components: {
+    mySearch,
+  },
+  data() {
+    return {
+      loading: false,
+      subBtn: true,
+      fullscreen: false,
+      total: 0,
+      pageSize: 1,
+      tableData: [],
+      totalData: [],
+      totalSums: [],
+      params: {},
+        tooltit: "业务时长查询",
+        searchList: [
+          {
+              type: 'date',
+              tit: '数据时间',
+              value: new Date(new Date()-24*60*60*1000),
+              width: '100%',
+          }
+        ],
+    };
+  },
+  methods: {
+
+
+
+    //获取列表
+    getList(v, n) {
+      this.loading = true;
+      this.$http({
+        url: "/market/cMkBusiTime/queryList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json"
+        },
+        data: this.params,
+      }).then((res) => {
+        this.loading = false;
+        this.tableData = res.data;
+      });
+    },
+      //搜索数据
+      searchInfo(v) {
+          this.params = {};
+          if(v[0]){
+              var date = new Date(v[0]);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+              var Y = date.getFullYear();
+              var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1);
+              var D = (date.getDate()+1 < 10 ? '0'+(date.getDate()) : date.getDate())
+              this.params.opTime = Y+M+D;
+          }else{
+              this.$message({
+                  message: '必须选择数据日期',
+                  type: 'warning'
+              });
+              return;
+          }
+          this.getList(this.params, this.pageSize);
+      },
+
+    addRowId({row, rowIndex}){
+        row.id = rowIndex+1;
+    },
+
+    iconCli(v) {
+      if (v === 1) {
+          this.getList(this.params, this.pageSize);
+      }
+      if (v === 2) {
+          this.fullscreen = !this.fullscreen;
+      }
+      if(v === 3){
+          // this.exportExcel();
+          this.expData();
+      }
+    },
+      expData() {
+          let exdata = [];
+          this.$http({
+              url: "/market/cMkBusiTime/queryList",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+              data: this.params,
+          }).then((res) => {
+              exdata = res.data;
+              var that = this;
+              require.ensure([], () => {
+                  const { export_json_to_excel } = require("../vendor/Export2Excel");
+                  const tHeader = [
+                      "地市",
+                      "自有-营销活动办理",
+                      "自有-资费变更",
+                      "自有-普通缴费",
+                      "自有-开户",
+                      "自有-补卡",
+                      "自有-营销活动取消",
+                      "自有-智能组网加装业务受理",
+                      "自有-携号转网开户",
+                      "自有-家庭成员管理",
+                      "自有-过户",
+                      "自有-用户密码修改",
+                      "自有-销户",
+                      "自有-流量共享业务",
+                      "自有-融合宽带业务",
+
+                      "社会-营销活动办理",
+                      "社会-资费变更",
+                      "社会-普通缴费",
+                      "社会-开户",
+                      "社会-补卡",
+                      "社会-营销活动取消",
+                      "社会-智能组网加装业务受理",
+                      "社会-携号转网开户",
+                      "社会-家庭成员管理",
+                      "社会-过户",
+                      "社会-用户密码修改",
+                      "社会-销户",
+                      "社会-流量共享业务",
+                      "社会-融合宽带业务",
+                  ]; // 导出的表头名
+                  const filterVal = [
+                      "region",
+                      "zyYxhdbl",
+                      "zyZfbg",
+                      "zyPtjf",
+                      "zyKh",
+                      "zyBk",
+                      "zyYxhdqx",
+                      "zyZnzwjz",
+                      "zyXhzwkh",
+                      "zyJtcygl",
+                      "zyGh",
+                      "zyYhmmgq",
+                      "zyXh",
+                      "zyLlgx",
+                      "zyRhkd",
+
+                      "shYxhdbl",
+                      "shZfbg",
+                      "shPtjf",
+                      "shKh",
+                      "shBk",
+                      "shYxhdqx",
+                      "shZnzwjz",
+                      "shXhzwkh",
+                      "shJtcygl",
+                      "shGh",
+                      "shYhmmgq",
+                      "shXh",
+                      "shLlgx",
+                      "shRhkd",
+                  ]; // 导出的表头字段名
+
+                  let list = exdata;
+
+                  const data = that.formatJson(filterVal, list);
+                  export_json_to_excel(tHeader, data, `report`); // 导出的表格名称,根据需要自己命名
+              });
+          });
+      },
+      formatJson(filterVal, jsonData) {
+          return jsonData.map((v) => filterVal.map((j) => v[j]));
+      },
+  },
+  created() {
+      var date = new Date(this.searchList[0].value);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+      var Y = date.getFullYear() ;
+      var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1);
+      var D = (date.getDate()+1 < 10 ? '0'+(date.getDate()) : date.getDate())
+      this.params={opTime:Y+M+D}
+      this.getList(this.params, this.pageSize);
+  },
+};
+</script>
+
+
+
+<style>
+.el-input__suffix {
+    cursor: pointer;
+}
+</style>
+<style scoped lang="scss">
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.tabbox {
+    margin-top: 15px;
+}
+
+.pageBox {
+    text-align: right;
+    margin-top: 10px;
+}
+</style>

+ 371 - 0
src/pages/main/busitime/busiTimeout.vue

@@ -0,0 +1,371 @@
+<template>
+    <div class="container">
+        <fullscreen :fullscreen.sync="fullscreen" class="container-box">
+            <div class="titbox">
+                <h2>异常数据监控</h2>
+                <div>
+                    <i class="el-icon-download" @click="iconCli(3)"></i>
+                    <i class="el-icon-refresh" @click="iconCli(1)"></i>
+                    <i class="el-icon-full-screen" @click="iconCli(2)"></i>
+                    <!--                    <i class="el-icon-folder-opened"></i>-->
+                    <!--                    <i class="el-icon-view"></i>-->
+                    <!--                    <i class="el-icon-more"></i>-->
+                </div>
+            </div>
+            <div class="search">
+                <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
+            </div>
+            <div class="tabbox">
+                <el-table height="100%" v-loading="loading" class="com-table" ref="multipleTable"
+                          :data="tableData" tooltip-effect="dark" size="small" border style="width: 100%">
+                    <el-table-column prop="region" label="地市"> </el-table-column>
+                    <el-table-column prop="channelType" label="渠道类型"></el-table-column>
+                    <el-table-column prop="opName" label="业务类型"></el-table-column>
+                    <el-table-column prop="normalTime" label="标准用时(秒)"></el-table-column>
+                    <el-table-column prop="busiTimeoutTime" label="异常业务平均用时(秒)" width="160px"></el-table-column>
+                    <el-table-column prop="busiTimeoutPercentage" label="异常用时超出比例" width="140px"></el-table-column>
+                    <el-table-column prop="busiTotal" label="总业务笔数"></el-table-column>
+                    <el-table-column prop="timeoutTotal" label="超时业务笔数"></el-table-column>
+                    <el-table-column prop="timeoutPercentage" label="超时业务量占比"></el-table-column>
+                    <el-table-column label="操作" width="220px" align="center">
+                        <template slot-scope="scope">
+                            <el-button :disabled="scope.row.region == '全省'" size="mini" type="primary" @click="dialogCheck(scope.row)">查看超时业务详情</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+
+            </div>
+        </fullscreen>
+        <el-dialog title="异常数据监控(超时业务笔数达到或超过10%)" :visible.sync="dialogStatus" width="50%" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="true" >
+            <div>
+                <el-table
+                    height="400px"
+                    v-loading="loadingDialog"
+                    class="com-table"
+                    ref="multipleTable"
+                    :data="tableDataDialog"
+                    tooltip-effect="dark"
+                    size="small"
+                    style="width: 100%"
+                    :row-class-name="addRowId"
+                    id="rptTable"
+                    
+                >
+                    <el-table-column prop="region" fixed label="地市"> </el-table-column>
+                    <el-table-column prop="channelType" label="渠道类型"></el-table-column>
+                    <el-table-column prop="opName" label="业务类型" width="180px"></el-table-column>
+                    <el-table-column prop="shop" label="网点" width="200px"></el-table-column>
+                    <el-table-column prop="channelCode" label="渠道编码"></el-table-column>
+                    <!-- <el-table-column prop="busiType" label="业务类型"></el-table-column> -->
+                    <el-table-column prop="normalTime" label="标准用时"></el-table-column>
+                    <el-table-column prop="timeoutTotal" label="超时业务笔数" width="120px"></el-table-column>
+                    <el-table-column prop="aveTime" label="平均实际用时" width="120px"></el-table-column>
+                    <el-table-column prop="timeoutFlag" label="是否超时"></el-table-column>
+                </el-table>
+                <div slot="footer" class="dialog-footer myfooter">
+                    <el-button @click="dialogExpData()">导出数据</el-button>
+                </div>
+            </div>
+        </el-dialog>
+
+    </div>
+</template>
+
+<script>
+import mySearch from "../../../components/search";
+import {export_json_to_excel} from "../vendor/Export2Excel";
+export default {
+  components: {
+    mySearch
+  },
+  data() {
+    return {
+      loading: false,
+      subBtn: true,
+      fullscreen: false,
+      total: 0,
+      pageSize: 1,
+      tableData: [],
+      totalData: [],
+      totalSums: [],
+      params: {},
+        dialogParams:{},
+      tooltit: "异常数据监控(超时业务笔数达到或超过10%)",
+      searchList: [{
+          type: 'sel',
+          tit: '地市',
+          value: '-',
+          width: '32%',
+          options: [{dataName:'全部',dataCode:'-'},
+              {dataName:'哈尔滨',dataCode:'哈尔滨'},
+              {dataName:'齐齐哈尔',dataCode:'齐齐哈尔'},
+              {dataName:'牡丹江',dataCode:'牡丹江'},
+              {dataName:'佳木斯',dataCode:'佳木斯'},
+              {dataName:'大庆',dataCode:'大庆'},
+              {dataName:'鸡西',dataCode:'鸡西'},
+              {dataName:'双鸭山',dataCode:'双鸭山'},
+              {dataName:'伊春',dataCode:'伊春'},
+              {dataName:'七台河',dataCode:'七台河'},
+              {dataName:'鹤岗',dataCode:'鹤岗'},
+              {dataName:'黑河',dataCode:'黑河'},
+              {dataName:'绥化',dataCode:'绥化'},
+              {dataName:'大兴安岭',dataCode:'大兴安岭'}],
+      },{
+          type: 'sel',
+          tit: '渠道类型',
+          value: '自有渠道',
+          width: '32%',
+          options: [{dataName:'自有渠道',dataCode:'自有渠道'},
+              {dataName:'社会渠道',dataCode:'社会渠道'}]
+      },{
+          type: 'sel',
+          tit: '业务类型',
+          value: '-',
+          width: '32%',
+          options: [{dataName:'全部',dataCode:'-'},
+                    {dataName:'营销活动办理',dataCode:'营销活动办理'},
+                    {dataName:'资费变更',dataCode:'资费变更'},
+                    {dataName:'普通缴费',dataCode:'普通缴费'},
+                    {dataName:'开户',dataCode:'开户'},
+                    {dataName:'补卡',dataCode:'补卡'},
+                    {dataName:'营销活动取消',dataCode:'营销活动取消'},
+                    {dataName:'智能组网加装业务受理',dataCode:'智能组网加装业务受理'},
+                    {dataName:'携号转网开户',dataCode:'携号转网开户'},
+                    {dataName:'家庭成员管理',dataCode:'家庭成员管理'},
+                    {dataName:'过户',dataCode:'过户'},
+                    {dataName:'用户密码修改',dataCode:'用户密码修改'},
+                    {dataName:'销户',dataCode:'销户'},
+                    {dataName:'流量共享业务',dataCode:'流量共享业务'},
+                    {dataName:'融合宽带业务',dataCode:'融合宽带业务'}]
+      },
+          {
+              type: 'date',
+              tit: '数据时间',
+              value: new Date(new Date()-24*60*60*1000),
+              width: '32%',
+          }
+        ],
+        dialogStatus: false,
+        loadingDialog: false,
+        totalDialog: 0,
+        pageSizeDialog: 1,
+        tableDataDialog: [],
+    };
+  },
+  methods: {
+
+    //获取列表
+    getList(v, n) {
+      this.loading = true;
+      this.params.orderByClause = '(case when region=\'全省\' THEN 1 else 2 END)';
+      this.$http({
+        url: "/market/mkBusiTimeout/queryList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json"
+        },
+        data: this.params,
+      }).then((res) => {
+          console.log(res.data);
+        this.loading = false;
+        this.tableData = res.data;
+      });
+    },
+      dialogCheck(row){
+          this.dialogParams = {};
+          this.loadingDialog = true;
+        this.dialogStatus=true;
+          this.dialogParams = {channelType:row.channelType,region:row.region,opTime:row.opTime,opName:row.opName};
+          this.$http({
+              url: "/market/mkBusiTimeoutDetail/queryList",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json"
+              },
+              data: this.dialogParams,
+          }).then((res) => {
+              console.log(res.data);
+              this.loadingDialog = false;
+              this.tableDataDialog = res.data;
+          });
+      },
+    addRowId({row, rowIndex}){
+        row.id = rowIndex+1;
+    },
+      //搜索数据
+      searchInfo(v) {
+          this.params = {};
+          v[0] && v[0] !=='-' ? this.params.region = v[0] : '';
+          v[1] ? this.params.channelType = v[1] : '';
+          v[2] && v[2] !=='-' ? this.params.opName= v[2] : '';
+          if(v[3]){
+              var date = new Date(v[3]);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+              var Y = date.getFullYear() ;
+              var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1);
+              var D = (date.getDate()+1 < 10 ? '0'+(date.getDate()) : date.getDate())
+              this.params.opTime = Y+M+D;
+          }else{
+              this.$message({
+                  message: '必须选择数据日期',
+                  type: 'warning'
+              });
+              return;
+          }
+          this.getList(this.params, this.pageSize);
+      },
+
+
+    iconCli(v) {
+      if (v === 1) {
+          this.getList(this.params, this.pageSize);
+      }
+      if (v === 2) {
+          this.fullscreen = !this.fullscreen;
+      }
+      if(v === 3){
+          // this.exportExcel();
+          this.expData();
+      }
+    },
+      expData() {
+          let exdata = [];
+          this.$http({
+              url: "/market/mkBusiTimeout/queryList",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+              data: this.params,
+          }).then((res) => {
+              exdata = res.data;
+              var that = this;
+              require.ensure([], () => {
+                  const { export_json_to_excel } = require("../vendor/Export2Excel");
+                  const tHeader = [
+                      "地市",
+                      "渠道类型",
+                      "业务类型",
+                      "标准用时(秒)",
+                      "异常业务平均用时(秒)",
+                      "异常用时超出比例",
+                      "总业务笔数",
+                      "超时业务笔数",
+                      "超时业务量占比",
+                  ]; // 导出的表头名
+                  const filterVal = [
+                      "region",
+                      "channelType",
+                      "opName",
+                      "normalTime",
+                      "busiTimeoutTime",
+                      "busiTimeoutPercentage",
+                      "busiTotal",
+                      "timeoutTotal",
+                      "timeoutPercentage",
+                  ]; // 导出的表头字段名
+
+                  let list = exdata;
+
+                  const data = that.formatJson(filterVal, list);
+                  export_json_to_excel(tHeader, data, `report`); // 导出的表格名称,根据需要自己命名
+              });
+          });
+      },
+
+      dialogExpData() {
+          let exdata = [];
+          this.$http({
+              url: "/market/mkBusiTimeoutDetail/queryList",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+              data: this.dialogParams,
+          }).then((res) => {
+              exdata = res.data;
+              var that = this;
+              require.ensure([], () => {
+                  const { export_json_to_excel } = require("../vendor/Export2Excel");
+                  const tHeader = [
+                      "地市",
+                      "渠道类型",
+                      "业务类型",
+                      "网点",
+                      "渠道编码",
+                    //   "业务类型",
+                      "标准用时",
+                      "超时业务笔数",
+                      "平均实际用时",
+                      "是否超时",
+                  ]; // 导出的表头名
+                  const filterVal = [
+                      "region",
+                      "channelType",
+                      "opName",
+                      "shop",
+                      "channelCode",
+                    //   "busiType",
+                      "normalTime",
+                      "timeoutTotal",
+                      "aveTime",
+                      "timeoutFlag",
+                  ]; // 导出的表头字段名
+
+                  let list = exdata;
+
+                  const data = that.formatJson(filterVal, list);
+                  export_json_to_excel(tHeader, data, `report`); // 导出的表格名称,根据需要自己命名
+              });
+          });
+      },
+
+      formatJson(filterVal, jsonData) {
+          return jsonData.map((v) => filterVal.map((j) => v[j]));
+      },
+
+
+  },
+
+  created() {
+
+      var date = new Date(this.searchList[3].value);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+      var Y = date.getFullYear();
+      var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1);
+      var D = (date.getDate()+1 < 10 ? '0'+(date.getDate()) : date.getDate())
+      this.params={opTime:Y+M+D,channelType:this.searchList[1].value}
+      this.getList(this.params, this.pageSize);
+
+  },
+};
+</script>
+
+
+
+<style>
+.el-input__suffix {
+    cursor: pointer;
+}
+</style>
+<style scoped lang="scss">
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.tabbox {
+    margin-top: 15px;
+}
+
+.pageBox {
+    text-align: right;
+    margin-top: 10px;
+}
+</style>

ファイルの差分が大きいため隠しています
+ 517 - 500
src/pages/main/competitor/addCompetitor.vue


+ 754 - 0
src/pages/main/competitor/addCompetitorNew.vue

@@ -0,0 +1,754 @@
+<template>
+    <div>
+        <fullscreen :fullscreen.sync="fullscreen" class="container structure-l" style="margin: 0;width: calc(75% - 15px);">
+            <div class="container-box">
+                <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
+                <div class="info-form">
+                    <el-form :model="infolist" ref="infolist" :rules="rules">
+                        <div class="info-line">
+                            <el-form-item prop="violationCate">
+                                <span><i>*</i>类别</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.violationCate" placeholder="请选择类别" @change="verifcheck(1)">
+                                    <el-option v-for="item in options1" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="provinceCode">
+                                <span><i>*</i>地域</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.provinceCode" placeholder="请选择省份" @change="verifcheck(2)">
+                                    <el-option v-for="item in options2" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="operatorCode">
+                                <span><i>*</i>运营商</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.operatorCode" placeholder="请选择运营商" @change="verifcheck(3)">
+                                    <el-option v-for="item in options3" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="packageGear">
+                                <span><i>*</i>套餐档位</span>
+                                <el-select v-model="infolist.packageGear" placeholder="请选择" @change="verifcheck(4)" >
+                                    <el-option
+                                        v-for="item in options6"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="tariffName">
+                                <span><i>*</i>套餐名称</span>
+                                <el-input v-model="infolist.tariffName" placeholder="请输入资费名称"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="recordRegionCode" class="info-line tea-r">
+                                <span><i>*</i>地市</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.recordRegionCode" placeholder="请选择违规地市" @change="verifcheck(5)">
+                                    <el-option v-for="item in options5" :key="item.dataCode" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="monthFee">
+                                <span><i>*</i>月费(元)</span>
+                                <el-input v-model="infolist.monthFee" placeholder="请输入月费金额"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="preFee">
+                                <span><i>*</i>预存款(元)</span>
+                                <el-input v-model="infolist.preFee" placeholder="请输入预存款金额"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="concessionalRate">
+                                <span><i>*</i>优惠价(元)</span>
+                                <el-input v-model="infolist.concessionalRate" placeholder="请输入预存款金额"></el-input>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span><i></i>酬金</span>
+                                <el-input v-model="infolist.remFee" placeholder="请输入酬金金额"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="saleChnl">
+                                <span><i>*</i>销售渠道</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.saleChnl" placeholder="请选择销售渠道">
+                                    <el-option v-for="item in saleChnlopt" :key="item.dataName" :label="item.dataName"
+                                               :value="item.dataName">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span><i></i>销售范围</span>
+                                <el-input v-model="infolist.saleScope" placeholder="请输入销售范围"></el-input>
+                            </el-form-item>
+                            <el-form-item>
+                                <span><i></i>月销量</span>
+                                <el-input v-model="infolist.monthSale" placeholder="请输入月销量"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="isDb">
+                                <span><i>*</i>是否包含宽带</span>
+                                <el-select v-model="infolist.isDb" placeholder="请选择" >
+                                    <el-option
+                                        v-for="item in options7"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item>
+                                <span><i></i>宽带内容</span>
+                                <el-input v-model="infolist.dbContent" placeholder="请输入宽带内容"></el-input>
+                            </el-form-item>
+                        </div>
+
+                        <el-form-item prop="taffiffContent" class="info-line online">
+                            <span><i>*</i>套餐内容</span>
+                            <el-input v-model="infolist.taffiffContent" placeholder="请输入资费内容" type="textarea" :rows="3"></el-input>
+                        </el-form-item>
+                        <div style="padding-left: 60px">
+                            <myUpload @uploadBack="uploadBack" :fileInfo="fileInfo" :fileList="fileInfo.fileList"></myUpload>
+                        </div>
+                    </el-form>
+                </div>
+                <div class="titbtn-box">
+                    <el-button type="primary" plain @click="submitList(1)">取消</el-button>
+                    <el-button type="primary" @click="submitList">提交</el-button>
+                </div>
+            </div>
+        </fullscreen>
+        <competeRight></competeRight>
+    </div>
+</template>
+<script>
+import competeRight from "../../../components/competeRight";
+import myUpload from "../../../components/upload";
+import toolList from "../../../components/toolList";
+
+export default {
+    components: {
+        competeRight,
+        myUpload,
+        toolList
+    },
+    data() {
+        const fileLists = (rule, value, callback) => {
+            if (!this.fileLists.length > 0) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const opName = (rule, value, callback) => {
+            if (!this.infolist.opName) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const contactPhone = (rule, value, callback) => {
+            let x = this.infolist.contactPhone * 1;
+            if (!(/^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/.test(x))) {
+                callback(new Error('请输入正确的电话号码'))
+            } else {
+                callback()
+            }
+        }
+        const violationCate = (rule, value, callback) => {
+            if (!this.infolist.violationCate) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const provinceCode = (rule, value, callback) => {
+            if (!this.infolist.provinceCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const operatorCode = (rule, value, callback) => {
+            if (!this.infolist.operatorCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const recordRegionCode = (rule, value, callback) => {
+            if (!this.infolist.recordRegionCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const packageGear = (rule, value, callback) => {
+            if (!this.infolist.packageGear) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const tariffName = (rule, value, callback) => {
+            if (!this.infolist.tariffName) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const monthFee = (rule, value, callback) => {
+            let x = isNaN(this.infolist.monthFee);
+            if (x) {
+                callback(new Error('请输入数字'))
+            } else {
+                callback()
+            }
+        }
+        const preFee = (rule, value, callback) => {
+            let x = isNaN(this.infolist.preFee);
+            if (x) {
+                callback(new Error('请输入数字'))
+            } else {
+                callback()
+            }
+        }
+        const concessionalRate = (rule, value, callback) => {
+            let x = isNaN(this.infolist.concessionalRate);
+            if (x) {
+                callback(new Error('请输入数字'))
+            } else {
+                callback()
+            }
+        }
+        const remFee = (rule, value, callback) => {
+            if (!this.infolist.remFee) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const saleChnl = (rule, value, callback) => {
+            if (!this.infolist.saleChnl) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const saleScope = (rule, value, callback) => {
+            if (!this.infolist.saleScope) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const monthSale = (rule, value, callback) => {
+            if (!this.infolist.monthSale) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const isDb = (rule, value, callback) => {
+            if (!this.infolist.isDb) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const dbContent = (rule, value, callback) => {
+            if (!this.infolist.dbContent) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const evidenceType = (rule, value, callback) => {
+            if (!this.infolist.evidenceType) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const validateUsername = (rule, value, callback) => {
+            if (!this.infolist.violationContent) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const taffiffContent = (rule, value, callback) => {
+            if (!this.infolist.taffiffContent) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            rules: {
+                fileLists: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: fileLists
+                }],
+                recordRegionCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: recordRegionCode
+                }],
+                opName: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: opName
+                }],
+                contactPhone: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: contactPhone
+                }],
+                violationCate: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: violationCate
+                }],
+                provinceCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: provinceCode
+                }],
+                operatorCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: operatorCode
+                }],
+                packageGear: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: packageGear
+                }],
+                tariffName: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: tariffName
+                }],
+                monthFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: monthFee
+                }],
+                preFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: preFee
+                }],
+                concessionalRate: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: concessionalRate
+                }],
+                remFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: remFee
+                }],
+                saleChnl: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: saleChnl
+                }],
+                monthSale: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: monthSale
+                }],
+                isDb: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: isDb
+                }],
+                dbContent: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: dbContent
+                }],
+                evidenceType: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: evidenceType
+                }],
+                saleScope: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: saleScope
+                }],
+                violationContent: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: validateUsername
+                }],
+                taffiffContent: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: taffiffContent
+                }],
+            },
+            tooltit: '新增竞争对手信息',
+            infolist: {},
+            options1: [],
+            options2: [],
+            options3: [],
+            options4: [],
+            options5: [],
+            options6: [{
+                value: '低档:58元以下套餐',
+                label: '低档:58元以下套餐'
+            }, {
+                value: '中档:58元(含)-128元套餐(不含)',
+                label: '中档:58元(含)-128元套餐(不含)'
+            }, {
+                value: '高档:128元及以上套餐',
+                label: '高档:128元及以上套餐'
+            }],
+            options7: [{
+                value: '是',
+                label: '是'
+            }, {
+                value: '否',
+                label: '否'
+            }],
+            saleChnlopt: [],
+            fullscreen: false,
+            fileList: [],
+            fileLists: [],
+            attList: [],
+            fileInfo: {
+                limit: 5,
+                url: '/market/compatt/upload',
+                fileList: []
+            },
+            userInfo: {},
+        }
+    },
+    methods: {
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen
+            }
+        },
+        //查询字典
+        getListwglb() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'wglb'
+                },
+            }).then((res) => {
+                this.options1 = res.data;
+            });
+        },
+        getListsf() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'sf'
+                },
+            }).then((res) => {
+                this.options2 = res.data;
+            });
+        },
+        getListyys(v) {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'yys'
+                },
+            }).then((res) => {
+                if (v === 1) {
+                    this.options3 = [];
+                    res.data.forEach(item => {
+                        if (item.dataName !== '移动') {
+                            this.options3.push(item)
+                        }
+                    })
+                } else {
+                    this.options3 = res.data;
+                }
+            });
+        },
+        getListwgxx() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'wgxx'
+                },
+            }).then((res) => {
+                this.options4 = res.data;
+            });
+        },
+        getListregion() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'region'
+                },
+            }).then((res) => {
+                this.options5 = res.data;
+            });
+        },
+        getsaleChnl() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'saleChnl'
+                },
+            }).then((res) => {
+                this.saleChnlopt = res.data;
+            });
+        },
+        //添加、取消
+        submitList(v) {
+            if (v === 1) {
+                this.getUser();
+                this.$router.push("/competitor?type=1");
+                return
+            }
+            let _this = this;
+            let attList = [];
+            for (let i = 0; i < this.attList.length; i++) {
+                attList.push({
+                    id: this.attList[i].id
+                });
+            }
+            this.$refs.infolist.validate(valid => {
+                if (valid) {
+                    let nowdata = _this.$formatDate(new Date(), "YYYY-MM-DD");
+                    this.infolist.opTime = nowdata;
+                    this.infolist.sts = 0;
+                    this.infolist.stsDesc = '未审核';
+                    this.infolist.type = '正规';
+                    this.$http({
+                        url: "/market/cwcompetitor/save",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json",
+                        },
+                        data: {
+                            wCompetitor: this.infolist,
+                            attList: attList
+                        },
+                    }).then((res) => {
+                        if (res.data.result === 1) {
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'error'
+                            });
+                        } else {
+                            _this.$message({
+                                message: '添加成功',
+                                type: 'success'
+                            });
+                            _this.$router.push("/competitor");
+                        }
+                    });
+                }
+            })
+        },
+        //处理所需数据
+        verifcheck(v) {
+            if (v === 1) {
+                for (let i = 0; i < this.options1.length; i++) {
+                    if (this.options1[i].dataCode === this.infolist.violationCate) {
+                        this.infolist.violationCateName = this.options1[i].dataName
+                    }
+                }
+            }
+            if (v === 2) {
+                if (this.infolist.provinceCode === 'hlj') {
+                    this.getListyys(1);
+                    if (this.infolist.operatorCode === 'mobile') {
+                        this.infolist.operatorCode = '';
+                    }
+                } else {
+                    this.getListyys();
+                }
+                for (let i = 0; i < this.options2.length; i++) {
+                    if (this.options2[i].dataCode === this.infolist.provinceCode) {
+                        this.infolist.provinceName = this.options2[i].dataName
+                    }
+                }
+            }
+            if (v === 3) {
+                for (let i = 0; i < this.options3.length; i++) {
+                    if (this.options3[i].dataCode === this.infolist.operatorCode) {
+                        this.infolist.operatorName = this.options3[i].dataName
+                    }
+                }
+            }
+            if (v === 4) {
+                for (let i = 0; i < this.options4.length; i++) {
+                    if (this.options4[i].dataCode === this.infolist.violationItem) {
+                        this.infolist.violationItemName = this.options4[i].dataName
+                    }
+                }
+            }
+            if (v === 5) {
+                for (let i = 0; i < this.options5.length; i++) {
+                    if (this.options5[i].dataCode === this.infolist.recordRegionCode) {
+                        this.infolist.recordRegionName = this.options5[i].dataName
+                    }
+                }
+            }
+        },
+        uploadBack(v) {
+            this.attList = v;
+        },
+        getUser() {
+            this.userInfo = JSON.parse(window.sessionStorage.userInfo);
+            this.infolist = {
+                opNo: '',
+                regionName: '',
+                regionCode: '',
+                deptName: '',
+                deptCode: '',
+                opName: '',
+                contactPhone: '',
+            };
+            this.infolist.opNo = this.userInfo.loginNo;
+            // this.infolist.regionName = '';
+            // this.infolist.regionCode = '';
+            // this.infolist.deptName = '';
+            // this.infolist.deptCode = '';
+            this.infolist.opName = this.userInfo.loginName;
+            this.infolist.contactPhone = this.userInfo.phoneNo;
+        }
+    },
+    mounted() {
+
+    },
+    created() {
+        this.getListwglb();
+        this.getListyys();
+        this.getListsf();
+        this.getListwgxx();
+        this.getListregion();
+        this.getsaleChnl();
+        this.getUser();
+    },
+    watch:{
+        $route(to, from) {
+            if(to.path === '/addCompetitor'){
+
+            }
+        },
+    }
+}
+</script>
+<style scoped lang="scss">
+.titbox {
+    div {
+        float: right;
+        margin-top: 20px;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.info-form {
+    margin-top: 30px;
+    height: calc(100% - 150px);
+    overflow-y: scroll;
+
+    .info-line {
+        width: 100%;
+        display: block;
+
+        div {
+            width: 50%;
+            display: inline-block;
+        }
+
+        span {
+            width: 80px;
+            display: inline-block;
+            text-align: left;
+
+            i {
+                color: red;
+                display: inline-block;
+                padding-right: 5px;
+            }
+        }
+
+        .el-select,
+        .el-input {
+            width: calc(100% - 100px);
+        }
+    }
+
+    .tea-r {
+        /*text-align: right;*/
+    }
+
+    .online {
+        width: 100%;
+
+        span {
+            vertical-align: top;
+        }
+
+        .el-textarea {
+            width: calc(100% - 100px);
+        }
+    }
+}
+
+.titbtn-box {
+    text-align: right;
+    margin: 15px 20px 0 0;
+
+    button {
+        width: 120px;
+    }
+}
+</style>

+ 793 - 0
src/pages/main/competitor/changeCompetNew.vue

@@ -0,0 +1,793 @@
+<template>
+    <div>
+        <fullscreen :fullscreen.sync="fullscreen" class="container structure-l" style="margin: 0;width: calc(75% - 15px);">
+            <div class="container-box">
+                <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
+                <div class="info-form">
+                    <el-form :model="infolist" ref="infolist" :rules="rules">
+                        <div class="info-line">
+                            <el-form-item prop="violationCate">
+                                <span><i>*</i>类别</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.violationCate" placeholder="类别" @change="verifcheck(1)">
+                                    <el-option v-for="item in options1" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="provinceCode">
+                                <span><i>*</i>地域</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.provinceCode" placeholder="省份" @change="verifcheck(2)">
+                                    <el-option v-for="item in options2" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="operatorCode">
+                                <span><i>*</i>运营商</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.operatorCode" placeholder="运营商" @change="verifcheck(3)">
+                                    <el-option v-for="item in options3" :key="item.orderNumber" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item prop="packageGear">
+                                <span><i>*</i>套餐档位</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.packageGear" placeholder="违规项目" @change="verifcheck(4)">
+                                    <el-option
+                                        v-for="item in options6"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="tariffName">
+                                <span><i>*</i>套餐名称</span>
+                                <el-input v-model="infolist.tariffName" placeholder="资费名称"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="recordRegionCode" class="info-line tea-r">
+                                <span><i>*</i>地市</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.recordRegionCode" placeholder="违规地市" @change="verifcheck(5)">
+                                    <el-option v-for="item in options5" :key="item.dataCode" :label="item.dataName"
+                                               :value="item.dataCode">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span>月费(元)</span>
+                                <el-input v-model="infolist.monthFee" placeholder="月费"></el-input>
+                            </el-form-item>
+                            <el-form-item>
+                                <span>预存款(元)</span>
+                                <el-input v-model="infolist.preFee" placeholder="预存款"></el-input>
+                            </el-form-item>
+                            <el-form-item>
+                                <span><i>*</i>优惠价(元)</span>
+                                <el-input v-model="infolist.concessionalRate" placeholder="请输入预存款金额"></el-input>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span>酬金</span>
+                                <el-input v-model="infolist.remFee" placeholder="酬金"></el-input>
+                            </el-form-item>
+                            <el-form-item>
+                                <span>销售渠道</span>
+                                <el-select :popper-append-to-body="false" v-model="infolist.saleChnl" placeholder="请选择销售渠道">
+                                    <el-option v-for="item in saleChnlopt" :key="item.dataName" :label="item.dataName"
+                                               :value="item.dataName">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item prop="saleScope">
+                                <span><i>*</i>销售范围</span>
+                                <el-input v-model="infolist.saleScope" placeholder="销售范围"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="monthSale">
+                                <span><i>*</i>月销量</span>
+                                <el-input v-model="infolist.monthSale" placeholder="月销量"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="isDb">
+                                <span><i>*</i>是否包含宽带</span>
+                                <el-select v-model="infolist.isDb" placeholder="请选择" >
+                                    <el-option
+                                        v-for="item in options7"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item>
+                                <span><i></i>宽带内容</span>
+                                <el-input v-model="infolist.dbContent" placeholder="请输入宽带内容"></el-input>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span>解决结果</span>
+                                <el-select v-model="infolist.fixFlag" placeholder="解决结果">
+                                    <el-option v-for="item in ifoption" :key="item.id" :label="item.name" :value="item.id">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item>
+                                <span>反馈总部</span>
+                                <el-select v-model="infolist.groupFlag" placeholder="是否反馈总部">
+                                    <el-option v-for="item in ifoption" :key="item.id" :label="item.name" :value="item.id">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <div class="info-line">
+                            <el-form-item>
+                                <span>返回竞合</span>
+                                <el-select v-model="infolist.wwFlag" placeholder="是否返回竞合">
+                                    <el-option v-for="item in ifoption" :key="item.id" :label="item.name" :value="item.id">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item>
+                                <span>反馈总局</span>
+                                <el-select v-model="infolist.admFlag" placeholder="是否反馈总局">
+                                    <el-option v-for="item in ifoption" :key="item.id" :label="item.name" :value="item.id">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                        </div>
+                        <!-- <div class="info-line">
+                            <el-form-item prop="opName">
+                                <span><i>*</i>上报人</span>
+                                <el-input v-model="infolist.opName" placeholder="销售范围"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="contactPhone">
+                                <span><i>*</i>联系电话</span>
+                                <el-input v-model="infolist.contactPhone" placeholder="月销量"></el-input>
+                            </el-form-item>
+                        </div> -->
+                        <el-form-item prop="taffiffContent" class="info-line online">
+                            <span><i>*</i>资费内容</span>
+                            <el-input v-model="infolist.taffiffContent" placeholder="套餐内容" type="textarea" :rows="3"></el-input>
+                        </el-form-item>
+                        <div style="padding-left: 60px">
+                            <myUpload @uploadBack="uploadBack" :fileInfo="fileInfo" :fileList="fileInfo.fileList"></myUpload>
+                        </div>
+                    </el-form>
+                </div>
+                <div class="titbtn-box">
+                    <el-button type="primary" plain @click="submitList(1)">取消</el-button>
+                    <el-button type="primary" @click="submitList">提交</el-button>
+                </div>
+            </div>
+
+        </fullscreen>
+        <competeRight></competeRight>
+    </div>
+</template>
+<script>
+import competeRight from "../../../components/competeRight";
+import myUpload from "../../../components/upload";
+import toolList from "../../../components/toolList";
+
+export default {
+    components: {
+        competeRight,
+        myUpload,
+        toolList
+    },
+    data() {
+        const fileLists = (rule, value, callback) => {
+            if (!this.fileLists.length > 0) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const opName = (rule, value, callback) => {
+            if (!this.infolist.opName) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const contactPhone = (rule, value, callback) => {
+            let x = this.infolist.contactPhone * 1;
+            if (!(/^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/.test(x))) {
+                callback(new Error('请输入正确的电话号码'))
+            } else {
+                callback()
+            }
+        }
+        const violationCate = (rule, value, callback) => {
+            if (!this.infolist.violationCate) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const provinceCode = (rule, value, callback) => {
+            if (!this.infolist.provinceCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const operatorCode = (rule, value, callback) => {
+            if (!this.infolist.operatorCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const recordRegionCode = (rule, value, callback) => {
+            if (!this.infolist.recordRegionCode) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const violationItem = (rule, value, callback) => {
+            if (!this.infolist.violationItem) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const tariffName = (rule, value, callback) => {
+            if (!this.infolist.tariffName) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const monthFee = (rule, value, callback) => {
+            let x = isNaN(this.infolist.monthFee);
+            if (x) {
+                callback(new Error('请输入数字'))
+            } else {
+                callback()
+            }
+        }
+        const preFee = (rule, value, callback) => {
+            let x = isNaN(this.infolist.preFee);
+            if (x) {
+                callback(new Error('请输入数字'))
+            } else {
+                callback()
+            }
+        }
+        const remFee = (rule, value, callback) => {
+            if (!this.infolist.remFee) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const saleChnl = (rule, value, callback) => {
+            if (!this.infolist.saleChnl) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const saleScope = (rule, value, callback) => {
+            if (!this.infolist.saleScope) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const monthSale = (rule, value, callback) => {
+            if (!this.infolist.monthSale) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const validateUsername = (rule, value, callback) => {
+            if (!this.infolist.violationContent) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        const taffiffContent = (rule, value, callback) => {
+            if (!this.infolist.taffiffContent) {
+                callback(new Error('不能为空'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            rules: {
+                fileLists: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: fileLists
+                }],
+                recordRegionCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: recordRegionCode
+                }],
+                opName: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: opName
+                }],
+                contactPhone: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: contactPhone
+                }],
+                violationCate: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: violationCate
+                }],
+                provinceCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: provinceCode
+                }],
+                operatorCode: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: operatorCode
+                }],
+                violationItem: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: violationItem
+                }],
+                tariffName: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: tariffName
+                }],
+                monthFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: monthFee
+                }],
+                preFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: preFee
+                }],
+                remFee: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: remFee
+                }],
+                saleChnl: [{
+                    required: true,
+                    trigger: 'change',
+                    validator: saleChnl
+                }],
+                monthSale: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: monthSale
+                }],
+                saleScope: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: saleScope
+                }],
+                violationContent: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: validateUsername
+                }],
+                taffiffContent: [{
+                    required: true,
+                    trigger: 'blur',
+                    validator: taffiffContent
+                }],
+            },
+            tooltit: '修改竞争对手信息',
+            infolist: {
+                roomname: '0'
+            },
+            options1: [],
+            options2: [],
+            options3: [],
+            options4: [],
+            options5: [],
+            options6: [{
+                value: '低档:58元以下套餐',
+                label: '低档:58元以下套餐'
+            }, {
+                value: '中档:58元(含)-128元套餐(不含)',
+                label: '中档:58元(含)-128元套餐(不含)'
+            }, {
+                value: '高档:128元及以上套餐',
+                label: '高档:128元及以上套餐'
+            }],
+            options7: [{
+                value: '是',
+                label: '是'
+            }, {
+                value: '否',
+                label: '否'
+            }],
+            saleChnlopt: [],
+            fullscreen: false,
+            fileList: [],
+            fileLists: [],
+            attList: [],
+            fileInfo: {
+                limit: 5,
+                url: '/market/compatt/upload',
+                fileList: []
+            },
+            ifoption: [{
+                id: '0',
+                name: '是'
+            },
+                {
+                    id: '1',
+                    name: '否'
+                }
+            ]
+        }
+    },
+    methods: {
+        //获取详情
+        getInfo(v) {
+            let _this = this;
+            this.$http({
+                url: "/market/cwcompetitor/queryInfo",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    id: v
+                },
+            }).then((res) => {
+                _this.infolist = res.data;
+                this.attList = [];
+                this.fileInfo.fileList = [];
+                res.data.attList.forEach(item => {
+                    this.fileInfo.fileList.push({
+                        name: item.fileName,
+                        url: '',
+                        id: item.id,
+                        fileName: item.fileName
+                    });
+                    this.attList.push({
+                        name: item.fileName,
+                        url: '',
+                        id: item.id,
+                        fileName: item.fileName
+                    });
+                })
+                if (this.infolist.provinceCode === 'hlj') {
+                    this.getListyys(1);
+                } else {
+                    this.getListyys();
+                }
+            });
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen
+            }
+        },
+        //查询字典
+        getListwglb() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'wglb'
+                },
+            }).then((res) => {
+                this.options1 = res.data;
+            });
+        },
+        getListsf() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'sf'
+                },
+            }).then((res) => {
+                this.options2 = res.data;
+            });
+        },
+        getListyys(v) {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'yys'
+                },
+            }).then((res) => {
+                if (v === 1) {
+                    this.options3 = [];
+                    res.data.forEach(item => {
+                        if (item.dataName !== '移动') {
+                            this.options3.push(item)
+                        }
+                    })
+                } else {
+                    this.options3 = res.data;
+                }
+            });
+        },
+        getListwgxx() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'wgxx'
+                },
+            }).then((res) => {
+                this.options4 = res.data;
+            });
+        },
+        getListregion() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'region'
+                },
+            }).then((res) => {
+                this.options5 = res.data;
+            });
+        },
+        getsaleChnl() {
+            this.$http({
+                url: "/market/cfgDataDict/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    dictCode: 'saleChnl'
+                },
+            }).then((res) => {
+                this.saleChnlopt = res.data;
+            });
+        },
+        //添加、取消
+        submitList(v) {
+            if (v === 1) {
+                this.$router.push("/competitor");
+                return
+            }
+            let _this = this;
+            let attList = [];
+            for (let i = 0; i < this.attList.length; i++) {
+                attList.push({
+                    id: this.attList[i].id
+                });
+            }
+            this.infolist.fixFlag === '1' ? this.infolist.fixFlagDesc = '否' : this.infolist.fixFlagDesc = '是';
+            this.infolist.groupFlag === '1' ? this.infolist.groupFlagDesc = '否' : this.infolist.groupFlagDesc = '是';
+            this.infolist.wwFlag === '1' ? this.infolist.wwFlagDesc = '否' : this.infolist.wwFlagDesc = '是';
+            this.infolist.admFlag === '1' ? this.infolist.admFlagDesc = '否' : this.infolist.admFlagDesc = '是';
+            this.$refs.infolist.validate(valid => {
+                if (valid) {
+                    let nowdata = _this.$formatDate(new Date(), "YYYY-MM-DD");
+                    this.infolist.opTime = nowdata;
+                    this.infolist.sts = 0;
+                    this.infolist.stsDesc = '未审核';
+                    this.$http({
+                        url: "/market/cwcompetitor/update",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json",
+                        },
+                        data: {
+                            wCompetitor: this.infolist,
+                            attList: attList
+                        },
+                    }).then((res) => {
+                        if (res.data.result === 1) {
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'error'
+                            });
+                        } else {
+                            _this.$message({
+                                message: '修改成功',
+                                type: 'success'
+                            });
+                            _this.$router.push("/competitor");
+                        }
+                    });
+                }
+            })
+        },
+        //处理所需数据
+        verifcheck(v) {
+            if (v === 1) {
+                for (let i = 0; i < this.options1.length; i++) {
+                    if (this.options1[i].dataCode === this.infolist.violationCate) {
+                        this.infolist.violationCateName = this.options1[i].dataName
+                    }
+                }
+            }
+            if (v === 2) {
+                if (this.infolist.provinceCode === 'hlj') {
+                    this.getListyys(1);
+                    if (this.infolist.operatorCode === 'mobile') {
+                        this.infolist.operatorCode = '';
+                    }
+                } else {
+                    this.getListyys();
+                }
+                for (let i = 0; i < this.options2.length; i++) {
+                    if (this.options2[i].dataCode === this.infolist.provinceCode) {
+                        this.infolist.provinceName = this.options2[i].dataName
+                    }
+                }
+            }
+            if (v === 3) {
+                for (let i = 0; i < this.options3.length; i++) {
+                    if (this.options3[i].dataCode === this.infolist.operatorCode) {
+                        this.infolist.operatorName = this.options3[i].dataName
+                    }
+                }
+            }
+            if (v === 4) {
+                for (let i = 0; i < this.options4.length; i++) {
+                    if (this.options4[i].dataCode === this.infolist.violationItem) {
+                        this.infolist.violationItemName = this.options4[i].dataName
+                    }
+                }
+            }
+            if (v === 5) {
+                for (let i = 0; i < this.options5.length; i++) {
+                    if (this.options5[i].dataCode === this.infolist.recordRegionCode) {
+                        this.infolist.recordRegionName = this.options5[i].dataName
+                    }
+                }
+            }
+        },
+        uploadBack(v) {
+            this.attList = v;
+        }
+    },
+    mounted() {
+
+    },
+    created() {
+        this.getListwglb();
+        this.getListyys();
+        this.getListsf();
+        this.getListwgxx();
+        this.getListregion();
+        this.getsaleChnl();
+        this.getInfo(this.$route.query.id);
+    }
+}
+</script>
+<style scoped lang="scss">
+.fileline {
+    color: #666;
+    font-size: 14px;
+    overflow: hidden;
+    padding: 0 10px;
+    height: 28px;
+    line-height: 28px;
+    border-radius: 3px;
+
+    span {}
+
+    i {
+        float: right;
+        height: 28px;
+        line-height: 28px;
+        cursor: pointer;
+    }
+}
+
+.fileline:hover {
+    background: #f4f4f4;
+}
+
+.titbox {
+    div {
+        float: right;
+        margin-top: 20px;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.info-form {
+    margin-top: 30px;
+    height: calc(100% - 150px);
+    overflow-y: scroll;
+
+    .info-line {
+        width: 100%;
+        display: block;
+
+        div {
+            width: 50%;
+            display: inline-block;
+        }
+
+        span {
+            width: 80px;
+            display: inline-block;
+            text-align: left;
+
+            i {
+                color: red;
+                display: inline-block;
+                padding-right: 5px;
+            }
+        }
+
+        .el-select,
+        .el-input {
+            width: calc(100% - 100px);
+        }
+    }
+
+    .tea-r {
+        /*text-align: right;*/
+    }
+
+    .online {
+        width: 100%;
+
+        span {
+            vertical-align: top;
+        }
+
+        .el-textarea {
+            width: calc(100% - 100px);
+        }
+    }
+}
+
+.titbtn-box {
+    text-align: right;
+    margin: 15px 20px;
+
+    button {
+        width: 120px;
+    }
+}
+</style>

+ 410 - 0
src/pages/main/competitor/competitorInfoNew.vue

@@ -0,0 +1,410 @@
+<template>
+    <div class="dia-box">
+        <fullscreen :fullscreen.sync="fullscreen" class="container structure-l" style="margin: 0;width: calc(75% - 15px);">
+            <div class="container-box">
+                <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
+                <!-- <div class="titbox">
+                                    <span :style="'color:'+tableData.bg">({{tableData.stsDesc}})</span>
+                                </div> -->
+                <div class="checknum">
+                    <span>上报人:{{tableData.opName}}</span>
+                    <!--                    <span>部门:市场部</span>-->
+                    <span>联系方式:{{tableData.contactPhone}}</span>
+                    <!--                    <span>地市:哈尔滨市移动分公司</span>-->
+                    <!--                    <span>职级:部门经理</span>-->
+                    <span>上报时间:{{tableData.opTime}}</span>
+                </div>
+                <div style="height: 116px;background: #f4f4f4;">
+                    <uploadDown :datalist="datalist" :dialogStatus="uploadstatus" style="margin-top: 10px;"></uploadDown>
+                </div>
+                <div class="tab-boxinfo">
+                    <div class="box-line">
+                        <span>省份</span>
+                        <div>{{tableData.provinceName}}</div>
+                    </div>
+                    <div class="box-line">
+                        <span>运营商</span>
+                        <div>{{tableData.operatorName}}</div>
+                    </div>
+                    <div class="box-line">
+                        <span>类别</span>
+                        <div>{{tableData.violationCateName}}</div>
+                    </div>
+                    <div class="box-line box-line-bg">
+                        <span>月费</span>
+                        <div>{{tableData.monthFee}} (元)</div>
+                    </div>
+                    <div class="box-line box-line-bg">
+                        <span>预存款</span>
+                        <div>{{tableData.preFee}} (元)</div>
+                    </div>
+                    <div class="box-line">
+                        <span>套餐名称</span>
+                        <div>{{tableData.tariffName}}</div>
+                    </div>
+                    <div class="box-line">
+                        <span>套餐内容</span>
+                        <div>{{tableData.taffiffContent}}</div>
+                    </div>
+                    <div class="box-line">
+                        <span>酬金</span>
+                        <div>{{tableData.remFee}}</div>
+                    </div>
+                    <div class="box-line box-line-bg">
+                        <span>销售范围</span>
+                        <div>{{tableData.saleScope}}</div>
+                    </div>
+                    <div class="box-line box-line-bg">
+                        <span>销售渠道</span>
+                        <div>{{tableData.saleChnl}}</div>
+                    </div>
+                    <div class="box-line box-line-bg">
+                        <span>月销量</span>
+                        <div>{{tableData.monthSale}}</div>
+                    </div>
+                    <div class="box-line">
+                        <span>地市</span>
+                        <div>{{tableData.recordRegionName}}</div>
+                    </div>
+                    <!--                    <div class="box-line">-->
+                    <!--                        <span>上报时间</span>-->
+                    <!--                        <div>{{tableData.opTime}}</div>-->
+                    <!--                    </div>-->
+                    <!--                    <div class="box-line">-->
+                    <!--                        <span>上报人</span>-->
+                    <!--                        <div>{{tableData.opName}}</div>-->
+                    <!--                    </div>-->
+                    <!--                    <div class="box-line">-->
+                    <!--                        <span>联系电话</span>-->
+                    <!--                        <div>{{tableData.contactPhone}}</div>-->
+                    <!--                    </div>-->
+                    <div class="box-line" v-if="tableData.sts*1!==0">
+                        <span>审批人</span>
+                        <div>{{tableData.auditName}}</div>
+                    </div>
+                    <div class="box-line-bg">
+                        <div class="box-line" v-if="tableData.sts*1!==0">
+                            <span>是否已解决</span>
+                            <div>{{tableData.fixFlagDesc}}</div>
+                        </div>
+                        <div class="box-line" v-if="tableData.sts*1!==0">
+                            <span>是否反馈总部</span>
+                            <div>{{tableData.groupFlagDesc}}</div>
+                        </div>
+                        <div class="box-line" v-if="tableData.sts*1!==0">
+                            <span>是否返回竞合</span>
+                            <div>{{tableData.wwFlagDesc}}</div>
+                        </div>
+                    </div>
+
+
+                    <div class="box-line" v-if="tableData.sts*1!==0">
+                        <span>是否反馈总局</span>
+                        <div>{{tableData.admFlagDesc}}</div>
+                    </div>
+
+                    <div class="box-line" v-if="tableData.sts*1!==0">
+                        <span>审批意见</span>
+                        <div>{{tableData.auditResultDesc}}.{{tableData.auditRemarks}}</div>
+                    </div>
+
+
+                </div>
+                <div class="titbtn-box" v-if="infotype===1">
+                    <el-button size="medium" type="warning" icon="el-icon-picture" @click="outlineinfo(1)">对外导出图片</el-button>
+                    <el-button size="medium" type="primary" icon="el-icon-folder-opened" @click="outlineinfo(2)">对内导出word</el-button>
+                </div>
+                <div class="titbtn-box" v-if="infotype!==1">
+                    <el-button size="medium" type="danger" @click="exaStatus=true">拒绝</el-button>
+                    <el-button size="medium" type="primary" @click="exaInfo(1,'已通过')">通过</el-button>
+                </div>
+            </div>
+            <el-dialog title="拒绝申请" :visible.sync="exaStatus" width="50%" :destroy-on-close="true" :modal-append-to-body="false"
+                       :close-on-click-modal="false">
+                <el-input type="textarea" :rows="4" placeholder="请输入拒绝原因或建议" v-model="auditRemarks">
+                </el-input>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="exaStatus = false">取 消</el-button>
+                    <el-button type="primary" @click="exaInfo(2,'未通过')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </fullscreen>
+
+        <competeRight></competeRight>
+
+    </div>
+</template>
+<script>
+import competeRight from "../../../components/competeRight";
+import uploadDown from "../../../components/uploadDown";
+import toolList from "../../../components/toolList";
+
+export default {
+    components: {
+        competeRight,
+        uploadDown,
+        toolList
+    },
+    data() {
+        return {
+            tooltit: '竞争对手信息',
+            tableData: {},
+            fullscreen: false,
+            infotype: 0,
+            attList: [],
+            auditRemarks: '',
+            exaStatus: false,
+            datalist: {
+                url: '/market/compatt/downfile',
+                type: 1
+            },
+            uploadstatus: false,
+        }
+    },
+    methods: {
+        //获取详情
+        getInfo(v) {
+            this.infotype = this.$route.query.type * 1;
+            this.$http({
+                url: "/market/cwcompetitor/queryInfo",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    id: v
+                },
+            }).then((res) => {
+                this.datalist.attList = res.data.attList;
+                this.uploadstatus = true;
+                this.tableData = res.data;
+                if (this.tableData.sts * 1 === 0) {
+                    this.tableData.bg = '#999';
+                } else if (this.tableData.sts * 1 === 1) {
+                    this.tableData.bg = 'green';
+                } else {
+                    this.tableData.bg = 'red';
+                }
+                // this.tableData.opTime = this.timeChange(res.data.opTime * 1);
+                this.attList = res.data.attList;
+            });
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getInfo(this.$route.query.id)
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen
+            }
+        },
+        exaInfo(v, n) {
+            let _this = this;
+            this.exaStatus = false;
+            let params = {
+                id: this.tableData.id,
+                sts: v,
+                stsDesc: n,
+                auditName: JSON.parse(window.sessionStorage.userInfo).loginName,
+                auditNo: JSON.parse(window.sessionStorage.userInfo).loginName,
+                auditRemarks: this.auditRemarks,
+                auditResult: v,
+                auditResultDesc: n,
+                auditTime: new Date().getTime(),
+            }
+            this.$http({
+                url: "/market/swcompetitor/update",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: params,
+            }).then((res) => {
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '审核成功',
+                        type: 'success'
+                    });
+                    _this.$router.push("/competExa");
+                }
+            });
+        },
+        //导出
+        outlineinfo(v) {
+            let data = {
+                provinceName: this.tableData.provinceName,
+                operatorName: this.tableData.operatorName,
+                violationCateName: this.tableData.violationCateName,
+                violationItemName: this.tableData.violationItemName,
+                violationItem: this.tableData.violationItemName,
+                monthFee: this.tableData.monthFee,
+                tariffName: this.tableData.tariffName,
+                taffiffContent: this.tableData.taffiffContent,
+                remFee: this.tableData.remFee,
+                preFee: this.tableData.preFee,
+                saleScope: this.tableData.saleScope,
+                saleChnl: this.tableData.saleChnl,
+                monthSale: this.tableData.monthSale,
+                violationContent: this.tableData.violationContent,
+                recordRegionName: this.tableData.recordRegionName,
+                opTime: this.tableData.opTime,
+            }
+            console.log(data)
+            if (v === 1) {
+                this.$http({
+                    url: "/market/cwcompetitor/writeImg1",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    responseType: "blob",
+                    data: data,
+                }).then((response) => {
+                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                        let blob = new Blob([response.data], {
+                            type: 'application/vnd.ms-excel'
+                        })
+                        window.navigator.msSaveOrOpenBlob(blob,
+                            new Date().getTime() + '.png')
+                    } else {
+                        /* 火狐谷歌的文件下载方式 */
+                        var blob = new Blob([response.data])
+                        var downloadElement = document.createElement('a')
+                        var href = window.URL.createObjectURL(blob)
+                        downloadElement.href = href
+                        downloadElement.download = new Date().getTime() + '.png'
+                        document.body.appendChild(downloadElement)
+                        downloadElement.click()
+                        document.body.removeChild(downloadElement)
+                        window.URL.revokeObjectURL(href)
+                    }
+                });
+            } else {
+                data.id = this.tableData.id;
+                this.$http({
+                    url: "/market/cwcompetitor/write2Doc1",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    responseType: "blob",
+                    data: data,
+                }).then((response) => {
+                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                        let blob = new Blob([response.data], {
+                            type: 'application/vnd.ms-excel'
+                        })
+                        window.navigator.msSaveOrOpenBlob(blob,
+                            new Date().getTime() + '.docx')
+                    } else {
+                        /* 火狐谷歌的文件下载方式 */
+                        var blob = new Blob([response.data])
+                        var downloadElement = document.createElement('a')
+                        var href = window.URL.createObjectURL(blob)
+                        downloadElement.href = href
+                        downloadElement.download = new Date().getTime() + '.docx'
+                        document.body.appendChild(downloadElement)
+                        downloadElement.click()
+                        document.body.removeChild(downloadElement)
+                        window.URL.revokeObjectURL(href)
+                    }
+                });
+            }
+        },
+        //时间转换
+        timeChange(v) {
+            var time = new Date(v);
+            var y = time.getFullYear();
+            var m = time.getMonth() + 1;
+            m < 10 ? '0' + m : m;
+            var d = time.getDate();
+            d < 10 ? '0' + d : d;
+            var h = time.getHours();
+            h < 10 ? '0' + h : h;
+            var mm = time.getMinutes();
+            mm < 10 ? '0' + mm : mm;
+            var s = time.getSeconds();
+            s < 10 ? '0' + s : s;
+            return y + '-' + m + '-' + d + ' ' + h + ':' + mm + ':' + s;
+        },
+    },
+    mounted() {
+
+    },
+    created() {
+        this.infotype = this.$route.query.type * 1;
+        this.infotype === 1 ? this.tooltit = '竞争对手信息收集' : this.tooltit = '竞争对手信息审核';
+        this.getInfo(this.$route.query.id);
+    }
+}
+</script>
+<style scoped lang="scss">
+@import "../../../assets/style";
+
+.titbox {
+
+    span {
+        padding-left: 10px;
+    }
+}
+
+.checknum {
+    border: 3px dotted #f0f0f0;
+    padding: 10px 20px;
+    margin-top: 10px;
+
+    span {
+        display: inline-block;
+        width: 33%;
+        padding-left: 10px;
+        height: 36px;
+        line-height: 36px;
+        color: #aaa;
+    }
+}
+
+.tab-boxinfo {
+    border: 2px solid #f0f0f0;
+    margin-top: 10px;
+    color: #4b4b4b;
+    height: calc(100% - 330px);
+    overflow-y: scroll;
+
+    .box-line {
+        height: 34px;
+        line-height: 34px;
+        padding-left: 20px;
+        font-size: 14px;
+        width: 33.3%;
+        display: inline-block;
+
+        span {
+            display: inline-block;
+            width: 100px;
+        }
+
+        div {
+            display: inline-block;
+            width: calc(100% - 100px);
+        }
+    }
+
+    .box-line-bg {
+        background: #FAFAFA;
+    }
+}
+
+.titbtn-box {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+        min-width: 100px;
+    }
+}
+</style>

ファイルの差分が大きいため隠しています
+ 1234 - 499
src/pages/main/competitor/index.vue


+ 21 - 16
src/pages/main/cooOperation/index.vue

@@ -389,22 +389,27 @@
 					this.titname = '审批';
 					this.disableStatus = true;
 				} else if (v === 3) {
-                    this.$http({
-                        url: '/market/bpmTemp/query',
-                        method: "post",
-                        headers: {"Content-Type": "application/json",},
-                        data: {bpmType: "5"},
-                    }).then((res) => {
-                        if (res.data) {
-                            let content = JSON.parse(res.data.content);
-                            this.infolist = content.infolist;
-                            this.attList = content.attList;
-                            this.fileInfo.fileList =  content.fileList;
-                        }
-                        this.tempSave = true;
-                        this.titname = '添加';
-                        this.disableStatus = false;
-                    });
+                    // this.$http({
+                    //     url: '/market/bpmTemp/query',
+                    //     method: "post",
+                    //     headers: {"Content-Type": "application/json",},
+                    //     data: {bpmType: "5"},
+                    // }).then((res) => {
+                    //     if (res.data) {
+                    //         let content = JSON.parse(res.data.content);
+                    //         this.infolist = content.infolist;
+                    //         this.attList = content.attList;
+                    //         this.fileInfo.fileList =  content.fileList;
+                    //     }
+                    //     this.tempSave = true;
+                    //     this.titname = '添加';
+                    //     this.disableStatus = false;
+                    // });
+					//todo 查询历史数据会导致节点id为空的bug(添加失败)临时解决方案此处流程待梳理
+					this.infolist = {};
+					this.tempSave = true;
+					this.titname = '添加';
+					this.disableStatus = false;
                     return
 				}
 				this.$http({

ファイルの差分が大きいため隠しています
+ 1964 - 1018
src/pages/main/demandDevelop/index.vue


+ 321 - 261
src/pages/main/demandDevelop/ywStanding.vue

@@ -1,287 +1,347 @@
 <template>
-    <fullscreen :fullscreen.sync="fullscreen" class="container">
-        <div class="container-box">
-            <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
-            <div class="search">
-				<mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
-                <el-button class="btn-check" size="medium" type="primary" @click="outlist">导出
-                </el-button>
-            </div>
-            <div class="tabbox">
-                <el-table height="calc(100% - 40px)" class="com-table" ref="multipleTable" :data="tableData"
-                    tooltip-effect="dark" size="small" border style="width: 100%">
-                    <el-table-column prop="demandName" label="需求名称">
-                    </el-table-column>
-                    <el-table-column prop="deptName" label="提出部门/地市">
-                    </el-table-column>
-                    <el-table-column prop="busiStartTime" label="时间段">
-						<template slot-scope="scope">
-							{{scope.row.busiStartTime + '~' + scope.row.busiEndTime}}
-						</template>
-                    </el-table-column>
-                    <el-table-column prop="factoryName" label="支撑方">
-                    </el-table-column>
-					<el-table-column prop="workLoad" label="工作量">
-                    </el-table-column>
-                </el-table>
-                <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
-                    :total="total">
-                </el-pagination>
-            </div>
-        </div>
-    </fullscreen>
+  <fullscreen :fullscreen.sync="fullscreen" class="container">
+    <div class="container-box">
+      <toolList @iconCli="iconCli" :tooltit="tooltit"></toolList>
+      <div class="search">
+        <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
+        <el-button
+          class="btn-check"
+          size="medium"
+          type="primary"
+          @click="outlist"
+          >导出
+        </el-button>
+      </div>
+      <div class="tabbox">
+        <el-table
+          height="calc(100% - 40px)"
+          class="com-table"
+          ref="multipleTable"
+          :data="tableData"
+          tooltip-effect="dark"
+          size="small"
+          border
+          style="width: 100%"
+        >
+          <el-table-column prop="demandName" label="需求名称">
+          </el-table-column>
+          <el-table-column prop="groupName" label="提出部门/地市">
+          </el-table-column>
+          <el-table-column prop="busiStartTime" label="时间段">
+            <template slot-scope="scope">
+              {{ scope.row.busiStartTime + "~" + scope.row.busiEndTime }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="status" label="状态"> </el-table-column>
+          <el-table-column prop="support" label="支撑方"> </el-table-column>
+          <el-table-column prop="workload" label="工作量"> </el-table-column>
+        </el-table>
+        <el-pagination
+          class="pageBox"
+          @current-change="currchange"
+          layout="prev, pager, next"
+          background
+          :total="total"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </fullscreen>
 </template>
 <script>
-    import mySearch from "../../../components/search.vue";
-    import toolList from "../../../components/toolList.vue";
+import mySearch from "../../../components/search.vue";
+import toolList from "../../../components/toolList.vue";
 
-    export default {
-        components: {
-            mySearch,
-            toolList
+export default {
+  components: {
+    mySearch,
+    toolList,
+  },
+  data() {
+    return {
+      searchList: [
+        {
+          type: "input",
+          tit: "需求名称",
+          value: "",
+          width: "23%",
         },
-        data() {
-
-            return {
-				searchList: [{
-					type: 'input',
-					tit: '需求名称',
-					value: '',
-					width: '32%',
-				},{
-					type: 'date',
-					tit: '开始时间',
-					value: '',
-					width: '32%',
-				}, {
-					type: 'date',
-					tit: '结束时间',
-					value: '',
-					width: '32%',
-				}],
-                tooltit: '线上业务需求台账',
-                fullscreen: false,
-                total: 0,
-                pageSize: 1,
-                tableData: [],
-                dialogStatus: false,
-                disableStatus: false,
-                titname: '终端',
-                infolist: {},
-                typeOptions: [{
-                    dataCode: 1,
-                    dataName: 111,
-                }],
-                userInfo: {},
-                params: {},
-                infoApply: []
-            }
+        {
+          type: "input",
+          tit: "部门或地市",
+          value: "",
+          width: "23%",
         },
-        methods: {
-			//搜索数据
-			searchInfo(v) {
-				this.params = {};
-				v[0] ? this.params.demandName = v[0] : '';
-				v[1] ? this.params.busiStartTimeTo = v[1] : '';
-				v[2] ? this.params.busiEndTimeFrom = v[2]:'';
-				this.getList(this.params, this.pageSize);
-			},
-            //获取列表
-            getList(v, n) {
-				v.sts = 1;
-                this.pageSize = n;
-                let _this = this;
-                this.$http({
-                    url: "/market/cChannelDemand/queryPage",
-                    method: "post",
-                    headers: {
-                        "Content-Type": "application/json",
-                        "page": '{"pageNo":"' + n + '","pageSize":"10"}'
-                    },
-                    data: v,
-                }).then((res) => {
-                    this.tableData = res.data.data;
-                    this.total = res.data.totalRecord;
-                });
-            },
-            // 分页
-            currchange(v) {
-                this.pageSize = v;
-                this.getList(this.params, this.pageSize);
-            },
-            //功能栏
-            iconCli(v) {
-                if (v === 1) {
-                    this.getList(this.params, this.pageSize);
-                }
-                if (v === 2) {
-                    this.fullscreen = !this.fullscreen
-                }
-            },
-            // =======================
-            outlist() {
-                let data = {
-                    colStr: "demandName,deptName,busiStartTime,busiEndTime,factoryName,workLoad",
-                    fileName: "台账.xlsx",
-                    tital: [
-                        [
-                            {
-                                "colNum": "0",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "需求名称"
-                            },
-                            {
-                                "colNum": "1",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "提出部门"
-                            },
-                            {
-                                "colNum": "2",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "开始时间"
-                            },
-                            {
-                                "colNum": "3",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "结束时间"
-                            },
-                            {
-                                "colNum": "4",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "支撑方"
-                            },
-                            {
-                                "colNum": "5",
-                                "colSpan": "0",
-                                "rowSpan": "1",
-                                "val": "工作量"
-                            },
-                        ]
-                    ]
-                }
-                // data.tital = JSON.stringify(data.tital)
-                this.$http({
-                    url: "/market/cChannelDemand/excelExport",
-                    method: "post",
-                    headers: {
-                        "Content-Type": "application/json",
-                    },
-                    responseType: "blob",
-                    data: data,
-                }).then((response) => {
-                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
-                        let blob = new Blob([response.data], {
-                            type: 'application/vnd.ms-excel'
-                        })
-                        window.navigator.msSaveOrOpenBlob(blob,
-                            new Date().getTime() + '.xlsx')
-                    } else {
-                        /* 火狐谷歌的文件下载方式 */
-                        var blob = new Blob([response.data])
-                        var downloadElement = document.createElement('a')
-                        var href = window.URL.createObjectURL(blob)
-                        downloadElement.href = href
-                        downloadElement.download = new Date().getTime() + '.xlsx'
-                        document.body.appendChild(downloadElement)
-                        downloadElement.click()
-                        document.body.removeChild(downloadElement)
-                        window.URL.revokeObjectURL(href)
-                    }
-                });
-            },
-            getUser() {
-                this.userInfo = JSON.parse(window.sessionStorage.userInfo);
-                this.infolist = {
-                    opNo: '',
-                    opName: '',
-                };
-                this.infolist.opNo = this.userInfo.loginNo;
-                this.infolist.opName = this.userInfo.loginName;
-
-            }
+        {
+          type: "date",
+          tit: "开始时间",
+          value: "",
+          width: "23%",
         },
-        mounted() {
-            this.getList({}, 1);
-            this.getUser();
+        {
+          type: "date",
+          tit: "结束时间",
+          value: "",
+          width: "23%",
         },
-        created() {
-
+      ],
+      tooltit: "线上业务需求台账",
+      fullscreen: false,
+      total: 0,
+      page: 1,
+      pageSize: 10,
+      tableData: [],
+      dialogStatus: false,
+      disableStatus: false,
+      titname: "终端",
+      infolist: {},
+      typeOptions: [
+        {
+          dataCode: 1,
+          dataName: 111,
+        },
+      ],
+      userInfo: {},
+      params: {},
+      infoApply: [],
+    };
+  },
+  methods: {
+    //搜索数据
+    searchInfo(v) {
+      this.params = {};
+      v[0] ? (this.params.demandName = v[0]) : "";
+      v[1] ? (this.params.deptOrCity = v[1]) : "";
+      v[2]
+        ? (this.params.startTime = this.$formatDate(v[2], "YYYY-MM-DD"))
+        : "";
+      v[3] ? (this.params.endTime = this.$formatDate(v[3], "YYYY-MM-DD")) : "";
+      this.handleInit();
+    },
+    // 初始化列表
+    handleInit() {
+      this.$http({
+        url: "/market/mkOnlineChannel/ledgerList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {
+          ...this.params,
+          page: this.page,
+          pageSize: this.pageSize,
+        },
+      }).then(
+        ({
+          data: {
+            body: { data, count },
+          },
+        }) => {
+          this.tableData = data;
+          this.total = count;
         }
-    }
+      );
+    },
+    outlist() {
+      // let data = {
+      //   colStr:
+      //     "demandName,deptName,busiStartTime,busiEndTime,factoryName,workLoad",
+      //   fileName: "台账.xlsx",
+      //   tital: [
+      //     [
+      //       {
+      //         colNum: "0",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "需求名称",
+      //       },
+      //       {
+      //         colNum: "1",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "提出部门",
+      //       },
+      //       {
+      //         colNum: "2",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "开始时间",
+      //       },
+      //       {
+      //         colNum: "3",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "结束时间",
+      //       },
+      //       {
+      //         colNum: "4",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "支撑方",
+      //       },
+      //       {
+      //         colNum: "5",
+      //         colSpan: "0",
+      //         rowSpan: "1",
+      //         val: "工作量",
+      //       },
+      //     ],
+      //   ],
+      // };
+      // // data.tital = JSON.stringify(data.tital)
+      this.$http({
+        url: "/market/mkOnlineChannel/exportLedger",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        responseType: "blob",
+        data: this.params,
+      }).then((response) => {
+        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+          let blob = new Blob([response.data], {
+            type: "application/vnd.ms-excel",
+          });
+          window.navigator.msSaveOrOpenBlob(
+            blob,
+            new Date().getTime() + ".xlsx"
+          );
+        } else {
+          /* 火狐谷歌的文件下载方式 */
+          var blob = new Blob([response.data]);
+          var downloadElement = document.createElement("a");
+          var href = window.URL.createObjectURL(blob);
+          downloadElement.href = href;
+          downloadElement.download = new Date().getTime() + ".xlsx";
+          document.body.appendChild(downloadElement);
+          downloadElement.click();
+          document.body.removeChild(downloadElement);
+          window.URL.revokeObjectURL(href);
+        }
+      });
+    },
+    // 分页
+    currchange(v) {
+      this.page = v;
+      this.handleInit();
+    },
+
+    //获取列表
+    getList(v, n) {
+      v.sts = 1;
+      this.pageSize = n;
+      let _this = this;
+      this.$http({
+        url: "/market/cChannelDemand/queryPage",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+          page: '{"pageNo":"' + n + '","pageSize":"10"}',
+        },
+        data: v,
+      }).then((res) => {
+        this.tableData = res.data.data;
+        this.total = res.data.totalRecord;
+      });
+    },
+
+    //功能栏
+    iconCli(v) {
+      if (v === 1) {
+        this.handleInit();
+      }
+      if (v === 2) {
+        this.fullscreen = !this.fullscreen;
+      }
+    },
+    // =======================
+
+    getUser() {
+      this.userInfo = JSON.parse(window.sessionStorage.userInfo);
+      this.infolist = {
+        opNo: "",
+        opName: "",
+      };
+      this.infolist.opNo = this.userInfo.loginNo;
+      this.infolist.opName = this.userInfo.loginName;
+    },
+  },
+  mounted() {
+    // this.getList({}, 1);
+    this.handleInit();
+    this.getUser();
+  },
+  created() {},
+};
 </script>
 <style scoped lang="scss">
-    .onetab {
-        margin-bottom: 20px;
-        padding: 0 20px;
-    }
+.onetab {
+  margin-bottom: 20px;
+  padding: 0 20px;
+}
 
-    .titbox {
-        div {
-            float: right;
+.titbox {
+  div {
+    float: right;
 
-            i {
-                font-size: 22px;
-                margin-left: 20px;
-                cursor: pointer;
-            }
-        }
+    i {
+      font-size: 22px;
+      margin-left: 20px;
+      cursor: pointer;
     }
+  }
+}
 
-    .tabbox {
-        margin-top: 15px;
-    }
+.tabbox {
+  margin-top: 15px;
+}
 
-    .pageBox {
-        text-align: right;
-        margin-top: 10px;
-    }
+.pageBox {
+  text-align: right;
+  margin-top: 10px;
+}
 
-    .info-line {
-        width: 100%;
-        display: block;
-        padding-left: 20px;
+.info-line {
+  width: 100%;
+  display: block;
+  padding-left: 20px;
 
-        div {
-            width: 50%;
-            display: inline-block;
-        }
-
-        span {
-            width: 80px;
-            display: inline-block;
-            text-align: left;
+  div {
+    width: 50%;
+    display: inline-block;
+  }
 
-            i {
-                color: red;
-                display: inline-block;
-                padding-right: 5px;
-            }
-        }
+  span {
+    width: 80px;
+    display: inline-block;
+    text-align: left;
 
-        .el-select,
-        .el-input {
-            width: calc(100% - 100px);
-        }
+    i {
+      color: red;
+      display: inline-block;
+      padding-right: 5px;
     }
+  }
 
-    .online {
-        width: 100%;
+  .el-select,
+  .el-input {
+    width: calc(100% - 100px);
+  }
+}
 
-        .el-select {
-            width: calc(100% - 100px);
-        }
+.online {
+  width: 100%;
 
-        span {
-            vertical-align: top;
-        }
+  .el-select {
+    width: calc(100% - 100px);
+  }
 
-        .el-textarea {
-            width: calc(100% - 100px);
-        }
-    }
+  span {
+    vertical-align: top;
+  }
+
+  .el-textarea {
+    width: calc(100% - 100px);
+  }
+}
 </style>

ファイルの差分が大きいため隠しています
+ 1165 - 0
src/pages/main/file/flieList.vue


+ 26 - 0
src/pages/main/funcInit/manageLnit.vue

@@ -62,6 +62,14 @@
                         <span>线条名称</span>
                         <el-input v-model="infolist.lineName" placeholder="线条名称" :disabled="disableStatus"></el-input>
                     </el-form-item>
+                    <el-form-item v-if="type == '1'" prop="groupname">
+                        <span>分组名称</span>
+                        <el-select  :disabled="disableStatus" v-model="groupname"
+                            placeholder="分组名称">
+                            <el-option value="default" label="默认"> </el-option>
+					        <el-option value="IT" label="信息中心"> </el-option>
+                        </el-select>
+                    </el-form-item>
                     <el-form-item v-if="type != '1'" prop="lineId">
                         <span>线条名称</span>
                         <el-select :popper-append-to-body="false" :disabled="disableStatus" v-model="lineId"
@@ -165,6 +173,15 @@
                     callback()
                 }
             }
+
+             const groupname = (rule, value, callback) => {
+                if (!this.groupname && this.type > 1) {
+                    callback(new Error('不能为空'))
+                } else {
+                    callback()
+                }
+            }
+
             const lineId = (rule, value, callback) => {
                 if (!this.lineId && this.type > 1) {
                     callback(new Error('不能为空'))
@@ -252,6 +269,11 @@
                         trigger: 'blur',
                         validator: lineName
                     }],
+                    groupname: [{
+                        required: true,
+                        trigger: 'blur',
+                        validator: groupname
+                    }],
                     lineId: [{
                         required: true,
                         trigger: 'change',
@@ -342,6 +364,7 @@
 
                 },
                 lineId: '',
+                groupname: 'default',
                 unitId: '',
                 moduleId: '',
                 typeOptions: [{
@@ -440,6 +463,7 @@
                     this.lineId = this.infolist.lineId;
                     this.unitId = this.infolist.unitId;
                     this.moduleId = this.infolist.moduleId;
+                    this.groupname = this.infolist.groupname;
                     return
                 } else if (v === 2) {
                     this.titname = '修改';
@@ -448,6 +472,7 @@
                     this.lineId = this.infolist.lineId;
                     this.unitId = this.infolist.unitId;
                     this.moduleId = this.infolist.moduleId;
+                    this.groupname = this.infolist.groupname;
                 } else if (v === 3) {
                     this.titname = '添加';
                     this.disableStatus = false;
@@ -471,6 +496,7 @@
                     this.infolist.lineId = this.lineId;
                     this.infolist.unitId = this.unitId;
                     this.infolist.moduleId = this.moduleId;
+                    this.infolist.groupname = this.groupname;
                     if (this.titname === '添加') {
                         let url = '';
                         if (this.type == '1') {

+ 502 - 0
src/pages/main/gridDivision/approvalExamination.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="simple-container approvalExamination-container">
+    <simple-form
+      :form="table_form"
+      :handle="table_handle"
+      @search="handleSearch"
+      @track="handleQueryTrack"
+      @batch="handleBatch"
+      @turn="handleReturn"
+    >
+    </simple-form>
+    <simple-table
+      :list="table_list"
+      :config="table_config"
+      :loading="table_loading"
+      :handle-row="table_handle_row"
+      @download="handleDownload"
+      @selection="handleSelect"
+      @back="handleBack"
+    ></simple-table>
+    <simple-pagination
+      :page="page"
+      :total="total"
+      @change="handleChange"
+    ></simple-pagination>
+    <simple-dialog
+      title="审批"
+      width="40%"
+      @cancel="handleVisible('opinion')"
+      :visible="opinion_visible"
+    >
+      <el-form label-width="80px" :model="opinion_form" ref="opinion_ref">
+        <el-form-item label="审批意见" prop="opinion">
+          <el-input
+            :rows="8"
+            type="textarea"
+            v-model="opinion_form.opinion"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <template v-slot:footer>
+        <div>
+          <el-button v-if="!isAgree" @click="handleOpinion('1')" type="default"
+            >退回修改</el-button
+          >
+          <el-button v-else @click="handleOpinion('0')" type="primary"
+            >同意</el-button
+          >
+        </div>
+      </template>
+    </simple-dialog>
+    <simple-dialog
+      title="审批轨迹"
+      :fullscreen="true"
+      @cancel="handleVisible('track')"
+      :visible="track_visible"
+    >
+      <simple-table
+        :list="table_list_track"
+        :config="table_config_track"
+        :loading="table_loading_track"
+      ></simple-table>
+      <template v-slot:footer>
+        <!-- <div>
+          <el-button @click="handleVisible('track')" type="default"
+            >退回修改</el-button
+          >
+          <el-button @click="handleConsent" type="primary">同意</el-button>
+        </div> -->
+        <el-button @click="handleConsent" type="primary">确定</el-button>
+      </template>
+    </simple-dialog>
+  </div>
+</template>
+
+<script>
+import simpleForm from "../performance/components/form.vue";
+import simpleTable from "../performance/components/table.vue";
+import simpleDialog from "../performance/components/dialog.vue";
+import simplePagination from "../performance/components/pagination.vue";
+export default {
+  components: {
+    simpleForm,
+    simpleDialog,
+    simpleTable,
+    simplePagination,
+  },
+  data() {
+    return {
+      // 审批意见
+      opinion_visible: false,
+      track_visible: false,
+      opinion_form: {},
+      status: "",
+      isAgree: false,
+      // 单条审批id
+      ids: "",
+      parentId: "",
+      adoptIds: [],
+      page: 1,
+      rows: 10,
+      total: 0,
+      table_form: [
+        {
+          label: "公司名称",
+          props: "companyName",
+          type: "input",
+        },
+        {
+          label: "状态",
+          props: "sts",
+          type: "select",
+          // 0.待办  1.已办
+          dictionary: [
+            {
+              label: "待办",
+              value: "0",
+            },
+            {
+              label: "已办",
+              value: "1",
+            },
+          ],
+        },
+      ],
+      table_loading: false,
+      table_handle: [
+        {
+          label: "返回",
+          props: "turn",
+        },
+        {
+          label: "审批轨迹",
+          props: "track",
+        },
+        {
+          label: "批量审批",
+          props: "batch",
+        },
+      ],
+      // 列表数据
+      table_list: [],
+      // 表头配置
+      table_config: [
+        {
+          label: "序号",
+          props: "No",
+        },
+        {
+          label: "公司名称",
+          props: "companyName",
+        },
+        {
+          label: "提出人",
+          props: "proposer",
+        },
+        {
+          label: "联系电话",
+          props: "telephone",
+        },
+        {
+          label: "网格划分需求",
+          props: "wanggeText",
+        },
+        {
+          label: "附件",
+          props: "attList",
+          type: "file",
+        },
+        {
+          label: "状态",
+          props: "sts",
+          type: "dictionary",
+          dictionary: { 0: "待办", 1: "已办" },
+        },
+      ],
+      //   表格里的操作按钮
+      table_handle_row: [
+        {
+          label: "不通过",
+          props: "back",
+          visible: { sts: ["0"] },
+        },
+        {},
+        {},
+      ],
+      table_loading_track: false,
+      // 审批轨迹内表数据
+      table_list_track: [],
+      // 审批轨迹内表头配置
+      table_config_track: [
+        {
+          label: "编号",
+          props: "No",
+        },
+        {
+          label: "流程环节",
+          props: "liuchengName",
+        },
+        {
+          label: "处理人",
+          props: "createId",
+        },
+        {
+          label: "处理工号",
+          props: "createName",
+        },
+        {
+          label: "处理时间",
+          props: "createTime",
+        },
+        {
+          label: "审批意见",
+          props: "desc",
+          // type: "dictionary",
+          // dictionary: { 0: "同意", 1: "不同意" },
+        },
+      ],
+    };
+  },
+  watch: {
+    parentId() {
+      this.handleInit();
+    },
+  },
+  mounted() {
+    this.parentId = this.$route.query.parentId;
+    this.status = this.$route.query.status;
+  },
+  methods: {
+    // 表格数据初始化
+    handleInit() {
+      this.table_loading = true;
+      let reqdata = {
+        ...this.table_search,
+        type: "2",
+        page: this.page,
+        parentId: this.parentId,
+        pageSize: this.rows,
+      };
+      this.$http({
+        url: "/market/mkWangge/queryPage",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: reqdata,
+      }).then(({ data: body }) => {
+        this.table_loading = false;
+        console.log(body.body);
+
+        // 列表数据回显
+        let data = body.body.page.data;
+        let count = body.body.page.count;
+
+        this.total = count;
+        this.table_list = data
+          ? data.map((element, index) => ({
+              ...element,
+              No: index + 1,
+              sts: this.status + "",
+            }))
+          : [];
+        this.table_list.length && this.table_list[0].sts === "0"
+          ? (this.table_handle = [
+              {
+                label: "返回",
+                props: "turn",
+              },
+              {
+                label: "审批轨迹",
+                props: "track",
+              },
+              {
+                label: "批量审批",
+                props: "batch",
+              },
+            ])
+          : (this.table_handle = [
+              {
+                label: "返回",
+                props: "turn",
+              },
+              {
+                label: "审批轨迹",
+                props: "track",
+              },
+            ]);
+        if (data.length) {
+          data.forEach((item) => {
+            this.adoptIds.push(item.wanggeId.toString());
+          });
+        }
+        // console.log(this.table_list,'table_list');
+        // console.log(this.adoptIds);
+      });
+    },
+    // 搜索事件
+    handleSearch(data) {
+      this.table_search = data;
+      this.page = 1;
+      this.handleInit();
+    },
+    // 翻页
+    handleChange(page) {
+      this.page = page;
+      this.handleInit();
+    },
+    handleDownload({ index, rows }) {
+      let fileName = "";
+      let fileCode = "";
+      rows.attList.forEach((el, no) => {
+        if (no === index) {
+          fileName = el.fileName;
+          fileCode = el.fileCode;
+        }
+      });
+      console.log(index, rows);
+      console.log(fileName, fileCode);
+      this.$http({
+        url: "/market/compatt/downfile",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        responseType: "blob",
+        data: { id: fileCode, fileName: fileName },
+      }).then((response) => {
+        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+          let blob = new Blob([response.data], {
+            type: "application/vnd.ms-excel",
+          });
+          window.navigator.msSaveOrOpenBlob(blob, fileName);
+        } else {
+          /* 火狐谷歌的文件下载方式 */
+          var blob = new Blob([response.data]);
+          var downloadElement = document.createElement("a");
+          var href = window.URL.createObjectURL(blob);
+          downloadElement.href = href;
+          downloadElement.download = fileName;
+          document.body.appendChild(downloadElement);
+          downloadElement.click();
+          document.body.removeChild(downloadElement);
+          window.URL.revokeObjectURL(href);
+        }
+      });
+
+      // // /market/compatt/downfile
+      // console.log(item);
+    },
+    handleVisible(props) {
+      switch (props) {
+        case "opinion":
+          this.opinion_visible = !this.opinion_visible;
+          this.isAgree = false;
+          this.opinion_form = {};
+          break;
+        case "track":
+          this.track_visible = !this.track_visible;
+          break;
+        case "batch":
+          this.opinion_visible = !this.opinion_visible;
+          this.isAgree = true;
+          break;
+      }
+    },
+    // 查询审批轨迹
+    handleQueryTrack() {
+      // let reqdata = {
+      //   id: Number(this.parentId),
+      // }
+      this.$http({
+        url: "/market/mkWanggeLog/selectList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: this.parentId + "",
+      }).then(({ data }) => {
+        let body = data.body;
+        console.log(body, "body");
+        this.table_list_track = body.map((item, index) => ({
+          ...item,
+          No: index + 1,
+        }));
+      });
+      this.handleVisible("track");
+    },
+    // 批量审批
+    handleBatch() {
+      this.handleVisible("batch");
+    },
+    handleSelect(val) {
+      console.log(val);
+    },
+    // 审批不通过
+    handleBack(row) {
+      // console.log(row);
+      this.ids = row.wanggeId.toString();
+      this.handleVisible("opinion");
+      this.isAgree = false;
+    },
+    // 审批意见提交
+    handleOpinion(type) {
+      let reqdata = {};
+      if (type === "1") {
+        // 批量退回
+        reqdata = {
+          parentId: this.parentId,
+          remark: this.opinion_form.opinion,
+          wanggeId: this.ids,
+        };
+        console.log(reqdata);
+        this.$http({
+          url: "/market/mkWangge/backList",
+          method: "post",
+          headers: {
+            "Content-Type": "application/json",
+          },
+          data: {
+            ...reqdata,
+          },
+        }).then(({ data }) => {
+          console.log(data);
+          if (data.desc === "操作成功") {
+            this.$message({
+              message: "操作成功!",
+              type: "success",
+            });
+          } else if (data.desc === "操作失败") {
+            this.$message({
+              message: "操作失败!",
+              type: "error",
+            });
+          }
+          this.handleInit();
+        });
+      } else {
+        // 批量审批(多条)
+        reqdata = {
+          adoptIds: this.adoptIds,
+          remark: this.opinion_form.opinion,
+          parentId: this.parentId,
+          type: type,
+        };
+        console.log(reqdata);
+        this.$http({
+          url: "/market/mkWangge/reviewMore",
+          method: "post",
+          headers: {
+            "Content-Type": "application/json",
+          },
+          data: {
+            ...reqdata,
+          },
+        }).then(({ data }) => {
+          console.log(data);
+          this.status = "1";
+          if (data.desc === "操作成功") {
+            this.$message({
+              message: "操作成功!",
+              type: "success",
+            });
+          } else if (data.desc === "操作失败") {
+            this.$message({
+              message: "操作失败!",
+              type: "error",
+            });
+          }
+          this.handleInit();
+        });
+      }
+
+      this.handleVisible("opinion");
+    },
+    handleReturn() {
+      this.$router.go(-1);
+    },
+    // 审批轨迹--确定关闭模态框
+    handleConsent() {
+      this.handleVisible("track");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.approvalExamination-container {
+  background: #ffffff;
+  padding: 0 20px;
+  padding-top: 20px;
+  margin: 15px;
+  overflow: auto;
+  width: calc(100% - 30px);
+  max-width: calc(100% - 30px);
+  height: 100%;
+  overflow-x: hidden;
+}
+::v-deep .el-row {
+  padding-bottom: 12px;
+}
+</style>

+ 809 - 0
src/pages/main/gridDivision/workersList.vue

@@ -0,0 +1,809 @@
+<template>
+  <div class="simple-container workersList-container">
+    <simple-form
+      :form="table_form"
+      :handle="table_handle"
+      @search="handleSearch"
+      @summary="handleVisible('summary')"
+      @add="handleVisible('add')"
+    >
+    </simple-form>
+    <simple-table
+      :list="table_list"
+      :config="table_config"
+      :loading="table_loading"
+      :multiple="true"
+      :handle-row="table_handle_row"
+      @selection="handleSelect"
+      :selectable="handleSelectFilter"
+      @check="handleCheck"
+      @edit="handleEdit"
+      @approve="handleApprove"
+    ></simple-table>
+    <simple-pagination
+      :page="page"
+      :total="total"
+      @change="handleChange"
+    ></simple-pagination>
+    <simple-dialog
+      :title="title"
+      :fullscreen="true"
+      @cancel="handleVisible('add')"
+      :visible="add_visible"
+    >
+      <el-form
+        label-width="120px"
+        :rules="rules"
+        :model="add_form"
+        ref="add_ref"
+      >
+        <el-form-item label="提出人" prop="proposer">
+          <el-input
+            :disabled="title === '审批' || title === '查看'"
+            v-model="add_form.proposer"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话" prop="telephone">
+          <el-input
+            :disabled="title === '审批' || title === '查看'"
+            v-model="add_form.telephone"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="网格划分需求" prop="wanggeText">
+          <el-input
+            type="textarea"
+            :disabled="title === '审批' || title === '查看'"
+            v-model="add_form.wanggeText"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="附件上传" prop="file">
+          <!-- <myUpload
+            v-if="title === '新建' || title === '发起人处理'"
+            @uploadBack="uploadBack"
+            :fileInfo="fileInfo"
+            :fileList="fileInfo.fileList"
+          ></myUpload> -->
+          <el-upload
+            v-if="title === '新建' || title === '发起人处理'"
+            class="upload-demo"
+            drag
+            :limit="3"
+            :on-exceed="uploadExceed"
+            :on-remove="uploadRemove"
+            :http-request="uploadBack"
+            action="http://192.168.1.228:9600/spfm"
+            multiple
+            :file-list="file"
+          >
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">
+              将文件拖到此处,或<em>点击上传</em>
+            </div>
+          </el-upload>
+          <div v-else>
+            <div v-if="file.length === 0">暂无附件</div>
+            <div
+              v-for="(item, index) in file"
+              :key="index"
+              class="simple-table-click cursor-pointer margin-left-10"
+              @click="handleDownload(item)"
+            >
+              {{ item.fileName }}
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="审批轨迹" prop="" v-if="edit_visible">
+          <simple-table
+            :list="table_list_approve"
+            :config="table_config_approve"
+            :loading="table_loading_approve"
+          ></simple-table>
+        </el-form-item>
+        <el-form-item
+          label="审批意见"
+          prop="desc"
+          v-if="edit_visible && approve_visible"
+        >
+          <el-input type="textarea" v-model="add_form.remark"></el-input>
+        </el-form-item>
+      </el-form>
+      <template v-slot:footer>
+        <div v-if="title === '新建'">
+          <el-button @click="handleSubmit('save')" type="primary"
+            >保存</el-button
+          >
+          <el-button @click="handleSubmit('add')" type="primary"
+            >提交</el-button
+          >
+          <el-button @click="handleVisible('add')" type="default"
+            >取消</el-button
+          >
+        </div>
+        <div v-else-if="title === '查看'">
+          <div>
+            <el-button @click="handleVisible('add')" type="primary"
+              >确定</el-button
+            >
+          </div>
+        </div>
+        <div v-else-if="title === '发起人处理'">
+          <el-button @click="handleSubmit('save')" type="primary"
+            >保存</el-button
+          >
+          <el-button @click="handleSubmit('add')" type="primary"
+            >重新提交</el-button
+          >
+          <el-button @click="handleVisible('add')" type="default"
+            >取消</el-button
+          >
+        </div>
+        <div v-else>
+          <el-button @click="handleSubmit('adopt')" type="primary"
+            >保存</el-button
+          >
+          <el-button @click="handleSubmit('failed')" type="default"
+            >退回修改</el-button
+          >
+          <el-button @click="handleVisible('add')" type="default"
+            >取消</el-button
+          >
+        </div>
+      </template>
+    </simple-dialog>
+    <simple-dialog
+      title="工单汇总"
+      width="40%"
+      @cancel="handleVisible('summary')"
+      @confirm="handleSummary"
+      :visible="summary_visible"
+    >
+      <div class="summary">
+        <p>是否要对所选工单进行汇总?</p>
+        <p class="summary-tip">
+          可对未审批的区县网格划分审批工单合并为同一条工单,由相关审批人员进行审批,减少审批工作量
+        </p>
+      </div>
+    </simple-dialog>
+  </div>
+</template>
+
+<script>
+// import myUpload from "../../../components/upload";
+import simpleForm from "../performance/components/form.vue";
+import simpleTable from "../performance/components/table.vue";
+import simpleDialog from "../performance/components/dialog.vue";
+import simplePagination from "../performance/components/pagination.vue";
+
+export default {
+  components: {
+    simpleForm,
+    simpleDialog,
+    // myUpload,
+    simpleTable,
+    simplePagination,
+  },
+  data() {
+    const chcekPhone = (rule, value, callback) => {
+      const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/;
+      if (!value) {
+        return callback(new Error("联系人为空"));
+      }
+
+      setTimeout(() => {
+        if (!Number.isInteger(+value)) {
+          callback(new Error("请输入数字值"));
+        } else {
+          if (phoneReg.test(value)) {
+            callback();
+          } else {
+            callback(new Error("联系人格式不正确"));
+          }
+        }
+      }, 100);
+    };
+    return {
+      rules: {
+        proposer: [
+          {
+            required: true,
+            message: "提出人不能为空",
+            trigger: "blur",
+          },
+        ],
+        telephone: [
+          {
+            required: true,
+            // message: "联系电话不能为空",
+            trigger: "blur",
+            validator: chcekPhone,
+          },
+        ],
+        wanggeText: [
+          {
+            required: true,
+            message: "网格划分需求不能为空",
+            trigger: "blur",
+          },
+        ],
+      },
+      file: [],
+      file1: "",
+      file2: "",
+      file3: "",
+      // 删除的文件
+      delFile: "",
+      // 暂存删除文件
+      tmpDeleteFile: [],
+      // 当前用户标识
+      loginNoStr: "",
+      fileInfo: {
+        limit: 3,
+        url: "/market/mkWangge/upload",
+        fileList: [],
+      },
+      attList: [],
+      page: 1,
+      rows: 10,
+      total: 0,
+      // 模态框标题
+      title: "",
+      // 是否为查看状态
+      isCheck: false,
+      // 汇总id列表
+      summaryIds: [],
+      table_search: {},
+      // 新建模态框
+      add_visible: false,
+      summary_visible: false,
+      edit_visible: false,
+      approve_visible: false,
+      ids: [],
+      add_form: {},
+      table_handle: [
+        {
+          label: "工单汇总",
+          props: "summary",
+        },
+        {
+          label: "新建",
+          props: "add",
+        },
+      ],
+      table_form: [
+        {
+          label: "公司名称",
+          props: "companyName",
+          type: "input",
+        },
+        {
+          label: "状态",
+          props: "sts",
+          type: "select",
+          // 0.待办  1.已办
+          dictionary: [
+            {
+              label: "待办",
+              value: "0",
+            },
+            {
+              label: "已办",
+              value: "1",
+            },
+          ],
+        },
+      ],
+      // 列表数据
+      table_list: [],
+      table_loading: false,
+      //   表格里的操作按钮
+      table_handle_row: [
+        {
+          label: "查看",
+          props: "check",
+        },
+        {
+          label: "编辑",
+          props: "edit",
+          visible: {
+            isEdit: ["1"],
+          },
+        },
+        {
+          label: "处理",
+          props: "approve",
+          visible: {
+            deal: ["1"],
+          },
+        },
+      ],
+      //  表头配置
+      table_config: [
+        {
+          label: "序号",
+          props: "No",
+        },
+        {
+          label: "公司名称",
+          props: "companyName",
+        },
+        {
+          label: "发起人",
+          props: "proposer",
+        },
+        {
+          label: "发起时间",
+          props: "createTime",
+        },
+        {
+          label: "状态",
+          props: "sts",
+          type: "dictionary",
+          dictionary: { 0: "待办", 1: "已办" },
+        },
+      ],
+      // 模态框内表数据
+      table_list_approve: [],
+      table_loading_approve: false,
+      // 模态框内表头配置
+      table_config_approve: [
+        {
+          label: "编号",
+          props: "No",
+        },
+        {
+          label: "流程环节",
+          props: "liuchengName",
+        },
+        {
+          label: "处理人",
+          props: "createId",
+        },
+        {
+          label: "处理工号",
+          props: "createName",
+        },
+        {
+          label: "处理时间",
+          props: "createTime",
+        },
+        {
+          label: "审批意见",
+          props: "desc",
+          // type: "dictionary",
+          // dictionary: { 0: "同意", 1: "不同意" },
+        },
+      ],
+    };
+  },
+  mounted() {
+    this.handleInit();
+    this.loginNoStr = JSON.parse(sessionStorage.getItem("userInfo")).loginNoStr;
+  },
+  methods: {
+    // 表格数据初始化
+    handleInit() {
+      this.table_loading = true;
+      // console.log(data);
+      let reqdata = {
+        ...this.table_search,
+        type: "1",
+        page: this.page,
+        pageSize: this.rows,
+      };
+      this.$http({
+        url: "/market/mkWangge/queryPage",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: reqdata,
+      }).then(({ data: body }) => {
+        this.table_loading = false;
+        console.log(body.body);
+
+        // 汇总或新建权限判断是否显示按钮
+        let huiZongButton = body.body.huiZongButton;
+        let insertButton = body.body.insertButton;
+
+        if (huiZongButton && insertButton) {
+          this.table_handle = [
+            {
+              label: "工单汇总",
+              props: "summary",
+            },
+            {
+              label: "新建",
+              props: "add",
+            },
+          ];
+        } else if (huiZongButton && !insertButton) {
+          this.table_handle = [
+            {
+              label: "工单汇总",
+              props: "summary",
+            },
+          ];
+        } else if (!huiZongButton && insertButton) {
+          this.table_handle = [
+            {
+              label: "新建",
+              props: "add",
+            },
+          ];
+        } else {
+          this.table_handle = [];
+        }
+
+        // 列表数据回显
+        let data = body.body.page.data;
+        let count = body.body.page.count;
+
+        this.total = count;
+        this.table_list = data
+          ? data.map((element, index) => ({
+              ...element,
+              id: element.id + "",
+              deal: element.draft === "1" && element.sts === "0" ? "1" : "0",
+              isEdit:
+                element.draft === "0" &&
+                element.createId === this.loginNoStr &&
+                element.parentLevel === "0"
+                  ? "1"
+                  : "0",
+              No: index + 1,
+            }))
+          : [];
+        // console.log(this.table_list);
+      });
+    },
+    // 搜索事件
+    handleSearch(data) {
+      this.table_search = data;
+      this.page = 1;
+      this.handleInit();
+    },
+    handleVisible(props) {
+      this.approve_visible = false;
+      switch (props) {
+        case "add":
+          this.add_visible = !this.add_visible;
+          this.edit_visible = false;
+          this.approve_visible = false;
+          this.title = "新建";
+          this.isCheck = false;
+          this.add_form = {};
+          this.file = [];
+          break;
+        case "summary":
+          this.summary_visible = !this.summary_visible;
+          break;
+
+        case "edit":
+          this.edit_visible = !this.edit_visible;
+          this.add_visible = !this.add_visible;
+          this.title = "发起人处理";
+          this.isCheck = false;
+          break;
+        case "check":
+          this.edit_visible = !this.edit_visible;
+          this.add_visible = !this.add_visible;
+          this.title = "查看";
+          this.isCheck = true;
+          break;
+        case "approve":
+          this.edit_visible = !this.edit_visible;
+          this.add_visible = !this.add_visible;
+          this.title = "审批";
+          this.isCheck = false;
+          this.approve_visible = !this.approve_visible;
+          break;
+      }
+    },
+    handleSelect(val) {
+      this.summaryIds = val.map((item) => {
+        return item.wanggeId + "";
+      });
+      // console.log(this.summaryIds);
+    },
+    //文件返回值
+    uploadBack({ file }) {
+      // console.log( file instanceof Object,'sasdas');
+      this.file.push(file);
+      console.log(this.file, "file");
+      this.file1 = this.file[0];
+      this.file2 = this.file[1];
+      this.file3 = this.file[2];
+    },
+    // 删除文件
+    uploadRemove(file) {
+      console.log(file,'dada');
+      this.file.forEach((item, index) => {
+        if (item.uid === file.uid) {
+          this.file.splice(index, 1);
+          if (item.id) {
+            this.tmpDeleteFile.push(item.id);
+            // this.delFile = this.delFile + item.id + ','
+            this.delFile = this.tmpDeleteFile.join(",");
+          }
+        }
+      });
+      this.file1 = this.file[0];
+      this.file2 = this.file[1];
+      this.file3 = this.file[2];
+    },
+    // 超出文件上传限制
+    uploadExceed(file) {
+      this.$message({
+        message: "附件最多可上传3个!",
+        type: "error",
+      });
+      console.log(file);
+    },
+    // 获取模态框信息
+    getDialogData(row) {
+      let id = row.wanggeId;
+      let type = row.parentId === null ? "1" : "0";
+      this.$http({
+        url: "/market/mkWangge/getMkWanggeById",
+        method: "get",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        params: {
+          id,
+          type,
+        },
+      }).then(({ data: { body } }) => {
+        // console.log(body, "body");
+        this.ids = [body.wanggeId.toString()];
+        this.add_form = {
+          id: body.wanggeId,
+          proposer: body.proposer,
+          telephone: body.telephone,
+          wanggeText: body.wanggeText,
+          fileNames: body.fileNames,
+          fileIds: body.fileIds,
+        };
+        this.table_list_approve = body.mkWanggeLogList
+          ? body.mkWanggeLogList.map((item, index) => ({
+              ...item,
+              No: index + 1,
+            }))
+          : [];
+        this.file = body.attList
+          ? body.attList.map((item) => ({
+              ...item,
+              name: item.fileName,
+            }))
+          : [];
+      });
+    },
+    // 查看按钮
+    handleCheck(row) {
+      if (row.parentLevel === "1") {
+        this.$router.push({
+          path: "/approvalExamination",
+          query: {
+            parentId: row.wanggeId.toString(),
+            status: row.sts.toString(),
+          },
+        });
+      } else {
+        this.getDialogData(row);
+        this.handleVisible("check");
+      }
+    },
+    // 编辑按钮
+    handleEdit(row) {
+      this.getDialogData(row);
+      this.handleVisible("edit");
+    },
+    // 处理按钮
+    handleApprove(row) {
+      if (row.parentLevel === "1") {
+        this.$router.push({
+          path: "/approvalExamination",
+          query: {
+            parentId: row.wanggeId.toString(),
+            status: row.sts.toString(),
+          },
+        });
+      } else {
+        this.getDialogData(row);
+        this.handleVisible("approve");
+      }
+    },
+    handleSubmit(type) {
+      // console.log(this.add_form);
+      // let _this = this;
+      let draft = "";
+      if (type === "add") {
+        draft = "1";
+      } else if (type === "save") {
+        draft = "0";
+      }
+      let isAdopt = "";
+      if (type === "adopt") {
+        isAdopt = "0";
+      } else if (type === "failed") {
+        isAdopt = "1";
+      }
+      this.$refs.add_ref.validate((valid) => {
+        if (valid) {
+          let formData = new FormData();
+          // console.log(this.file1,'adasdsa')
+          let reqdata = {
+            ...this.add_form,
+            procId: "729294602773110788",
+            draft: draft,
+            num: "1",
+            delFileId: this.delFile ? this.delFile : "",
+          };
+          // 这是处理文件的参数
+          this.file.forEach((el, index) => {
+            if (el.constructor.name === "File") {
+              formData.append(`file${index + 1}`, el);
+            }
+          });
+          // 表单的其他参数
+          for (let key in reqdata) {
+            formData.append(key, reqdata[key]);
+          }
+          // this.file1 ? formData.append("file1", this.file1) : "";
+          // this.file2 ? formData.append("file2", this.file2) : "";
+          // this.file3 ? formData.append("file3", this.file3) : "";
+          // this.file ? formData.append("file", this.file) : [] ;
+          // ;
+          if (!this.approve_visible) {
+            // 编辑/新增
+            this.$http({
+              url: "/market/mkWangge/saveOrUpdateList",
+              method: "post",
+              headers: {
+                "Content-Type": "multipart/form-data",
+              },
+              data: formData,
+            }).then((res) => {
+              console.log(res);
+              this.handleInit();
+              this.handleVisible("add");
+            });
+          } else {
+            // 审批
+            let reqdata = {
+              ids: this.ids,
+              remark: this.add_form.remark,
+              type: isAdopt,
+            };
+            console.log(reqdata, "reqdata");
+            this.$http({
+              url: "/market/mkWangge/review",
+              method: "post",
+              headers: {
+                "Content-Type": "application/json",
+              },
+              data: {
+                ...reqdata,
+              },
+            }).then((res) => {
+              console.log(res);
+              this.handleInit();
+              this.handleVisible("add");
+            });
+          }
+          // this.edit_visible = false;
+          // this.add_visible = false;
+          this.file = [];
+        }
+      });
+    },
+    handleSummary() {
+      if (this.summaryIds.length === 0) {
+        this.$message({
+          message: "还未选择要合并的项目",
+          type: "error",
+        });
+        this.handleVisible("summary");
+        return;
+      } else {
+        this.$http({
+          url: "/market/mkWangge/huizongWangge",
+          method: "post",
+          headers: {
+            "Content-Type": "application/json",
+          },
+          data: this.summaryIds,
+        }).then((res) => {
+          console.log(res);
+          if (res.data.result === 1) {
+            this.$message({
+              message: res.data.desc,
+              type: "error",
+            });
+          } else {
+            this.$message({
+              message: res.data.desc,
+              type: "success",
+            });
+          }
+          this.handleInit();
+        });
+        this.handleVisible("summary");
+      }
+    },
+    handleChange(page) {
+      this.page = page;
+      this.handleInit();
+    },
+    handleSelectFilter(row) {
+      // 过滤可被选中的数组
+      if (row.parentLevel === "1") {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    // 附件下载
+    handleDownload({ fileCode, fileName }) {
+      console.log(fileCode, fileName);
+      this.$http({
+        url: "/bpm/api/download",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        responseType: "blob",
+        data: { id: fileCode, fileName: fileName },
+      }).then((response) => {
+        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+          let blob = new Blob([response.data], {
+            type: "application/vnd.ms-excel",
+          });
+          window.navigator.msSaveOrOpenBlob(blob, fileName);
+        } else {
+          /* 火狐谷歌的文件下载方式 */
+          var blob = new Blob([response.data]);
+          var downloadElement = document.createElement("a");
+          var href = window.URL.createObjectURL(blob);
+          downloadElement.href = href;
+          downloadElement.download = fileName;
+          document.body.appendChild(downloadElement);
+          downloadElement.click();
+          document.body.removeChild(downloadElement);
+          window.URL.revokeObjectURL(href);
+        }
+      });
+      // // /market/compatt/downfile
+      // console.log(item);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.workersList-container {
+  background: #ffffff;
+  padding: 0 20px;
+  margin: 15px;
+  overflow: auto;
+  width: calc(100% - 30px);
+  max-width: calc(100% - 30px);
+  height: 100%;
+  overflow-x: hidden;
+}
+.simple-container .el-form-item {
+  padding-bottom: 22px;
+}
+.summary {
+  padding: 20px 50px 100px;
+  font-size: 16px;
+  .summary-tip {
+    color: #7f7f7f;
+    padding-top: 30px;
+  }
+}
+::v-deep .el-row {
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+</style>

+ 177 - 0
src/pages/main/performance/components/deptTreeOnly.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="treebox" v-loading="loading">
+    <el-tree
+      :highlight-current="true"
+      :check-strictly="true"
+      ref="tree"
+      :data="treeList"
+      node-key="o"
+      :default-checked-keys="defaultListc"
+      :default-expanded-keys="defaultListc"
+      @node-click="handleNodeClick"
+    >
+      <span class="custom-tree-node" slot-scope="{ node }">
+        <em
+          style="display: inline-block; width: 20px"
+          v-if="node.data.haveUserFlag == 'N' && node.data.children.length == 0"
+        ></em>
+        <i
+          class="el-icon-caret-right"
+          v-if="node.data.haveUserFlag == 'Y' && node.data.children.length == 0"
+        ></i>
+        <el-checkbox
+          @change="handleCheckChange(node)"
+          style="margin-right: 10px"
+          v-model="node.checked"
+          v-if="node.data.type == 1"
+        ></el-checkbox>
+        <span>{{ node.label }}</span>
+      </span>
+    </el-tree>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["defaultList", "type", "closeList", "resetList", "only"],
+  data() {
+    return {
+      treeList: [],
+      opt: [],
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      defaultListc: [],
+      loading: false,
+    };
+  },
+  methods: {
+    getTree() {
+      this.loading = true;
+      this.$http({
+        url: "/sysmgr/csysdept/queryAllList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {},
+      }).then((res) => {
+        this.treeList = res.data;
+        this.loading = false;
+      });
+      // const info = JSON.parse(sessionStorage.userInfo);
+      // console.log(info, "JSON.parse(sessionStorage.userInfo)");
+      // this.treeList = [
+      //   {
+      //     children: [],
+      //     o: info.groupId,
+      //     label: `${info.groupName}`,
+      //     haveUserFlag: "Y",
+      //     ou: `${info.groupName}`,
+      //   },
+      // ];
+    },
+    handleNodeClick(v) {
+      let s = false;
+      if (v.children && v.children.length == 0) {
+        s = true;
+      }
+      if (v.type) {
+        return;
+      }
+      if (
+        v.children &&
+        v.children.length > 0 &&
+        v.children[v.children.length - 1].type == 1
+      ) {
+        return;
+      }
+      this.loading = true;
+      console.log(v);
+      this.$http({
+        url: "/sysmgr/sysuserinfo/queryList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {
+          groupId: v.o,
+        },
+      }).then((res) => {
+        v.children = v.children ? v.children : [];
+        res.data.forEach((item) => {
+          v.children.push({
+            id: item.groupId,
+            label: item.loginNameStr,
+            type: 1,
+            displayname: v.displayname,
+            loginNoStr: item.loginNoStr,
+            o: item.id,
+          });
+        });
+        this.loading = false;
+      });
+      for (let i = 0; i < this.$refs.tree.store._getAllNodes().length; i++) {
+        if (s && v.o == this.$refs.tree.store._getAllNodes()[i].data.o) {
+          this.$refs.tree.store._getAllNodes()[i].expanded = true;
+        }
+      }
+    },
+    handleCheckChange() {
+      console.log(this.only, "only");
+      const nodeList = this.$refs.tree.store.getCheckedNodes();
+      if (this.only) {
+        if (nodeList.length === 1) {
+          this.$emit("treeCheck", nodeList);
+        } else if (nodeList.length === 0) {
+          this.$refs.tree.setCheckedKeys([]);
+          this.$emit("treeCheck", nodeList);
+        } else {
+          let obj = { ...nodeList[0] };
+          this.$refs.tree.setCheckedKeys([]);
+          this.$nextTick(() => {
+            this.$refs.tree.setChecked(obj, true);
+          });
+          this.$message.error("这里只能选择一个审批人");
+        }
+      } else if (!this.only) {
+        this.$emit("treeCheck", nodeList);
+      }
+    },
+  },
+  created() {
+    this.getTree();
+    this.defaultListc = this.defaultList;
+  },
+  watch: {
+    type() {
+      this.defaultListc = this.defaultList;
+      this.$forceUpdate();
+    },
+    defaultList() {
+      this.$forceUpdate();
+    },
+    closeList() {
+      this.$refs.tree.setCheckedKeys([]);
+      if ([...this.resetList] && [...this.resetList].length > 0) {
+        [...this.resetList].forEach((el) => {
+          this.$nextTick(() => {
+            this.$refs.tree.setChecked(el, true);
+          });
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.el-icon-caret-right {
+  color: #ccc;
+  margin: 0 5px;
+}
+.treebox {
+  border: 1px solid #ddd;
+}
+</style>

+ 75 - 79
src/pages/main/performance/components/form.vue

@@ -1,94 +1,90 @@
 <!--
  * @Author       : yuanrunwei
  * @Date         : 2021-11-01 18:03:02
- * @LastEditors  : yuanrunwei
- * @LastEditTime : 2021-12-04 17:53:54
+ * @LastEditors: Please set LastEditors
+ * @LastEditTime: 2022-01-10 19:27:43
  * @FilePath     : \spfm-market-front\src\pages\main\performance\components\form.vue
 -->
 <template>
-    <el-form :inline="true" :model="object">
-        <el-row :gutter="24">
-            <el-col
-                v-for="({ props, label, type, dictionary }, index) in form"
+  <el-form :inline="true" :model="object">
+    <el-row :gutter="24">
+      <el-col
+        v-for="({ props, label, type, dictionary }, index) in form"
+        :key="index"
+        :span="6"
+      >
+        <el-form-item :label="label">
+          <template v-if="type === 'select'">
+            <el-select
+              v-model="object[props]"
+              :placeholder="label"
+              filterable
+              clearable
+            >
+              <el-option
+                :label="label"
+                :value="value"
+                v-for="({ label, value }, index) in dictionary"
                 :key="index"
-                :span="6"
+              ></el-option>
+            </el-select>
+          </template>
+          <template v-else-if="['datetime', 'date', 'month'].includes(type)">
+            <el-date-picker
+              v-model="object[props]"
+              :type="type"
+              :placeholder="label"
             >
-                <el-form-item :label="label">
-                    <template v-if="type === 'select'">
-                        <el-select
-                            v-model="object[props]"
-                            :placeholder="label"
-                            filterable
-                            clearable
-                        >
-                            <el-option
-                                :label="label"
-                                :value="value"
-                                v-for="({ label, value }, index) in dictionary"
-                                :key="index"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template v-else-if="['date', 'month'].includes(type)">
-                        <el-date-picker
-                            v-model="object[props]"
-                            :type="type"
-                            :placeholder="label"
-                        >
-                        </el-date-picker>
-                    </template>
-                    <template v-else>
-                        <el-input
-                            v-model="object[props]"
-                            :placeholder="label"
-                            clearable
-                        ></el-input>
-                    </template>
-                </el-form-item>
-            </el-col>
-            <el-col :span="6">
-                <el-form-item>
-                    <el-button type="primary" @click="handleSearch"
-                        >搜索</el-button
-                    >
-                </el-form-item>
-            </el-col>
-            <el-col class="flex-justify-align-end" :span="24">
-                <el-button
-                    v-for="({ label, props }, index) in handle"
-                    :key="index"
-                    @click="handleSubmit(props)"
-                >
-                    <i class="el-icon-document-add font-weight-bold" />{{
-                        label
-                    }}
-                </el-button>
-            </el-col>
-        </el-row>
-    </el-form>
+            </el-date-picker>
+          </template>
+          <template v-else>
+            <el-input
+              v-model="object[props]"
+              :placeholder="label"
+              clearable
+            ></el-input>
+          </template>
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
+        <el-form-item>
+          <el-button type="primary" @click="handleSearch">搜索</el-button>
+        </el-form-item>
+      </el-col>
+      <el-col class="flex-justify-align-end" :span="24">
+        <el-button
+          v-for="({ label, props, unlogo }, index) in handle"
+          :key="index"
+          @click="handleSubmit(props)"
+        >
+          <i v-if="!unlogo" class="el-icon-document-add font-weight-bold" />{{ label }}
+        </el-button>
+      </el-col>
+    </el-row>
+  </el-form>
 </template>
 <script>
 export default {
-    props: {
-        form: {
-            type: Array,
-            default: () => [],
-        },
-        handle: {
-            type: Array,
-            default: () => [],
-        },
+  props: {
+    form: {
+      type: Array,
+      default: () => [],
+    },
+    handle: {
+      type: Array,
+      default: () => [],
+    },
+  },
+  data: () => ({
+    object: {},
+  }),
+  methods: {
+    handleSearch() {
+      this.$emit("search", this.object);
     },
-    data: () => ({
-        object: {},
-    }),
-    methods: {
-        handleSearch() {
-            this.$emit("search", this.object);
-        },
-        handleSubmit(params) {
-            this.$emit(params, this.object);
-        },
+    handleSubmit(params) {
+      this.$emit(params, this.object);
     },
+  },
 };
 </script>

ファイルの差分が大きいため隠しています
+ 999 - 449
src/pages/main/performance/components/sheet.vue


+ 224 - 149
src/pages/main/performance/components/table.vue

@@ -2,166 +2,241 @@
  * @Author       : yuanrunwei
  * @Date         : 2021-11-01 18:02:58
  * @LastEditors: Please set LastEditors
- * @LastEditTime: 2021-12-22 19:55:28
- * @FilePath     : \spfm-market-front\src\pages\main\performance\components\table.vue
+ * @LastEditTime: 2022-02-10 11:17:50
+ * @FilePath     : /spfm-market-front/src/pages/main/performance/components/table.vue
 -->
 <template>
-    <el-table class="simple-table" :data="computed_list" v-loading="loading">
+  <el-table
+    class="simple-table"
+    :data="computed_list"
+    v-loading="loading"
+    @selection-change="handleSelectionChange"
+  >
+    <el-table-column
+      type="selection"
+      width="55"
+      :selectable="selectable"
+      v-if="multiple"
+    />
+    <el-table-column
+      v-for="(
+        { props, label, type, width, align, children, dictionary, control },
+        index
+      ) in config"
+      :key="index"
+      :prop="props"
+      :width="width"
+      :label="label"
+      :align="align || 'center'"
+    >
+      <template #default="scope">
+        <div v-if="type === 'edit'">
+          <el-input
+            v-if="scope.row[`edit`]"
+            v-model="scope.row[props]"
+            autosize
+            type="textarea"
+            @change="handleModify"
+          />
+        </div>
+        <div v-if="type === 'number'">{{ scope.$index + 1 }}</div>
+        <div v-else-if="type === 'textarea'">
+          <pre class="simple-table-break">{{ scope.row[props] }}</pre>
+        </div>
+        <div v-else-if="type === 'date'">
+          <div>{{ $formatDate(scope.row[props], "YYYY-MM-DD") }}</div>
+        </div>
+        <div v-else-if="type === 'time'">
+          <div>
+            {{ $formatDate(scope.row[props], "YYYY-MM-DD HH:00:00") }}
+          </div>
+        </div>
+        <div v-else-if="type === 'click'">
+          <div
+            v-if="control && Number(scope.row[control]) < 1 && scope.row[props]"
+          >
+            <span
+              v-for="(item, index) in scope.row[props].split(',')"
+              :key="index"
+              class="simple-table-click cursor-pointer"
+              @click="handleClick(props, { ...scope.row, index })"
+            >
+              {{ scope.row[props].split(",")[index] }}
+            </span>
+          </div>
+          <div
+            v-else-if="!control"
+            class="simple-table-click cursor-pointer"
+            @click="handleClick(props, scope.row)"
+          >
+            {{ scope.row[props] }}
+          </div>
+          <div v-else class="cursor-pointer">
+            {{ scope.row[props] }}
+          </div>
+        </div>
+        <div v-else-if="type === 'dictionary'">
+          {{ dictionary[scope.row[props]] }}
+        </div>
+        <div v-else-if="type === 'file'">
+          <div v-if="scope.row[props] && scope.row[props].length">
+            <div
+              v-for="({ fileName }, index) in scope.row[props]"
+              :key="index"
+              @click="downloadFile({ index, rows: scope.row })"
+              class="simple-table-click cursor-pointer margin-left-10"
+            >
+              {{ fileName }}
+            </div>
+          </div>
+          <div v-else></div>
+        </div>
+        <div v-else>{{ scope.row[props] }}</div>
+      </template>
+      <template v-if="children">
         <el-table-column
-            v-for="(
-                { props, label, type, width, align, children, dictionary },
-                index
-            ) in config"
-            :key="index"
-            :prop="props"
-            :width="width"
-            :label="label"
-            :align="align || 'center'"
+          v-for="({ props, label, width, align, type }, index) in children"
+          :key="index"
+          :prop="props"
+          :width="width"
+          :label="label"
+          :align="align || 'center'"
         >
-            <template #default="scope">
-                <div v-if="type === 'edit'">
-                    <el-input
-                        v-if="scope.row[`edit`]"
-                        v-model="scope.row[props]"
-                        autosize
-                        type="textarea"
-                        @change="handleModify"
-                    />
-                </div>
-                <div v-else-if="type === 'textarea'">
-                    <pre class="simple-table-break">{{ scope.row[props] }}</pre>
-                </div>
-                <div v-else-if="type === 'date'">
-                    <div>{{ $formatDate(scope.row[props], "YYYY-MM-DD") }}</div>
-                </div>
-                <div v-else-if="type === 'click'">
-                    <div
-                        class="simple-table-click cursor-pointer"
-                        @click="handleClick(props, scope.row)"
-                    >
-                        {{ scope.row[props] }}
-                    </div>
-                </div>
-                <div v-else-if="type === 'dictionary'">
-                    {{ dictionary[scope.row[props]] }}
-                </div>
-                <div v-else>{{ scope.row[props] }}</div>
-            </template>
-            <template v-if="children">
-                <el-table-column
-                    v-for="(
-                        { props, label, width, align, type }, index
-                    ) in children"
-                    :key="index"
-                    :prop="props"
-                    :width="width"
-                    :label="label"
-                    :align="align || 'center'"
-                >
-                    <template #default="scope">
-                        <div v-if="type === 'edit'">
-                            <el-input
-                                v-model="scope.row[props]"
-                                @change="handleModify"
-                                autosize
-                                type="textarea"
-                            />
-                        </div>
-                        <div v-else>{{ scope.row[props] }}</div>
-                    </template>
-                </el-table-column>
-            </template>
+          <template #default="scope">
+            <div v-if="type === 'edit'">
+              <el-input
+                v-model="scope.row[props]"
+                @change="handleModify"
+                autosize
+                type="textarea"
+              />
+            </div>
+            <div v-else>{{ scope.row[props] }}</div>
+          </template>
+          <!-- <template v-if="variable">
+            <div>{{ scope.row[props] }}</div>
+          </template> -->
         </el-table-column>
-        <el-table-column
-            v-if="handleRow.length"
-            label="操作"
-            :width="handleRow.length * 50"
+      </template>
+    </el-table-column>
+    <el-table-column
+      v-if="handleRow.length"
+      label="操作"
+      :align="'center'"
+      :width="handleRow.length * 50"
+    >
+      <template slot-scope="scope">
+        <span
+          v-for="({ label, props, popconfirm, visible }, index) in handleRow"
+          :key="index"
+          class="padding-right-5"
         >
-            <template slot-scope="scope">
-                <span
-                    v-for="(
-                        { label, props, popconfirm, visible }, index
-                    ) in handleRow"
-                    :key="index"
-                    class="padding-right-5"
-                >
-                    <span v-if="handleFormat(visible, scope.row)">
-                        <el-popconfirm
-                            v-if="popconfirm"
-                            :title="`确定要${label}吗?`"
-                            @confirm="handleClick(props,scope.row)"
-                            @cancel="handleCancel"
-                        >
-                            <el-button
-                                slot="reference"
-                                type="text"
-                                size="small"
-                                >{{ label }}</el-button
-                            >
-                        </el-popconfirm>
-                        <el-button
-                            v-else
-                            @click="handleClick(props, scope.row)"
-                            type="text"
-                            size="small"
-                            >{{ label }}</el-button
-                        >
-                    </span>
-                </span>
-            </template>
-        </el-table-column>
-    </el-table>
+          <span v-if="handleFormat(visible, scope.row)">
+            <!-- <el-popconfirm
+              v-if="popconfirm"
+              :title="`确定要${label}吗?`"
+              @confirm="handleClick(props, scope.row)"
+              @cancel="handleCancel"
+            >
+              <el-button slot="reference" type="text" size="small">{{
+                label
+              }}</el-button>
+            </el-popconfirm> -->
+            <el-button
+              v-if="popconfirm"
+              type="text"
+              size="small"
+              @click="handleConfirm(label, props, scope.row)"
+              >{{ label }}</el-button
+            >
+            <el-button
+              v-else
+              @click="handleClick(props, scope.row)"
+              type="text"
+              size="small"
+              >{{ label }}</el-button
+            >
+          </span>
+        </span>
+      </template>
+    </el-table-column>
+  </el-table>
 </template>
 <script>
 export default {
-    props: {
-        list: {
-            type: Array,
-            default: () => [],
-        },
-        config: {
-            type: Array,
-            default: () => [],
-        },
-        loading: {
-            type: Boolean,
-            default: false,
-        },
-        handleRow: {
-            type: Array,
-            default: () => [],
-        },
+  props: {
+    list: {
+      type: Array,
+      default: () => [],
+    },
+    config: {
+      type: Array,
+      default: () => [],
+    },
+    multiple: {
+      type: Boolean,
+      default: false,
+    },
+    selectable: {
+      type: Function,
+    },
+    loading: {
+      type: Boolean,
+      default: false,
+    },
+    handleRow: {
+      type: Array,
+      default: () => [],
+    },
+  },
+  computed: {
+    computed_list() {
+      return this.list.map((element) => ({
+        ...element,
+      }));
+    },
+  },
+  methods: {
+    handleFormat(params, data) {
+      let visible = true;
+      if (params) {
+        visible = false;
+        Object.keys(params).forEach((element) => {
+          if (params[element].includes(data[element])) {
+            visible = true;
+          }
+        });
+      }
+      return visible;
+    },
+    handleConfirm(label, props, row) {
+      this.$confirm(`确定要${label}吗?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "error",
+      })
+        .then(() => {
+          this.$emit(props, row);
+        })
+        .catch(() => {
+          console.log("error");
+        });
+    },
+    handleClick(props, row) {
+      this.$emit(props, row);
+    },
+    handleCancel() {
+      console.log("我被关闭了");
+    },
+    handleSelectionChange(val) {
+      this.$emit("selection", val);
     },
-    computed: {
-        computed_list() {
-            return this.list.map((element) => ({
-                ...element,
-            }));
-        },
+    downloadFile(val) {
+      this.$emit("download", val);
     },
-    methods: {
-        handleFormat(params, data) {
-            let visible = true;
-            if (params) {
-                visible = false;
-                Object.keys(params).forEach((element) => {
-                    if (params[element].includes(data[element])) {
-                        visible = true;
-                    }
-                });
-            }
-            return visible;
-        },
-        handleClick(props, row) {
-            console.log('aaaaaaaaa')
-            this.$emit(props, row);
-        },
-        handleCancel(){
-            console.log('我被关闭了')
-        },
-        handleModify() {
-            this.$emit("modify", this.computed_list);
-        },
+    handleModify() {
+      this.$emit("modify", this.computed_list);
     },
+  },
 };
 </script>

ファイルの差分が大きいため隠しています
+ 644 - 219
src/pages/main/performance/department.vue


+ 4 - 4
src/pages/main/performance/index.vue

@@ -47,10 +47,10 @@ export default {
                     label: "模板管理",
                     name: "mould",
                 },
-                {
-                    label: "下发管理",
-                    name: "issue",
-                },
+                // {
+                //     label: "下发管理",
+                //     name: "issue",
+                // },
                 {
                     label: "回复统计",
                     name: "reply",

+ 2 - 0
src/pages/main/performance/issue.vue

@@ -180,6 +180,7 @@ export default {
     },
     methods: {
         async handleInit(data) {
+            this.table_loading = true
             this.$http({
                 url: "/market/CMKIssued/CMKIssuedList",
                 method: "post",
@@ -193,6 +194,7 @@ export default {
                         this.$formatDate(data.endTime, "YYYY-MM-DD"),
                 },
             }).then(({ data: { data, count } }) => {
+                 this.table_loading = false
                 this.total = count;
                 this.table_list = data;
             });

+ 318 - 250
src/pages/main/performance/mould.vue

@@ -1,94 +1,117 @@
 <template>
-    <div>
-        <div class="simple-container">
-            <simple-form
-                :form="table_form"
-                :handle="table_handle"
-                @search="handleSearch"
-                @add="handleVisible('add')"
-            ></simple-form>
-            <simple-table
-                :list="table_list"
-                :config="table_config"
-                :loading="table_loading"
-                :handle-row="table_handle_row"
-                @issue="(params) => handleVisible('issue', params)"
-                @detail="(params) => handleVisible('template', params)"
-                @delete="handleDelete"
-            ></simple-table>
-            <simple-pagination
-                :page="page"
-                :total="total"
-                @change="handleChange"
-            ></simple-pagination>
-        </div>
-        <simple-dialog
-            title="下发"
-            width="500px"
-            @cancel="handleVisible('issue')"
-            @confirm="handleIssue"
-            :visible="issue_visible"
+  <div>
+    <div class="simple-container">
+      <simple-form
+        :form="table_form"
+        :handle="table_handle"
+        @search="handleSearch"
+        @add="handleVisible('add')"
+      ></simple-form>
+      <simple-table
+        :list="table_list"
+        :config="table_config"
+        :loading="table_loading"
+        :handle-row="table_handle_row"
+        @issue="(params) => handleVisible('issue', params)"
+        @detail="(params) => handleVisible('template', params)"
+        @redit="(params) => handleVisible('edit', params)"
+        @delete="handleDelete"
+      ></simple-table>
+      <simple-pagination
+        :page="page"
+        :total="total"
+        @change="handleChange"
+      ></simple-pagination>
+    </div>
+    <simple-dialog
+      title="下发"
+      width="500px"
+      @cancel="handleVisible('issue')"
+      @confirm="handleIssue"
+      :visible="issue_visible"
+    >
+      <el-form label-width="120px" :model="issue_form" ref="issue_ref">
+        <el-form-item
+          label="填报事由"
+          prop="reason"
+          :rules="{
+            required: true,
+            message: '填报事由不能为空',
+            trigger: 'blur',
+          }"
         >
-            <el-form label-width="120px" :model="issue_form" ref="issue_ref">
-                <el-form-item
-                    label="填报事由"
-                    prop="reason"
-                    :rules="{
-                        required: true,
-                        message: '填报事由不能为空',
-                        trigger: 'blur',
-                    }"
-                >
-                    <el-input v-model="issue_form.reason"></el-input>
-                </el-form-item>
-                <el-form-item
-                    label="填报注意事项"
-                    prop="precautions"
-                    :rules="{
-                        required: true,
-                        message: '填报注意事项不能为空',
-                        trigger: 'blur',
-                    }"
-                >
-                    <el-input v-model="issue_form.precautions"></el-input>
-                </el-form-item>
-                <el-form-item
-                    label="截止时间"
-                    prop="endTime"
-                    :rules="{
-                        required: true,
-                        message: '截止时间不能为空',
-                        trigger: 'change',
-                    }"
-                >
-                    <el-date-picker v-model="issue_form.endTime" type="date">
-                    </el-date-picker>
-                </el-form-item>
-            </el-form>
-        </simple-dialog>
-        <simple-dialog
-            fullscreen
-            title="新增模板"
-            :visible="add_visible"
-            width="1200px"
-            @confirm="handleVisible('add')"
-            @cancel="handleVisible('add')"
+          <el-input v-model="issue_form.reason"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="填报注意事项"
+          prop="precautions"
+          :rules="{
+            required: true,
+            message: '填报注意事项不能为空',
+            trigger: 'blur',
+          }"
         >
-            <el-form inline :model="form" label-width="100px"> </el-form>
-            <simple-sheet v-if="add_visible" @save="handleSave" type="edit" />
-            <template v-slot:footer><div></div></template>
-        </simple-dialog>
-        <simple-dialog
-            title="查看模板"
-            fullscreen
-            @cancel="handleVisible('template')"
-            @confirm="handleVisible('template')"
-            :visible="template_visible"
+          <el-input v-model="issue_form.precautions"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="截止时间"
+          prop="endTime"
+          :rules="{
+            required: true,
+            message: '截止时间不能为空',
+            trigger: 'change',
+          }"
         >
-            <simple-sheet v-if="template_visible" :id="template_id" />
-            <template v-slot:footer><div></div></template>
-        </simple-dialog>
-    </div>
+          <el-date-picker
+            v-model="issue_form.endTime"
+            type="datetime"
+            format="yyyy-MM-dd HH:00:00"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+    </simple-dialog>
+    <simple-dialog
+      fullscreen
+      title="新增模板"
+      :visible="add_visible"
+      width="1200px"
+      @confirm="handleVisible('add')"
+      @cancel="handleVisible('add')"
+    >
+      <el-form inline :model="form" label-width="100px"> </el-form>
+      <simple-sheet v-if="add_visible" @save="handleSave('add')" type="edit" />
+      <template v-slot:footer><div></div></template>
+    </simple-dialog>
+    <simple-dialog
+      fullscreen
+      title="编辑模板"
+      :visible="edit_visible"
+      width="1200px"
+      @confirm="handleVisible('edit')"
+      @cancel="handleVisible('edit')"
+    >
+      <el-form inline :model="form" label-width="100px"> </el-form>
+      <simple-sheet
+        v-if="edit_visible"
+        :id="template_id"
+        @save="handleSave('edit')"
+        :status="status"
+        type="edit"
+      />
+      <template v-slot:footer><div></div></template>
+    </simple-dialog>
+    <simple-dialog
+      title="查看模板"
+      fullscreen
+      @cancel="handleVisible('template')"
+      @confirm="handleVisible('template')"
+      :visible="template_visible"
+    >
+      <simple-sheet v-if="template_visible" :id="template_id" />
+      <template v-slot:footer><div></div></template>
+    </simple-dialog>
+  </div>
 </template>
 
 <script>
@@ -98,180 +121,225 @@ import simpleTable from "./components/table.vue";
 import simpleDialog from "./components/dialog.vue";
 import simplePagination from "./components/pagination.vue";
 export default {
-    components: {
-        simpleTable,
-        simpleDialog,
-        simpleForm,
-        simpleSheet,
-        simplePagination,
-    },
-    data() {
-        return {
-            page: 1,
-            rows: 10,
-            total: 0,
-            form: {},
-            add_visible: false,
-            // template
-            template_visible: false,
-            template_id: null,
-            // issue
-            issue_visible: false,
-            issue_form: {},
-            issue_id: null,
-            // table
-            table_loading: false,
-            table_search: {},
-            table_form: [
-                {
-                    label: "模板名称",
-                    props: "templateName",
-                    type: "input",
-                },
-            ],
-            table_list: [],
-            table_handle: [
-                {
-                    label: "新增模板",
-                    props: "add",
-                },
-            ],
-            table_handle_row: [
-                {
-                    label: "下发",
-                    props: "issue",
-                },
-                {
-                    label: "查看",
-                    props: "detail",
-                },
-                {
-                    label: "删除",
-                    props: "delete",
-                    popconfirm: true,
-                },
-            ],
-            table_config: [
-                {
-                    label: "模板名称",
-                    props: "templateName",
-                },
-                {
-                    label: "配置时间",
-                    props: "updateTime",
-                },
-                {
-                    label: "配置人员",
-                    props: "createId",
-                },
-                {
-                    label: "模板状态",
-                    props: "status",
-                    type: "dictionary",
-                    dictionary: {
-                        0: "在用",
-                        1: "停用",
-                    },
-                },
-            ],
-        };
-    },
-    methods: {
-        async handleInit() {
-            this.table_loading = true;
-            this.$http({
-                url: "/market/CMKFileTemplate/CMKFileTemplateList",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json",
-                },
-                data: {
-                    page: this.page,
-                    pageSize: this.rows,
-                    templateName: this.table_search.templateName,
-                },
-            }).then(({ data: { count, data } }) => {
-                this.total = count;
-                this.table_list = data;
-                this.table_loading = false;
-            });
+  components: {
+    simpleTable,
+    simpleDialog,
+    simpleForm,
+    simpleSheet,
+    simplePagination,
+  },
+  data() {
+    return {
+      page: 1,
+      rows: 10,
+      total: 0,
+      form: {},
+      status: "",
+      add_visible: false,
+      edit_visible: false,
+      // template
+      template_visible: false,
+      template_id: null,
+      // issue
+      issue_visible: false,
+      issue_form: {
+        reason: "",
+        precautions: "",
+        endTime: "",
+      },
+      issue_id: null,
+      // table
+      table_loading: false,
+      table_search: {},
+      table_form: [
+        {
+          label: "模板名称",
+          props: "templateName",
+          type: "input",
         },
-        handleSearch({ templateName }) {
-            this.table_search = { templateName };
-            this.handleReset();
-            this.handleInit();
+      ],
+      table_list: [],
+      table_handle: [
+        {
+          label: "新增模板",
+          props: "add",
         },
-        handleAdd() {},
-        handleChange(page) {
-            this.page = page;
-            this.handleInit();
+      ],
+      table_handle_row: [
+        {
+          label: "下发",
+          props: "issue",
+          visible: {
+            status: ["0"],
+          },
         },
-        handleVisible(props, params) {
-            switch (props) {
-                case "add":
-                    this.add_visible = !this.add_visible;
-                    break;
-                case "template":
-                    this.template_visible = !this.template_visible;
-                    this.template_id = params?.id;
-                    break;
-                case "issue":
-                    this.issue_visible = !this.issue_visible;
-                    this.issue_id = params ? params.id : null;
-                    break;
-            }
+        {
+          label: "编辑",
+          props: "redit",
+          visible: {
+            status: ["2"],
+          },
         },
-        handleReset() {
-            this.page = 1;
+        {
+          label: "查看",
+          props: "detail",
         },
-        handleDelete({ id }) {
-            this.$http({
-                url: "/market/CMKFileTemplate/delCMKFileTemplateById",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json",
-                },
-                data: {
-                    templateId: id,
-                },
-            }).then(() => {
-                this.$message.success("删除成功");
-                this.handleInit();
-            });
+        {
+          label: "删除",
+          props: "delete",
+          visible: {
+            status: ["0", "2"],
+          },
+          popconfirm: true,
         },
-        handleIssue() {
-            this.$refs["issue_ref"].validate((valid) => {
-                if (valid) {
-                    this.$http({
-                        url: "/market/CMKFileTemplate/issuedCMKFileTemplateById",
-                        method: "post",
-                        headers: {
-                            "Content-Type": "application/json",
-                        },
-                        data: {
-                            ...this.issue_form,
-                            endTime: this.$formatDate(
-                                this.issue_form.endTime,
-                                "YYYY-MM-DD"
-                            ),
-                            templateId: this.issue_id,
-                        },
-                    }).then(() => {
-                        this.handleVisible("issue");
-                        this.$message.success("下发成功");
-                        this.handleInit();
-                    });
-                }
-            });
+      ],
+      table_config: [
+        {
+          label: "序号",
+          type: "number",
         },
-        handleSave() {
-            this.handleVisible("add");
-            this.handleInit();
+        {
+          label: "模板名称",
+          props: "templateName",
+        },
+        {
+          label: "配置时间",
+          props: "updateTime",
+        },
+        {
+          label: "配置人员",
+          props: "createId",
+        },
+        {
+          label: "模板状态",
+          props: "status",
+          type: "dictionary",
+          dictionary: {
+            0: "已创建",
+            2: "起草中",
+            3: "已下发",
+          },
+        },
+      ],
+    };
+  },
+  methods: {
+    async handleInit() {
+      this.table_loading = true;
+      this.$http({
+        url: "/market/CMKFileTemplate/CMKFileTemplateList",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
         },
+        data: {
+          page: this.page,
+          pageSize: this.rows,
+          templateName: this.table_search.templateName,
+        },
+      }).then(({ data: { count, data } }) => {
+        this.total = count;
+        this.table_list = data;
+        this.table_loading = false;
+      });
+    },
+    handleSearch({ templateName }) {
+      this.table_search = { templateName };
+      this.handleReset();
+      this.handleInit();
+    },
+    handleAdd() {},
+    handleChange(page) {
+      this.page = page;
+      this.handleInit();
     },
-    mounted() {
+    handleVisible(props, params) {
+      switch (props) {
+        case "add":
+          this.add_visible = !this.add_visible;
+          break;
+        case "edit":
+          this.edit_visible = !this.edit_visible;
+          this.template_id = params ? params.id : null;
+          this.status = params ? params.status : "";
+          break;
+        case "template":
+          this.template_visible = !this.template_visible;
+          // this.template_id = params?.id;
+          this.template_id = params ? params.id : null;
+          break;
+        case "issue":
+          this.issue_visible = !this.issue_visible;
+          this.issue_id = params ? params.id : null;
+          if (this.issue_visible) {
+            this.issue_form.reason = params.reason ? params.reason : "";
+            this.issue_form.precautions = params.precautions
+              ? params.precautions
+              : "";
+            this.issue_form.endTime = params.endTime ? params.endTime : "";
+          }
+          break;
+      }
+    },
+    handleReset() {
+      this.page = 1;
+    },
+    handleDelete({ id }) {
+      this.$http({
+        url: "/market/CMKFileTemplate/delCMKFileTemplateById",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {
+          templateId: id,
+        },
+      }).then(() => {
+        this.$message.success("删除成功");
         this.handleInit();
+      });
+    },
+    handleIssue() {
+      this.$refs["issue_ref"].validate((valid) => {
+        if (valid) {
+          this.$http({
+            url: "/market/CMKFileTemplate/issuedCMKFileTemplateById",
+            method: "post",
+            headers: {
+              "Content-Type": "application/json",
+            },
+            data: {
+              ...this.issue_form,
+              endTime: this.$formatDate(
+                this.issue_form.endTime,
+                "YYYY-MM-DD HH:00:00"
+              ),
+              templateId: this.issue_id,
+            },
+          }).then(() => {
+            this.handleVisible("issue");
+            this.$message.success("下发成功");
+            this.handleInit();
+          });
+        }
+      });
+    },
+    handleSave(type) {
+      switch (type) {
+        case "add":
+          this.handleVisible("add");
+          break;
+        case "edit":
+          this.handleVisible("edit");
+          break;
+      }
+
+      this.handleInit();
     },
+  },
+  mounted() {
+    this.handleInit();
+  },
 };
 </script>
 

+ 209 - 135
src/pages/main/performance/reply.vue

@@ -1,152 +1,226 @@
 <template>
-    <div>
-        <div class="simple-container">
-            <simple-form
-                :form="table_form"
-                :handle="table_handle"
-                @search="handleSearch"
-            ></simple-form>
-            <simple-table
-                :list="table_list"
-                :config="table_config"
-                :loading="table_loading"
-                :handle-row="table_handle_row"
-            ></simple-table>
-            <simple-pagination
-                :page="page"
-                :total="total"
-                @change="handleChange"
-            ></simple-pagination>
-        </div>
+  <div>
+    <div class="simple-container">
+      <simple-form
+        :form="table_form"
+        :handle="table_handle"
+        @search="handleSearch"
+        @download="handleDownload"
+      ></simple-form>
+      <simple-table
+        :list="table_list"
+        :config="table_config"
+        :loading="table_loading"
+        :handle-row="table_handle_row"
+      ></simple-table>
+      <!-- <simple-pagination
+        :page="page"
+        :total="total"
+        @change="handleChange"
+      ></simple-pagination> -->
     </div>
+  </div>
 </template>
 
 <script>
 import simpleForm from "./components/form.vue";
 import simpleTable from "./components/table.vue";
-import simplePagination from "./components/pagination.vue";
+// import simplePagination from "./components/pagination.vue";
 export default {
-    components: {
-        simpleTable,
-        simpleForm,
-        simplePagination,
-    },
-    data() {
-        return {
-            page: 1,
-            rows: 10,
-            total: 0,
-            table_loading: false,
-            table_search: {},
-            table_form: [
-                {
-                    label: "统计月份",
-                    props: "date",
-                    type: "month",
-                },
-                {
-                    label: "绩效类型",
-                    props: "performance_type",
-                    type: "select",
-                    dictionary: [
-                        {
-                            label: "部门绩效",
-                            value: "部门绩效",
-                        },
-                        {
-                            label: "员工绩效",
-                            value: "员工绩效",
-                        },
-                    ],
-                },
-                {
-                    label: "绩效分类",
-                    props: "performance_class",
-                    type: "select",
-                    dictionary: [
-                        {
-                            label: "GS",
-                            value: "GS",
-                        },
-                        {
-                            label: "KPI",
-                            value: "KPI",
-                        },
-                    ],
-                },
-            ],
-            table_list: [],
-            table_handle: [
-                {
-                    label: "导出",
-                    props: "download",
-                },
-            ],
-            table_handle_row: [],
-            table_config: [
-                {
-                    label: "科室名称",
-                    props: "department_name",
-                },
-                {
-                    label: "科室经理",
-                    props: "department_manager",
-                },
-                {
-                    label: "代办接收数",
-                    props: "received_umber",
-                },
-                {
-                    label: "完成回复率",
-                    props: "response_rate",
-                },
-                {
-                    label: "超期率",
-                    props: "overdue_rate",
-                },
-                {
-                    label: "累计超期时间",
-                    props: "cumulative_overtime",
-                },
-            ],
-        };
-    },
-    methods: {
-        async handleInit() {
-            this.table_loading = true;
-            const data = [];
-            let index = 0;
-            while (index < 10) {
-                data.push({
-                    department_name: `科室${index}`,
-                    department_manager: `经理${index}`,
-                    received_umber: `${index}`,
-                    response_rate: `${index + 1}0`,
-                    overdue_rate: `50%`,
-                    cumulative_overtime: `3`,
-                });
-                index = index + 1;
-            }
-            this.total = index;
-            this.table_list = data;
-            this.table_loading = false;
+  components: {
+    simpleTable,
+    simpleForm,
+    // simplePagination,
+  },
+  data() {
+    return {
+      page: 1,
+      rows: 10,
+      total: 0,
+      table_loading: false,
+      table_search: {},
+      table_form: [
+        {
+          label: "统计月份",
+          props: "time",
+          type: "month",
+        },
+        // {
+        //     label: "绩效类型",
+        //     props: "performance_type",
+        //     type: "select",
+        //     dictionary: [
+        //         {
+        //             label: "部门绩效",
+        //             value: "部门绩效",
+        //         },
+        //         {
+        //             label: "员工绩效",
+        //             value: "员工绩效",
+        //         },
+        //     ],
+        // },
+        // {
+        //     label: "绩效分类",
+        //     props: "performance_class",
+        //     type: "select",
+        //     dictionary: [
+        //         {
+        //             label: "GS",
+        //             value: "GS",
+        //         },
+        //         {
+        //             label: "KPI",
+        //             value: "KPI",
+        //         },
+        //     ],
+        // },
+      ],
+      table_list: [],
+      table_handle: [
+        {
+          label: "导出",
+          props: "download",
+        },
+      ],
+      table_handle_row: [],
+      table_config: [
+        {
+          label: "科室名称",
+          props: "dept",
+        },
+        {
+          label: "科室经理",
+          props: "loginName",
+        },
+        {
+          label: "待办接收数",
+          props: "number",
         },
-        handleSearch({ template_name }) {
-            this.table_search = { template_name };
-            this.handleReset();
-            this.handleInit();
+        {
+          label: "完成回复率",
+          props: "percentageReply",
         },
-        handleChange(page) {
-            this.page = page;
-            this.handleInit();
+        {
+          label: "超期率",
+          props: "percentageTimeOut",
         },
-        handleReset() {
-            this.page = 1;
+        {
+          label: "累计超期时间",
+          props: "day",
         },
+      ],
+    };
+  },
+  methods: {
+    handleInit(data) {
+      this.table_loading = true;
+      this.$http({
+        url: "/market/CMKIssued/CMKIssuedReplyStatistics",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: data,
+      }).then(({ data }) => {
+        //   console.log(res,'data');
+        // this.total = count;
+        this.table_list = data;
+        this.table_loading = false;
+      });
+      // const data = [];
+      // let index = 0;
+      // while (index < 10) {
+      //     data.push({
+      //         department_name: `科室${index}`,
+      //         department_manager: `经理${index}`,
+      //         received_umber: `${index}`,
+      //         response_rate: `${index + 1}0`,
+      //         overdue_rate: `50%`,
+      //         cumulative_overtime: `3`,
+      //     });
+      //     index = index + 1;
+      // }
+    },
+    handleDownload() {
+      this.$http({
+        url: "/market/CMKIssued/exportCMKIssuedReplyStatistics",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        responseType: "blob",
+        data: {
+          ...this.table_search,
+          time: this.table_search.time ? this.$formatDate(this.table_search.time, "YYYY-MM") : '',
+        },
+      }).then((response) => {
+        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+          let blob = new Blob([response.data], {
+            type: "application/vnd.ms-excel",
+          });
+          let month = this.table_search.time ? this.$formatDate(this.table_search.time, "YYYY年MM月") : ''
+          window.navigator.msSaveOrOpenBlob(
+            blob,`${month}回复统计.xlsx`
+          );
+        } else {
+          /* 火狐谷歌的文件下载方式 */
+          var blob = new Blob([response.data]);
+          var downloadElement = document.createElement("a");
+          var href = window.URL.createObjectURL(blob);
+          downloadElement.href = href;
+          let month = this.table_search.time ? this.$formatDate(this.table_search.time, "YYYY年MM月") : ''
+          downloadElement.download =  `${month}回复统计.xlsx`;
+          document.body.appendChild(downloadElement);
+          downloadElement.click();
+          document.body.removeChild(downloadElement);
+          window.URL.revokeObjectURL(href);
+        }
+      });
+        // this.$http({
+        //   url: "/CMKIssued/exportCMKIssuedReplyStatistics",
+        //   method: "post",
+        //   headers: {
+        //     "Content-Type": "application/json",
+        //   },
+        //   data: {
+        //     ...this.table_search,
+        //     time: this.table_search.time ? this.table_search.time : "",
+        //   },
+        //   responseType: "blob", // 解决下载的文件乱码空白等问题
+        // }).then(({ data }) => {
+        //   console.log(data,'data');
+        //   let url = window.URL.createObjectURL(new Blob([data]));
+        //   let a = document.createElement("a");
+        //   a.setAttribute("href", url);
+        //   //   a.setAttribute('download', scope.row.fileName)
+        //   a.click();
+        // });
+      console.log("我下载了");
+    },
+    handleSearch(data) {
+      let obj = {
+        ...data,
+        time: data.time
+          ? this.$formatDate(data.time, "YYYY-MM")
+          : "",
+      };
+      console.log(obj,'obj');
+      this.table_search = data;
+      this.handleReset();
+      this.handleInit({ ...obj });
+    },
+    handleChange(page) {
+      this.page = page;
+      this.handleInit({ ...this.table_search });
     },
-    mounted() {
-        this.handleInit();
+    handleReset() {
+      this.page = 1;
     },
+  },
+  mounted() {
+    this.handleInit({ time: "" });
+  },
 };
 </script>
 

+ 2 - 0
src/plugins/element-ui.js

@@ -61,6 +61,7 @@ import {
 	Drawer,
 	Badge,
 	TimePicker,
+	Alert
 } from 'element-ui';
 Vue.use(TimePicker);
 Vue.use(Badge);
@@ -119,6 +120,7 @@ Vue.use(Carousel)
 Vue.use(Tabs)
 Vue.use(TabPane)
 Vue.use(TimeSelect)
+Vue.use(Alert)
 Vue.prototype.$confirm = MessageBox.confirm;
 Vue.prototype.$prompt = MessageBox.prompt;
 Vue.prototype.$notify = Notification;

+ 59 - 3
src/router/index.js

@@ -867,20 +867,34 @@ const routes = [{
                     component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/competitor/competeInfo'], resolve)
                 },
                 {
-                    meta: { name:  '新增竞争对手', keepAlive: false },
+                    meta: { name:  '新增竞争对手违规信息', keepAlive: false },
                     path: '/addCompetitor',
                     name: 'addCompetitor',
                     component: (resolve) => require( /* webpackChunkName: "system" */
                         ['../pages/main/competitor/addCompetitor.vue'], resolve)
                 },
                 {
-                    meta: { name:  '修改竞争对手', keepAlive: false },
+                    meta: { name:  '新增竞争对手常规信息', keepAlive: false },
+                    path: '/addCompetitorNew',
+                    name: 'addCompetitorNew',
+                    component: (resolve) => require( /* webpackChunkName: "system" */
+                        ['../pages/main/competitor/addCompetitorNew.vue'], resolve)
+                },
+                {
+                    meta: { name:  '修改竞争对手违规信息', keepAlive: false },
                     path: '/changeCompet',
                     name: 'changeCompet',
                     component: (resolve) => require( /* webpackChunkName: "system" */
                         ['../pages/main/competitor/changeCompet.vue'], resolve)
                 },
                 {
+                    meta: { name:  '修改竞争对手正规信息', keepAlive: false },
+                    path: '/changeCompetNew',
+                    name: 'changeCompetNew',
+                    component: (resolve) => require( /* webpackChunkName: "system" */
+                        ['../pages/main/competitor/changeCompetNew.vue'], resolve)
+                },
+                {
                     meta: { name:  '修改竞争对手审核详情', keepAlive: false },
                     path: '/competitorInfo',
                     name: 'competitorInfo',
@@ -888,6 +902,13 @@ const routes = [{
                         ['../pages/main/competitor/competitorInfo.vue'], resolve)
                 },
                 {
+                    meta: { name:  '修改竞争对手审核详情', keepAlive: false },
+                    path: '/competitorInfoNew',
+                    name: 'competitorInfo',
+                    component: (resolve) => require( /* webpackChunkName: "system" */
+                        ['../pages/main/competitor/competitorInfoNew.vue'], resolve)
+                },
+                {
                     meta: { name:  '修改竞争对手统计', keepAlive: false },
                     path: '/compete',
                     name: 'compete',
@@ -1072,6 +1093,12 @@ const routes = [{
             component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/knowledge/knowledgeType'], resolve)
         },
         {
+            meta: { name: '附件库', keepAlive: true },
+            path: '/flieList',
+            name: 'flieList',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/file/flieList'], resolve)
+          },
+        {
             meta: { name:  '公告', keepAlive: false },
             path: '/noticec',
             name: 'noticec',
@@ -1644,6 +1671,34 @@ const routes = [{
             path: '/knowledgeTypetop',
             name: 'knowledgeTypetop',
             component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/knowledgetop/knowledgeType'], resolve)
+        },{
+            meta: {
+                name: '业务时长查询',
+                keepAlive: true
+            },
+            path: '/busiTime',
+            name: 'busiTime',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/busitime/busiTime'], resolve)
+        },{
+            meta: {
+                name: '异常业务办理监控报表',
+                keepAlive: true
+            },
+            path: '/busiTimeout',
+            name: 'busiTimeout',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/busitime/busiTimeout'], resolve)
+        },
+        {
+            meta: { name:  '工单列表', keepAlive: false },
+            path: '/workersList',
+            name: 'workersList',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/gridDivision/workersList.vue'], resolve)
+        },
+        {
+            meta: { name:  '地市网格负责人~市场部副总汇总后处理', keepAlive: false },
+            path: '/approvalExamination',
+            name: 'approvalExamination',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/gridDivision/approvalExamination.vue'], resolve)
         },
         {
             meta: {
@@ -1686,7 +1741,8 @@ router.beforeEach((to, from, next) => {
     } else {
         // if (window.location.href.indexOf('?agileauthtoken=') == -1) {
         if (window.sessionStorage.agileauthtoken == undefined) {
-            window.location.href = "http://10.230.26.15:8000/spfm/sysmgr/ssLogin?sysFlag=0";
+            // window.location.href = "http://10.230.26.15:8000/spfm/sysmgr/ssLogin?sysFlag=0";
+            next()
             //window.location.href = "http://cas.hl.cmcc/cas/login?service=?service=http%3A%2F%2F10.230.26.15%3A8000%2Fspfm%2Fsysmgr%2FssLogin%3FsysFlag%3D0"
         } else {
             next()

+ 62 - 25
vue.config.js

@@ -1,31 +1,34 @@
-const CompressionPlugin = require('compression-webpack-plugin');
-const webpack = require('webpack');
-const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+const CompressionPlugin = require("compression-webpack-plugin");
+const webpack = require("webpack");
+const BundleAnalyzerPlugin =
+    require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
 module.exports = {
-    publicPath: process.env.NODE_ENV === 'production' ? '' : '/',
+    publicPath: process.env.NODE_ENV === "production" ? "" : "/",
     productionSourceMap: false,
     lintOnSave: false,
 
-    chainWebpack: config => {
-        if (process.env.NODE_ENV === 'production') {
+    chainWebpack: (config) => {
+        if (process.env.NODE_ENV === "production") {
             if (process.env.npm_config_report) {
                 config
-                    .plugin('webpack-bundle-analyzer')
-                    .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
+                    .plugin("webpack-bundle-analyzer")
+                    .use(
+                        require("webpack-bundle-analyzer").BundleAnalyzerPlugin
+                    );
             }
-            config.plugins.delete('prefetch');
+            config.plugins.delete("prefetch");
         }
     },
-    configureWebpack: config => {
-        if (process.env.NODE_ENV === 'production') {
+    configureWebpack: (config) => {
+        if (process.env.NODE_ENV === "production") {
             config.optimization = {
                 splitChunks: {
-                    chunks: "all",          //async异步代码分割 initial同步代码分割 all同步异步分割都开启
-                    minSize: 10000,         //字节 引入的文件大于30kb才进行分割
+                    chunks: "all", //async异步代码分割 initial同步代码分割 all同步异步分割都开启
+                    minSize: 10000, //字节 引入的文件大于30kb才进行分割
                     // minChunks: 2,           //模块至少使用次数
                     // maxAsyncRequests: 25,    //同时加载的模块数量最多是5个,只分割出同时引入的前5个文件
                     // maxInitialRequests: 30,  //首页加载的时候引入的文件最多3个
-                    automaticNameDelimiter: '-', //缓存组和生成文件名称之间的连接符
+                    automaticNameDelimiter: "-", //缓存组和生成文件名称之间的连接符
                     // name: true,                  //缓存组里面的filename生效,覆盖默认命名
                     cacheGroups: {
                         // vue: {
@@ -53,9 +56,9 @@ module.exports = {
                         //     test: /[\\\/]node_modules[\\\/]/,
                         //     priority: -20
                         // },
-                    }
-                }
-            }
+                    },
+                },
+            };
             // return {
             //     plugins: [
             //         new CompressionPlugin({
@@ -83,25 +86,59 @@ module.exports = {
             //     // new BundleAnalyzerPlugin()
             // ]
         }
-
     },
     parallel: true,
 
     devServer: {
         proxy: {
-            '/': {
+            // 开发环境变化可注释 ⬇️⬇️
+            "/market/CMK": {
+                target: "http://192.168.1.9:9114",
+                ws: false,
+                changeOrigin: true,
+                pathRewrite: {
+                    "^/market": "",
+                },
+            },
+            "/market/mk": {
+                target: "http://192.168.1.9:9114",
+                ws: false,
+                changeOrigin: true,
+                pathRewrite: {
+                    "^/market": "",
+                },
+            },
+            "/market/techcentergj": {
+                target: "http://192.168.1.9:9114",
+                ws: false,
+                changeOrigin: true,
+                pathRewrite: {
+                    "^/market": "",
+                },
+            },
+            "/mkWangge": {
+                target: "http://192.168.1.9:9114",
+                ws: false,
+                changeOrigin: true,
+                pathRewrite: {
+                    "^/market": "",
+                },
+            },
+            // 开发环境变化可注释 ⬆️⬆️
+            "/": {
                 // target: 'http://192.168.2.145:9600/spfm',
                 // target: 'http://192.168.2.149:9600',
                 // target: 'http://10.64.42.70:8088/',
                 // target: 'http://114.215.71.182:29600',
-                target: 'http://192.168.1.9:9600/spfm',
+                // target: 'http://192.168.1.9:9600/spfm',
                 // target: 'http://127.0.0.1:9600/',
                 // target: 'http://192.168.0.156:9600/',
                 // target: 'http://192.168.2.170:9600/',
                 // target: 'http://192.168.2.169:9600/',
-                changeOrigin: true
-            }
-        }
+                target: "http://192.168.0.66:9600",
+                changeOrigin: true,
+            },
+        },
     },
-    transpileDependencies: ['color-string'] // 此段为增加配置选项
-}
+    transpileDependencies: ["color-string"], // 此段为增加配置选项
+};