Parcourir la source

Merge branch 'master' into 'form-making'

# Conflicts:
#   public/index.html
#   src/router/index.js
徐兴安 il y a 2 ans
Parent
commit
0b6b01deae
100 fichiers modifiés avec 20766 ajouts et 4637 suppressions
  1. 1 1
      package.json
  2. 3 3
      public/index.html
  3. 1 0
      public/static/js/luckysheet/expendPlugins/chart/chartmix.css
  4. 34 0
      public/static/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js
  5. 1 1
      public/static/js/luckysheet/luckysheet.umd.js
  6. 22 0
      public/static/js/luckysheet/plugins/js/echarts.js
  7. 1 0
      public/static/js/luckysheet/plugins/js/elementUi.js
  8. 6 0
      public/static/js/luckysheet/plugins/js/vue.js
  9. 1099 0
      public/static/js/luckysheet/plugins/js/vuex.js
  10. 480 0
      public/static/views/incomeTemplateExcel.html
  11. 477 0
      public/static/views/incomeViewExcel.html
  12. 637 0
      public/static/views/onlineShareExcel.html
  13. 637 0
      public/static/views/onlineShareExcelMarket.html
  14. 604 0
      public/static/views/stockHandle.html
  15. 4 2
      src/App.vue
  16. 7 2
      src/assets/calendar.scss
  17. BIN
      src/assets/dbyb-bt-bj3.jpg
  18. BIN
      src/assets/djlph-bt-bj.jpg
  19. BIN
      src/assets/logo.png
  20. BIN
      src/assets/newlogo-old.png
  21. BIN
      src/assets/newlogo.png
  22. BIN
      src/assets/newlogo2-old.png
  23. BIN
      src/assets/newlogo2.png
  24. 1 0
      src/components/deptTreeOnly.vue
  25. 1 1
      src/components/deptTreeP.vue
  26. 1 1
      src/components/deptTreeUser.vue
  27. 1 1
      src/components/deptTreeUserNew.vue
  28. 257 0
      src/components/modUpload.vue
  29. 38 0
      src/components/myMessageNew.vue
  30. 46 0
      src/components/myMessageRadio.vue
  31. 91 20
      src/components/p-header.vue
  32. 123 86
      src/components/p-menu-item.vue
  33. 183 167
      src/components/p-menu.vue
  34. 59 45
      src/components/p-tabs.vue
  35. 2 2
      src/components/toolList.vue
  36. 138 96
      src/pages/main/achievements/achievementsIndex.vue
  37. 1 1
      src/pages/main/achievements/achievementsMuban.vue
  38. 1 1
      src/pages/main/achievements/issueList.vue
  39. 4 1
      src/pages/main/achievements/recallBumen.vue
  40. 4 1
      src/pages/main/achievements/recallGS.vue
  41. 4 1
      src/pages/main/achievements/recallJt.vue
  42. 1 1
      src/pages/main/achievements/recallMuban.vue
  43. 2 2
      src/pages/main/advertising/index.vue
  44. 1 1
      src/pages/main/advertising/indexs.vue
  45. 1451 1509
      src/pages/main/advertising/materialApplicationadd.vue
  46. 63 24
      src/pages/main/antiSpoofing/home.vue
  47. 1276 0
      src/pages/main/apkTestMain/index.vue
  48. 176 154
      src/pages/main/budget/budgetIndex.vue
  49. 1 1
      src/pages/main/budget/budgetList.vue
  50. 1 1
      src/pages/main/budget/initBudget.vue
  51. 1 1
      src/pages/main/budget/issueList.vue
  52. 1 1
      src/pages/main/budget/noRecall.vue
  53. 1 1
      src/pages/main/budget/recall.vue
  54. 1 1
      src/pages/main/businessOutsourc/index.vue
  55. 1 1
      src/pages/main/busitime/busiTime.vue
  56. 1 1
      src/pages/main/busitime/busiTimeout.vue
  57. 874 803
      src/pages/main/competitor/compete.vue
  58. 5 2
      src/pages/main/competitor/competeInfo.vue
  59. 360 0
      src/pages/main/competitor/components/export.js
  60. 1012 0
      src/pages/main/competitor/components/sheet.vue
  61. 42 8
      src/pages/main/competitor/home.vue
  62. 1522 1208
      src/pages/main/competitor/index.vue
  63. 1553 0
      src/pages/main/competitors/company.vue
  64. 363 0
      src/pages/main/competitors/components/export.js
  65. 1494 0
      src/pages/main/competitors/components/sheet.vue
  66. 1936 0
      src/pages/main/competitors/home.vue
  67. 81 0
      src/pages/main/competitors/index.vue
  68. 1 1
      src/pages/main/compvis/complaintFeedback.vue
  69. 1 1
      src/pages/main/compvis/complaintWoAlarmInfo.vue
  70. 1 1
      src/pages/main/compvis/complaintlog.vue
  71. 1 1
      src/pages/main/compvis/compvisList.vue
  72. 1 1
      src/pages/main/customer/ydBrodbdNetwork.vue
  73. 1 1
      src/pages/main/customer/ydBrodbdUser.vue
  74. 1 1
      src/pages/main/customer/ydGroupUser.vue
  75. 1 1
      src/pages/main/customer/ydLobbyUser.vue
  76. 1 1
      src/pages/main/customer/ydMobileNetwork.vue
  77. 1 1
      src/pages/main/customer/ydMobileUser.vue
  78. 1 1
      src/pages/main/customer/ydTariff.vue
  79. 408 203
      src/pages/main/demandDevelop/index.vue
  80. 141 127
      src/pages/main/demandDevelop/ywStanding.vue
  81. 66 0
      src/pages/main/departWorkLists/dialog.vue
  82. 364 0
      src/pages/main/departWorkLists/export.js
  83. 953 0
      src/pages/main/departWorkLists/index.vue
  84. 631 0
      src/pages/main/departWorkLists/sheet.vue
  85. 99 99
      src/pages/main/file/flieList.vue
  86. 1 1
      src/pages/main/fileList/fileList.vue
  87. 14 11
      src/pages/main/fileList/fileListIndex.vue
  88. 1 1
      src/pages/main/flow/flowInit.vue
  89. 1 1
      src/pages/main/form/fromIndex.vue
  90. 38 25
      src/pages/main/fullcalendar/calendar.vue
  91. 1 0
      src/pages/main/homeMarket/magicboxAudit/audit.vue
  92. 3 1
      src/pages/main/homeMarket/magicboxAudit/base.vue
  93. 9 1
      src/pages/main/homeMarket/magicboxAudit/dealAudit.vue
  94. 2 0
      src/pages/main/homeMarket/magicboxAudit/homeTask.vue
  95. 1 1
      src/pages/main/homeMarket/magicboxAudit/index.vue
  96. 1 1
      src/pages/main/homeMarket/tvAssess/tvAssessIndex.vue
  97. 1 1
      src/pages/main/homeMarket/tvIntroduction/index.vue
  98. 80 0
      src/pages/main/incomeExcel/home.vue
  99. 751 0
      src/pages/main/incomeExcel/incomeExcelAppendix.vue
  100. 0 0
      src/pages/main/incomeExcel/incomeExcelInfo.vue

+ 1 - 1
package.json

@@ -35,7 +35,7 @@
     "vue-axios": "^2.1.5",
     "vue-contextmenu": "^1.5.10",
     "vue-cookie": "^1.1.4",
-    "vue-fullscreen": "^2.2.0",
+    "vue-fullscreen": "^2.6.1",
     "vue-router": "^3.0.7",
     "vuex": "^3.3.0",
     "xlsx": "^0.16.9"

+ 3 - 3
public/index.html

@@ -28,10 +28,10 @@
   <!-- built files will be auto injected -->
   <script type="text/javascript">
     window.staticHost = 'http://10.230.26.15:8000/mkt'; // 正式
-    // window.staticHost = 'http://10.149.85.90:8000/spfm'; // 测试
-    // window.staticHost = 'http://124.223.66.248:9600/';
+    // window.staticHost = 'http://10.149.85.91:8000/spfm'; // 测试
+    // window.staticHost = 'http://192.168.0.103:9600/';
     // window.staticHost = 'http://192.168.2.142:9600/';
-    
+
     // document.title = "hello";
   </script>
 </body>

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
public/static/js/luckysheet/expendPlugins/chart/chartmix.css


Fichier diff supprimé car celui-ci est trop grand
+ 34 - 0
public/static/js/luckysheet/expendPlugins/chart/chartmix.umd.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
public/static/js/luckysheet/luckysheet.umd.js


Fichier diff supprimé car celui-ci est trop grand
+ 22 - 0
public/static/js/luckysheet/plugins/js/echarts.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
public/static/js/luckysheet/plugins/js/elementUi.js


Fichier diff supprimé car celui-ci est trop grand
+ 6 - 0
public/static/js/luckysheet/plugins/js/vue.js


Fichier diff supprimé car celui-ci est trop grand
+ 1099 - 0
public/static/js/luckysheet/plugins/js/vuex.js


Fichier diff supprimé car celui-ci est trop grand
+ 480 - 0
public/static/views/incomeTemplateExcel.html


Fichier diff supprimé car celui-ci est trop grand
+ 477 - 0
public/static/views/incomeViewExcel.html


Fichier diff supprimé car celui-ci est trop grand
+ 637 - 0
public/static/views/onlineShareExcel.html


Fichier diff supprimé car celui-ci est trop grand
+ 637 - 0
public/static/views/onlineShareExcelMarket.html


Fichier diff supprimé car celui-ci est trop grand
+ 604 - 0
public/static/views/stockHandle.html


+ 4 - 2
src/App.vue

@@ -22,8 +22,9 @@ export default {
   padding: 0;
   margin: 0;
   box-sizing: border-box;
-  font-family: Helvetica Neue, Helvetica, Arial, PingFang SC, Hiragino Sans GB,
-    WenQuanYi Micro Hei, Microsoft Yahei, sans-serif !important;
+  // font-family: Helvetica Neue, Helvetica, Arial, PingFang SC, Hiragino Sans GB,
+  //   WenQuanYi Micro Hei, Microsoft Yahei, sans-serif !important;
+  font-family: "Microsoft YaHei",微软雅黑,Consolas,"LiberationMono",Courier,monospace,simsun !important;
 }
 
 html,
@@ -32,6 +33,7 @@ body,
 .page {
   width: 100%;
   min-width: 1000px;
+  overflow: hidden;
   height: 100%;
   font-family: "Avenir", Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;

+ 7 - 2
src/assets/calendar.scss

@@ -1,7 +1,12 @@
 @charset "UTF-8";
 .calendar-box {
-  height: 710px;
-  overflow-y: scroll;
+  height: 720px;
+  overflow-y: auto;
+  background: rgb(255, 255, 255);
+  padding-left: 15px;
+  padding-top: 20px;
+  padding-right: 15px;
+  border-radius: 5px;
 }
 .tag-tip{
   text-align: right;

BIN
src/assets/dbyb-bt-bj3.jpg


BIN
src/assets/djlph-bt-bj.jpg


BIN
src/assets/logo.png


BIN
src/assets/newlogo-old.png


BIN
src/assets/newlogo.png


BIN
src/assets/newlogo2-old.png


BIN
src/assets/newlogo2.png


+ 1 - 0
src/components/deptTreeOnly.vue

@@ -10,6 +10,7 @@
       :default-checked-keys="defaultListc"
       :default-expanded-keys="defaultListc"
       @node-click="handleNodeClick"
+      @node-expand="handleNodeClick"
       :filter-node-method="filterNode"
     >
       <span class="custom-tree-node" slot-scope="{ node, data }">

+ 1 - 1
src/components/deptTreeP.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="treebox">
-        <el-tree ref="tree" @node-click="handleCheckChange" :data="treeList" node-key="o"
+        <el-tree ref="tree" @node-expand="handleNodeClick" @node-click="handleCheckChange" :data="treeList" node-key="o"
             :default-checked-keys="defaultListc" :default-expanded-keys="defaultList"></el-tree>
     </div>
 </template>

+ 1 - 1
src/components/deptTreeUser.vue

@@ -3,7 +3,7 @@
         <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
         <el-tree :highlight-current="true" :check-strictly="true" ref="tree" @check-change="handleCheckChange"
             :data="treeList" node-key="id" :default-checked-keys="defaultListc" :default-expanded-keys="defaultListc"
-            @node-click="handleNodeClick" :filter-node-method="filterNode">
+            @node-click="handleNodeClick" @node-expand="handleNodeClick" :filter-node-method="filterNode">
             <span class="custom-tree-node" slot-scope="{ node, data }" @click="cs(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>

+ 1 - 1
src/components/deptTreeUserNew.vue

@@ -3,7 +3,7 @@
         <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
         <el-tree :highlight-current="true" :check-strictly="true" ref="tree" @check-change="handleCheckChange"
             :data="treeList" node-key="id" :default-checked-keys="defaultListc" :default-expanded-keys="defaultListc"
-            @node-click="handleNodeClick" :filter-node-method="filterNode">
+            @node-click="handleNodeClick" @node-expand="handleNodeClick" :filter-node-method="filterNode">
             <span class="custom-tree-node" slot-scope="{ node, data }" @click="cs(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>

+ 257 - 0
src/components/modUpload.vue

@@ -0,0 +1,257 @@
+<template>
+    <div v-loading="loading">
+        <el-upload class="upload-demo" :drag="fileInfo.type !== 'btn'" multiple :limit="fileInfo.limit" ref="upload"
+            action="string" :on-remove="handleRemove" :on-exceed="handleExceed" :file-list="fileList"
+             :auto-upload="true" :show-file-list="fileInfo.type !== 'btn'"
+            :before-upload="deforeUp" :http-request="signUpload">
+            <div v-if="fileInfo.type !== 'btn'">
+                <i class="el-icon-upload"></i>
+                <div class="el-upload__text">点击上传</div>
+            </div>
+            <div v-if="fileInfo.type === 'btn'">
+                <el-button :size="fileInfo.size?fileInfo.size:'medium'" :type="fileInfo.btntype" @click="aa">{{fileInfo.typename}}</el-button>
+            </div>
+        </el-upload>
+    </div>
+</template>
+<script>
+    export default {
+        props: ['fileInfo', 'fileList','type'],
+        data() {
+            return {
+                fileLists: [],
+                attList: [],
+                loading: false,
+                num: 0,
+                s: false
+            }
+        },
+        methods: {
+            aa(){
+                this.$emit("test");
+            },
+            signUpload(){},
+            //删除
+            handleRemove(file) {
+                for (let i = 0; i < this.attList.length; i++) {
+                    if (this.attList[i].fileName === file.name) {
+                        this.attList.splice(i, 1);
+                        this.$emit('uploadBack', this.attList)
+                    }
+                }
+            },
+            //数量限制
+            handleExceed(files, fileList) {
+                this.$message.warning(
+                    `当前限制选择 ${this.fileInfo.limit} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`
+                );
+            },
+            deforeUp(file) {
+                const isJPG = (file.type === 'image/jpeg') || (file.type ==='image/png');
+
+                if (!isJPG) {
+                    this.$message.error('只能上传jpg或png图片!');
+                    return false
+                }
+                if (this.fileInfo.fileSize) {
+                    const isLt2M = file.size / 1024 / 1024 < this.fileInfo.fileSize;
+                    if (!isLt2M) {
+                        this.$message.error('上传文件大小不能超过 '+this.fileInfo.fileSize+'MB!');
+                        return false
+                    }
+                } else{
+                    const isLt2M = file.size / 1024 / 1024 < 100;
+                    if (!isLt2M) {
+                        this.$message.error('上传文件大小不能超过 20MB!');
+                        return false
+                    }
+                }
+
+                if(this.fileInfo.type == 'img'){
+                    const isImg = file.type.split("/")[0] == 'image';
+                    if (!isImg) {
+                        this.$message.error('请上传图片格式文件!');
+                        return false
+                    }
+                }
+                if(this.fileInfo.typexz == 'ppt'){
+                    const isImg = file.name.split(".")[1] == 'pptx';
+                    // console.log(file.name.split(".")[1] == 'pptx')
+                    if (!isImg) {
+                        this.$message.error('请上传ppt格式文件!');
+                        return false
+                    }
+                }
+                if(this.fileInfo.typexz == 'csv'){
+                    const isImg = file.name.split(".")[1] == 'csv';
+                    if (!isImg) {
+                        this.$message.error('请上传csv格式文件!');
+                        return false
+                    }
+                }
+                if(this.fileInfo.typexz == 'xlsx'){
+                    const isImg = file.name.split(".")[1] == 'xlsx';
+                    if (!isImg) {
+                        this.$message.error('请上传xlsx格式文件!');
+                        return false
+                    }
+                }
+                this.loading = true;
+                let query = new FormData();
+                query.append("files", file);
+                if(this.fileInfo.typename == '一键上传'){
+                    query.append("categoryId", this.fileInfo.categoryId);
+                    query.append("categoryName", this.fileInfo.categoryName);
+                }
+                if(this.fileInfo.typename == '新增素材'){
+                    query.append("advType", this.fileInfo.advType);
+                    query.append("advTypeName", this.fileInfo.advTypeName);
+                }
+                if(this.fileInfo.url == '/market/cIllegalCallTask/importTempByProv'||this.fileInfo.url == '/market/cChannelInfo/cIllegalCallTask/importTempByProv'){
+                    query.append("taskId", this.fileInfo.taskId);
+                    query.append("tempId", this.fileInfo.tempId);
+                }
+                //违规外呼
+                if(this.fileInfo.uploadType == 'outCall'){
+                    query.append("uploadType", 'outCall');
+                    query.append("relId", this.fileInfo.relId);
+                }
+                if(this.fileInfo.uploadType == 'train'){
+                    query.append("uploadType", 'train');
+                    query.append("relId", this.fileInfo.relId);
+                }
+                //运营类项目考核及结算
+                if(this.fileInfo.url == '/market/cmkAttachInfo/upload'){
+                    query.append("uploadType", this.fileInfo.uploadType);
+                }
+                if(this.fileInfo.url == '/market/cStoreOutWo/importData'){
+                    query.append("woNo", this.fileInfo.woNo);
+                }
+                if(this.fileInfo.url == '/market/cStoreScheTrainEva/importDataEva'){
+                    query.append("evaId", this.fileInfo.evaId);
+                }
+                this.num++;
+                let _this = this;
+                this.$http({
+                    url: this.fileInfo.url,
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    data: query,
+                }).then((res) => {
+                    if (this.fileInfo.type === 'btn') {
+                        this.$refs['upload'].clearFiles();
+                        this.$emit('uploadBack',res)
+                        if(res.data.result==0){
+                            _this.$message({
+                                message: res.data.desc,
+                                type: 'success'
+                            });
+                            location.reload();
+                        }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;
+                        }
+                        return
+                    }
+                    if (this.fileInfo.type === 'voice') {
+                        this.attList = res.data;
+                    } else {
+                        this.attList.push({
+                            id: res.data.body.id,
+                            fileName: res.data.body.fileName,
+                            fileCode: res.data.body.fileCode,
+                            opName: res.data.body.opName,
+                            opNo: res.data.body.opNo,
+                            opTime: res.data.body.opTime,
+                            attchFileId: res.data.body.attchFileId,
+                            type: res.data.body.type,
+                        });
+                    }
+                    this.$emit('uploadBack', this.attList);
+                    this.num--;
+                    if (this.num == 0) {
+                        this.loading = false;
+                    }
+                    return true
+                }).catch((res) => {
+                    this.$message({
+                        message: file.name+'上传失败',
+                        type: 'error'
+                    });
+                    this.num--;
+                    if (this.num == 0) {
+                        this.loading = false;
+                    }
+                    for (let i = 0; i < this.$refs['upload'].uploadFiles.length; i++) {
+                        if(file.name == this.$refs['upload'].uploadFiles[i].name){
+                            this.$refs['upload'].uploadFiles.splice(i,1)
+                        }
+                    }
+                    return false
+                })
+            },
+        },
+        mounted() {
+
+        },
+        created() {
+            this.attList = [];
+            for (let i = 0; i < this.fileList.length; i++) {
+                this.attList.push({
+                    id: this.fileList[i].id,
+                    fileName: this.fileList[i].fileName,
+                    fileCode: this.fileList[i].fileCode,
+                    opName: this.fileList[i].opName,
+                    opNo: this.fileList[i].opNo,
+                    opTime: this.fileList[i].opTime,
+                    attchFileId: this.fileList[i].attchFileId,
+                    type: this.fileList[i].type,
+                })
+            }
+        },
+        watch: {
+            fileList() {
+                this.attList = [];
+                for (let i = 0; i < this.fileList.length; i++) {
+                    this.attList.push({
+                        id: this.fileList[i].id,
+                        fileName: this.fileList[i].fileName,
+                        fileCode: this.fileList[i].fileCode,
+                        opName: this.fileList[i].opName,
+                        opNo: this.fileList[i].opNo,
+                        opTime: this.fileList[i].opTime,
+                        attchFileId: this.fileList[i].attchFileId,
+                        type: this.fileList[i].type,
+                    })
+                }
+            }
+        }
+    }
+</script>
+<style scoped lang="scss">
+
+</style>

+ 38 - 0
src/components/myMessageNew.vue

@@ -0,0 +1,38 @@
+<template>
+    <div class="myMessage">
+        <el-dialog title="提示" :visible.sync="centerDialogVisible" top="30vh" width="30%" :close-on-press-escape="false"
+                   :show-close="true" :destroy-on-close="true" :modal-append-to-body="false"
+                   :close-on-click-modal="false" :before-close="closemessage">
+            <div style="height: 30px;line-height: 30px;overflow: hidden;">
+                <i class="el-icon-warning" style="font-size: 30px;float:left;padding:0 10px;color: orange;"></i>
+                <span style="height: 30px;line-height: 30px;display: inline-block;float:left">{{messTit}}</span>
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button size="small" type="primary" @click="closemessage(1)">{{yesBtnName}}</el-button>
+                <el-button size="small" @click="closemessage">{{noBtnName}}</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+export default {
+    props: ["centerDialogVisible","messTit",'type','yesBtnName','noBtnName'],
+    data() {
+        return {
+
+        };
+    },
+    methods: {
+        closemessage(v){
+            this.$emit("closeMessage",v)
+        }
+    },
+    mounted() {},
+    created() {},
+};
+</script>
+
+
+<style>
+</style>

+ 46 - 0
src/components/myMessageRadio.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="myMessage">
+        <el-dialog title="提示" :visible.sync="centerDialogVisible" top="30vh" width="30%" :close-on-press-escape="false"
+                   :show-close="true" :destroy-on-close="true" :modal-append-to-body="false"
+                   :close-on-click-modal="false" :before-close="realClose">
+            <div style="height: 70px;line-height: 30px;overflow: hidden;">
+                <i class="el-icon-warning" style="font-size: 30px;float:left;padding:0 10px;color: orange;"></i>
+                <span style="height: 30px;line-height: 30px;display: inline-block;float:left">{{ messTit }}</span><br/>
+                <div style="margin-left: 40px">
+                        <el-radio v-model="radioStatus" label="1" style="margin: 10px">{{ yesBtnName }}</el-radio>
+                        <el-radio v-model="radioStatus" label="2" style="margin: 10px">{{ noBtnName }}</el-radio>
+                </div>
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button size="small" type="primary" @click="closemessage()">{{ okBtnName }}</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+export default {
+    props: ["centerDialogVisible", "messTit", 'type', 'yesBtnName', 'noBtnName', 'okBtnName'],
+    data() {
+        return {
+            radioStatus: '2'
+        };
+    },
+    methods: {
+        closemessage(v) {
+            this.$emit("closeMessage", this.radioStatus)
+        },
+        realClose(v) {
+            this.$emit("closeMessage", '3')
+        }
+    },
+    mounted() {
+    },
+    created() {
+    },
+};
+</script>
+
+
+<style>
+</style>

+ 91 - 20
src/components/p-header.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="p-header">
-    <div class="title" @click="menuClose">
+    <!-- <div class="title" @click="menuClose">
       <i v-if="this.$store.state.collapse" class="el-icon-s-fold"></i
       ><i v-else class="el-icon-s-unfold"></i>
-    </div>
+    </div> -->
     <!-- <div
       class="title"
       v-for="(item, index) in routeChecked"
@@ -13,12 +13,25 @@
     >
       <span :class="item.icon"></span>{{ item.name }}
     </div> -->
+    <div class="headerspan">
+      <!-- <span>市场经济管理平台</span> -->
+      <img
+        :src="
+          parentorgid === '00440063000000000000'
+            ? require('../assets/newlogo2.png')
+            : require('../assets/newlogo.png')
+        "
+        style="text-align: center; vertical-align: middle"
+        alt=""
+      />
+    </div>
+
     <div class="bars">
-      <div class="bars-item user-info">Hello,{{ username }}</div>
       <div class="bars-item" @click="handleGoToCalendar">
         <i class="el-icon-date"></i>
         日历
       </div>
+      <div class="bars-item user-info">你好{{ username }}</div>
 
       <div class="bars-item" @click="handleHelp">
         <i class="el-icon-time"></i>
@@ -29,8 +42,30 @@
         知识库
       </div>
       <div class="bars-item" @click="handleLogout">
-        <i class="el-icon-guide"></i>
-        退出
+        <!-- <i class="el-icon-guide"></i> -->
+        <svg
+          t="1654163202752"
+          class="icon"
+          viewBox="0 0 1024 1024"
+          version="1.1"
+          xmlns="http://www.w3.org/2000/svg"
+          p-id="9307"
+          id="mx_n_1654163202756"
+          width="18"
+          height="18"
+        >
+          <path
+            d="M768 819.2h-256V204.8L256 102.4h512v102.4h102.4V0H0v819.2l512 204.8v-102.4h358.4v-204.8h-102.4v102.4z"
+            p-id="9308"
+            fill="#ffffff"
+          ></path>
+          <path
+            d="M1024 460.8l-256-153.6v102.4h-204.8v102.4h204.8v102.4l256-153.6z"
+            p-id="9309"
+            fill="#ffffff"
+          ></path>
+        </svg>
+        <span>退出</span>
       </div>
     </div>
   </div>
@@ -47,6 +82,7 @@ export default {
   },
   data() {
     return {
+      parentorgid: "",
       currentIndex: "5",
       date: new Date(),
       routeChecked: [
@@ -74,20 +110,26 @@ export default {
     //   this.$store.commit("setCollapse");
     // }
     //this.menuClose();
-    this.$http({
-      url: "/sysmgr/csysdept/queryGroupListByLoginNo",
-      method: "post",
-      headers: {
-        "Content-Type": "application/json",
-      },
-      data: {},
-    }).then((res) => {
-      if (res.data[0].parentorgid === "00440063000000000000") {
-        document.title = "IT工作台";
-      }
-    });
+    this.getDept();
+    
   },
   methods: {
+    getDept() {
+      this.$http({
+        url: "/sysmgr/csysdept/queryGroupListByLoginNo",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {},
+      }).then((res) => {
+        console.log(res.data[0].parentorgid);
+        this.parentorgid = res.data[0].parentorgid;
+        if (res.data[0].parentorgid === "00440063000000000000") {
+          document.title = "IT工作台";
+        }
+      });
+    },
     handleGoToCalendar() {
       this.$http({
         url: "/sysmgr/csysdept/queryGroupListByLoginNo",
@@ -164,7 +206,7 @@ export default {
             window.sessionStorage.menus = undefined;
             window.sessionStorage.userInfo = undefined;
             window.sessionStorage.childrenMenus = undefined;
-            window.sessionStorage.removeItem("antiSpoofingSearchParams")
+            window.sessionStorage.removeItem("antiSpoofingSearchParams");
             window.opener = null;
             window.open(" ", "_self");
             window.close();
@@ -218,7 +260,26 @@ export default {
 .p-header {
   color: #fff;
   height: 100%;
-  background-color: #0b82ff;
+  background-color: #0056a9;
+
+  .headerspan {
+    float: left;
+    width: 300px;
+    line-height: 60px;
+    margin-left: 20px;
+    // background: url(../assets/logo.png) no-repeat 20px center;
+    // text-indent: 25px;
+    // font-size: 18px;
+    // font-weight: bolder;
+    color: #ffffff;
+    // span {
+    //   margin-left: 40px;
+    // }
+    img {
+      width: 207px;
+      height: 35px;
+    }
+  }
 
   .active {
     color: #0b82ff;
@@ -256,9 +317,19 @@ export default {
       margin-left: 30px;
       cursor: pointer;
       font-family: SourceHanSansCN-Normal;
-      font-size: 14px;
+      font-size: 18px;
       color: #ffffff;
+      position: relative;
       letter-spacing: 0;
+      svg {
+        position: absolute;
+        top: 55%;
+        bottom: 50%;
+        transform: translate(-50%, -50%);
+      }
+      span {
+        margin-left: 15px;
+      }
     }
 
     .user-info {

+ 123 - 86
src/components/p-menu-item.vue

@@ -1,107 +1,144 @@
 <template>
-	<div>
-		<template v-for="(menu, index) in menuData">
-			<el-submenu :key="menu.index" :index="
+  <div>
+    <template v-for="(menu, index) in menuData">
+      <el-submenu
+        :key="menu.index"
+        :index="
           menu.rountPath == '' || menu.rountPath == '#'
             ? menu.name + index
             : menu.rountPath
-        " v-if="menu.children" @click="handelRouterTo(menu)">
-				<template slot="title">
-					<i style="color: #409eff !important" class="el-icon-location"></i>
-					<el-tooltip class="item" effect="dark" :content="menu.name" placement="right"
-						v-if="menu.name.length > 9"><span>{{ menu.name }}</span>
-					</el-tooltip>
-					<span v-else>{{ menu.name }}</span>
-				</template>
-				<MenuTree :menuData="menu.children"></MenuTree>
-			</el-submenu>
-			<el-menu-item v-show="menu.systemflag != 1" @click="handelRouterTo(menu)"
-				:index="menu.rountPath == '' ? menu.name : menu.rountPath" :key="menu.index" v-else>
-				<el-tooltip class="item" effect="dark" :content="menu.name" placement="right"
-					v-if="menu.name.length > 9"><span>{{ menu.name }}</span>
-				</el-tooltip>
-				<span v-else>{{ menu.name }}</span>
-			</el-menu-item>
-		</template>
-	</div>
+        "
+        v-if="menu.children"
+        @click="handelRouterTo(menu)"
+      >
+        <template slot="title">
+          <i style="color: #409eff !important" class="el-icon-location"></i>
+          <el-tooltip
+            class="item"
+            effect="dark"
+            :content="menu.name"
+            placement="right"
+            v-if="menu.name.length > 9"
+            ><span>{{ menu.name }}</span>
+          </el-tooltip>
+          <span v-else>{{ menu.name }}</span>
+        </template>
+        <MenuTree style="align: center" :menuData="menu.children"></MenuTree>
+      </el-submenu>
+      <el-menu-item
+        v-show="menu.systemflag != 1"
+        @click="handelRouterTo(menu)"
+        :index="menu.rountPath == '' ? menu.name : menu.rountPath"
+        :key="menu.index"
+        v-else
+      >
+        <el-tooltip
+          class="item"
+          effect="dark"
+          :content="menu.name"
+          placement="right"
+          v-if="menu.name.length > 9"
+          ><span style="margin-left:10px;">{{ menu.name }}</span>
+        </el-tooltip>
+        <span style="margin-left:10px;" v-else>{{ menu.name }}</span>
+      </el-menu-item>
+    </template>
+  </div>
 </template>
 
 <script>
-	export default {
-		name: "MenuTree",
-		props: ["menuData"],
-		methods: {
-			handleOpen(e) {
-				if (e.indexOf("/") != -1) {
-					if (this.$route.path != e) {
-						this.$router.push(e);
-					}
-				}
-			},
-			handleClose() {},
-			handelRouterTo(item) {
-				if (item.systemflag == "1") {
-					return;
-				}
-				for (let i = 0; i < this.$store.state.tabList.length; i++) {
-					if (this.$store.state.tabList[i].rountPath === item.rountPath) {
-						this.$store.state.tabList[i] = item;
-					}
-				}
-				let set = new Set([...this.$store.state.tabList, item]);
-				set.add(item);
-				this.$store.commit("setDefaultActive", item.rountPath);
-				this.$store.commit("setTabList", Array.from(set));
-			},
-		},
-	};
+export default {
+  name: "MenuTree",
+  props: ["menuData"],
+  methods: {
+    handleOpen(e) {
+      if (e.indexOf("/") != -1) {
+        if (this.$route.path != e) {
+          this.$router.push(e);
+        }
+      }
+    },
+    handleClose() {},
+    handelRouterTo(item) {
+      if (item.systemflag == "1") {
+        return;
+      }
+      for (let i = 0; i < this.$store.state.tabList.length; i++) {
+        if (this.$store.state.tabList[i].rountPath === item.rountPath) {
+          this.$store.state.tabList[i] = item;
+        }
+      }
+      let set = new Set([...this.$store.state.tabList, item]);
+      set.add(item);
+      this.$store.commit("setDefaultActive", item.rountPath);
+      this.$store.commit("setTabList", Array.from(set));
+    },
+  },
+};
 </script>
-<style>
-	.el-submenu {
-		border-bottom: 1px solid #f2f2f2;
-	}
-
-	.is-opened .el-submenu__title {
-		background-color: #ecf5ff !important;
-	}
+<style lang="scss" scoped>
+.el-submenu {
+  border-bottom: 1px solid #ececec;
+}
 
+.is-opened .el-submenu__title {
+  /* background-color: #ecf5ff !important; */
+  background-color: #dddddd !important;
+  border-left: 3px solid #34a0ce;
+}
+.el-submenu__title:hover {
+  background-color: #bbbbbb !important;
+  border-left: 3px solid #34a0ce;
+}
+.is-opened .el-submenu__title:hover {
+  background-color: #bbbbbb !important;
+  border-left: 3px solid #34a0ce;
+}
+::v-deep .el-submenu__title {
+   /* padding-left: 30px !important; */
+}
 	.el-submenu__title {
 		/* background-color: #ecf5ff;
   border-radius: 30px;
   margin-bottom: 10px; */
-	}
+}
 
-	.el-submenu.is-active .el-submenu__title {
-		/* background-color: #ecf5ff; */
-	}
+.el-submenu.is-active .el-submenu__title {
+  /* background-color: #ecf5ff; */
+}
 </style>
 <style lang="scss" scoped>
-	.el-menu-item {
-		overflow: hidden;
-		text-overflow: ellipsis;
-		white-space: nowrap;
-		width: 50px;
-
-		span {
-			padding-right: 10px;
-		}
-	}
+.el-menu-item {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 50px;
+  padding-left: 60px !important;
+  background: #2e7dcf;
+  span {
+    padding-right: 10px;
+    color: #bdddff;
+  }
+}
 
-	.el-menu--vertical {
-		.el-menu-item {
-			width: auto !important;
+.el-menu-item:hover {
+  background: #577494;
+}
 
-			span {
-				padding-right: 0;
-			}
-		}
-	}
+.el-menu--vertical {
+  .el-menu-item {
+    width: auto !important;
+    span {
+      padding-right: 0;
+    }
+  }
+}
 
-	.bgc {
-		background-color: #f56c6c;
-	}
+.bgc {
+  background-color: #f56c6c;
+}
 
-	.bgcChild {
-		background-color: #f56c6c;
-	}
+.bgcChild {
+  background-color: #f56c6c;
+}
 </style>

+ 183 - 167
src/components/p-menu.vue

@@ -1,185 +1,201 @@
 <template>
-	<div class="p-menu">
-		<!-- <div style="height:60px;background-color: #0b82ff;"></div> -->
-		<!-- <el-card class="card" ref="menuCard"> -->
-		<el-menu class="el-menu-vertical-demo" :default-active="getDefaultActive" router :collapse="collapse"
-			@open="handleOpen" @close="handleClose" active-text-color="#71A6FD">
-			<div class="menu-logo" style="height: 60px; line-height: 60px">
-<!--                <img width="95%" style="text-align: center; vertical-align: middle" src="../assets/newlogo.png"-->
-<!--                     alt="" />-->
-                <img :src="parentorgid==='00440063000000000000' ? require('../assets/newlogo2.png') : require('../assets/newlogo.png')" width="95%" style="text-align: center; vertical-align: middle" alt=""/>
-			</div>
-			<!-- 引入组件 -->
-			<div class="menuScoll">
-				<menuItem :menuData="data" class="menuScoll-box">
-				</menuItem>
-			</div>
-		</el-menu>
-		<!-- </el-card> -->
-	</div>
+  <div class="p-menu">
+    <!-- <div style="height:60px;background-color: #0b82ff;"></div> -->
+    <!-- <el-card class="card" ref="menuCard"> -->
+    <el-menu
+      class="el-menu-vertical-demo"
+      :default-active="getDefaultActive"
+      router
+      :collapse="collapse"
+      @open="handleOpen"
+      @close="handleClose"
+      active-text-color="#71A6FD"
+    >
+      <!-- <div class="menu-logo" style="height: 60px; line-height: 60px"> -->
+      <!--                <img width="95%" style="text-align: center; vertical-align: middle" src="../assets/newlogo.png"-->
+      <!--                     alt="" />-->
+      <!-- <img :src="parentorgid==='00440063000000000000' ? require('../assets/newlogo2.png') : require('../assets/newlogo.png')" width="95%" style="text-align: center; vertical-align: middle" alt=""/> -->
+      <!-- </div> -->
+      <!-- 引入组件 -->
+      <div class="menuScoll">
+        <menuItem :menuData="data" class="menuScoll-box"> </menuItem>
+      </div>
+    </el-menu>
+    <!-- </el-card> -->
+  </div>
 </template>
 
 <script>
-	export default {
-		props: {
-			//菜单数据源类型Array<JsonObject>,具体格式参考data/menu-list.js
-			data: {
-				required: false,
-				type: Array,
-				default () {
-					return [];
-				},
-			},
-		},
-		components: {
-			menuItem: () => import( /* webpackChunkName: "system" */ "./p-menu-item"),
-		},
-		computed: {
-			getDefaultActive() {
-				return this.$store.state.defaultActive;
-			},
-			collapse() {
-				return this.$store.state.collapse;
-			},
-		},
-		data() {
-			return {
-				defaultActiveMenuItem: {},
-                parentorgid: '',
-			};
-		},
-		mounted() {
-			if (this.data.length > 0) {
-				this.recursion(this.data);
-			}
-            this.getDept()
-		},
-		updated() {
-			if (this.data.length > 0) {
-
-				this.recursion(this.data);
-
-			}
-		},
-		methods: {
-			recursion(data) {
-				for (let item of data) {
-					if (item.children != "") {
-						this.recursion(item.children);
-					} else if (item.rountPath == this.$route.path) {
-						if (item.systemflag != "1") {
-							this.handelRouterTo(item);
-							return;
-						}
-					}
-				}
-			},
-			handleOpen(e) {
-				if (e.indexOf("/") != -1) {
-					if (this.$route.path != e) {
-						this.$router.push(e);
-					}
-				}
-			},
-			handleClose() {},
-			handelRouterTo(item) {
-				if (item.systemflag == "1") {
-					return;
-				}
-				let defaults = this.$store.state.tabList.filter((row) => {
-					let rountPath = row.hasOwnProperty("rountPath") ?
-						row.rountPath :
-						row.jspUrl;
-					if (rountPath == item.rountPath) {
-						return row;
-					}
-				});
-				if (defaults.length == 1) {
-					return;
-				}
-				let set = new Set([...this.$store.state.tabList, item]);
-				set.add(item);
-				this.$store.commit("setDefaultActive", item.rountPath);
-				this.$store.commit("setTabList", Array.from(set));
-			},
-            getDept() {
-                this.$http({
-                    url: "/sysmgr/csysdept/queryGroupListByLoginNo",
-                    method: "post",
-                    headers: {
-                        "Content-Type": "application/json",
-                    },
-                    data: {},
-                }).then((res) => {
-                    console.log(res.data[0].parentorgid)
-                    this.parentorgid = res.data[0].parentorgid;
-                });
-            },
-		},
-	};
+export default {
+  props: {
+    //菜单数据源类型Array<JsonObject>,具体格式参考data/menu-list.js
+    data: {
+      required: false,
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+  },
+  components: {
+    menuItem: () => import(/* webpackChunkName: "system" */ "./p-menu-item"),
+  },
+  computed: {
+    getDefaultActive() {
+      return this.$store.state.defaultActive;
+    },
+    collapse() {
+      return this.$store.state.collapse;
+    },
+  },
+  data() {
+    return {
+      defaultActiveMenuItem: {},
+      parentorgid: "",
+    };
+  },
+  mounted() {
+    if (this.data.length > 0) {
+      this.recursion(this.data);
+    }
+    // this.getDept();
+  },
+  updated() {
+    if (this.data.length > 0) {
+      this.recursion(this.data);
+    }
+  },
+  methods: {
+    recursion(data) {
+      for (let item of data) {
+        if (item.children != "") {
+          this.recursion(item.children);
+        } else if (item.rountPath == this.$route.path) {
+          if (item.systemflag != "1") {
+            this.handelRouterTo(item);
+            return;
+          }
+        }
+      }
+    },
+    handleOpen(e) {
+      if (e.indexOf("/") != -1) {
+        if (this.$route.path != e) {
+          this.$router.push(e);
+        }
+      }
+    },
+    handleClose() {},
+    handelRouterTo(item) {
+      if (item.systemflag == "1") {
+        return;
+      }
+      let defaults = this.$store.state.tabList.filter((row) => {
+        let rountPath = row.hasOwnProperty("rountPath")
+          ? row.rountPath
+          : row.jspUrl;
+        if (rountPath == item.rountPath) {
+          return row;
+        }
+      });
+      if (defaults.length == 1) {
+        return;
+      }
+      let set = new Set([...this.$store.state.tabList, item]);
+      set.add(item);
+      this.$store.commit("setDefaultActive", item.rountPath);
+      this.$store.commit("setTabList", Array.from(set));
+    },
+    getDept() {
+      this.$http({
+        url: "/sysmgr/csysdept/queryGroupListByLoginNo",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {},
+      }).then((res) => {
+        console.log(res.data[0].parentorgid);
+        this.parentorgid = res.data[0].parentorgid;
+      });
+    },
+  },
+};
 </script>
 <style>
-	.el-menu--collapse .menu-logo {
-		background-image: url(../assets/leftlogo.png);
-		background-repeat: no-repeat;
-		background-size: 50% 50%;
-		background-position-x: 50%;
-		background-position-y: 50%;
-	}
+.el-menu--collapse .menu-logo {
+  background-image: url(../assets/leftlogo.png);
+  background-repeat: no-repeat;
+  background-size: 50% 50%;
+  background-position-x: 50%;
+  background-position-y: 50%;
+}
 
-	.menu-logo {
-		border: 1px solid #f2f2f2;
-	}
+.menu-logo {
+  border: 1px solid #f2f2f2;
+}
 
-	.el-menu--collapse .menu-logo img {
-		display: none;
-	}
+.el-menu--collapse .menu-logo img {
+  display: none;
+}
 
-	.el-menu--collapse .el-submenu__title span {
-		display: none;
-	}
+.el-menu--collapse .el-submenu__title span {
+  display: none;
+}
 
-	.el-menu--collapse .el-submenu__title .el-submenu__icon-arrow {
-		display: none;
-	}
+.el-menu--collapse .el-submenu__title .el-submenu__icon-arrow {
+  display: none;
+}
 
-	.p-menu .el-menu-vertical-demo:not(.el-menu--collapse) {
-		width: 200px;
-		min-height: 400px;
-	}
+.p-menu .el-menu-vertical-demo:not(.el-menu--collapse) {
+  width: 200px;
+  min-height: 400px;
+}
 </style>
 <style scoped="scoped" lang="scss">
-	.p-menu {
-		height: 100%;
-		// padding-left: 50px;
-		// padding-top: 38px;
-		max-width: 200px;
-		background-color: white;
-		overflow: hidden;
+.p-menu {
+  height: 100%;
+  // padding-left: 50px;
+  // padding-top: 38px;
+  max-width: 200px;
+  background-color: white;
+  overflow: hidden;
+
+  .card {
+    width: 100%;
+    flex-grow: 0;
+    flex-shrink: 0;
+    height: 100%;
+    max-height: 100%;
 
-		.card {
-			width: 100%;
-			flex-grow: 0;
-			flex-shrink: 0;
-			height: 100%;
-			max-height: 100%;
+    ::v-deep .el-card__body {
+      padding: 0px;
+    }
+  }
+}
 
-			::v-deep .el-card__body {
-				padding: 0px;
-			}
-		}
-	}
+.menuScoll {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
 
-	.menuScoll {
-		width: 100%;
-		height: 100%;
-		overflow: hidden;
+  .menuScoll-box {
+    width: calc(100% + 20px);
+    max-height: calc(100vh - 60px);
+    padding-bottom: 60px;
+    overflow-y: scroll;
+  }
+}
+/*菜单打开*/
+::v-deep .el-submenu.is-opened > .el-submenu__title .el-submenu__icon-arrow {
+  -webkit-transform: rotateZ(0deg);
+  transform: rotateZ(0deg);
+}
 
-		.menuScoll-box {
-			width: calc(100% + 20px);
-			max-height: calc(100vh - 60px);
-			padding-bottom: 60px;
-			overflow-y: scroll;
-		}
-	}
+/*菜单关闭*/
+::v-deep .el-submenu>.el-submenu__title .el-submenu__icon-arrow{
+	-webkit-transform: rotateZ(-90deg); 
+	-ms-transform: rotate(-90deg);
+	transform: rotateZ(-90deg);
+}
 </style>

+ 59 - 45
src/components/p-tabs.vue

@@ -7,9 +7,8 @@
         :key="item.name + item.rountPath || item.jspUrl"
         :class="{
           'tab-item-active':
-            (item.rountPath == undefined
-              ? item.jspUrl
-              : item.rountPath) == getDefaultActive,
+            (item.rountPath == undefined ? item.jspUrl : item.rountPath) ==
+            getDefaultActive,
         }"
         @click="handleClick($event, item, index)"
         @contextmenu.prevent="clickright($event, item, index)"
@@ -27,7 +26,7 @@
           </div>
         </el-tooltip>
         <i
-          class="el-icon-error close"
+          class="el-icon-close close"
           @click="handleClose($event, item, index)"
         ></i>
       </div>
@@ -125,9 +124,10 @@ export default {
      * 删除tab元素触发关闭页面的逻辑
      * @param {Object} e 事件对象
      * @param {Object} item 当前点击的tab元素数据
-     * @param {Object} index 当前tab的下标
+     * @param {Object} index 当前tab的下标p
      */
     handleClose(e, item, index) {
+      console.log(item);
       this.$store.commit(
         "removePagesByName",
         (item.rountPath == undefined ? item.jspUrl : item.rountPath).replace(
@@ -143,29 +143,39 @@ export default {
           (item.rountPath == undefined ? item.jspUrl : item.rountPath) !=
           this.getDefaultActive
         ) {
-          list.splice(index, 1);
+          if (item.jspUrl != "/leader" && item.rountPath != "/leader") {
+            list.splice(index, 1);
+          }
           this.$store.commit("setTabList", list);
         } else {
-          if (list[index - 1]) {
-            let rountPath = list[index - 1].hasOwnProperty("rountPath")
-              ? list[index - 1].rountPath
-              : list[index - 1].jspUrl;
-            this.$store.commit("setDefaultActive", rountPath);
-            list.splice(index, 1);
-            this.$store.commit("setTabList", list);
-            this.$router.push(rountPath);
-          } else if (list[index + 1]) {
-            let rountPath = list[index + 1].hasOwnProperty("rountPath")
-              ? list[index + 1].rountPath
-              : list[index + 1].jspUrl;
-            this.$store.commit("setDefaultActive", rountPath);
-            list.splice(index, 1);
-            this.$store.commit("setTabList", list);
-            this.$router.push(rountPath);
-          } else {
-            list.splice(index, 1);
-            this.$store.commit("setTabList", list);
-            this.$router.push("/");
+          if (item.jspUrl != "/leader" && item.rountPath != "/leader") {
+            if (list[index - 1]) {
+              let rountPath = list[index - 1].hasOwnProperty("rountPath")
+                ? list[index - 1].rountPath
+                : list[index - 1].jspUrl;
+              this.$store.commit("setDefaultActive", rountPath);
+              if (item.jspUrl != "/leader" && item.rountPath != "/leader") {
+                list.splice(index, 1);
+                this.$store.commit("setTabList", list);
+                this.$router.push(rountPath);
+              }
+            } else if (list[index + 1]) {
+              let rountPath = list[index + 1].hasOwnProperty("rountPath")
+                ? list[index + 1].rountPath
+                : list[index + 1].jspUrl;
+              this.$store.commit("setDefaultActive", rountPath);
+              if (item.jspUrl != "/leader" && item.rountPath != "/leader") {
+                list.splice(index, 1);
+                this.$store.commit("setTabList", list);
+                this.$router.push(rountPath);
+              }
+            } else {
+              if (item.jspUrl != "/leader" && item.rountPath != "/leader") {
+                list.splice(index, 1);
+                this.$store.commit("setTabList", list);
+                this.$router.push("/");
+              }
+            }
           }
         }
       }
@@ -377,27 +387,27 @@ export default {
 .p-tabs {
   box-sizing: border-box;
   width: 100%;
-  height: 38px;
+  height: 50px;
   white-space: nowrap;
   overflow: hidden;
-  margin-top: 15px;
-
+  // margin-top: 15px;
+  background: #f3f3f3;
   // padding-left: 40px;
   .tab-item {
     display: inline-block;
-    height: 38px;
-    line-height: 38px;
+    height: 50px;
+    line-height: 50px;
     color: black;
     position: relative;
-    width: 134px;
+    width: 180px;
     overflow: hidden;
     border-radius: 0px 5px 0px 0px;
-    margin-left: 15px;
+    // margin-left: 15px;
     cursor: pointer;
 
     .tab-item-shap {
       position: absolute;
-      width: 100%;
+      width: 160px;
       height: 38px;
       transition: 0.3s;
       background: rgba(255, 255, 255, 0.4);
@@ -408,29 +418,30 @@ export default {
 
     .text {
       text-align: center;
-      overflow-x: hidden;
+      overflow: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
       // padding: 0px 16px;
       font-size: 14px;
       letter-spacing: 0;
       position: absolute;
-      width: 100%;
+      width: 160px;
       height: 38px;
       text-align: center;
-      background-color: white;
+      // background-color: white;
     }
 
     .close {
-      font-size: 12px;
+      font-size: 16px;
+      font-weight: 900;
       position: absolute;
-      right: 3px;
-      top: 3px;
-      color: #fff;
+      right: -3px;
+      top: 18px;
+      color: #000000;
     }
 
     .close:hover {
-      color: #107cff;
+      color: #0056a9;
     }
   }
 
@@ -441,6 +452,8 @@ export default {
   }
 
   .tab-item-active {
+    border-bottom: 3px solid #41a2fd;
+
     .skew {
       background: #fff;
     }
@@ -454,15 +467,16 @@ export default {
 
     .text {
       text-align: center;
-      overflow-x: hidden;
+      // overflow-x: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
       // padding: 0px 16px;
-      color: #107cff;
+      font-weight: 900;
+      color: #0056a9;
     }
 
     .close {
-      color: #107cff;
+      color: transparent;
     }
   }
 

+ 2 - 2
src/components/toolList.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="titbox">
-        <h2>{{tooltit}}</h2>
+        <h2 class="font-ui">{{tooltit}}</h2>
         <div>
             <i class="el-icon-refresh" @click="iconCli(1)"></i>
             <i class="el-icon-full-screen" @click="iconCli(2)"></i>
@@ -31,7 +31,7 @@
 <style scoped lang="scss">
     .titbox {
         h2 {
-            font-weight: normal;
+            // font-weight: normal;
             display: inline-block;
         }
         div {

+ 138 - 96
src/pages/main/achievements/achievementsIndex.vue

@@ -1,101 +1,143 @@
 <template>
-	<div class="inner-container">
-		<el-col :span="3">
-			<el-tabs tab-position="left" v-model="activeName" @tab-click="handleClick">
-				<el-tab-pane v-for="(item, index) in menuList" :key="index" :name="item.path" :label="item.label">
-				</el-tab-pane>
-			</el-tabs>
-		</el-col>
-		<el-col :span="21">
-			<div style="height: 100%">
-				<router-view />
-			</div>
-		</el-col>
-	</div>
+  <div class="inner-container">
+    <div class="box">
+      <el-tabs v-model="activeName" @tab-click="handleClick" type="card">
+        <el-tab-pane
+          v-for="(item, index) in menuList"
+          :key="index"
+          :name="item.path"
+          :label="item.label"
+        >
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+    <el-row>
+      <div style="height: 100%;padding-left:15px">
+        <router-view />
+      </div>
+    </el-row>
+  </div>
 </template>
 <script>
-	export default {
-		data() {
-			return {
-				activeName: "budget",
-				userNo: JSON.parse(window.sessionStorage.userInfo).loginNo,
-				showList: [],
-				routerList: [{
-						label: "集团绩效",
-						path: "/recallJt",
-						name: "recallJt"
-					},
-					{
-						label: "部门绩效",
-						path: "/recallBm",
-						name: "recallBm"
-					},
-					{
-						label: "副总GS",
-						path: "/recallGs",
-						name: "recallGs"
-					},
-					// {
-					// 	label: "绩效回复列表",
-					// 	path: "/kpiRecall",
-					// 	name: "kpiRecall"
-					// },
-					{
-						label: "绩效模板管理",
-						path: "/kpiMuban",
-						name: "kpiMuban"
-					},
-                    {
-                        label: "下发管理",
-                        path: "/kpiIssueList",
-                        name: "kpiIssueList"
-                    },
-                    {
-                        label: "科室绩效",
-                        path: "/recallkpi",
-                        name: "recallkpi"
-                    },
-
-				],
-			};
-		},
-		computed: {
-			menuList: function() {
-				let arr = [];
-				this.routerList.map((item) => {
-					this.showList.map((row) => {
-						if (item.path == row) {
-							arr.push(item);
-						}
-					});
-				});
-				return arr;
-			},
-		},
-		methods: {
-			handleClick(val) {
-				if (this.$route.path != this.activeName) {
-					this.$router.push(this.activeName);
-				}
-			},
-		},
-		mounted() {
-			this.activeName = this.$route.path;
-		},
-		created() {
-			JSON.parse(sessionStorage.childrenMenus).map((item) => {
-				this.showList.push(item.jspUrl);
-			});
-		},
-		watch: {
-			$route(to, from) {
-				this.activeName = this.$route.path;
-			},
-		},
-	};
+export default {
+  data() {
+    return {
+      activeName: "budget",
+      userNo: JSON.parse(window.sessionStorage.userInfo).loginNo,
+      showList: [],
+      routerList: [
+        {
+          label: "集团绩效",
+          path: "/recallJt",
+          name: "recallJt",
+        },
+        {
+          label: "部门绩效",
+          path: "/recallBm",
+          name: "recallBm",
+        },
+        {
+          label: "副总GS",
+          path: "/recallGs",
+          name: "recallGs",
+        },
+        // {
+        // 	label: "绩效回复列表",
+        // 	path: "/kpiRecall",
+        // 	name: "kpiRecall"
+        // },
+        {
+          label: "绩效模板管理",
+          path: "/kpiMuban",
+          name: "kpiMuban",
+        },
+        {
+          label: "下发管理",
+          path: "/kpiIssueList",
+          name: "kpiIssueList",
+        },
+        {
+          label: "科室绩效",
+          path: "/recallkpi",
+          name: "recallkpi",
+        },
+      ],
+    };
+  },
+  computed: {
+    menuList: function () {
+      let arr = [];
+      let list = []
+      this.routerList.map((item) => {
+        this.showList.map((row) => {
+          if (item.path == row) {
+            arr.push(item);
+            list  = [...new Set(arr)]
+          }
+        });
+      });
+      return list;
+    },
+  },
+  methods: {
+    handleClick(val) {
+      if (this.$route.path != this.activeName) {
+        this.$router.push(this.activeName);
+      }
+    },
+  },
+  mounted() {
+    this.activeName = this.$route.path;
+  },
+  created() {
+    JSON.parse(sessionStorage.childrenMenus).map((item) => {
+      this.showList.push(item.jspUrl);
+    });
+  },
+  watch: {
+    $route(to, from) {
+      this.activeName = this.$route.path;
+    },
+  },
+};
 </script>
-<style>
-	.el-tabs__content {
-		display: none;
-	}
+<style lang="scss" scoped>
+.el-tabs__content {
+  display: none;
+}
+.box {
+  border-bottom: 1px solid #e1e1e1;
+  height: 55px;
+  margin-top:10px ;
+}
+::v-deep .el-tabs__item {
+  width: 166px;
+  text-align: center;
+  border-left: 10px solid #ffffff;
+  border-right: 10px solid #ffffff;
+}
+::v-deep .el-tabs__header {
+  margin: 0px;
+  background: #d8eaf6;
+  color: black;
+  border:0;
+  margin-left: 20px;
+  display: inline-block;
+}
+
+::v-deep .is-active {
+  background: #0583cd;
+  color: white;
+}
+
+::v-deep .el-tabs__item:hover {
+  color: black;
+}
+::v-deep .is-active:hover {
+  background: #0583cd;
+  color: white;
+}
+::v-deep .el-tabs--card>.el-tabs__header .el-tabs__nav {
+  border:0px
+}
 </style>

+ 1 - 1
src/pages/main/achievements/achievementsMuban.vue

@@ -3,7 +3,7 @@
 		<fullscreen :fullscreen.sync="fullscreen" class="container-box"
 			style="margin: 0 !important; padding: 0 !important">
 			<div class="titbox">
-				<h2>绩效模板管理</h2>
+				<h2 class="font-ui">绩效模板管理</h2>
 				<div>
 					<i class="el-icon-refresh" @click="iconCli(1)"></i>
 					<i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/achievements/issueList.vue

@@ -7,7 +7,7 @@
             style="margin: 0 !important; padding: 0 !important"
         >
             <div class="titbox">
-                <h2>下发管理</h2>
+                <h2 class="font-ui">下发管理</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 4 - 1
src/pages/main/achievements/recallBumen.vue

@@ -6,7 +6,7 @@
       style="margin: 0 !important; padding: 0 !important"
     >
       <div class="titbox">
-        <h2>部门绩效回复</h2>
+        <h2 class="font-ui">部门绩效回复</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>
@@ -417,5 +417,8 @@ export default {
   text-align: right;
   margin-top: 10px;
 }
+::v-deep .el-tabs__active-bar{
+		width: 0px !important;
+	}
 </style>
 

+ 4 - 1
src/pages/main/achievements/recallGS.vue

@@ -6,7 +6,7 @@
       style="margin: 0 !important; padding: 0 !important"
     >
       <div class="titbox">
-        <h2>副总GS绩效回复</h2>
+        <h2 class="font-ui">副总GS绩效回复</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>
@@ -435,5 +435,8 @@ export default {
   text-align: right;
   margin-top: 10px;
 }
+::v-deep .el-tabs__active-bar{
+		width: 0px !important;
+	}
 </style>
 

+ 4 - 1
src/pages/main/achievements/recallJt.vue

@@ -3,7 +3,7 @@
 		<fullscreen :fullscreen.sync="fullscreen" class="container-box"
 			style="margin: 0 !important; padding: 0 !important">
 			<div class="titbox">
-				<h2>集团绩效</h2>
+				<h2 class="font-ui">集团绩效</h2>
 				<div>
 					<i class="el-icon-refresh" @click="iconCli(1)"></i>
 					<i class="el-icon-full-screen" @click="iconCli(2)"></i>
@@ -387,4 +387,7 @@
 		text-align: right;
 		margin-top: 10px;
 	}
+	::v-deep .el-tabs__active-bar{
+		width: 0px !important;
+	}
 </style>

+ 1 - 1
src/pages/main/achievements/recallMuban.vue

@@ -2,7 +2,7 @@
 	<div class="container" v-loading="loading">
 		<fullscreen :fullscreen.sync="fullscreen" class="container-box">
 			<div class="titbox">
-				<h2>科室绩效回复</h2>
+				<h2 class="font-ui">科室绩效回复</h2>
 				<div>
 					<i class="el-icon-refresh" @click="iconCli(1)"></i>
 					<i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 2 - 2
src/pages/main/advertising/index.vue

@@ -17,7 +17,7 @@
 			        <span>查看/下载</span>
 			    </div>
 			</div> -->
-			<h2 style="margin-top: 20px;">宣传物料管理</h2>
+			<h2 class="font-ui" style="margin-top: 20px;">宣传物料管理</h2>
 			<div class="adv-type">
 			    <div class="wfour" @click="jumpinfo('/materialApplication','宣传物料申请及审批')">
 			        <span><i class="el-icon-folder-opened"></i></span>
@@ -36,7 +36,7 @@
 				    <span>市级物料审批</span>
 				</div> -->
 			</div>
-			<h2 style="margin-top: 20px;">基础数据管理</h2>
+			<h2 class="font-ui" style="margin-top: 20px;">基础数据管理</h2>
 			<div class="adv-type">
 			    <!-- <div class="wfive" @click="jumpinfo('/materielPick','一采物料类型建档')" v-if="province">
 			        <span><i class="el-icon-folder-opened"></i></span>

+ 1 - 1
src/pages/main/advertising/indexs.vue

@@ -2,7 +2,7 @@
     <fullscreen :fullscreen.sync="fullscreen" class="container">
         <div class="container-box">
 
-			<h2>广告宣传费台账</h2>
+			<h2 class="font-ui">广告宣传费台账</h2>
 			<div class="adv-type">
 			    <div @click="jumpinfop('/publicityAccount',1,'宣传费台账')" v-if="lockFlag == 'updata'">
 			        <span><i class="el-icon-folder-opened"></i></span>

Fichier diff supprimé car celui-ci est trop grand
+ 1451 - 1509
src/pages/main/advertising/materialApplicationadd.vue


+ 63 - 24
src/pages/main/antiSpoofing/home.vue

@@ -1,31 +1,31 @@
 <template>
   <div class="inner-container">
     <div v-if="menuList.indexOf(activeName) >= 0">
-        <el-col :span="3"
-        ><el-tabs
-            tab-position="left"
-            v-model="activeName"
-            @tab-click="handleClick"
+      <div class="box">
+        <el-tabs
+          v-model="activeName"
+          @tab-click="handleClick"
         >
-            <el-tab-pane
-                v-for="(item, index) in routerList"
-                :key="index"
-                :name="item.path"
-                :label="item.label"
-            ></el-tab-pane>
+          <el-tab-pane
+            v-for="(item, index) in routerList"
+            :key="index"
+            :name="item.path"
+            :label="item.label"
+          ></el-tab-pane>
         </el-tabs>
-        </el-col>
-        <el-col :span="21" style="background: #f4f4f4;">
-            <div style="height: 100%">
-                <router-view />
-            </div>
-        </el-col>
+      </div>
+      <el-row>
+        <!-- <el-col :span="21" style="background: #f4f4f4;"> -->
+        <div style="height: 100%">
+          <router-view />
+        </div>
+      </el-row>
     </div>
-      <div v-else>
-          <div style="height: 100%;background: #f4f4f4;">
-              <router-view />
-          </div>
+    <div v-else>
+      <div style="height: 100%; background: #f4f4f4">
+        <router-view />
       </div>
+    </div>
   </div>
 </template>
 <script>
@@ -35,9 +35,13 @@ export default {
       activeName: "",
       showList: [],
       routerList: [
-        { label: "区县考核报表", path: "/districtCounty", name: "districtCounty" },
+        {
+          label: "区县考核报表",
+          path: "/districtCounty",
+          name: "districtCounty",
+        },
         { label: "人员考核报表", path: "/personnel", name: "personnel" },
-        { label: "渠道考核报表", path: "/channel", name: "channel" }
+        { label: "渠道考核报表", path: "/channel", name: "channel" },
       ],
     };
   },
@@ -76,8 +80,43 @@ export default {
   },
 };
 </script>
-<style>
+<style lang="scss" scoped>
+
 .el-tabs__content {
   display: none;
 }
+.box{
+  border-bottom: 1px solid #e1e1e1;
+  height: 55px;
+  margin-top:10px ;
+}
+::v-deep .el-tabs__item {
+  width: 166px;
+  text-align: center;
+  border-left: 10px solid #ffffff;
+  padding: 0;
+  border-right: 10px solid #ffffff;
+}
+::v-deep .el-tabs__header {
+  margin: 0px;
+  background: #d8eaf6;
+  color: black;
+  margin-left: 20px;
+  display: inline-block;
+}
+::v-deep .is-active {
+  background: #0583cd;
+  color: white;
+}
+
+::v-deep .el-tabs__item:hover {
+  color: black;
+}
+::v-deep .is-active:hover {
+  background: #0583cd;
+  color: white;
+}
+::v-deep .el-tabs__active-bar{
+  width: 0px !important;;
+}
 </style>

Fichier diff supprimé car celui-ci est trop grand
+ 1276 - 0
src/pages/main/apkTestMain/index.vue


+ 176 - 154
src/pages/main/budget/budgetIndex.vue

@@ -1,162 +1,184 @@
 <template>
-	<div class="inner-container">
-		<el-col :span="3">
-			<span :class="item.sts?'spanbox bg':'spanbox'" v-for="(item, index) in menuList" :key="index" :name="item.path" :label="item.label" @click="handleClick(item)">
-				<el-badge :value="item.num" :max="99" :hidden="item.num == 0">
-					<span style="padding-right: 10px;">{{item.label}}</span>
-				</el-badge>
-			</span>
-			<!-- <el-tabs tab-position="left" v-model="activeName" @tab-click="handleClick">
+  <div class="inner-container">
+    <!-- <el-col :span="3"> -->
+    <div class="box">
+      <span
+        :class="item.sts ? 'spanbox bg' : 'spanbox'"
+        v-for="(item, index) in menuList"
+        :key="index"
+        :name="item.path"
+        :label="item.label"
+        @click="handleClick(item)"
+      >
+        <el-badge :value="item.num" :max="99" :hidden="item.num == 0">
+          <span>{{ item.label }}</span>
+        </el-badge>
+      </span>
+    </div>
+    <!-- <el-tabs tab-position="left" v-model="activeName" @tab-click="handleClick">
 				<el-tab-pane v-for="(item, index) in menuList" :key="index" :name="item.path" :label="item.label">
 				</el-tab-pane>
 			</el-tabs> -->
-		</el-col>
-		<el-col :span="21">
-			<div style="height: 100%">
-				<router-view />
-			</div>
-		</el-col>
-	</div>
+    <!-- </el-col> -->
+    <div style="padding-left: 15px">
+      <el-row>
+        <div style="height: 100%">
+          <router-view />
+        </div>
+      </el-row>
+    </div>
+  </div>
 </template>
 <script>
-	export default {
-		data() {
-			return {
-				activeName: "",
-				showList: [],
-				routerList: [{
-						label: "月度部门预算",
-						path: "/monthExcel",
-						name: "monthExcel",
-						sts:1,
-						num:0
-					},
-					{
-						label: "季度部门预算",
-						path: "/quarterExcel",
-						name: "quarterExcel",
-						sts:0,
-						num:0
-					},
-					{
-						label: "年度部门预算",
-						path: "/yearExcel",
-						name: "yearExcel",
-						sts:0,
-						num:0
-					},
-					{
-						label: "采购部门预算",
-						path: "/projectExcel",
-						name: "projectExcel",
-						sts:0,
-						num:0
-					},
-					// {
-					// 	label: "预算回复",
-					// 	path: "/recallAdmin",
-					// 	name: "recallAdmin",
-					// 	sts:0,
-					// 	num:0
-					// },
-					{
-						label: "预算模板管理",
-						path: "/budgetList",
-						name: "budgetList",
-						sts:0,
-						num:0
-					},
-                    {
-                        label: "下发管理",
-                        path: "/issueList",
-                        name: "issueList",
-                        sts:0,
-                        num:0
-                    },
-				],
-			};
-		},
-		computed: {
-			menuList: function() {
-				let arr = [];
-				this.routerList.map((item) => {
-					// arr.push(item);
-					this.showList.map((row) => {
-						if (item.path == row.jspUrl && row.systemflag == '1') {
-							arr.push(item);
-						}
-					});
-				});
-				return arr;
-			},
-		},
-		methods: {
-			handleClick(val) {
-				this.activeName = val.path;
-				for (let i = 0; i < this.routerList.length; i++) {
-					this.routerList[i].sts = 0;
-				}
-				val.sts = 1;
-				if (this.$route.path != this.activeName) {
-					this.$router.push(this.activeName);
-				}
-				this.getnunm();
-			},
-			getnunm(){
-				this.$http({
-					url: "/market/preTask/queryTaskToDoNumByFunc",
-					method: "post",
-					headers: {
-						"Content-Type": "application/json",
-					},
-					data: {},
-				}).then((res) => {
-					for (let i = 0; i < res.data.length; i++) {
-						if(res.data[i].funcCode == '1000'){
-							this.routerList[2].num = res.data[i].taskNum;
-						}
-						if(res.data[i].funcCode == '1001'){
-							this.routerList[0].num = res.data[i].taskNum;
-						}
-						if(res.data[i].funcCode == '1003'){
-							this.routerList[3].num = res.data[i].taskNum;
-						}
-						if(res.data[i].funcCode == '1004'){
-							this.routerList[1].num = res.data[i].taskNum;
-						}
-					}
-				});
-			}
-		},
-		mounted() {
-			this.activeName = this.$route.path;
-		},
-		created() {
-			JSON.parse(sessionStorage.childrenMenus).map((item) => {
-				this.showList.push(item);
-			});
-			this.getnunm();
-		},
-		watch: {
-			$route(to, from) {
-				this.activeName = this.$route.path;
-			},
-		},
-	};
+export default {
+  data() {
+    return {
+      activeName: "",
+      showList: [],
+      routerList: [
+        {
+          label: "月度部门预算",
+          path: "/monthExcel",
+          name: "monthExcel",
+          sts: 1,
+          num: 0,
+        },
+        {
+          label: "季度部门预算",
+          path: "/quarterExcel",
+          name: "quarterExcel",
+          sts: 0,
+          num: 0,
+        },
+        {
+          label: "年度部门预算",
+          path: "/yearExcel",
+          name: "yearExcel",
+          sts: 0,
+          num: 0,
+        },
+        {
+          label: "采购部门预算",
+          path: "/projectExcel",
+          name: "projectExcel",
+          sts: 0,
+          num: 0,
+        },
+        // {
+        // 	label: "预算回复",
+        // 	path: "/recallAdmin",
+        // 	name: "recallAdmin",
+        // 	sts:0,
+        // 	num:0
+        // },
+        {
+          label: "预算模板管理",
+          path: "/budgetList",
+          name: "budgetList",
+          sts: 0,
+          num: 0,
+        },
+        {
+          label: "下发管理",
+          path: "/issueList",
+          name: "issueList",
+          sts: 0,
+          num: 0,
+        },
+      ],
+    };
+  },
+  computed: {
+    menuList: function () {
+      let arr = [];
+      this.routerList.map((item) => {
+        // arr.push(item);
+        this.showList.map((row) => {
+          if (item.path == row.jspUrl && row.systemflag == "1") {
+            arr.push(item);
+          }
+        });
+      });
+      return arr;
+    },
+  },
+  methods: {
+    handleClick(val) {
+      this.activeName = val.path;
+      for (let i = 0; i < this.routerList.length; i++) {
+        this.routerList[i].sts = 0;
+      }
+      val.sts = 1;
+      if (this.$route.path != this.activeName) {
+        this.$router.push(this.activeName);
+      }
+      this.getnunm();
+    },
+    getnunm() {
+      this.$http({
+        url: "/market/preTask/queryTaskToDoNumByFunc",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {},
+      }).then((res) => {
+        for (let i = 0; i < res.data.length; i++) {
+          if (res.data[i].funcCode == "1000") {
+            this.routerList[2].num = res.data[i].taskNum;
+          }
+          if (res.data[i].funcCode == "1001") {
+            this.routerList[0].num = res.data[i].taskNum;
+          }
+          if (res.data[i].funcCode == "1003") {
+            this.routerList[3].num = res.data[i].taskNum;
+          }
+          if (res.data[i].funcCode == "1004") {
+            this.routerList[1].num = res.data[i].taskNum;
+          }
+        }
+      });
+    },
+  },
+  mounted() {
+    this.activeName = this.$route.path;
+  },
+  created() {
+    JSON.parse(sessionStorage.childrenMenus).map((item) => {
+      this.showList.push(item);
+    });
+    this.getnunm();
+  },
+  watch: {
+    $route(to, from) {
+      this.activeName = this.$route.path;
+    },
+  },
+};
 </script>
-<style>
-	.el-tabs__content {
-		display: none;
-	}
-	.spanbox{
-		display: block;
-		text-align: center;
-		padding: 10px 0;
-		border-right: 3px solid #f1f1f1;
-		margin-right: 20px;
-	}
-	.bg{
-		border-right: 3px solid #0080FF;
-		color: #007AFF;
-	}
+<style lang="scss" scoped>
+.el-tabs__content {
+  display: none;
+}
+
+.box {
+  display: inline-block;
+  padding-left: 10px;
+  width: 100%;
+  border-bottom: 1px solid #e1e1e1;
+  .spanbox {
+    display: inline-block;
+    text-align: center;
+    width: 166px;
+    height: 36px;
+    margin: 10px;
+    line-height: 36px;
+    background: #d8eaf6;
+    color: #000;
+  }
+  .bg {
+    color: white;
+    background: #0583cd;
+  }
+}
 </style>

+ 1 - 1
src/pages/main/budget/budgetList.vue

@@ -7,7 +7,7 @@
       style="margin: 0 !important; padding: 0 !important"
     >
       <div class="titbox">
-        <h2>部门预算模板管理</h2>
+        <h2 class="font-ui">部门预算模板管理</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/budget/initBudget.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box">
       <div class="titbox">
-        <h2>部门预算管理</h2>
+        <h2 class="font-ui">部门预算管理</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/budget/issueList.vue

@@ -7,7 +7,7 @@
             style="margin: 0 !important; padding: 0 !important"
         >
             <div class="titbox">
-                <h2>下发管理</h2>
+                <h2 class="font-ui">下发管理</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/budget/noRecall.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box" style="margin: 0;padding: 0;">
       <div class="titbox">
-        <h2>部门预算回复</h2>
+        <h2 class="font-ui">部门预算回复</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/budget/recall.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box" style="margin: 0;padding: 0;">
       <div class="titbox">
-        <h2>部门预算回复</h2>
+        <h2 class="font-ui">部门预算回复</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/businessOutsourc/index.vue

@@ -2,7 +2,7 @@
     <fullscreen :fullscreen.sync="fullscreen" class="container">
         <div class="container-box">
 
-            <h2>直营店业务外包</h2>
+            <h2 class="font-ui">直营店业务外包</h2>
             <div class="adv-type">
                 <div @click="jumpinfo('/stageSeat','台席管理')">
                     <span>

+ 1 - 1
src/pages/main/busitime/busiTime.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>业务时长查询</h2>
+                <h2 class="font-ui">业务时长查询</h2>
                 <div>
                     <i class="el-icon-download" @click="iconCli(3)"></i>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>

+ 1 - 1
src/pages/main/busitime/busiTimeout.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>异常数据监控</h2>
+                <h2 class="font-ui">异常数据监控</h2>
                 <div>
                     <i class="el-icon-download" @click="iconCli(3)"></i>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>

Fichier diff supprimé car celui-ci est trop grand
+ 874 - 803
src/pages/main/competitor/compete.vue


+ 5 - 2
src/pages/main/competitor/competeInfo.vue

@@ -1,5 +1,5 @@
 <template>
-    <fullscreen :fullscreen.sync="fullscreen" class="container" style="margin: 0;">
+    <fullscreen :fullscreen.sync="fullscreen" class="container" style="margin: 0px;">
         <div class="container-box">
             <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
             <div class="search">
@@ -42,7 +42,7 @@
         data() {
 
             return {
-                tooltit: '竞争对手信息收集统计',
+                tooltit: '竞争对手信息收集',
                 searchList: [{
                         type: 'date',
                         tit: '开始时间',
@@ -280,4 +280,7 @@
             width: calc(100% - 100px);
         }
     }
+    .container{
+        width: 100%;
+    }
 </style>

+ 360 - 0
src/pages/main/competitor/components/export.js

@@ -0,0 +1,360 @@
+// import { createCellPos } from './translateNumToLetter'
+
+
+function colorRGBtoHex(color) {
+	var rgb = color.split(',');
+	var r = parseInt(rgb[0].split('(')[1]);
+	var g = parseInt(rgb[1]);
+	var b = parseInt(rgb[2].split(')')[0]);
+	var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+	return hex;
+}
+const ExcelJS =require("exceljs" )  
+const saveAs = require('file-saver')
+function exportExcel(luckysheet, value) {
+	// 参数为luckysheet.getluckysheetfile()获取的对象
+	// 1.创建工作簿,可以为工作簿添加属性
+	var workbook = new ExcelJS.Workbook()
+	// 2.创建表格,第二个参数可以配置创建什么样的工作表
+	if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
+		luckysheet = [luckysheet]
+	}
+	luckysheet.forEach(function(table) {
+		if (table.data.length === 0) return true
+		// ws.getCell('B2').fill = fills.
+		var worksheet = workbook.addWorksheet(table.name)
+		var merge = (table.config && table.config.merge) || {}
+		var borderInfo = (table.config && table.config.borderInfo) || {}
+		// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+		setStyleAndValue(table.data, worksheet)
+		setMerge(merge, worksheet)
+		setBorder(borderInfo, worksheet)
+		return true
+	})
+
+	// return
+	// 4.写入 buffer
+	var buffer = workbook.xlsx.writeBuffer().then(function(data) {
+		var blob = new Blob([data], {
+			type: 'application/vnd.ms-excel;charset=utf-8'
+		})
+		saveAs(blob, value + '.xlsx')
+	})
+	return buffer
+}
+var setMerge = function(luckyMerge, worksheet) {
+	var mergearr = Object.values(luckyMerge || {})
+	mergearr.forEach(function(elem) {
+		// elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+		// 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+		worksheet.mergeCells(
+			elem.r + 1,
+			elem.c + 1,
+			elem.r + elem.rs,
+			elem.c + elem.cs
+		)
+	})
+}
+
+var setBorder = function(luckyBorderInfo, worksheet) {
+	if (!Array.isArray(luckyBorderInfo)) return
+	luckyBorderInfo.forEach(function(elem) {
+		// 现在只兼容到borderType 为range的情况
+		if (elem.rangeType === 'range') {
+			let border = borderConvert(elem.borderType, elem.style, elem.color)
+			let rang = elem.range[0]
+			let row = rang.row
+			let column = rang.column
+			for (let i = row[0] + 1; i < row[1] + 2; i++) {
+				for (let y = column[0] + 1; y < column[1] + 2; y++) {
+					worksheet.getCell(i, y).border = border
+				}
+			}
+		}
+		if (elem.rangeType === 'cell') {
+			// col_index: 2
+			// row_index: 1
+			// b: {
+			//   color: '#d0d4e3'
+			//   style: 1
+			// }
+			var col_index = elem.value.col_index
+			var row_index = elem.value.row_index
+			var borderData = Object.assign({}, elem.value)
+			delete borderData.col_index
+			delete borderData.row_index
+			let border = addborderToCell(borderData, row_index, col_index)
+			worksheet.getCell(row_index + 1, col_index + 1).border = border
+		}
+		// worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
+	})
+}
+var setStyleAndValue = function(cellArr, worksheet) {
+	if (!Array.isArray(cellArr)) return
+	cellArr.forEach(function(row, rowid) {
+		row.every(function(cell, columnid) {
+			if (!cell) return true
+			let fill = fillConvert(cell.bg)
+
+			let font = fontConvert(
+				cell.ff,
+				cell.fc,
+				cell.bl,
+				cell.it,
+				cell.fs,
+				cell.cl,
+				cell.ul
+			)
+			let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)
+			let value = ''
+
+			if (cell.f) {
+				value = {
+					formula: cell.f,
+					result: cell.v
+				}
+			} else if (!cell.v && cell.ct && cell.ct.s) {
+				// xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后
+				// value = cell.ct.s[0].v
+				cell.ct.s.forEach(function(arr) {
+					value += arr.v
+				})
+			} else {
+				value = cell.m //
+				console.log(value)
+			}
+			//  style 填入到_value中可以实现填充色
+			let letter = createCellPos(columnid)
+			let target = worksheet.getCell(letter + (rowid + 1))
+			for (var key in fill) {
+				target.fill = fill
+				break
+			}
+			target.font = font
+			target.alignment = alignment
+			target.value = value
+
+			return true
+		})
+	})
+}
+
+var fillConvert = function(bg) {
+	if (!bg) {
+		return {}
+	}
+	// var bgc = bg.replace('#', '')
+	if (bg.indexOf('#') == -1) {
+		bg = colorRGBtoHex(bg)
+	}
+	let fill = {
+		type: 'pattern',
+		pattern: 'solid',
+		fgColor: {
+			argb: bg.replace('#', '')
+		}
+	}
+	return fill
+}
+
+var fontConvert = function(
+	ff,
+	fc,
+	bl,
+	it,
+	fs,
+	cl,
+	ul
+) {
+	// luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+	var luckyToExcel = {
+		0: '微软雅黑',
+		1: '宋体(Song)',
+		2: '黑体(ST Heiti)',
+		3: '楷体(ST Kaiti)',
+		4: '仿宋(ST FangSong)',
+		5: '新宋体(ST Song)',
+		6: '华文新魏',
+		7: '华文行楷',
+		8: '华文隶书',
+		9: 'Arial',
+		10: 'Times New Roman ',
+		11: 'Tahoma ',
+		12: 'Verdana',
+		num2bl: function(num) {
+			return num === 0 ? false : true
+		}
+	}
+	// 出现Bug,导入的时候ff为luckyToExcel的val
+
+	let font = {
+		name: typeof ff === 'number' ? luckyToExcel[ff || 0] : ff || 0,
+		family: 1,
+		size: fs || 10,
+		color: {
+			argb: (fc || '#000000').replace('#', '')
+		},
+		bold: luckyToExcel.num2bl(bl || 0),
+		italic: luckyToExcel.num2bl(it || 0),
+		underline: luckyToExcel.num2bl(ul || 0),
+		strike: luckyToExcel.num2bl(cl || 0)
+	}
+
+	return font
+}
+
+var alignmentConvert = function(
+	vt,
+	ht,
+	tb,
+	tr
+) {
+	// luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+	var luckyToExcel = {
+		vertical: {
+			0: 'middle',
+			1: 'top',
+			2: 'bottom',
+			default: 'top'
+		},
+		horizontal: {
+			0: 'center',
+			1: 'left',
+			2: 'right',
+			default: 'left'
+		},
+		wrapText: {
+			0: false,
+			1: false,
+			2: true,
+			default: false
+		},
+		textRotation: {
+			0: 0,
+			1: 45,
+			2: -45,
+			3: 'vertical',
+			4: 90,
+			5: -90,
+			default: 0
+		}
+	}
+
+	let alignment = {
+		vertical: luckyToExcel.vertical[vt || 'default'],
+		horizontal: luckyToExcel.horizontal[ht || 'default'],
+		wrapText: luckyToExcel.wrapText[tb || 'default'],
+		textRotation: luckyToExcel.textRotation[tr || 'default']
+	}
+	return alignment
+}
+
+var borderConvert = function(borderType, style, color) {
+	// 对应luckysheet的config中borderinfo的的参数
+	if (!borderType) {
+		return {}
+	}
+	var luckyToExcel = {
+		type: {
+			'border-all': 'all',
+			'border-top': 'top',
+			'border-right': 'right',
+			'border-bottom': 'bottom',
+			'border-left': 'left'
+		},
+		style: {
+			0: 'none',
+			1: 'thin',
+			2: 'hair',
+			3: 'dotted',
+			4: 'dashDot', // 'Dashed',
+			5: 'dashDot',
+			6: 'dashDotDot',
+			7: 'double',
+			8: 'medium',
+			9: 'mediumDashed',
+			10: 'mediumDashDot',
+			11: 'mediumDashDotDot',
+			12: 'slantDashDot',
+			13: 'thick'
+		}
+	}
+	let template = {
+		style: luckyToExcel.style[style || 1],
+		color: {
+			argb: (color || '#000').replace('#', '')
+		}
+	}
+	let border = {}
+	if (luckyToExcel.type[borderType] === 'all') {
+		border['top'] = template
+		border['right'] = template
+		border['bottom'] = template
+		border['left'] = template
+	} else {
+		border[luckyToExcel.type[borderType]] = template
+	}
+	return border
+}
+
+function addborderToCell(borders, row_index, col_index) {
+	let border = {}
+	var luckyExcel = {
+		type: {
+			l: 'left',
+			r: 'right',
+			b: 'bottom',
+			t: 'top'
+		},
+		style: {
+			0: 'none',
+			1: 'thin',
+			2: 'hair',
+			3: 'dotted',
+			4: 'dashDot', // 'Dashed',
+			5: 'dashDot',
+			6: 'dashDotDot',
+			7: 'double',
+			8: 'medium',
+			9: 'mediumDashed',
+			10: 'mediumDashDot',
+			11: 'mediumDashDotDot',
+			12: 'slantDashDot',
+			13: 'thick'
+		}
+	}
+	for (var bor in borders) {
+		if (borders[bor].color.indexOf('rgb') === -1) {
+			border[luckyExcel.type[bor]] = {
+				style: luckyExcel.style[borders[bor].style],
+				color: {
+					argb: borders[bor].color.replace('#', '')
+				}
+			}
+		} else {
+			border[luckyExcel.type[bor]] = {
+				style: luckyExcel.style[borders[bor].style],
+				color: {
+					argb: borders[bor].color
+				}
+			}
+		}
+	}
+
+	return border
+}
+
+function createCellPos(n) {
+	let ordA = 'A'.charCodeAt(0)
+
+	let ordZ = 'Z'.charCodeAt(0)
+	let len = ordZ - ordA + 1
+	let s = ''
+	while (n >= 0) {
+		s = String.fromCharCode((n % len) + ordA) + s
+
+		n = Math.floor(n / len) - 1
+	}
+	return s
+}
+export {exportExcel}

Fichier diff supprimé car celui-ci est trop grand
+ 1012 - 0
src/pages/main/competitor/components/sheet.vue


+ 42 - 8
src/pages/main/competitor/home.vue

@@ -1,8 +1,7 @@
 <template>
   <div class="inner-container">
-    <el-col :span="3"
-      ><el-tabs
-        tab-position="left"
+    <div class="box">
+      <el-tabs
         v-model="activeName"
         @tab-click="handleClick"
       >
@@ -13,12 +12,12 @@
           :label="item.label"
         ></el-tab-pane>
       </el-tabs>
-    </el-col>
-    <el-col :span="21" style="background: #f4f4f4;">
-      <div style="height: 100%">
+    </div>
+    <el-row style="background: #f4f4f4;">
+      <div>
         <router-view />
       </div>
-    </el-col>
+      </el-row>
   </div>
 </template>
 <script>
@@ -70,8 +69,43 @@ export default {
   },
 };
 </script>
-<style>
+<style lang="scss" scoped>
+
 .el-tabs__content {
   display: none;
 }
+.box {
+  border-bottom: 1px solid #e1e1e1;
+  height: 55px;
+  margin-top:10px ;
+}
+::v-deep .el-tabs__item {
+  width: 166px;
+  text-align: center;
+  padding: 0;
+  border-left: 10px solid #ffffff;
+  border-right: 10px solid #ffffff;
+}
+::v-deep .el-tabs__header {
+  margin: 0px;
+  background: #d8eaf6;
+  color: black;
+  margin-left: 20px;
+  display: inline-block;
+}
+::v-deep .is-active {
+  background: #0583cd;
+  color: white;
+}
+
+::v-deep .el-tabs__item:hover {
+  color: black;
+}
+::v-deep .is-active:hover {
+  background: #0583cd;
+  color: white;
+}
+::v-deep .el-tabs__active-bar{
+		width: 0px !important;
+	}
 </style>

Fichier diff supprimé car celui-ci est trop grand
+ 1522 - 1208
src/pages/main/competitor/index.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1553 - 0
src/pages/main/competitors/company.vue


+ 363 - 0
src/pages/main/competitors/components/export.js

@@ -0,0 +1,363 @@
+// import { createCellPos } from './translateNumToLetter'
+
+
+function colorRGBtoHex(color) {
+	var rgb = color.split(',');
+	var r = parseInt(rgb[0].split('(')[1]);
+	var g = parseInt(rgb[1]);
+	var b = parseInt(rgb[2].split(')')[0]);
+	var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+	return hex;
+}
+const ExcelJS =require("exceljs" )  
+const saveAs = require('file-saver')
+function exportExcel(luckysheet, value) {
+	// 参数为luckysheet.getluckysheetfile()获取的对象
+	// 1.创建工作簿,可以为工作簿添加属性
+	var workbook = new ExcelJS.Workbook()
+	// 2.创建表格,第二个参数可以配置创建什么样的工作表
+	if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
+		luckysheet = [luckysheet]
+	}
+	luckysheet.forEach(function(table) {
+		if (table.data.length === 0) return true
+		// ws.getCell('B2').fill = fills.
+		var worksheet = workbook.addWorksheet(table.name)
+		var merge = (table.config && table.config.merge) || {}
+		var borderInfo = (table.config && table.config.borderInfo) || {}
+		// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+		setStyleAndValue(table.data, worksheet)
+		setMerge(merge, worksheet)
+		setBorder(borderInfo, worksheet)
+		return true
+	})
+
+	// return
+	// 4.写入 buffer
+	var buffer = workbook.xlsx.writeBuffer().then(function(data) {
+		var blob = new Blob([data], {
+			type: 'application/vnd.ms-excel;charset=utf-8'
+		})
+		saveAs(blob, value + '.xlsx')
+	})
+	return buffer
+}
+var setMerge = function(luckyMerge, worksheet) {
+	var mergearr = Object.values(luckyMerge || {})
+	mergearr.forEach(function(elem) {
+		// elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+		// 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+		worksheet.mergeCells(
+			elem.r + 1,
+			elem.c + 1,
+			elem.r + elem.rs,
+			elem.c + elem.cs
+		)
+	})
+}
+
+var setBorder = function(luckyBorderInfo, worksheet) {
+	if (!Array.isArray(luckyBorderInfo)) return
+	luckyBorderInfo.forEach(function(elem) {
+		// 现在只兼容到borderType 为range的情况
+		if (elem.rangeType === 'range') {
+			let border = borderConvert(elem.borderType, elem.style, elem.color)
+			let rang = elem.range[0]
+			let row = rang.row
+			let column = rang.column
+			for (let i = row[0] + 1; i < row[1] + 2; i++) {
+				for (let y = column[0] + 1; y < column[1] + 2; y++) {
+					worksheet.getCell(i, y).border = border
+				}
+			}
+		}
+		if (elem.rangeType === 'cell') {
+			// col_index: 2
+			// row_index: 1
+			// b: {
+			//   color: '#d0d4e3'
+			//   style: 1
+			// }
+			var col_index = elem.value.col_index
+			var row_index = elem.value.row_index
+			var borderData = Object.assign({}, elem.value)
+			delete borderData.col_index
+			delete borderData.row_index
+			let border = addborderToCell(borderData, row_index, col_index)
+			worksheet.getCell(row_index + 1, col_index + 1).border = border
+		}
+		// worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
+	})
+}
+var setStyleAndValue = function(cellArr, worksheet) {
+	console.log(cellArr);
+	if (!Array.isArray(cellArr)) return
+	cellArr.forEach(function(row, rowid) {
+		row.every(function(cell, columnid) {
+			console.log(cell);
+			if (!cell) return true
+			let fill = fillConvert(cell.bg)
+
+			let font = fontConvert(
+				cell.ff,
+				cell.fc,
+				cell.bl,
+				cell.it,
+				cell.fs,
+				cell.cl,
+				cell.ul,
+				cell.ct
+			)
+			let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)
+			let value = ''
+
+			if (cell.f) {
+				value = {
+					formula: cell.f,
+					result: cell.m
+				}
+			} else if (!cell.v && cell.ct && cell.ct.s) {
+				// xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后
+				// value = cell.ct.s[0].v
+				cell.ct.s.forEach(function(arr) {
+					value += arr.v
+				})
+			} else {
+				value = cell.m //
+				
+			}
+			//  style 填入到_value中可以实现填充色
+			let letter = createCellPos(columnid)
+			let target = worksheet.getCell(letter + (rowid + 1))
+			for (var key in fill) {
+				target.fill = fill
+				break
+			}
+			target.font = font
+			target.alignment = alignment
+			target.value = value
+
+			return true
+		})
+	})
+}
+
+var fillConvert = function(bg) {
+	if (!bg) {
+		return {}
+	}
+	// var bgc = bg.replace('#', '')
+	if (bg.indexOf('#') == -1) {
+		bg = colorRGBtoHex(bg)
+	}
+	let fill = {
+		type: 'pattern',
+		pattern: 'solid',
+		fgColor: {
+			argb: bg.replace('#', '')
+		}
+	}
+	return fill
+}
+
+var fontConvert = function(
+	ff,
+	fc,
+	bl,
+	it,
+	fs,
+	cl,
+	ul
+) {
+	// luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+	var luckyToExcel = {
+		0: '微软雅黑',
+		1: '宋体(Song)',
+		2: '黑体(ST Heiti)',
+		3: '楷体(ST Kaiti)',
+		4: '仿宋(ST FangSong)',
+		5: '新宋体(ST Song)',
+		6: '华文新魏',
+		7: '华文行楷',
+		8: '华文隶书',
+		9: 'Arial',
+		10: 'Times New Roman ',
+		11: 'Tahoma ',
+		12: 'Verdana',
+		num2bl: function(num) {
+			return num === 0 ? false : true
+		}
+	}
+	// 出现Bug,导入的时候ff为luckyToExcel的val
+
+	let font = {
+		name: typeof ff === 'number' ? luckyToExcel[ff || 0] : ff || 0,
+		family: 1,
+		size: fs || 10,
+		color: {
+			argb: (fc || '#000000').replace('#', '')
+		},
+		bold: luckyToExcel.num2bl(bl || 0),
+		italic: luckyToExcel.num2bl(it || 0),
+		underline: luckyToExcel.num2bl(ul || 0),
+		strike: luckyToExcel.num2bl(cl || 0)
+	}
+
+	return font
+}
+
+var alignmentConvert = function(
+	vt,
+	ht,
+	tb,
+	tr
+) {
+	// luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+	var luckyToExcel = {
+		vertical: {
+			0: 'middle',
+			1: 'top',
+			2: 'bottom',
+			default: 'top'
+		},
+		horizontal: {
+			0: 'center',
+			1: 'left',
+			2: 'right',
+			default: 'left'
+		},
+		wrapText: {
+			0: false,
+			1: false,
+			2: true,
+			default: false
+		},
+		textRotation: {
+			0: 0,
+			1: 45,
+			2: -45,
+			3: 'vertical',
+			4: 90,
+			5: -90,
+			default: 0
+		}
+	}
+
+	let alignment = {
+		vertical: luckyToExcel.vertical[vt || 'default'],
+		horizontal: luckyToExcel.horizontal[ht || 'default'],
+		wrapText: luckyToExcel.wrapText[tb || 'default'],
+		textRotation: luckyToExcel.textRotation[tr || 'default']
+	}
+	return alignment
+}
+
+var borderConvert = function(borderType, style, color) {
+	// 对应luckysheet的config中borderinfo的的参数
+	if (!borderType) {
+		return {}
+	}
+	var luckyToExcel = {
+		type: {
+			'border-all': 'all',
+			'border-top': 'top',
+			'border-right': 'right',
+			'border-bottom': 'bottom',
+			'border-left': 'left'
+		},
+		style: {
+			0: 'none',
+			1: 'thin',
+			2: 'hair',
+			3: 'dotted',
+			4: 'dashDot', // 'Dashed',
+			5: 'dashDot',
+			6: 'dashDotDot',
+			7: 'double',
+			8: 'medium',
+			9: 'mediumDashed',
+			10: 'mediumDashDot',
+			11: 'mediumDashDotDot',
+			12: 'slantDashDot',
+			13: 'thick'
+		}
+	}
+	let template = {
+		style: luckyToExcel.style[style || 1],
+		color: {
+			argb: (color || '#000').replace('#', '')
+		}
+	}
+	let border = {}
+	if (luckyToExcel.type[borderType] === 'all') {
+		border['top'] = template
+		border['right'] = template
+		border['bottom'] = template
+		border['left'] = template
+	} else {
+		border[luckyToExcel.type[borderType]] = template
+	}
+	return border
+}
+
+function addborderToCell(borders, row_index, col_index) {
+	let border = {}
+	var luckyExcel = {
+		type: {
+			l: 'left',
+			r: 'right',
+			b: 'bottom',
+			t: 'top'
+		},
+		style: {
+			0: 'none',
+			1: 'thin',
+			2: 'hair',
+			3: 'dotted',
+			4: 'dashDot', // 'Dashed',
+			5: 'dashDot',
+			6: 'dashDotDot',
+			7: 'double',
+			8: 'medium',
+			9: 'mediumDashed',
+			10: 'mediumDashDot',
+			11: 'mediumDashDotDot',
+			12: 'slantDashDot',
+			13: 'thick'
+		}
+	}
+	for (var bor in borders) {
+		if (borders[bor].color.indexOf('rgb') === -1) {
+			border[luckyExcel.type[bor]] = {
+				style: luckyExcel.style[borders[bor].style],
+				color: {
+					argb: borders[bor].color.replace('#', '')
+				}
+			}
+		} else {
+			border[luckyExcel.type[bor]] = {
+				style: luckyExcel.style[borders[bor].style],
+				color: {
+					argb: borders[bor].color
+				}
+			}
+		}
+	}
+
+	return border
+}
+
+function createCellPos(n) {
+	let ordA = 'A'.charCodeAt(0)
+
+	let ordZ = 'Z'.charCodeAt(0)
+	let len = ordZ - ordA + 1
+	let s = ''
+	while (n >= 0) {
+		s = String.fromCharCode((n % len) + ordA) + s
+
+		n = Math.floor(n / len) - 1
+	}
+	return s
+}
+export {exportExcel}

Fichier diff supprimé car celui-ci est trop grand
+ 1494 - 0
src/pages/main/competitors/components/sheet.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1936 - 0
src/pages/main/competitors/home.vue


+ 81 - 0
src/pages/main/competitors/index.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="inner-container">
+    <el-col :span="3"
+      ><el-tabs
+        tab-position="left"
+        v-model="activeName"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane
+          v-for="(item, index) in routerList"
+          :key="index"
+          :name="item.path"
+          :label="item.label"
+        ></el-tab-pane>
+      </el-tabs>
+    </el-col>
+    <el-col :span="21" style="background: #f4f4f4;">
+      <div style="height: 100%">
+        <router-view />
+      </div>
+    </el-col>
+  </div>
+</template>
+<script>
+import { userInfo } from 'os';
+
+export default {
+  data() {
+    return {
+      activeName: "",
+      showList: [],
+      routerList: [
+        { label: "地市", path: "/competitors", name: "competitors" },
+        // { label: "省公司", path: "/company", name: "company" }
+      ],
+    };
+  },
+  computed: {
+    menuList: function () {
+      let arr = [];
+      this.routerList.map((item) => {
+        this.showList.map((row) => {
+          if (item.path == row) {
+            arr.push(item);
+          }
+        });
+      });
+      return arr;
+    },
+  },
+  methods: {
+    handleClick(val) {
+      console.log(val);
+      if (this.$route.path != this.activeName) {
+        this.$router.push(this.activeName);
+      }
+    },
+  },
+  mounted() {
+    if(!JSON.parse(window.sessionStorage.getItem('userInfo')).cityName){
+     this.routerList.push({ label: "省公司", path: "/company", name: "company" })
+    }
+    this.activeName = this.$route.path;
+  },
+  created() {
+    JSON.parse(sessionStorage.childrenMenus).map((item) => {
+      this.showList.push(item.jspUrl);
+    });
+  },
+  watch: {
+    $route(to, from) {
+      this.activeName = this.$route.path;
+    },
+  },
+};
+</script>
+<style>
+.el-tabs__content {
+  display: none;
+}
+</style>

+ 1 - 1
src/pages/main/compvis/complaintFeedback.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box">
       <div class="titbox">
-        <h2>投诉处理工单反馈</h2>
+        <h2 class="font-ui">投诉处理工单反馈</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/compvis/complaintWoAlarmInfo.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box">
       <div class="titbox">
-        <h2>投诉工单告警信息列表</h2>
+        <h2 class="font-ui">投诉工单告警信息列表</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/compvis/complaintlog.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>处理工单历史信息</h2>
+                <h2 class="font-ui">处理工单历史信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/compvis/compvisList.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>投诉单列表</h2>
+                <h2 class="font-ui">投诉单列表</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydBrodbdNetwork.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>宽带上网信息</h2>
+                <h2 class="font-ui">宽带上网信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydBrodbdUser.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>宽带用户信息</h2>
+                <h2 class="font-ui">宽带用户信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydGroupUser.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>集团客户信息</h2>
+                <h2 class="font-ui">集团客户信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydLobbyUser.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>进厅客户信息</h2>
+                <h2 class="font-ui">进厅客户信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydMobileNetwork.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>手机移动网络信息</h2>
+                <h2 class="font-ui">手机移动网络信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydMobileUser.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>手机客户信息详情</h2>
+                <h2 class="font-ui">手机客户信息详情</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/customer/ydTariff.vue

@@ -2,7 +2,7 @@
     <div class="container">
         <fullscreen :fullscreen.sync="fullscreen" class="container-box">
             <div class="titbox">
-                <h2>手机套餐资费信息</h2>
+                <h2 class="font-ui">手机套餐资费信息</h2>
                 <div>
                     <i class="el-icon-refresh" @click="iconCli(1)"></i>
                     <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 408 - 203
src/pages/main/demandDevelop/index.vue

@@ -9,12 +9,14 @@
           @click="dialogCheck(3)"
           >添加</el-button
         >
-        <el-button
-          style="float: right; margin-top: 10px; margin-right: 20px"
-          type="primary"
-          @click="getStanding"
-          >台账</el-button
-        >
+          <el-button
+              v-if="standingAuth"
+              style="float: right; margin-top: 10px; margin-right: 20px"
+              type="primary"
+              @click="getStanding"
+          >台账
+          </el-button
+          >
       </div>
       <div class="tabbox">
         <el-table
@@ -43,7 +45,7 @@
               }}
             </template>
           </el-table-column>
-          <el-table-column label="操作" width="120px" align="center">
+          <el-table-column label="操作" width="150px" align="center">
             <template slot-scope="scope">
               <el-button
                 size="mini"
@@ -53,11 +55,19 @@
               >
               <el-button
                 size="mini"
-                type="danger"
+                type="warning"
                 v-if="scope.row.sts !== '4'"
                 @click="dialogCheck(2, scope.row)"
                 >处理</el-button
               >
+
+             <el-button
+                 size="mini"
+                 type="danger"
+                 v-if="scope.row.step === '0'"
+                 @click="dialogCheck(4, scope.row)"
+             >注销</el-button
+             >
               <!-- <el-button size="mini" type="danger" @click="delLine(scope.row)">删除</el-button> -->
             </template>
           </el-table-column>
@@ -250,64 +260,79 @@
               >导入</el-button
             ></el-upload
           >
-          <div
-            style="margin: 20px 0; padding: 0 20px"
-            v-if="vision == '信息补填'"
-          >
-            <el-table
-              class="com-table"
-              ref="multipleTable"
-              :data="infodatas"
-              tooltip-effect="dark"
-              size="small"
-              border
-              style="width: 100%"
+            <div
+                style="margin: 20px 0; padding: 0 20px"
+                v-if="vision == '信息补填'"
             >
-              <el-table-column prop="infoName" label="需求承接支撑方">
-                <template slot-scope="scope">
-                  <el-input
-                    v-model="scope.row.factoryName"
-                    :disabled="tableSatus === '4'"
-                  ></el-input>
-                </template>
-              </el-table-column>
-              <el-table-column prop="infoName" label="涉及发生工作量">
-                <template slot-scope="scope">
-                  <el-input
-                    v-model="scope.row.workLoad"
-                    :disabled="tableSatus === '4'"
-                  ></el-input>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="操作"
-                width="120px"
-                align="center"
-                v-if="titname == '审批'"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    :disabled="tableSatus === '4'"
-                    @click="choline(1, scope)"
-                    >添加</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    :disabled="tableSatus === '4'"
-                    @click="choline(2, scope)"
-                    >删除</el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </div>
-          <el-form-item class="info-line online" v-if="visionsts == '2'">
+                <el-table
+                    class="com-table"
+                    ref="multipleTable"
+                    :data="infodatas"
+                    tooltip-effect="dark"
+                    size="small"
+                    border
+                    style="width: 100%"
+                >
+                    <el-table-column prop="factoryName" label="需求承接支撑方">
+                        <template slot-scope="scope">
+                            <el-form :ref="'supportFactoryName'+scope.$index" :model="scope.row" :rules="supportRules">
+                                <el-form-item prop="factoryName">
+                                    <el-select v-model="scope.row.factoryName" filterable placeholder="请选择厂商" :disabled="tableSatus === '4'" style="width: 100%">
+                                        <el-option
+                                            v-for="item in supportList"
+                                            :key="item"
+                                            :label="item"
+                                            :value="item"
+                                            :disabled="getDisabledFlag(item)"
+                                        >
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-form>
+                        </template>
+
+                    </el-table-column>
+                    <el-table-column prop="workLoad" label="涉及发生工作量">
+                        <template slot-scope="scope">
+                            <el-form :ref="'supportWorkLoad'+scope.$index" :model="scope.row" :rules="supportRules">
+                                <el-form-item prop="workLoad">
+                                    <el-input
+                                        v-model="scope.row.workLoad"
+                                        :disabled="tableSatus === '4'"
+                                    ></el-input>
+                                </el-form-item>
+                            </el-form>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        label="操作"
+                        width="120px"
+                        align="center"
+                        v-if="titname == '审批'"
+                    >
+                        <template slot-scope="scope">
+                            <el-button
+                                size="mini"
+                                type="primary"
+                                :disabled="tableSatus === '4'"
+                                @click="choline(1, scope)"
+                            >添加</el-button
+                            >
+                            <el-button
+                                size="mini"
+                                type="danger"
+                                :disabled="tableSatus === '4'"
+                                @click="choline(2, scope)"
+                            >删除</el-button
+                            >
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+          <el-form-item class="info-line online" prop="remark" v-if="visionsts == '2'">
             <span>审批说明</span>
             <el-input
-              v-model="remark"
+              v-model="infolist.remark"
               placeholder=""
               type="textarea"
               :rows="3"
@@ -315,30 +340,41 @@
             >
             </el-input>
           </el-form-item>
-
-          <div
-            style="margin: 20px 0px; padding: 0 20px"
-            v-if="titname !== '添加'"
-          >
-            <el-table
-              class="com-table"
-              :data="rovaList"
-              tooltip-effect="dark"
-              size="small"
-              border
-              style="width: 100%"
+          <el-form-item class="info-line online" prop="opinion" v-if="visionsts === '2'">
+              <span>审批意见</span>
+              <el-select v-model="infolist.opinion" placeholder="请选择审批意见" :disabled="titname === '查看'">
+                  <el-option label="同意" value="1"></el-option>
+                  <el-option label="不同意" value="2"></el-option>
+              </el-select>
+          </el-form-item>
+            <div
+                style="margin: 20px 0px; padding: 0 20px"
+                v-if="titname !== '添加'"
             >
-              <el-table-column prop="logNo" label="编号"> </el-table-column>
-              <el-table-column prop="stepName" label="环节"> </el-table-column>
-              <el-table-column prop="processName" label="处理人">
-              </el-table-column>
-              <el-table-column prop="processWorkNo" label="处理人工号">
-              </el-table-column>
-              <el-table-column prop="updateTimeStr" label="处理时间">
-              </el-table-column>
-              <el-table-column prop="remark" label="备注"> </el-table-column>
-            </el-table>
-          </div>
+                <el-table
+                    class="com-table"
+                    :data="rovaList"
+                    tooltip-effect="dark"
+                    size="small"
+                    border
+                    style="width: 100%"
+                >
+                    <el-table-column prop="logNo" label="编号"> </el-table-column>
+                    <el-table-column prop="stepName" label="环节"> </el-table-column>
+                    <el-table-column prop="processName" label="处理人">
+                    </el-table-column>
+                    <el-table-column prop="processWorkNo" label="处理人工号">
+                    </el-table-column>
+                    <el-table-column prop="updateTimeStr" label="处理时间">
+                    </el-table-column>
+                    <el-table-column prop="remark" label="备注"> </el-table-column>
+                    <el-table-column prop="opinion" label="审批意见">
+                        <template slot-scope="scope">
+                            {{ scope.row.opinion === "1" ? '同意' : (scope.row.opinion === "2" ? '不同意' : '') }}
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
         </el-form>
 
         <div slot="footer" class="info-footer">
@@ -346,8 +382,8 @@
             <el-button type="primary" @click="handleApprove('送部门人员审核')"
               >送部门人员审核</el-button
             >
-            <el-button type="primary" @click="handleApprove('送领导审核')"
-              >送领导审核</el-button
+            <el-button type="primary" @click="handleApprove('送科室领导审核')"
+              >送科室领导审核</el-button
             >
             <el-button @click="handleApprove('取消')">取消</el-button>
           </div>
@@ -464,15 +500,54 @@ export default {
     deptTreeOnly,
   },
   data() {
+      const validatorWorkLoad = (rule, value, callback) => {
+          if (/^[0-9]+(\.[0-9]{1,1})?$/.test(value)){
+              callback()
+          }  else {
+              callback(new Error('只能输入一位小数数字'))
+          }
+      }
     return {
-      rules: {
-        demandName: [
+        standingAuth: false,
+        rules: {
+            demandName: [
           {
             required: true,
             trigger: "blur",
             message: "不能为空",
           },
         ],
+        remark: [
+            {
+                required: true,
+                trigger: "blur",
+                message: "不能为空",
+            },
+            {
+                trigger: "change",
+                validator:this.copyValue
+            },
+        ],
+      },
+      supportRules: {
+          factoryName: [
+          {
+            required: true,
+            trigger: "change",
+            message: "不能为空",
+          },
+        ],
+          workLoad: [
+            {
+                required: true,
+                trigger: "blur",
+                message: "不能为空",
+            },
+            {
+                trigger: "change",
+                validator:validatorWorkLoad
+            }
+        ],
       },
       // 操作名称
       operateName: "",
@@ -521,7 +596,7 @@ export default {
         },
       ],
       // 用来控制多选里的单选
-      only: false,
+      only: true,
       // 信息回显
       infolist: {},
       // 用户信息
@@ -565,7 +640,7 @@ export default {
           name: "否",
         },
       ],
-      infodatas: [],
+      infodatas: [{factoryName:'',workLoad:''}],
       busiTime: [],
       urgDegreeopt: [
         {
@@ -597,6 +672,7 @@ export default {
         fileList: [],
       },
       tempSave: false,
+      supportList:[]
     };
   },
   watch: {
@@ -614,6 +690,19 @@ export default {
     // },
   },
   methods: {
+    copyValue(rule, value, callback) {
+        this.remark = value
+        callback()
+    },
+    // 判断需求支撑方是否可选
+    getDisabledFlag(support){
+        for(let n=0;n<this.infodatas.length;n++){
+            if (this.infodatas[n].factoryName === support){
+                return true;
+            }
+        }
+        return false;
+    },
     // 新的处理方法
     handlePreview(file) {
       console.log(file, "Preview");
@@ -667,7 +756,7 @@ export default {
             case "送部门人员审核":
               this.operateName = "送部门人员审核";
               this.checkexa = true;
-              this.type = "0";
+              this.type = "1";
               console.log("送部门人员审核");
               break;
             // case "送领导审核":
@@ -677,13 +766,21 @@ export default {
             //   console.log("送领导审核");
             //   break;
             //领导审批支持整个OA组织架构
-            case "送领导审核":
-              this.operateName = "送领导审核";
-              this.type = "1";
+            case "送科室领导审核":
+              this.operateName = "送科室领导审核";
+              this.type = "2";
               // this.checkLaeder = true;
               this.checkexa = true;
               console.log("送领导审核");
               break;
+            case "送部门领导审核":
+            case "送公司领导审核":
+              this.operateName = type;
+              this.type = "3";
+              // this.checkLaeder = true;
+              this.checkexa = true;
+              console.log(type);
+              break;
             case "送起草人编号发送":
               this.operateName = "送起草人编号";
               this.handleSendNo();
@@ -692,39 +789,45 @@ export default {
               this.operateName = "确认编号";
               this.handleComfirmNo();
               break;
+            case "提交电商接口人审批":
+            case "提交省公司电商接口人审批":
+              this.operateName = type;
+              this.deliverReadOffice();
+              break;
             case "打回":
               this.operateName = "打回";
               this.handleBackRecord();
               break;
-            case "确认需求":
+            case "转交渠道经理待办":
               this.checkexa = true;
               this.type = "0";
-              this.operateName = "确认需求";
+              this.operateName = "转交渠道经理待办";
               break;
             case "送项目经理会签":
               this.checkexa = true;
               this.type = "0";
+              this.only = false;
               this.operateName = "送项目经理会签";
               break;
-            case "送电商接口人阅办":
-              this.operateName = "送电商接口人阅办";
+            case "送电商接口人":
+              this.operateName = type;
               this.handleDeliverReadOfficeOrOtherDo("1");
               break;
             case "送其他人办理":
               this.checkexa = true;
-              this.only = true;
               this.operateName = "送其他人办理";
               break;
             case "确认上线":
               this.operateName = "确认上线";
               this.handleConfirmOnline("1");
               break;
-            case "已办结":
+/*            case "已办结":
               this.operateName = "已办结";
               this.handleConfirmOnline("2");
-              break;
+              break;*/
             case "保存":
               this.operateName = "保存";
+              console.log(this.infodatas)
               this.handleConfirmOnline("3");
               break;
           }
@@ -732,22 +835,32 @@ export default {
       });
     },
     // 确认上线/已办结
-    handleConfirmOnline(type) {
+    async handleConfirmOnline(type) {
+      // 校验需求支撑方和工作量 是否合规
+        for (let i = 0; i < this.infodatas.length; i++) {
+            let supportFlag = await this.$refs['supportFactoryName' + i].validate();
+            if (supportFlag){
+                let workLoadFlag = await this.$refs['supportWorkLoad' + i].validate();
+                if (!workLoadFlag){
+                    return ;
+                }
+            }else {
+                return ;
+            }
+        }
       let flag = 1;
       const factoryName = [];
       const workLoad = [];
-      if (type !== "1") {
-        this.infodatas.forEach((el) => {
+      this.infodatas.forEach((el) => {
           // 判断条件
           if (el.factoryName && el.workLoad) {
-            flag = flag * 1;
-            factoryName.push(el.factoryName);
-            workLoad.push(el.workLoad);
+              flag = flag * 1;
+              factoryName.push(el.factoryName);
+              workLoad.push(el.workLoad);
           } else {
-            flag = flag * 0;
+              flag = flag * 0;
           }
-        });
-      }
+      });
       if (flag) {
         let reqdata = {
           operateName: this.operateName,
@@ -756,6 +869,7 @@ export default {
           support: factoryName,
           workload: workLoad,
           woNo: this.woNo + "",
+          opinion: this.infolist.opinion,
         };
         this.$http({
           url: "/market/mkOnlineChannel/confirmOnline",
@@ -764,14 +878,14 @@ export default {
             "Content-Type": "application/json",
           },
           data: reqdata,
-        }).then(({ data: { desc } }) => {
-          console.log(desc);
-          if (desc === "操作成功") {
-            this.$message.success("操作成功");
-            this.dialogStatus = false;
-            this.handleInit();
-            this.closedia();
-          } else {
+        }).then(({ data }) => {
+            console.log(data)
+            if (data && data.result === 0) {
+                this.$message.success(data.desc);
+                this.dialogStatus = false;
+                this.handleInit();
+                this.closedia();
+            } else {
             this.$message.error("操作失败");
           }
         });
@@ -794,6 +908,7 @@ export default {
         type,
         reviewOpinion: this.remark,
         woId: this.woNo + "",
+        opinion: this.infolist.opinion,
       };
       if (type === "2") {
         reqdata = {
@@ -810,15 +925,15 @@ export default {
           "Content-Type": "application/json",
         },
         data: reqdata,
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.checkexa = false;
-          this.dialogStatus = false;
-          this.handleInit();
-          this.closedia();
-        } else {
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.checkexa = false;
+              this.dialogStatus = false;
+              this.handleInit();
+              this.closedia();
+          } else {
           this.$message.error("操作失败");
         }
       });
@@ -838,6 +953,7 @@ export default {
         receiveName: receiveName.join(","),
         reviewOpinion: this.remark,
         woNo: this.woNo + "",
+        opinion: this.infolist.opinion,
       };
       console.log(reqdata);
 
@@ -848,20 +964,20 @@ export default {
           "Content-Type": "application/json",
         },
         data: reqdata,
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.checkexa = false;
-          this.dialogStatus = false;
-          this.handleInit();
-          this.closedia();
-        } else {
-          this.$message.error("操作失败");
-        }
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.checkexa = false;
+              this.dialogStatus = false;
+              this.handleInit();
+              this.closedia();
+          } else {
+              this.$message.error("操作失败");
+            }
       });
     },
-    // 确认需求
+    // 转交渠道经理待办
     handleNeedyComfirm() {
       let receiveId = [];
       let receiveName = [];
@@ -876,6 +992,7 @@ export default {
         receiveName: receiveName.join(","),
         reviewOpinion: this.remark,
         woNo: this.woNo + "",
+        opinion: this.infolist.opinion,
       };
       console.log(reqdata);
 
@@ -886,17 +1003,17 @@ export default {
           "Content-Type": "application/json",
         },
         data: reqdata,
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.checkexa = false;
-          this.dialogStatus = false;
-          this.handleInit();
-          this.closedia();
-        } else {
-          this.$message.error("操作失败");
-        }
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.checkexa = false;
+              this.dialogStatus = false;
+              this.handleInit();
+              this.closedia();
+          } else {
+              this.$message.error("操作失败");
+            }
       });
     },
     // 打回方法
@@ -909,20 +1026,19 @@ export default {
         },
         params: {
           woNo: this.woNo,
-          remark: [this.operateName, this.remark]
-            .filter((el) => el !== "")
-            .join(","),
+          remark: this.remark,
+          opinion: this.infolist.opinion,
         },
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.dialogStatus = false;
-          this.handleInit();
-          this.closedia();
-        } else {
-          this.$message.error("操作失败");
-        }
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.dialogStatus = false;
+              this.handleInit();
+              this.closedia();
+          } else {
+            this.$message.error("操作失败");
+          }
       });
     },
     // 表单提交
@@ -975,9 +1091,7 @@ export default {
         // 需求描述
         demandDesc: this.infolist.demandDesc,
         // 审批说明
-        remark: [this.operateName, this.remark]
-          .filter((el) => el !== "")
-          .join(","),
+        remark: this.remark,
         // 审核人员
         loginNameList: this.treeList.length
           ? this.treeList.map((el) => {
@@ -990,7 +1104,10 @@ export default {
             })
           : [this.leader],
         type: this.type,
-        // fileList: this.file,
+        opinion: this.infolist.opinion ? this.infolist.opinion : '',
+          // fileList: this.file,
+        // 添加操作步骤
+        operateName: this.operateName
       };
       // 处理其他参数
       for (let key in params) {
@@ -1004,7 +1121,7 @@ export default {
           }
         });
       }
-      if (this.operateName === "确认需求") {
+      if (this.operateName === "转交渠道经理待办") {
         this.handleNeedyComfirm();
         return;
       }
@@ -1026,7 +1143,7 @@ export default {
           },
           data: formData,
         }).then(({ data }) => {
-          if (data && data.desc === "操作成功") {
+          if (data && data.result === 0) {
             this.$message({
               type: "success",
               message: data.desc,
@@ -1047,19 +1164,18 @@ export default {
         },
         params: {
           woNo: this.woNo,
-          remark: [this.operateName, this.remark]
-            .filter((el) => el !== "")
-            .join(","),
+          remark: this.remark,
+          opinion: this.infolist.opinion
         },
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.handleInit();
-          this.closedia();
-        } else {
-          this.$message.error("操作失败");
-        }
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.handleInit();
+              this.closedia();
+          } else {
+              this.$message.error("操作失败");
+            }
       });
     },
     // 确认编号
@@ -1072,19 +1188,43 @@ export default {
         },
         data: {
           woNo: this.woNo + "",
-          remark: [this.operateName, this.remark]
-            .filter((el) => el !== "")
-            .join(","),
+          remark: this.remark,
+          opinion: this.infolist.opinion,
         },
-      }).then(({ data: { desc } }) => {
-        console.log(desc);
-        if (desc === "操作成功") {
-          this.$message.success("操作成功");
-          this.handleInit();
-          this.closedia();
-        } else {
-          this.$message.error("操作失败");
-        }
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.handleInit();
+              this.closedia();
+          } else {
+            this.$message.error("操作失败");
+          }
+      });
+    },
+    // 确认编号后送电商接口人
+    deliverReadOffice() {
+      this.$http({
+        url: "/market/mkOnlineChannel/deliverReadOffice",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        data: {
+          woNo: this.woNo + "",
+          remark: this.remark,
+          opinion: this.infolist.opinion,
+          operateName: this.operateName
+        },
+      }).then(({ data }) => {
+          console.log(data)
+          if (data && data.result === 0) {
+              this.$message.success(data.desc);
+              this.handleInit();
+              this.closedia();
+            } else {
+              this.$message.error("操作失败");
+            }
       });
     },
     // 初始化列表接口
@@ -1107,9 +1247,40 @@ export default {
         }) => {
           this.total = count;
           this.tableData = data;
+          console.log("===================================")
+          console.log(this.tableData)
         }
       );
     },
+      // 注销
+      delDetails(id){
+          this.$confirm('确认注销吗?', '提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+          }).then(() => {
+              this.$http({
+                  url: "/market/mkOnlineChannel/delDetailsByWoNo",
+                  method: "post",
+                  headers: {
+                      "Content-Type": "application/json",
+                  },
+                  data: id,
+              }).then(({ data }) => {
+                  if (data && data.result === 0) {
+                      this.$message.success(data.desc);
+                      this.handleInit();
+                  } else {
+                      this.$message.error("操作失败");
+                  }
+              });
+          }).catch(() => {
+              this.$message({
+                  type: 'info',
+                  message: '取消注销'
+              });
+          });
+      },
     // 查看详情接口封装
     queryDetails(id) {
       this.$http({
@@ -1135,6 +1306,7 @@ export default {
             carryChannelCode: mkOnlineChannel.carryChannelCode
               ? mkOnlineChannel.carryChannelCode.split(",")
               : [],
+            opinion: ''
           };
           this.busiTime = [
             mkOnlineChannel.busiStartTime,
@@ -1167,8 +1339,9 @@ export default {
               this.buttonList = [];
               this.disableStatus = true;
               this.visionsts = "";
-              if (this.step === "7") {
+              if (this.step === "9") {
                 this.vision = "信息补填";
+                this.getSupportList()
                 // 查看也不能操作数据
                 this.tableSatus = "4";
                 this.visionsts = "";
@@ -1194,14 +1367,12 @@ export default {
               }
               this.disableStatus = true;
               this.dialogStatus = true;
-              if (this.step === "7") {
+              if (this.step === "9") {
                 // 这个是判断最后一步是否可以导入数据
                 if (this.buttonList[0] === "确认上线") {
-                  this.vision = "";
-                  this.visionsts = "2";
-                } else {
                   this.vision = "信息补填";
                   this.visionsts = "";
+                  this.getSupportList()
                 }
                 this.infodatas = mkOnlineChannel.workloadAndsupport.length
                   ? mkOnlineChannel.workloadAndsupport.map((el) => ({
@@ -1223,6 +1394,25 @@ export default {
         }
       );
     },
+    // 获取所有需求承接支撑方
+    getSupportList(){
+        this.$http({
+            url: "/market/cChannelContract/queryList",
+            method: "post",
+            headers: {
+                "Content-Type": "application/json",
+
+            },
+            data: {},
+        }).then((res) => {
+            let supportName = []
+            for (let i = 0; i < res.data.length; i++) {
+                let datum = res.data[i];
+                supportName.push(datum.factoryName)
+            }
+            this.supportList = [...new Set(supportName)];
+        });
+    },
 
     // 老方法
     temp() {
@@ -1270,7 +1460,7 @@ export default {
     },
     choline(v, n) {
       if (v == 1) {
-        this.infodatas.push({});
+        this.infodatas.push({factoryName:'',workLoad:''});
       } else {
         this.infodatas.splice(n.$index, 1);
       }
@@ -1298,7 +1488,7 @@ export default {
       // 审核人
       this.checkexa = false;
       // 审核人单选是否开启
-      this.only = false;
+      this.only = true;
     },
     //获取列表
     getList(v, n) {
@@ -1358,6 +1548,10 @@ export default {
         //   // this.tempSave = true;
         // });
         // return;
+      } else if (type === 4) {
+          this.titname = "注销";
+          this.visionsts = "2";
+          this.delDetails(data.woNo);
       }
       // this.$http({
       //   url: "/bpm/api/taskInit",
@@ -1831,6 +2025,17 @@ export default {
         this.carryChannelopt = res.data;
       });
     },
+      ywStandingAuth(){
+          this.$http({
+              url: "/market/mkOnlineChannel/ywStandingAuth",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+          }).then((res) => {
+             this.standingAuth =  res.data.body;
+          });
+      }
   },
   mounted() {
     // 调用初始化接口
@@ -1840,7 +2045,7 @@ export default {
     this.getTermianl();
     this.getsaleChnl();
   },
-  created() {},
+  created() { this.ywStandingAuth()},
 };
 </script>
 <style scoped lang="scss">

+ 141 - 127
src/pages/main/demandDevelop/ywStanding.vue

@@ -4,37 +4,20 @@
       <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">
+        <div>
+            <el-button class="btn-check"  size="medium" type="primary"  @click="outlist">导出
+            </el-button>
+            <myUpload style="display:inline-block;" :fileInfo="fileInfo" @onSuccess="onSuccess"
+                      :fileList="fileInfo.fileList"></myUpload>
+        </div>
+        </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%"
+            height="calc(100% - 40px)" class="com-table" ref="multipleTable" :data="tableData"
+            tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading" :key= Math.random()
         >
-          <el-table-column prop="demandName" label="需求名称">
-          </el-table-column>
-          <el-table-column prop="groupName" label="提出部门/地市">
+          <el-table-column width="150" v-for="item in tableHead"  :prop=item.prop :label=item.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"
@@ -51,38 +34,53 @@
 <script>
 import mySearch from "../../../components/search.vue";
 import toolList from "../../../components/toolList.vue";
+import myUpload from '../../../components/upload';
+
 
 export default {
   components: {
-    mySearch,
-    toolList,
+      mySearch,
+      toolList,
+      myUpload
   },
   data() {
     return {
-      searchList: [
-        {
-          type: "input",
-          tit: "需求名称",
-          value: "",
-          width: "23%",
-        },
-        {
-          type: "input",
-          tit: "部门或地市",
-          value: "",
-          width: "23%",
+        // tableHead: [{prop: 'demandNo', label: '需求编号'},{prop: 'groupName', label: '提出部门'}],
+        fileInfo: {
+            type: 'btn',
+            typename: '导入',
+            btntype: 'primary',
+            limit: 1,
+            url: '/market/mkOnlineChannel/importLedgerList',
+            fileList: [],
+            typexz:"xlsx"
         },
+        loading:false,
+        tableHead:[],
+        searchList: [
+            // {
+            //   type: "input",
+        //   tit: "需求名称",
+        //   value: "",
+        //   width: "23%",
+        // },
+        // {
+        //   type: "input",
+        //   tit: "部门或地市",
+        //   value: "",
+        //   width: "23%",
+        // },
         {
           type: "date",
           tit: "开始时间",
           value: "",
-          width: "23%",
+          width: "46%",
         },
         {
           type: "date",
           tit: "结束时间",
           value: "",
-          width: "23%",
+          width: "46%",
         },
       ],
       tooltit: "线上业务需求台账",
@@ -107,20 +105,36 @@ export default {
     };
   },
   methods: {
+      headerStyleFun({rowIndex}){
+          if (rowIndex === 0){
+              return "font-size:14px;font-weight:bold;color:black;"
+          }
+      },
+      onSuccess(file){
+          this.searchInfo([this.searchList[0].value], 1);
+      },
     //搜索数据
     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[0] ? (this.params.demandName = v[0]) : "";
+      // v[1] ? (this.params.deptOrCity = v[1]) : "";
+      v[0]
+        ? (this.params.startTime = this.$formatDate(v[0], "YYYY-MM-DD"))
         : "";
-      v[3] ? (this.params.endTime = this.$formatDate(v[3], "YYYY-MM-DD")) : "";
-      this.handleInit();
+      v[1] ? (this.params.endTime = this.$formatDate(v[1], "YYYY-MM-DD")) : "";
+        if ((new Date(this.params.startTime)).getTime() > (new Date(this.params.endTime)).getTime()){
+            this.$message.error(
+                "开始时间不能大于结束时间"
+            );
+            return
+        }
+        this.getTableHeadlist();
+        this.handleInit();
     },
     // 初始化列表
     handleInit() {
-      this.$http({
+        this.loading=true;
+        this.$http({
         url: "/market/mkOnlineChannel/ledgerList",
         method: "post",
         headers: {
@@ -137,59 +151,41 @@ export default {
             body: { data, count },
           },
         }) => {
-          this.total = count;
-          this.tableData = data;
-          this.total = count;
+            this.loading = false;
+            this.total = count;
+            this.tableData = data;
+            this.total = count;
         }
       );
     },
+      //获取表头数据
+      getTableHeadlist() {
+          this.$http({
+              url: "/market/mkOnlineChannel/getTableHeadlist",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+              data: {
+                  ...this.params,
+                  page: this.page,
+                  pageSize: this.pageSize,
+              },
+          }).then(({ data: { body } }) => {
+              this.tableHead = body;
+          });
+      },
     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)
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1 < 10 ?
+            '0' + (date.getMonth() + 1) : date.getMonth()+ 1
+        var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+        let hh = new Date().getHours();
+        let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+        let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+        var nowDate=year+month+day+hh+mf+ss
+
       this.$http({
         url: "/market/mkOnlineChannel/exportLedger",
         method: "post",
@@ -197,7 +193,11 @@ export default {
           "Content-Type": "application/json",
         },
         responseType: "blob",
-        data: this.params,
+          data: {
+              ...this.params,
+              page: this.page,
+              pageSize: this.pageSize,
+          }
       }).then((response) => {
         if (window.navigator && window.navigator.msSaveOrOpenBlob) {
           let blob = new Blob([response.data], {
@@ -205,7 +205,7 @@ export default {
           });
           window.navigator.msSaveOrOpenBlob(
             blob,
-            new Date().getTime() + ".xlsx"
+            "线上业务需求台账-"+nowDate + ".xlsx"
           );
         } else {
           /* 火狐谷歌的文件下载方式 */
@@ -213,7 +213,7 @@ export default {
           var downloadElement = document.createElement("a");
           var href = window.URL.createObjectURL(blob);
           downloadElement.href = href;
-          downloadElement.download = new Date().getTime() + ".xlsx";
+          downloadElement.download = "线上业务需求台账-"+nowDate + ".xlsx";
           document.body.appendChild(downloadElement);
           downloadElement.click();
           document.body.removeChild(downloadElement);
@@ -221,41 +221,54 @@ export default {
         }
       });
     },
+      inlist(){
+          this.$http({
+              url: "/market/mkOnlineChannel/importLedger",
+              method: "post",
+              headers: {
+                  "Content-Type": "application/json",
+              },
+              data: this.params,
+          }).then((res) => {
+              res.data;
+          });
+      },
     // 分页
     currchange(v) {
-      this.page = v;
-      this.handleInit();
+        this.page = v;
+        this.getTableHeadlist();
+        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;
-      });
-    },
+    // 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();
+          this.getTableHeadlist();
+          this.handleInit();
       }
       if (v === 2) {
         this.fullscreen = !this.fullscreen;
       }
     },
-    // =======================
 
     getUser() {
       this.userInfo = JSON.parse(window.sessionStorage.userInfo);
@@ -268,9 +281,10 @@ export default {
     },
   },
   mounted() {
-    // this.getList({}, 1);
-    this.handleInit();
-    this.getUser();
+      // this.getList({}, 1);
+      this.getTableHeadlist();
+      this.handleInit();
+      this.getUser();
   },
   created() {},
 };

+ 66 - 0
src/pages/main/departWorkLists/dialog.vue

@@ -0,0 +1,66 @@
+<template>
+  <el-dialog
+    :modal="modal"
+    :title="title"
+    :visible.sync="visible"
+    :fullscreen="fullscreen"
+    :key="reload"
+    :before-close="handleCancel"
+    :modal-append-to-body="false"
+    :width="width"
+    :show-close="false"
+    :destroy-on-close="destroy"
+  >
+    <!-- 表格主体部分 -->
+    <slot></slot>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    title: {
+      type: String,
+      default: "",
+    },
+    reload: {
+      type: Number,
+      default: 0,
+    },
+    width: {
+      type: String,
+      default: "500px",
+    },
+    fullscreen: {
+      type: Boolean,
+      default: false,
+    },
+    modal: {
+      type: Boolean,
+      default: true,
+    },
+    destroy: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    //   确定的回调
+    handleConfirm() {
+      this.$emit("confirm", false);
+    },
+    //   取消的回调
+    handleCancel() {
+      this.$emit("cancel", false);
+    },
+  },
+};
+</script>
+
+<style></style>

+ 364 - 0
src/pages/main/departWorkLists/export.js

@@ -0,0 +1,364 @@
+// import { createCellPos } from './translateNumToLetter'
+const Excel = require("exceljs");
+import FileSaver from "file-saver";
+export var exportExcel = function (luckysheet, value) {
+    // 参数为luckysheet.getluckysheetfile()获取的对象
+    // 1.创建工作簿,可以为工作簿添加属性
+    const workbook = new Excel.Workbook();
+    // 2.创建表格,第二个参数可以配置创建什么样的工作表
+    if (Object.prototype.toString.call(luckysheet) === "[object Object]") {
+        luckysheet = [luckysheet];
+    }
+    luckysheet.forEach(function (table) {
+        if (table.data.length === 0) return true;
+        // ws.getCell('B2').fill = fills.
+        const worksheet = workbook.addWorksheet(table.name);
+        const merge = (table.config && table.config.merge) || {};
+        const borderInfo = (table.config && table.config.borderInfo) || {};
+        // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+        setStyleAndValue(table.data, worksheet, table);
+        setMerge(merge, worksheet);
+        setBorder(borderInfo, worksheet);
+        return true;
+    });
+
+    // return
+    // 4.写入 buffer
+    const buffer = workbook.xlsx.writeBuffer().then((data) => {
+        // console.log('data', data)
+        const blob = new Blob([data], {
+            type: "application/vnd.ms-excel;charset=utf-8",
+        });
+        console.log("导出成功!2");
+        FileSaver.saveAs(blob, `${value}.xlsx`);
+    });
+    return buffer;
+};
+
+var setMerge = function (luckyMerge = {}, worksheet) {
+    const mergearr = Object.values(luckyMerge);
+    mergearr.forEach(function (elem) {
+        // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+        // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+        worksheet.mergeCells(
+            elem.r + 1,
+            elem.c + 1,
+            elem.r + elem.rs,
+            elem.c + elem.cs
+        );
+    });
+};
+
+var setBorder = function (luckyBorderInfo, worksheet) {
+    if (!Array.isArray(luckyBorderInfo)) return;
+    // console.log('luckyBorderInfo', luckyBorderInfo)
+    luckyBorderInfo.forEach(function (elem) {
+        // 现在只兼容到borderType 为range的情况
+        // console.log('ele', elem)
+        if (elem.rangeType === "range") {
+            let border = borderConvert(elem.borderType, elem.style, elem.color);
+            let rang = elem.range[0];
+            // console.log('range', rang)
+            let row = rang.row;
+            let column = rang.column;
+            for (let i = row[0] + 1; i < row[1] + 2; i++) {
+                for (let y = column[0] + 1; y < column[1] + 2; y++) {
+                    worksheet.getCell(i, y).border = border;
+                }
+            }
+        }
+        if (elem.rangeType === "cell") {
+            // col_index: 2
+            // row_index: 1
+            // b: {
+            //   color: '#d0d4e3'
+            //   style: 1
+            // }
+            const { col_index, row_index } = elem.value;
+            const borderData = Object.assign({}, elem.value);
+            delete borderData.col_index;
+            delete borderData.row_index;
+            let border = addborderToCell(borderData, row_index, col_index);
+            // console.log('bordre', border, borderData)
+            worksheet.getCell(row_index + 1, col_index + 1).border = border;
+        }
+        // console.log(rang.column_focus + 1, rang.row_focus + 1)
+        // worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
+    });
+};
+var setStyleAndValue = function (cellArr, worksheet, table) {
+    if (!Array.isArray(cellArr)) return;
+    cellArr.forEach(function (row, rowid) {
+        row.every(function (cell, columnid) {
+            if (!cell) return true;
+            let fill = fillConvert(cell.bg);
+
+            let font = fontConvert(
+                cell.ff,
+                cell.fc,
+                cell.bl,
+                cell.it,
+                cell.fs,
+                cell.cl,
+                cell.ul
+            );
+            let alignment = alignmentConvert(
+                cell.vt,
+                cell.ht,
+                cell.tb,
+                cell.tr
+            );
+            let value = "";
+
+            if (cell.f) {
+                value = { formula: cell.f, result: cell.v };
+            } else if (!cell.v && cell.ct && cell.ct.s) {
+                // xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后
+                // value = cell.ct.s[0].v
+                cell.ct.s.forEach((arr) => {
+                    value += (arr.m ? arr.m : arr.v);
+                });
+            } else {
+                value = cell.m ? cell.m : cell.v;
+            }
+            //  style 填入到_value中可以实现填充色
+            let letter = createCellPos(columnid);
+            let target = worksheet.getCell(letter + (rowid + 1));
+            // console.log('1233', letter + (rowid + 1))
+            // eslint-disable-next-line no-unused-vars
+            for (const key in fill) {
+                target.fill = fill;
+                break;
+            }
+            target.font = font;
+            target.alignment = alignment;
+            target.value = value;
+            return true;
+        });
+
+    });
+    let columnWidth = table.visibledatacolumn;
+    let rowHeight = table.visibledatarow;
+    for (let i = 0; i < cellArr.length; i++) {
+        let row1 = worksheet.getRow(i+1);
+        row1.height = i > 0 ? rowHeight[i] - rowHeight[i-1] : rowHeight[i]
+    }
+    for (let i = 0; i < cellArr[0].length; i++) {
+        let dobCol = worksheet.getColumn(createCellPos(i));
+        dobCol.width = i > 0 ? (columnWidth[i] - columnWidth[i - 1]) / 6.5 : columnWidth[i] / 6.5
+    }
+
+};
+
+var fillConvert = function (bg) {
+    if (!bg) {
+        return {};
+    }
+    // const bgc = bg.replace('#', '')
+    let fill = {
+        type: "pattern",
+        pattern: "solid",
+        fgColor: { argb: bg.replace("#", "") },
+    };
+    return fill;
+};
+
+var fontConvert = function (
+    ff = 0,
+    fc = "#000000",
+    bl = 0,
+    it = 0,
+    fs = 10,
+    cl = 0,
+    ul = 0
+) {
+    // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+    const luckyToExcel = {
+        0: "微软雅黑",
+        1: "宋体(Song)",
+        2: "黑体(ST Heiti)",
+        3: "楷体(ST Kaiti)",
+        4: "仿宋(ST FangSong)",
+        5: "新宋体(ST Song)",
+        6: "华文新魏",
+        7: "华文行楷",
+        8: "华文隶书",
+        9: "Arial",
+        10: "Times New Roman ",
+        11: "Tahoma ",
+        12: "Verdana",
+        num2bl: function (num) {
+            return num === 0 ? false : true;
+        },
+    };
+    // 出现Bug,导入的时候ff为luckyToExcel的val
+
+    let font = {
+        name: typeof ff === "number" ? luckyToExcel[ff] : ff,
+        family: 1,
+        size: fs,
+        color: { argb: fc.replace("#", "") },
+        bold: luckyToExcel.num2bl(bl),
+        italic: luckyToExcel.num2bl(it),
+        underline: luckyToExcel.num2bl(ul),
+        strike: luckyToExcel.num2bl(cl),
+    };
+
+    return font;
+};
+
+var alignmentConvert = function (
+    vt = "default",
+    ht = "default",
+    tb = "default",
+    tr = "default"
+) {
+    // luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+    const luckyToExcel = {
+        vertical: {
+            0: "middle",
+            1: "top",
+            2: "bottom",
+            default: "top",
+        },
+        horizontal: {
+            0: "center",
+            1: "left",
+            2: "right",
+            default: "left",
+        },
+        wrapText: {
+            0: false,
+            1: false,
+            2: true,
+            default: false,
+        },
+        textRotation: {
+            0: 0,
+            1: 45,
+            2: -45,
+            3: "vertical",
+            4: 90,
+            5: -90,
+            default: 0,
+        },
+    };
+
+    let alignment = {
+        vertical: luckyToExcel.vertical[vt],
+        horizontal: luckyToExcel.horizontal[ht],
+        wrapText: luckyToExcel.wrapText[tb],
+        textRotation: luckyToExcel.textRotation[tr],
+    };
+    return alignment;
+};
+
+var borderConvert = function (borderType, style = 1, color = "#000") {
+    // 对应luckysheet的config中borderinfo的的参数
+    if (!borderType) {
+        return {};
+    }
+    const luckyToExcel = {
+        type: {
+            "border-all": "all",
+            "border-top": "top",
+            "border-right": "right",
+            "border-bottom": "bottom",
+            "border-left": "left",
+        },
+        style: {
+            0: "none",
+            1: "thin",
+            2: "hair",
+            3: "dotted",
+            4: "dashDot", // 'Dashed',
+            5: "dashDot",
+            6: "dashDotDot",
+            7: "double",
+            8: "medium",
+            9: "mediumDashed",
+            10: "mediumDashDot",
+            11: "mediumDashDotDot",
+            12: "slantDashDot",
+            13: "thick",
+        },
+    };
+    let template = {
+        style: luckyToExcel.style[style],
+        color: { argb: color.replace("#", "") },
+    };
+    let border = {};
+    if (luckyToExcel.type[borderType] === "all") {
+        border["top"] = template;
+        border["right"] = template;
+        border["bottom"] = template;
+        border["left"] = template;
+    } else {
+        border[luckyToExcel.type[borderType]] = template;
+    }
+    // console.log('border', border)
+    return border;
+};
+
+function addborderToCell(borders) {
+    let border = {};
+    const luckyExcel = {
+        type: {
+            l: "left",
+            r: "right",
+            b: "bottom",
+            t: "top",
+        },
+        style: {
+            0: "none",
+            1: "thin",
+            2: "hair",
+            3: "dotted",
+            4: "dashDot", // 'Dashed',
+            5: "dashDot",
+            6: "dashDotDot",
+            7: "double",
+            8: "medium",
+            9: "mediumDashed",
+            10: "mediumDashDot",
+            11: "mediumDashDotDot",
+            12: "slantDashDot",
+            13: "thick",
+        },
+    };
+    for (const bor in borders) {
+        if (borders[bor]) {
+            if (borders[bor].color.indexOf("rgb") === -1) {
+                border[luckyExcel.type[bor]] = {
+                    style: luckyExcel.style[borders[bor].style],
+                    color: { argb: borders[bor].color.replace("#", "") },
+                };
+            } else {
+                border[luckyExcel.type[bor]] = {
+                    style: luckyExcel.style[borders[bor].style],
+                    color: { argb: borders[bor].color },
+                };
+            }
+        } else {
+            border[luckyExcel.type[bor]] = {
+                color: "#000000",
+                style: 1,
+            };
+        }
+    }
+    return border;
+}
+
+function createCellPos(n) {
+    let ordA = "A".charCodeAt(0);
+
+    let ordZ = "Z".charCodeAt(0);
+    let len = ordZ - ordA + 1;
+    let s = "";
+    while (n >= 0) {
+        s = String.fromCharCode((n % len) + ordA) + s;
+
+        n = Math.floor(n / len) - 1;
+    }
+    return s;
+}

+ 953 - 0
src/pages/main/departWorkLists/index.vue

@@ -0,0 +1,953 @@
+<template>
+    <div class="container">
+        <div class="main-box" :key="simpleSheetKey">
+            <div class="inner-left">
+                <div class="button-list">
+                    <el-button size="mini" type="" @click="addMenu('root')"  :disabled="!authData" >
+                        添加根目录</el-button
+                    >
+                    <el-button size="mini" type="" @click="addMenu('detail')" :disabled="!authData">
+                        添加清单目录</el-button
+                    >
+                    <el-button size="medium" type="" @click="delMenu" :disabled="!authData"> 删除 </el-button>
+                </div>
+                <el-alert type="warning" :closable="false">
+                    <template slot="title">
+                        <span style="word-break: break-all">
+                            {{
+                        checkedNode && checkedNode.length > 0
+                        ? "当前选择节点名称:" + checkedNode[0].name
+                        : "当前无选择节点"
+                        }}
+                        </span>
+                    </template>
+                </el-alert>
+                <div style="margin: 10px 0">
+                    <el-input
+                        size="medium"
+                        placeholder="请输入内容"
+                        v-model="filterText"
+                        class="input-with-select"
+                        clearable
+                        @change="
+                                () => {
+                                  if (!filterText) {
+                                    searchMenu();
+                                  }
+                                }
+                            "
+                    >
+                        <el-button
+                            slot="append"
+                            @click="searchMenu"
+                            icon="el-icon-search"
+                        ></el-button>
+                    </el-input>
+                </div>
+                <div
+                    style="
+                          height: calc(100% - 182px);
+                          overflow-y: auto;
+                          margin-top: 20px;
+                        "
+                >
+                    <el-tree
+                        ref="catalogTree"
+                        :expand-on-click-node="true"
+                        :auto-expand-parent="true"
+                        :default-expand-all="true"
+                        :props="defaultProps"
+                        @node-click="nodeClick"
+                        :filter-node-method="filterNode"
+                        :data="menuList"
+                        node-key="id"
+                    >
+                        <span class="custom-tree-node" slot-scope="{ node }">
+                                <el-tooltip effect="light" :content="node.label" placement="right">
+                                    <span class="item-tit">
+                                        <span :style="
+                                            node.data.parentCode===0
+                                            ? 'font-size:14px;padding-left:5px'
+                                            : 'font-size:12px;padding-left:5px'
+                                        "
+                                        >
+                                             {{node.data.name}}
+                                        </span>
+                                    </span>
+                                </el-tooltip>
+                        </span>
+                    </el-tree>
+                </div>
+            </div>
+            <div  class="inner-right" v-if="addOnlineWordFlag">
+                <simple-dialog
+                    v-if="fullscreen"
+                    :fullscreen="fullscreen"
+                    :visible="addOnlineWordFlag"
+                    width="1200px"
+                >
+                    <simple-sheet ref="simpleSheet" :type="type"
+                                  :fullscreen="fullscreen"
+                                  @saveData="handleSaveData"
+                                  @handleFullscreen="handleFullscreen"
+                                  @save="handleSave"
+                                  :workName="workName"
+                                  :work-data="workData"
+                                  :id="tmpId" :mkdirId="params.mkdirId" :isCreater="isCreater"/>
+                </simple-dialog>
+                <simple-sheet v-else :type="type"
+                              :fullscreen="fullscreen"
+                              @saveData="handleSaveData"
+                              @handleFullscreen="handleFullscreen"
+                              :workName="workName"
+                              :work-data="workData"
+                              @save="handleSave"
+                              :id="tmpId" :mkdirId="params.mkdirId" :isCreater="isCreater"/>
+            </div>
+
+            <div class="inner-right" v-if="workListFlag">
+                <div class="search">
+                    <span>{{ catalogueName }}</span>
+                </div>
+                <div style="margin-bottom: 10px;margin-top: 10px;">
+                    <el-button
+                        v-if="checkedNode && checkedNode.length === 2"
+                        type="primary"
+                        size="mini"
+                        @click="addFile('add',{delFlag:'1'})"
+                        style="width: 80px"
+                    >
+                        新建
+                    </el-button>
+                </div>
+                <div class="tabBoxClass">
+                    <el-table
+                        height="calc(100% )"
+                        class="com-table"
+                        ref="multipleTable"
+                        :data="tableData"
+                        tooltip-effect="dark"
+                        :key="tableData.id"
+                        border
+                        size="small"
+                        style="width:100%"
+                        v-loading="loading"
+                    >
+                        <el-table-column
+                            prop="templateName"
+                            show-overflow-tooltip
+                            label="名称"
+                            min-width="25%"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="createTime"
+                            show-overflow-tooltip
+                            label="创建时间"
+                            min-width="20%"
+                            align="center"
+                        />
+                        <el-table-column
+                            prop="createCity"
+                            show-overflow-tooltip
+                            label="创建科室"
+                            min-width="25%"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="createBy"
+                            show-overflow-tooltip
+                            label="创建人"
+                            min-width="10%"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="stateNm"
+                            show-overflow-tooltip
+                            label="状态"
+                            min-width="10%"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column label="操作" align="center" width="150">
+                            <template slot-scope="scope">
+                                <el-button
+                                    :disabled="scope.row.editFlag=='1'?false:true"
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="addFile('edit',scope.row)"
+                                >编辑
+                                </el-button>
+                                <el-button
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="addFile('view',scope.row)"
+                                >查看
+                                </el-button>
+                                <el-button
+                                    v-show="scope.row.delFlag=='1'?true:false"
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="deleteOne(scope.row)"
+                                >删除
+                                </el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                                            <el-pagination
+                                                class="pageBox"
+                                                @current-change="currchange"
+                                                layout="total, prev, pager, next"
+                                                background
+                                                :total="total"
+                                            >
+                                            </el-pagination>
+                </div>
+            </div>
+        </div>
+        <el-dialog
+            class="p-new-box"
+            size="50%"
+            title="新增目录"
+            :append-to-body="true"
+            :visible.sync="addDialogStatus"
+            :close-on-click-modal="false"
+        >
+            <el-form
+                :model="formData"
+                :rules="rules"
+                ref="ruleForm"
+                label-width="100px"
+                class="demo-ruleForm"
+                style="width: 90%; margin: 30px auto"
+            >
+                <el-form-item label="目录名称:" prop="name">
+                    <el-input
+                        v-model="formData.name"
+                        placeholder="请输入目录名称"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item
+                    label="父级目录:"
+                    prop="parentName"
+                >
+                    <el-input
+                        disabled
+                        v-model="formData.parentName"
+                        placeholder="请输入父级名称"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item label="操作人:" prop="createName">
+                    <el-input
+                        v-model="formData.createId"
+                        disabled
+                    ></el-input>
+                </el-form-item>
+                <div class="drawer-footer" style="text-align: right">
+                    <el-button
+                        type="primary"
+                        size="medium"
+                        @click="submitForm('ruleForm')"
+                    >确认</el-button
+                    >
+                    <el-button
+                        style="margin-right: 40px"
+                        size="medium"
+                        @click="resetForm('ruleForm')"
+                    >取消</el-button
+                    >
+                </div>
+            </el-form>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import Vue from 'vue';
+import simpleSheet from "./sheet.vue";
+import simpleDialog from "./dialog.vue";
+export default {
+    components: {
+        simpleSheet,
+        simpleDialog
+    },
+    data() {
+        return {
+            catalogueName:"部门工作清单",
+            isCreater:"0",//1:创建者 0:非创建者
+            addDialogStatus: false,
+            tooltit: "部门工作清单",
+            filterText: "", // tree搜索value
+            menuList: [], // tree数据源
+            checkedNode: [], // 选中节点信息
+            authData: false, //是否有权限 false无全权限
+            fullscreen: false,
+            formData: {
+                name: "",
+                parentCode: "",
+                parentName: "",
+                createId: JSON.parse(sessionStorage.userInfo).loginNo,
+            },
+            defaultProps: {
+                children: "children",
+                label: "name",
+            },
+            rules: {
+                name: [
+                    {
+                        required: true,
+                        message: "请输入目录名称",
+                        trigger: "change",
+                    },
+                ],
+            },
+
+            tmpId:'',
+            rowData:{},
+            type:'add',
+            workListFlag:true,
+            addOnlineWordFlag:false,
+            loading: false,
+            tableData: [
+                // {
+                //     templateName:"测试",
+                //     createTime:"2022-6-12",
+                //     createCity:"规划开发室",
+                //     createBy:"范岩",
+                //     state:"开",
+                //     delFlag:"1",//1:代表创建人有删除权限 0:不显示
+                //     editFlag:"0"//1:不置灰(状态state字段为开时);0:置灰(状态state字段为关时且不是创建人时)
+                // }
+            ], // 表格数据源
+            infolist: {
+                isFile: "1",
+                title: "", // 材料名称
+                meeting: "", // 会议名称
+                titleBg: "", // 材料背景
+                auth: "1", // 查看权限
+                mkFileShareAttachList: [], // 附件数据
+                parentId: "",
+            }, // 提交表单数据源
+            filerules: {
+                title: [
+                    {
+                        required: true,
+                        message: "请输入材料名称",
+                        trigger: "change",
+                    },
+                ],
+                meeting: [
+                    {
+                        required: true,
+                        message: "请输入会议名称",
+                        trigger: "change",
+                    },
+                ],
+                titleBg: [
+                    {
+                        required: true,
+                        message: "请输入材料背景",
+                        trigger: "change",
+                    },
+                ],
+            },
+            subType: "",
+            total: 0,
+            pageSize: 1,
+            params: {
+                id: "",
+                mkdirId:"3"
+            },
+            paramsSearch: {
+                isFile: "1",
+                id: "",
+            },
+            fileInfo: {
+                type: "bt1n",
+                typename: "上传文件",
+                limit: 5,
+                url: "/market/cmkFileShareNet/upload",
+                fileList: [],
+            },
+            titname: "新增",
+            dialogStatus: false,
+            attList: [],
+            simpleSheetKey:0,
+            workName:'',
+            workData:null,
+        };
+    },
+    methods: {
+        handleSaveData(workName, workData){
+            this.workName = workName;
+            this.workData = workData;
+        },
+        handleFullscreen(fullscreen){
+            if (fullscreen){
+                Vue.set(this, 'fullscreen', fullscreen)
+                /*this.$nextTick(()=>{
+                    this.$refs.simpleSheet.handleFullscreenOption()
+                })*/
+            }else {
+                this.$nextTick(()=>{
+                    this.$refs.simpleSheet.handleFullscreenOption()
+                    Vue.set(this, 'fullscreen', fullscreen)
+                })
+            }
+
+        },
+        saveData(workName, workData){
+            this.workName = workName;
+            this.workData = workData;
+        },
+        // 搜索按钮事件
+        searchMenu() {
+            this.$refs.catalogTree.filter(this.filterText);
+        },
+        // 新增目录-表单提交
+        async submitForm(formName) {
+            let valid = await this.$refs[formName].validate().catch((err) => err);
+            if (valid) {
+                let nm = this.formData.name;
+                if(""===nm.trim()){
+                    this.$message({
+                        type: "error",
+                        message: "新建失败!目录名称不能为空",
+                    });
+                    return;
+                }
+                this.$http({
+                    url:"/market/mkWorkListCatalogue/add",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    data: this.formData,
+                }).then((res) => {
+                    if (res.data.result === 0) {
+                        this.$message({
+                            type: "success",
+                            message: res.data.desc,
+                        });
+                        this.getData();
+                        this.$refs[formName].resetFields();
+                        this.addDialogStatus = false;
+                    }else {
+                        this.$message({
+                            type: "error",
+                            message: res.data.desc,
+                        });
+                    }
+                });
+            }
+        },
+        // 取消新增目录
+        resetForm(formName) {
+            this.$refs[formName].resetFields();
+            this.addDialogStatus = false;
+        },
+        // 新增目录
+        addMenu(flag) {
+            if (flag === 'detail'){
+                if (!this.checkedNode || this.checkedNode.length !== 1){
+                    this.$message({
+                        type: "warning",
+                        message: "请先选择根目录",
+                    });
+                    return;
+                }
+                this.formData.parentCode = this.checkedNode[0].id
+                this.formData.parentName = this.checkedNode[0].name
+            }else if (flag === 'root'){
+                this.formData.parentCode = 0;
+                this.formData.parentName = ''
+            }
+            this.addDialogStatus = true
+        },
+        // 删除目录
+        delMenu() {
+            if (!this.checkedNode || this.checkedNode.length === 0) {
+                this.$message("请先选中要删除的目录");
+            } else {
+                this.$confirm("即将删除此条数据, 是否删除?", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                })
+                    .then(() => {
+                        this.$http({
+                            url: "/market/mkWorkListCatalogue/del",
+                            method: "post",
+                            headers: {
+                                "Content-Type": "application/json",
+                            },
+                            data: {
+                                id: this.checkedNode[0].id,
+                                parentCode: this.checkedNode[0].parentCode
+                            },
+                        }).then((res) => {
+                            if (res.data.result === 0) {
+                                this.$notify({
+                                    title: "成功",
+                                    message: res.data.desc,
+                                    type: "success",
+                                });
+                                this.checkedNode = [];
+                                //删除成功后渲染右边目录和表格数据
+                                this.catalogueName="部门工作清单";
+                                this.params.mkdirId='-1';//确保查不到数据
+                                this.getList(this.params, this.pageSize);
+                                this.getData();
+                            }else if(res.data.result === 1) {
+                                this.$notify({
+                                    title: "失败",
+                                    message: res.data.desc,
+                                    type: "error",
+                                });
+                            }
+                        });
+                    })
+                    .catch(() => {});
+            }
+        },
+        // tree过滤方法
+        filterNode(value, data) {
+            if (!value) return true;
+            return data.name.indexOf(value) !== -1;
+        },
+        // 点击树节点事件
+        nodeClick(data, node) {
+            this.formData.parentCode = data.parentCode;
+            let clickNode = []
+            this.getParent(node, clickNode)
+            this.checkedNode = clickNode
+            if (clickNode.length === 2){
+                this.catalogueName = clickNode[1].name + '-' + clickNode[0].name
+                this.params.mkdirId = clickNode[0].id + ''
+                this.getList(this.params, this.pageSize);
+            }else if(clickNode.length === 1){
+                //父目录,则显示新建按钮只显示表头
+                this.catalogueName =data.name
+                this.params.mkdirId=data.id;
+                this.getList(this.params, this.pageSize);
+            }
+            //返回列表页面
+            this.addOnlineWordFlag=false;
+            this.workListFlag=true;
+        },
+        getParent(node, list){
+            if (node.level > 0){
+                list.push(node.data)
+                this.getParent(node.parent, list);
+            }
+        },
+        // 获取目录
+        getData() {
+            this.$http({
+                url: "/market/mkWorkListCatalogue/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: { isFile: "0" },
+            }).then((res) => {
+                if (res.data.result === 0) {
+                    this.menuList = res.data.body;
+                }else {
+                    this.$message({
+                        message: res.data.desc,
+                        type: "error",
+                    });
+                }
+            });
+        },
+        // 获取权限
+        getAuthData() {
+            let menus = JSON.parse(window.sessionStorage.childrenMenus);
+            for(let n=0;n<menus.length;n++){
+                if (menus[n].jspUrl === "/workListCatalogueAuth") {
+                   this.authData = true
+                }
+            }
+        },
+
+
+        handleSave() {
+            // switch (type) {
+            //     case "add":
+            console.log("************")
+            this.addOnlineWordFlag=false;
+            this.workListFlag=true;
+                //     break;
+                // case "edit":
+                //     this.handleVisible("edit");
+                //     break;
+            // }
+            //调用list列表接口根据目录ID
+            // this.handleInit();
+            this.getList(this.params, this.pageSize);
+        },
+        //搜索数据
+        searchInfo(v) {
+            this.paramsSearch = {};
+            v[0] ? this.paramsSearch.title = v[0] : '';
+            this.paramsSearch.isFile = "1";
+            // this.paramsSearch.parentId = this.infolist.parentId;
+            this.pageSize = 1;//重置分页
+            this.getList(this.paramsSearch, this.pageSize);
+        },
+        // 新增在线文档
+        addFile(type,data) {
+            // this.titname = "新增";
+            this.workName = ""
+            this.workData = null
+            this.workListFlag = false;
+            this.addOnlineWordFlag = true;
+            this.type=type;
+            this.isCreater = data.delFlag;
+            this.tmpId=data.id
+            // switch (type) {
+            //     case "add":
+            //         break;
+            //     case "edit":
+            //
+            //         this.rowData=data;
+            //         break;
+            //     case "view":
+            //         this.rowData=data;
+            //         break;
+            // }
+        },
+        // 上传回调
+        uploadBack(v) {
+            this.attList = v;
+        },
+        deleteOne(val) {
+            this.$confirm("即将删除此条数据, 是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            })
+                .then(() => {
+                    this.pageSize = 1;
+                    this.$http({
+                        url: "/market/workLists/del",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json",
+                        },
+                        data: {
+                            id: val.id,
+                        },
+                    }).then((res) => {
+                        if (res.data.result == 0) {
+                            this.$message({
+                                message: "删除成功",
+                                type: "success",
+                            });
+                            this.getList(this.params, this.pageSize);
+                        }else if(res.data.result == 1) {
+                            this.$message({
+                                message: res.data.body,
+                                type: "error",
+                            });
+                        }
+                    });
+                })
+                .catch(() => {});
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList(this.params, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen;
+            }
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList(this.params, this.pageSize);
+        },
+        //获取列表
+        getList(v, n) {
+            this.pageSize = n;
+            this.loading = true;
+            this.tableData = [];
+            this.$http({
+                url: "/market/workLists/list",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    page: '{"pageNo":"' + n + '","pageSize":"10"}',
+                },
+                data: v,
+            }).then((res) => {
+                if(res.data.result==0){
+                    this.tableData=res.data.body.data
+                    this.tableData.forEach(item=>{
+                        item.stateNm=item.state=='1'?'开启':'关闭';
+                    });
+                }else{
+                    this.$message({
+                        message: "获取失败",
+                        type: "error",
+                    });
+                }
+                this.total = res.data.body.totalRecord;
+                this.loading = false;
+            });
+        },
+    },
+    mounted() {
+        this.getData();
+        this.getAuthData();
+    },
+};
+</script>
+<style scoped lang="scss">
+.radviv div {
+    width: 80% !important;
+}
+.pageBox {
+    text-align: right;
+    margin-top: 5px;
+}
+
+.info-line {
+    width: 100%;
+    display: block;
+    // padding-left: 20px;
+
+    div {
+        width: 50%;
+        display: inline-block;
+    }
+
+    span {
+        width: 100px;
+        display: inline-block;
+        text-align: right;
+        font-weight: bold;
+        font-size: 14px;
+        padding-right: 15px;
+
+        i {
+            color: red;
+            display: inline-block;
+            padding-right: 5px;
+        }
+    }
+
+    .el-select,
+    .el-input {
+        width: calc(100% - 100px);
+    }
+
+    .tree {
+        width: calc(100% - 100px);
+    }
+}
+
+.online {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 100px);
+    }
+
+    span {
+        vertical-align: top;
+    }
+
+    .el-textarea {
+        width: calc(100% - 100px);
+    }
+}
+</style>
+
+<style lang="scss" scoped>
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+.container {
+    background-color: #f0f2f5;
+    .clearStyle {
+        cursor: pointer;
+        color: #0b82ff;
+    }
+    .el-col {
+        background-color: white;
+        padding: 0 20px;
+    }
+
+    .container-box {
+        padding: 0;
+        margin-top: 0;
+        height: 100%;
+        background-color: white;
+        padding: 20px;
+    }
+
+    .main-box {
+        overflow: hidden;
+        display: flex;
+        background-color: white;
+        padding: 20px 0;
+
+        > div {
+            background-color: white;
+        }
+
+        .inner-left {
+            width: 320px;
+            padding: 0 20px;
+            border: 1px solid #ddd;
+            border-radius: 5px;
+            height: calc(100vh - 220px);
+
+             .canel-style {
+             	color: #1890ff;
+             	cursor: pointer;
+             	padding-left: 10px;
+             }
+        }
+
+        .inner-right {
+            flex: 1;
+            margin: 0 2%;
+            //overflow-y: auto;
+            //   border-left: 1px solid #ddd;
+            height: calc(100vh - 220px);
+            width: calc(100% - 320px - 4%);
+            .tabBoxClass {
+                height: calc(100% - 120px);
+            }
+        }
+    }
+}
+
+.button-list {
+    padding: 30px 0 10px 0;
+    display: flex;
+    //   justify-content: center;
+    justify-content: space-between;
+}
+
+.choice-style {
+    background: rgb(255, 255, 255);
+}
+
+.tree-action {
+    bottom: 0;
+    width: 100%;
+    // border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+}
+
+.tree-line {
+    // .el-tree-node__content {
+    //   padding-left: 0 !important;
+    // }
+
+    .el-tree-node__expand-icon.is-leaf {
+        display: none !important;
+    }
+
+    .el-tree-node {
+        position: relative;
+        padding-left: 16px; // 缩进量
+    }
+
+    .el-tree-node__children {
+        padding-left: 16px; // 缩进量
+    }
+
+    // 竖线
+    .el-tree-node::before {
+        content: "";
+        height: 100%;
+        width: 1px;
+        position: absolute;
+        left: -3px;
+        top: -17px;
+        border-width: 1px;
+        border-left: 1px dashed #52627c;
+    }
+
+    // 当前层最后一个节点的竖线高度固定
+    .el-tree-node:last-child::before {
+        height: 38px; // 可以自己调节到合适数值
+    }
+
+    // 横线
+    .el-tree-node::after {
+        content: "";
+        width: 24px;
+        height: 20px;
+        position: absolute;
+        left: -3px;
+        top: 20px;
+        border-width: 1px;
+        border-top: 1px dashed #52627c;
+    }
+
+    // 去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了
+    & > .el-tree-node::after {
+        border-top: none;
+    }
+
+    & > .el-tree-node::before {
+        border-left: none;
+    }
+
+    // 展开关闭的icon
+    .el-tree-node__expand-icon {
+        font-size: 16px;
+
+        // 叶子节点(无子节点)
+        &.is-leaf {
+            color: transparent;
+            // display: none; // 也可以去掉
+        }
+    }
+}
+.custom-tree-node {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    padding-right: 8px;
+    // .item-tit{
+    //     color: #ffffff;
+    // }
+}
+.el-tree ::v-deep .custom-tree-node,
+.el-tree ::v-deep .custom-tree-node .item-tit{
+    overflow: hidden!important;
+    text-overflow:ellipsis!important;
+    white-space: nowrap!important;
+}
+</style>

+ 631 - 0
src/pages/main/departWorkLists/sheet.vue

@@ -0,0 +1,631 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-12-04 14:23:58
+ * @LastEditors: daiqisheng
+ * @LastEditTime: 2022-05-10 11:24:05
+ * @FilePath     : \spfm-market-front\src\pages\main\performance\components\sheet.vue
+-->
+<template>
+    <fullscreen id="containerClass" :fullscreen.sync="fullscreen" class="containerClass" style=" background-color: #ffffff">
+        <div class="sheet-container" id="full-container">
+            <div style="    margin-top: 20px; margin-left: 30px;" >
+                <span style="  font-size: small;margin-right: 10px;">控制权限</span>
+                <el-select v-model="state" placeholder="请选择" :disabled="this.type=='view'|| (this.type=='edit' && this.isCreater !='1') ?true:false " size="mini">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </div>
+            <div class="flex-justify-align-end margin-bottom-20">
+                <!--      <span-->
+                <!--        v-if="['template'].includes(attribute)"-->
+                <!--        ><span class="sheet-container-require">*</span>模板类型:</span-->
+                <!--      >-->
+                <div style="display: flex;
+                        margin-right: 20px;
+                        background: rgb(2, 135, 251);
+                        padding: 2px;
+                        border-radius: 4px;">
+                    <el-upload
+                        action
+                        :http-request="request"
+                        :on-change="handleChange"
+                        :show-file-list="false"
+                        :disabled="this.type=='view'?true:false"
+                    >
+                        <el-button :disabled="this.type=='view'?true:false" size="mini">选择文件</el-button>
+                    </el-upload>
+                    <span style="font-size: 12px;margin-right: 5px;line-height: 2;color: white;">{{ fileListName }}</span>
+                </div>
+                <el-button
+                    type="danger"
+                    @click="handleResave"
+                    size="mini"
+                    :disabled="this.type=='view'?true:false"
+                >保存</el-button
+                >
+                <!--            :disabled="handleForbid()"-->
+
+                <el-button  size="mini" type="danger" @click="handleDownload">导出</el-button>
+                <el-button size="mini" type="primary" @click="returnList">返回</el-button>
+                <el-button size="mini" type="primary" @click="handleFullscreen">{{ showName }}</el-button>
+            </div>
+            <div id="luckysheet" class="sheet-container-block_class" ></div>
+        </div>
+    </fullscreen>
+</template>
+
+<script>
+import luckyexcel from "luckyexcel";
+import { exportExcel } from "./export";
+export default {
+    components: {
+    },
+    props: {
+        isCreater: {
+            type: String,
+            default: "",
+        },
+        type: {
+            type: String,
+            default: "view", // view 查看 edit 编辑
+        },
+        attribute: {
+            type: String,
+            default: "template", // template 模板 order 工单 file 文件
+        },
+        id: {
+            default: null,
+        },
+        // 接收人
+        receiver: {
+            type: String,
+            default: "",
+        },
+        // 模板状态按钮判断
+        status: { type: String, default: "" },
+        mkdirId:{
+            type: String,
+            default:'',
+        },
+        fullscreen:{
+            type:Boolean,
+            default:false
+        },
+        workName:{
+            type:String
+        },
+        workData:{
+            type:Object
+        }
+    },
+    data() {
+        return {
+            options: [{
+                value: '1',
+                label: '开启'
+            },{
+                value: '0',
+                label: '关闭'
+            }],
+            state:'1',
+            form: {
+                charge: [
+                    {
+                        person: [],
+                        col_start: "",
+                        col_end: "",
+                        row_start: "",
+                        row_end: "",
+                    },
+                ],
+                array: [],
+                type: null,
+                permission_type: null,
+                col_start: "",
+                col_end: "",
+                row_start: "",
+                row_end: "",
+            },
+            approveForm: {
+                type: "",
+                comments: "",
+                list: [
+                    {
+                        label: "同意",
+                        value: "同意",
+                    },
+                    {
+                        label: "不同意",
+                        value: "不同意",
+                    },
+                    {
+                        label: "其他",
+                        value: "3",
+                    },
+                ],
+            },
+            superviserules: {
+                distribute: [
+                    { required: true, message: "请选择派发周期", trigger: "change" },
+                ],
+                write: [
+                    { required: true, message: "请选择填报周期", trigger: "change" },
+                ],
+                endTime: [
+                    { required: true, message: "请选择截止时间", trigger: "change" },
+                ],
+            },
+            superviseForm: {
+                distribute: "", // 派单周期
+                write: "", // 填写周期
+                endTime: "", // 截止时间
+            },
+            originSuperviseForm: {},
+            pickOptions: {
+                disabledDate(time) {
+                    return time.getTime() < new Date().getTime() - 8.64e7;
+                },
+            },
+            pickWrite: {
+                disabledDate(time) {
+                    return time.getTime() < new Date().getTime() - 8.64e7;
+                },
+            },
+            // 可提交标志
+            addFlag: "0",
+            // 督办标志
+            superviseFlag: null,
+            rowList: [],
+            isDisable: true,
+            issued_id: null,
+            template_id: null,
+            visible: false,
+            templateType: "",
+            // 督办
+            supervise: false,
+            manager_approve: false,
+            row_list: [],
+            column_list: [],
+            charge_list: [],
+            type_options: [
+                {
+                    value: 1,
+                    label: "按行",
+                },
+                // {
+                //     value: 2,
+                //     label: "按列",
+                // },
+            ],
+            fileListName:'未选择任何文件',
+            showName: '全屏显示'
+        };
+    },
+    methods: {
+        request(){},
+        handleInit() {
+            if (this.id) {
+                if (this.workData){
+                    this.handleCreate({
+                        json: this.workData,
+                        name: this.workName,
+                        type: "json",
+                    });
+                }else {
+                    this.handleQuery();
+                }
+            } else {
+                if (this.workData){
+                    this.handleCreate({
+                        json: this.workData,
+                        name: this.workName,
+                        type: "json",
+                    });
+                }else {
+                    this.handleCreate();
+                }
+            }
+            if (this.fullscreen){
+                this.$nextTick(()=>{
+                    this.handleFullscreenOption();
+                    this.showName = '退出全屏'
+                })
+            }
+        },
+        returnList(){
+            if (this.fullscreen){
+                this.handleFullscreenOption()
+                this.$emit("handleFullscreen", false)
+            }
+            this.$emit("save");
+        },
+        handleAllow() {
+            //查看无法编辑
+            return this.type=="view"?false:true;
+        },
+        addInputPlace(){
+            this.$nextTick(()=>{
+                let element = document.getElementById('luckysheet_info_detail_input');
+                element.placeholder = '请输入标题'
+                element.style['min-width'] = '120px'
+            })
+        },
+        async handleQuery() {
+            const {
+                data: {
+                    templateContent,
+                    templateName,
+                    state,
+                },
+            } = await this.$http({
+                url: "/market/workLists/getWorkById",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {id:this.id},
+            });
+            this.state=state;
+            this.handleCreate({
+                json: templateContent ? JSON.parse(templateContent) : {},
+                name: templateName,
+                type: "json",
+            });
+        },
+        async handleCreate({ file, json, type, name } = {}) {
+            let that = this;
+            if('add'== this.type){
+                window.luckysheet.destroy();
+                window.luckysheet.create({
+                    container: "luckysheet",
+                    lang: "zh",
+                    showsheetbar: false,
+                    data:[{"name": "777e1d91-2075-446f-b163-03c5e0ee0e0c"}],
+                    plugins:['chart'],
+                    userInfo:undefined,
+                    title:""
+                })
+                this.addInputPlace();
+                if (!this.fullscreen){
+                    let interval = setInterval(()=>{
+                        let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                        if (elementById){
+                            elementById.style.width = '55%'
+                            clearInterval(interval)
+                        }
+                    },300)
+                }
+            }
+            switch (type) {
+                case "file":
+                    if (file) {
+                        await new Promise((resolve) => {
+                            luckyexcel.transformExcelToLucky(file, (export_json) => {
+                                let name = export_json.info.name;
+                                if(!name.endsWith(".xlsx")){
+                                    this.$message({
+                                        type: "error",
+                                        message: '导入失败!只支持.xlsx格式文件',
+                                    });
+                                }else {
+                                    this.fileListName = name;
+                                    let lastIndexOf = export_json.info.name.lastIndexOf('.');
+                                    name = name.substring(0, lastIndexOf);
+                                    window.luckysheet.destroy();
+                                    export_json.sheets.name = '777e1d91-2075-446f-b163-03c5e0ee0e0c'
+                                    window.luckysheet.create({
+                                        container: "luckysheet",
+                                        lang: "zh",
+                                        plugins:['chart'],
+                                        showsheetbar: false,
+                                        data:export_json.sheets,
+                                        title:name,
+                                        userInfo:export_json.info.name.creater
+
+                                    })
+                                    this.addInputPlace();
+                                    if (!this.fullscreen){
+                                        let interval = setInterval(()=>{
+                                            let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                                            if (elementById){
+                                                elementById.style.width = '55%'
+                                                clearInterval(interval)
+                                            }
+                                        },300)
+                                    }
+                                }
+                                resolve();
+                            });
+                        });
+                    }
+                    break;
+                case "json":
+                    if (json) {
+                        window.luckysheet.destroy();
+                        let data=[];
+                        data[0]=json;
+                        if('view'==this.type){
+                            window.luckysheet.create({
+                                container: "luckysheet",
+                                lang: "zh",
+                                plugins:['chart'],
+                                showsheetbar: false,
+                                data:data,
+                                title:name,
+                                userInfo:name.creater,
+                                hook: {
+                                    cellEditBefore: function ([
+                                                                  { row_focus: row, column_focus: column },
+                                                              ]) {
+                                        if (!that.handleAllow({ row, column })) {
+                                            that.$message.error("当前为【查看】状态,无法编辑!");
+                                        }
+                                    },
+                                    // cellUpdated: function (row, column) {
+                                    //   that.rowList.push(row);
+                                    // },
+                                    cellUpdateBefore: function (row, column) {
+                                        console.log(row, column);
+                                        if (!that.handleAllow({ row, column })) {
+                                            return false;
+                                        }
+                                    },
+                                    rangePasteBefore: function ([
+                                                                    { row_focus: row, column_focus: column },
+                                                                ]) {
+                                        if (!that.handleAllow({ row, column })) {
+                                            that.$message.error("当前为【查看】状态,无法编辑!");
+                                            return false;
+                                        }
+                                    },
+                                    updated: function ({ range }) {
+                                        const middle = range.map((el) => {
+                                            return that.paramsArr(el.row[0], el.row[1]);
+                                        });
+                                        let changedList = middle.join(",").split(",");
+                                        that.rowList.push(...changedList);
+                                    },
+                                }
+                            });
+                        }else{
+                            window.luckysheet.create({
+                                container: "luckysheet",
+                                lang: "zh",
+                                plugins:['chart'],
+                                showsheetbar: false,
+                                data:data,
+                                title:name,
+                                userInfo:name.creater
+                            });
+                            this.addInputPlace();
+                            if (!this.fullscreen){
+                                let interval = setInterval(()=>{
+                                    let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                                    if (elementById){
+                                        elementById.style.width = '55%'
+                                        clearInterval(interval)
+                                    }
+                                },300)
+                            }
+                        }
+                    }
+                    break;
+            }
+        },
+        async handleChange(response, fileList) {
+            this.handleCreate({ file: response.raw, type: "file" });
+        },
+        handleDownload() {
+            exportExcel(
+                window.luckysheet.getAllSheets(),
+                window.luckysheet.getWorkbookName()
+            );
+        },
+        // 判断数组是否有值
+        confirmArrayData(data) {
+            if (data instanceof Array) {
+                if (data.length) {
+                    for (let i = 0; i < data.length; i++) {
+                        if (data[i] instanceof  Array){
+                            for (let j = 0; j < data[i].length; j++) {
+                                if ((data[i][j] && data[i][j].v) || (data[i][j] && data[i][j].ct && data[i][j].ct.s && data[i][j].ct.s.length > 0 && data[i][j].ct.s[0].v)) {
+                                    return true;
+                                }
+                            }
+                        }else {
+                            return false;
+                        }
+                    }
+                    return false;
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        },
+        // 通用方法用于转化全局
+        paramsArr(start, end) {
+            const arr = [];
+            console.log(start, end);
+            for (let i = Number(start); i <= Number(end); i++) {
+                arr.push(i);
+            }
+            return arr.join(",");
+        },
+        handleFullscreen() {
+            const data = window.luckysheet.getSheet({name:"777e1d91-2075-446f-b163-03c5e0ee0e0c"});
+            const workbook_name = window.luckysheet.getWorkbookName();
+            this.$emit('saveData', workbook_name, data)
+            if (this.fullscreen === false){
+                this.$emit("handleFullscreen", true)
+            }
+            if (this.fullscreen === true){
+                this.$emit("handleFullscreen", false)
+            }
+        },
+        handleFullscreenOption(){
+            const element = document.body;
+            const is_fullscreen =
+                document.fullScreen ||
+                document.mozFullScreen ||
+                document.webkitIsFullScreen;
+            if (!is_fullscreen) {
+                let elementById = document.getElementById("containerClass");
+                elementById.style.height = 'calc(100vh - 100px)';
+                //进入全屏,多重短路表达式
+                (element.requestFullscreen && element.requestFullscreen()) ||
+                (element.mozRequestFullScreen && element.mozRequestFullScreen()) ||
+                (element.webkitRequestFullscreen &&
+                    element.webkitRequestFullscreen()) ||
+                (element.msRequestFullscreen && element.msRequestFullscreen());
+            }else {
+                let elementById = document.getElementById("containerClass");
+                elementById.style.height = 'calc(100vh - 220px)';
+               //退出全屏,三目运算符
+               document.exitFullscreen
+                 ? document.exitFullscreen()
+                 : document.mozCancelFullScreen
+                 ? document.mozCancelFullScreen()
+                 : document.webkitExitFullscreen
+                 ? document.webkitExitFullscreen()
+                 : "";
+            }
+        },
+        handleResave() {
+            const sheet_name = window.luckysheet.getSheet().name;
+            const data = window.luckysheet.getSheet(sheet_name);
+            const workbook_name = window.luckysheet.getWorkbookName();
+            let empty = this.confirmArrayData(data.data);
+            if (!empty){
+                this.$message({
+                    type: "error",
+                    message: '文档内容为空',
+                });
+                return;
+            }
+            if('请输入标题'== workbook_name || !workbook_name){
+                this.$message({
+                    type: "error",
+                    message: '请输入标题',
+                });
+                return;
+            }
+            let value = {
+                // templateId: this.id,
+                templateContent: JSON.stringify(data), //文件内容
+                templateName: workbook_name, //模板名称
+                templateUrl: "", //文件链接
+                state: this.state,
+                mkdirId: this.mkdirId
+            };
+            if("edit" ==this.type){
+                value.id=this.id;
+            }
+            this.$http({
+                url: "/market/workLists/saveOrUpdate",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: value,
+            }).then((res) => {
+                console.log("----res",res);
+                if(res.data.result==0){
+                    this.$message({
+                        type: "success",
+                        message: "保存成功",
+                    });
+                }else{
+                    this.$message({
+                        type: "error",
+                        message: res.data.body,
+                    });
+                }
+                if (this.fullscreen){
+                    this.handleFullscreenOption()
+                    this.$emit("handleFullscreen", false)
+                }
+                this.$emit("save");
+            });
+        },
+    },
+    mounted() {
+        this.handleInit();
+        // this.handleChargeList();
+    },
+    destroyed() {
+        window.luckysheet.destroy();
+    },
+};
+</script>
+
+<style lang="scss" scope>
+.sheet-container {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    &-block {
+        overflow: hidden;
+        position: absolute;
+        width: 100%;
+        height: 85%;
+    }
+    &-require {
+        color: red;
+    }
+    .el-input {
+        width: 200px;
+        margin-right: 10px;
+    }
+}
+.form {
+    &-input {
+        margin-top: 5px;
+        .el-input {
+            width: 150px;
+            .el-input__inner {
+                height: 30px !important;
+                line-height: 30px !important;
+            }
+        }
+    }
+    &-content {
+        margin: 0px 10px;
+    }
+    //&-select {
+    //  .el-input {
+    //    width: 100px;
+    //    .el-input__inner {
+    //      height: 30px !important;
+    //      line-height: 30px !important;
+    //    }
+    //  }
+    //}
+}
+.containerClass{
+    background: #fff;
+    border-radius: 5px;
+    height: calc(100vh - 220px);
+    width: calc(100% - 6px);
+    float: left;
+    display: inline-block;
+    overflow: hidden;
+}
+.sheet-container-block_class{
+    height: calc(100% - 96px);
+    width: 100%;
+}
+.containerClass #luckysheet .luckysheet .fa{
+    font:normal normal normal 14px/1 FontAwesome !important;
+}
+</style>
+<style lang="scss">
+body #luckysheet-modal-dialog-slider-pivot .fa{
+    font:normal normal normal 14px/1 FontAwesome !important;
+}
+</style>

+ 99 - 99
src/pages/main/file/flieList.vue

@@ -134,7 +134,7 @@
               class="btn-check"
               size="medium"
               @click="addFile"
-              :disabled="uploadStatus === false"
+              :disabled="uploadStatus ===false"
             >
               上传附件
             </el-button>
@@ -376,7 +376,7 @@ export default {
   },
   data() {
     return {
-      uploadStatus: true,
+        uploadStatus:true,
       jurisdiction: {}, //权限列表
       isSuper: "", //是否为超级管理员
       loadinged: false,
@@ -477,7 +477,7 @@ export default {
       paramsSearch: {
         isFile: "1",
         id: "",
-        auth: "",
+        auth:''
       },
 
       fileInfo: {
@@ -848,30 +848,28 @@ export default {
       this.formData.id = nodeData.id;
       delete Object["children"];
       this.actionName = nodeData.title;
-      if (
-        this.actionName === "C市场" ||
-        this.actionName === "H市场" ||
-        this.actionName === "N市场+线上" ||
-        this.actionName === "业务综合" ||
-        this.actionName === "渠道"
-      ) {
-        this.isSuper = "2"; //权限
-        this.uploadStatus = false;
-      } else {
-        this.uploadStatus = true;
-        if (this.jurisdiction.isSuper === "1") {
-          this.isSuper = "1";
-        }
+      if(this.actionName ==='C市场' ||this.actionName === 'H市场'||this.actionName ==='N市场+线上' || this.actionName === '业务综合'||this.actionName ==='渠道'){
+          this.isSuper = '2'//权限
+          this.uploadStatus = false;
+      }else{
+          this.uploadStatus = true;
+          if(this.jurisdiction.isSuper === '1'){
+              this.isSuper ='1'
+          }
       }
-      this.subType = "修改";
-      this.params.type = "";
-      this.params.title = "";
-      this.params.collection = "";
-      this.params.catalogId = nodeData.id;
-      this.params.id = nodeData.id;
-      this.infolist.parentId = nodeData.id;
-      this.pageSize = 1; //切换树重置分页
-      this.getList(this.params, this.pageSize);
+        this.subType = "修改";
+        this.params.type = "";
+        this.params.title = "";
+        this.params.collection = "";
+        this.params.catalogId = nodeData.id;
+        this.params.id = nodeData.id;
+        this.infolist.parentId = nodeData.id;
+        this.pageSize = 1; //切换树重置分页
+        // if(this.jurisdiction.isSuper === '1'){
+        //     this.params.auth = '2';
+        // }
+            this.getList(this.params, this.pageSize);
+
     },
     //获取权限
     async getQuan() {
@@ -883,27 +881,23 @@ export default {
         },
         data: {},
       }).then((res) => {
-        if (res.data) {
-          this.isSuper = res.data[0].isSuper || "";
-          this.jurisdiction = res.data[0];
-          if (this.jurisdiction.isSuper === "1") {
-            this.params.auth = "";
-          } else {
+        if(res.data){
+            this.isSuper = res.data[0].isSuper || "";
+            this.jurisdiction = res.data[0];
             switch (this.jurisdiction.roleDuty) {
-              case "二级经理":
-                this.params.auth = 2;
-                this.paramsSearch = 2;
-                break;
-              case "三级经理":
-                this.params.auth = 3;
-                this.paramsSearch.auth = 3;
-                break;
-              case "员工":
-                this.params.auth = 1;
-                this.paramsSearch = 1;
-                break;
+                case "二级经理":
+                    this.params.auth = 2;
+                    this.paramsSearch =2
+                    break;
+                case "三级经理":
+                    this.params.auth = 3;
+                    this.paramsSearch.auth =3
+                    break;
+                case "员工":
+                    this.params.auth = 1;
+                    this.paramsSearch =1
+                    break;
             }
-          }
         }
       });
       await this.getData();
@@ -913,7 +907,7 @@ export default {
       this.actionName = "";
       this.params.id = "";
       this.getList(this.params, this.pageSize);
-      this.$router.go(0);
+      this.$router.go(0)
     },
     // 获取目录
     async getData() {
@@ -926,63 +920,69 @@ export default {
         data: { isFile: "0" },
       }).then((res) => {
         if (res.data && res.data.length > 0) {
-          res.data.map((item) => {
-            if (this.jurisdiction.isSuper === "1") {
-              //全部加入list
-              this.menuList = res.data;
-              console.log(this.menuList);
-            } else {
-              //不是超级管理员
-              if (item.powerSwitch === 0) {
-                //不是固定文件夹
-                this.menuList.push(item);
-              }
-              if (this.jurisdiction.roleType === "省公司") {
-                if (item.powerSwitch === 1) {
-                  //是固定文件夹
-                  if (
-                    this.jurisdiction.roleId === item.id ||
-                    this.jurisdiction.parentId === item.id
-                  ) {
-                    this.menuList.push(item);
-                    if (
-                      this.jurisdiction.roleDuty === "三级经理" ||
-                      this.jurisdiction.roleDuty === "员工"
-                    ) {
-                      //小弟
-                      // this.menuList.push(res.data[i]);
-                      this.menuList.map((item) => {
-                        if (
-                          item.id === this.jurisdiction.roleId ||
-                          this.jurisdiction.parentId === item.id
-                        ) {
-                          item.childDept.map((items) => {
-                            if (items.id === this.jurisdiction.roleId) {
-                              item.childDept = [];
-                              item.childDept.push(items);
+            res.data.map((item) =>{
+                if (this.jurisdiction.isSuper === "1"){//全部加入list
+                    this.menuList = res.data;
+                }else{ //不是超级管理员
+                    if(item.powerSwitch === 0){ //不是固定文件夹
+                        this.menuList.push(item)
+                    }
+                    if(this.jurisdiction.roleType ==='省公司') {
+                            if(item.powerSwitch === 1){ //是固定文件夹
+                                if (
+                                    this.jurisdiction.roleId === item.id ||
+                                    this.jurisdiction.parentId === item.id
+                                ) {
+                                    this.menuList.push(item);
+                                    if (
+                                        this.jurisdiction.roleDuty === "三级经理" ||
+                                        this.jurisdiction.roleDuty === "员工"
+                                    ) {
+                                        //小弟
+                                        // this.menuList.push(res.data[i]);
+                                        this.menuList.map((item) =>{
+                                            if(item.id === this.jurisdiction.roleId ||this.jurisdiction.parentId===item.id){
+                                                item.childDept.map((items) =>{
+                                                    if(items.id === this.jurisdiction.roleId){
+                                                        item.childDept = [];
+                                                        item.childDept.push(items)
+                                                    }
+                                                })
+                                            }
+                                        })
+
+                                    }
+                                }
                             }
-                          });
-                        }
-                      });
+                    }else if(this.jurisdiction.roleType ==='地市公司'){
+
+                        //地市公司权限
+                       if(item.id === '66666666666666666'){
+
+                           this.menuList = []
+                           this.menuList.push((item))
+                       }
                     }
-                  }
+
+
                 }
-              }
+
+
+            })
+            // if (this.jurisdiction.isSuper == "1") {
+            //   this.menuList = res.data;
+            // }else{
+            //     for (let i = 0; i < res.data.length ; i++) {
+            //         if(this.jurisdiction.roleType ==='省公司' && res.data[i].id === '99999999999999999'){
+            //             this.menuList.push(res.data[i])
+            //         }
+            //         else {
+            //
+            //         }
+            //     }
+            // }
             }
-          });
-          // if (this.jurisdiction.isSuper == "1") {
-          //   this.menuList = res.data;
-          // }else{
-          //     for (let i = 0; i < res.data.length ; i++) {
-          //         if(this.jurisdiction.roleType ==='省公司' && res.data[i].id === '99999999999999999'){
-          //             this.menuList.push(res.data[i])
-          //         }
-          //         else {
-          //
-          //         }
-          //     }
-          // }
-        }
+
       });
     },
     // 获取权限

+ 1 - 1
src/pages/main/fileList/fileList.vue

@@ -8,7 +8,7 @@
     >
       <div class="titbox">
         <!-- <h2>部门预算模板管理</h2> -->
-        <h2>在线文档编辑</h2>
+        <h2 class="font-ui">在线文档编辑</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 14 - 11
src/pages/main/fileList/fileListIndex.vue

@@ -96,15 +96,18 @@
 	.el-tabs__content {
 		display: none;
 	}
-	.spanbox{
-		display: block;
-		text-align: center;
-		padding: 10px 0;
-		border-right: 3px solid #f1f1f1;
-		margin-right: 20px;
-	}
-	.bg{
-		border-right: 3px solid #0080FF;
-		color: #007AFF;
-	}
+	.spanbox {
+    display: inline-block;
+    text-align: center;
+    width: 166px;
+    height: 36px;
+    margin: 10px;
+    line-height: 36px;
+    background: #d8eaf6;
+    color: #000;
+  }
+  .bg {
+    color: white;
+    background: #0583cd;
+  }
 </style>

+ 1 - 1
src/pages/main/flow/flowInit.vue

@@ -2,7 +2,7 @@
   <div id="select-dom" style="margin: 15px 0 0 0" v-loading="loading">
     <fullscreen :fullscreen.sync="fullscreen">
       <div class="titbox">
-        <h2>绩效模板</h2>
+        <h2 class="font-ui">绩效模板</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 1 - 1
src/pages/main/form/fromIndex.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <fullscreen :fullscreen.sync="fullscreen" class="container-box">
       <div class="titbox">
-        <h2>表单配置</h2>
+        <h2 class="font-ui">表单配置</h2>
         <div>
           <i class="el-icon-refresh" @click="iconCli(1)"></i>
           <i class="el-icon-full-screen" @click="iconCli(2)"></i>

+ 38 - 25
src/pages/main/fullcalendar/calendar.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <basic-block title="">
+    <!-- <basic-block title=""> -->
       <!--
             <div class="tag-tip">
               <el-tag size="small" color="#f08f00">审核中</el-tag>
@@ -20,13 +20,14 @@
                   </div>
                 </el-col>
                 -->
-        <el-col :span="19">
+        <el-col :span="24">
           <div class="calendar-box">
             <!-- 日历菜单栏 -->
             <full-calendar
               ref="fullCalendar"
               style="height: 100%"
               :options="calendarOptions"
+              id="calendar"
               alt=""
             >
             </full-calendar>
@@ -228,7 +229,7 @@
         </el-form>
       </el-dialog>
       <!--日程新增弹窗end-->
-    </basic-block>
+    <!-- </basic-block> -->
   </div>
 </template>
 
@@ -331,9 +332,9 @@ export default {
         height: 700,
         plugins: [dayGridPlugin, interactionPlugin],
         headerToolbar: {
-          left: "prev,next today",
-          center: "title",
-          right: "dayGridMonth,dayGridWeek,dayGrid",
+          left: "title",
+          center: "",
+          right: "today prev dayGridMonth,dayGridWeek,dayGrid next",
           // right: 'agendaWeek,dayGridWeek,dayGrid'
         },
         buttonText: {
@@ -352,6 +353,7 @@ export default {
         dateClick: this.handleDateClick, //点击日历
         eventClick: this.handleEventClick, //日历日程点击
         eventsSet: this.handleEvents,
+
         select: this.handleDateSelect,
         eventMouseEnter: this.eventmouseover, //鼠标滑过
         eventMouseLeave: this.eventmouseout, //鼠标离开
@@ -473,7 +475,7 @@ export default {
         },
         data: { isFile: "0" },
       }).then((res) => {
-        console.log("res", res);
+        // console.log("res", res);
         if (res.data && res.data.length > 0) {
           this.array = res.data;
           // this.getReservationList(this.array.scheduleList0);
@@ -491,7 +493,7 @@ export default {
         },
         data: { isFile: "0" },
       }).then((res) => {
-        console.log(res);
+        // console.log(res);
         // console.log('res====', typeof res.data)
         // console.log(res.data)
         this.auth = res.data;
@@ -499,7 +501,7 @@ export default {
       });
     },
     getReservationList(arrayData) {
-      console.log(arrayData);
+      // console.log(arrayData);
       let newArr = [];
       this.subList = arrayData;
       // let year = new Date(new Date()).getFullYear();
@@ -587,7 +589,7 @@ export default {
       //   });
       // });
       arrayData.forEach((item) => {
-        console.log("item", item);
+        // console.log("item", item);
         newArr.push({
           newBeginTime: item.begindate.split(" ")[1].substr(0, 5),
           newEndTime: item.enddate.split(" ")[1].substr(0, 5),
@@ -603,7 +605,7 @@ export default {
         });
       });
       this.calendarOptions.events = newArr;
-      console.log(this.calendarOptions.events);
+      // console.log(this.calendarOptions.events);
 
       // debugger
     },
@@ -646,7 +648,7 @@ export default {
       this.form.startTime = this.getHoursMin(beginDate);
       this.form.enddate = this.dealWithTime(endDate);
       this.form.endTime = this.getHoursMin(endDate);
-      console.log(this.form);
+      // console.log(this.form);
       // this.$forceUpdate()
       this.form = { ...this.form };
     },
@@ -700,7 +702,7 @@ export default {
     },
     //鼠标滑过事件
     eventmouseover(calEvent, event) {
-      console.log(123);
+      // console.log(123);
       this.xuanchuang(calEvent, event);
     },
     eventmouseout() {
@@ -728,9 +730,9 @@ export default {
     },
     //悬停窗体删除按钮
     delxuan() {
-        if (!this.auth) {
-            return;
-        }
+      if (!this.auth) {
+        return;
+      }
       this.delStatus = true;
     },
     // 点击日历
@@ -796,10 +798,10 @@ export default {
     //     }
     // },
     handleEvents(events) {
-      console.log(events, "事件3");
+      // console.log(events, "事件3");
     },
     handleDateSelect(selectInfo) {
-      console.log(selectInfo, "限制");
+      // console.log(selectInfo, "限制");
     },
     // 切换上一个按钮
     prev() {
@@ -825,7 +827,7 @@ export default {
           id: this.idx,
         },
       }).then((res) => {
-        console.log(res);
+        // console.log(res);
         location.reload();
       });
     },
@@ -835,7 +837,7 @@ export default {
         if (valid) {
           this.form.begindate = `${this.form.begindate} ${this.form.startTime}`;
           this.form.enddate = `${this.form.enddate} ${this.form.endTime}`;
-          console.log(this.form, "数据");
+          // console.log(this.form, "数据");
           this.dialogVisible = false;
           if (this.form.id === "") {
             this.form === "";
@@ -857,7 +859,7 @@ export default {
               },
               data: this.form,
             }).then((res) => {
-              console.log(res);
+              // console.log(res);
               this.loadinged = false;
               if (res.data.result === 1) {
                 this.$message({
@@ -874,7 +876,7 @@ export default {
             });
           }
         } else {
-          console.log("error submit!!");
+          // console.log("error submit!!");
           return false;
         }
       });
@@ -889,7 +891,7 @@ export default {
       this.$refs["form"].resetFields();
     },
     onStartTime(val) {
-      console.log("val", val);
+      // console.log("val", val);
       this.form.startTime = val;
     },
     //开始时间 option显示/隐藏
@@ -908,7 +910,7 @@ export default {
           return result;
         });
         // 第二次过滤,过滤掉后端返回的数据
-        console.log(this.newfrom);
+        // console.log(this.newfrom);
         this.newfrom.map((_item) => {
           this.timeOptions = this.timeOptions.map((_timeOptionItem) => {
             // debugger
@@ -1030,9 +1032,20 @@ export default {
   border: none !important;
   background-color: #fff !important;
 }
-::v-deep .el-select__tags{
+::v-deep .el-select__tags {
   flex-flow: inherit;
   overflow: hidden;
   flex-wrap: inherit;
 }
+.calendar-box {
+  margin: 10px;
+}
+::v-deep .fc-col-header-cell-cushion {
+  font-size: 18px;
+  line-height: 50px;
+}
+::v-deep .fc .fc-daygrid-day-top {
+  justify-content: center;
+  margin-top: 5px;
+}
 </style>

+ 1 - 0
src/pages/main/homeMarket/magicboxAudit/audit.vue

@@ -190,6 +190,7 @@
                     }
                     this.datalist.attList = res.data.attachList;
                     console.log(this.datalist.attList)
+                    console.log("taskInit-attachList-----taskInit-attachListtaskInit-attachList-----taskInit-attachList")
                     this.infolist = Object.assign({}, res.data);
                     this.infoApply = JSON.parse(this.infolist.params.terminalRes);
                     this.uploadstatus = true;

+ 3 - 1
src/pages/main/homeMarket/magicboxAudit/base.vue

@@ -73,7 +73,8 @@ export default {
     props: {
         woNo:   { required: false,type: String},
         itemId: { required: false,type: String},
-        taskName:{ required: false, type: String}
+        taskName:{ required: false, type: String},
+        datalist:{ required: false, type:Object}
     },
     data(){
         return{
@@ -140,6 +141,7 @@ export default {
                     let xFile = JSON.parse(this.infoApply.attrList);
                     for(var i = 0 ;i<xFile.length ;i++){
                         xFile[i].fileName = xFile[i].name;
+                        xFile[i].id = xFile[i].attchFileId;
                     }
                     this.datalist.attList = xFile;
                     this.uploadstatus =true

+ 9 - 1
src/pages/main/homeMarket/magicboxAudit/dealAudit.vue

@@ -4,7 +4,7 @@
             <div class="container-box">
                 <div class="el-label"><i class="el-icon-collection-tag"></i>基本信息</div>
                 <div class="el-line"></div>
-                <baseTable v-if="woNo" :itemId="itemId" :woNo="woNo" :taskName="taskName"/>
+                <baseTable v-if="woNo" :itemId="itemId" :woNo="woNo" :taskName="taskName" :datalist="datalist"/>
 
                 <div class="el-line"></div>
                 <div class="el-label"><i class="el-icon-collection-tag"></i>审批轨迹</div>
@@ -98,6 +98,11 @@ export default {
     components:{ baseTable ,userDlg},
     data(){
         return{
+            datalist: {
+                    url: '/bpm/api/download',
+                    //url: '/market/compatt/downfile',
+                    type: 1
+                },
             itemId : "",
             taskId:"",
             woNo :"",
@@ -139,6 +144,9 @@ export default {
             }).then((res) => {
                 this.rovaList = res.data.taskList;
                 this.uploadstatus = true;
+                this.datalist.attList = res.data.attachList;
+                console.log(this.datalist.attList)
+                console.log('taskInit-attachList-----taskInit-attachList')
             });
         },
         submitInfo(u, v) {

+ 2 - 0
src/pages/main/homeMarket/magicboxAudit/homeTask.vue

@@ -211,6 +211,8 @@ export default {
     },
     //处理申请
     dialogCheck(n, v) {
+      console.log(n)
+      console.log('rowrowrowrowrowrowrowrowrowrow')
         if (v == 1) {
             this.changeinfo = false;
             let params = { woNo: n.woNo, taskId: n.taskId,taskName:n.taskName}

+ 1 - 1
src/pages/main/homeMarket/magicboxAudit/index.vue

@@ -6,7 +6,7 @@
           <el-row>
             <el-col :span="24">
                 <div class="car-line">
-                    <h2 style="margin-left: 20px;padding-top: 10px;">魔百和大屏广告自有业务承载审批流程</h2>
+                    <h2 class="font-ui" style="margin-left: 20px;padding-top: 10px;">魔百和大屏广告自有业务承载审批流程</h2>
                     <div class="adv-box">
                         <div class="adv-tit" @click="jumpadv('0')">
                             <i class="el-icon-time"></i>

+ 1 - 1
src/pages/main/homeMarket/tvAssess/tvAssessIndex.vue

@@ -6,7 +6,7 @@
                     <el-row>
                         <el-col :span="24">
                             <div class="car-line">
-                                <h2 style="margin-left: 20px;padding-top: 10px;">互联网电视合作考核流程</h2>
+                                <h2 class="font-ui" style="margin-left: 20px;padding-top: 10px;">互联网电视合作考核流程</h2>
                                 <div class="adv-box">
 <!--                                    <div class="adv-tit" >
                                         <i class="el-icon-time"></i>

+ 1 - 1
src/pages/main/homeMarket/tvIntroduction/index.vue

@@ -4,7 +4,7 @@
       <div class="mc-top">
         <div class="mc-top-left">
             <div class="car-line">
-                <h2 style="margin-left: 20px;padding-top: 10px;">互联网电视合作引入流程</h2>
+                <h2 class="font-ui" style="margin-left: 20px;padding-top: 10px;">互联网电视合作引入流程</h2>
                 <div class="adv-box">
                     <div class="adv-tit" @click="jNotice('1')">
                         <i class="el-icon-time"></i>

+ 80 - 0
src/pages/main/incomeExcel/home.vue

@@ -0,0 +1,80 @@
+<template>
+    <div class="inner-container">
+        <div class="tabBox">
+            <el-tabs tab-position="left" v-model="activeName" @tab-click="handleClick">
+                <el-tab-pane v-for="(item, index) in routerList" :key="index" :name="item.path" :label="item.label">
+                </el-tab-pane>
+            </el-tabs>
+        </div>
+        <div class="infoBox">
+            <router-view />
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            activeName: "",
+            showList: [],
+            routerList: [
+                {label: "收入模板管理", path: "/incomeExcelTemplate", name: "incomeExcelTemplate"},
+                {label: "收入信息收集", path: "/incomeExcelIssued", name: "incomeExcelIssued"},
+                {label: "收入信息发布", path: "/incomeExcelView", name: "incomeExcelView"},
+                {label: "收入附件收集", path: "/incomeExcelAppendix", name: "incomeExcelAppendix"}
+            ],
+        };
+    },
+    computed: {
+        menuList: function() {
+            let arr = [];
+            this.routerList.map((item) => {
+                this.showList.map((row) => {
+                    if (item.path == row) {
+                        arr.push(item);
+                    }
+                });
+            });
+            return arr;
+        },
+    },
+    methods: {
+        handleClick(val) {
+            if (this.$route.path != this.activeName) {
+                console.log(this.activeName);
+                this.$router.push(this.activeName);
+            }
+        },
+    },
+    mounted() {
+        this.activeName = this.$route.path;
+    },
+    created() {
+        JSON.parse(sessionStorage.childrenMenus).map((item) => {
+            this.showList.push(item.jspUrl);
+        });
+    },
+    watch: {
+        $route(to, from) {
+            this.activeName = this.$route.path;
+        },
+    },
+};
+</script>
+<style>
+.el-tabs__content {
+    display: none;
+}
+.inner-container{
+    display: flex;
+    justify-content: space-between;
+}
+.tabBox{
+    width: 135px;
+}
+.infoBox{
+    background: #f4f4f4!important;
+    height: 100%;
+    width: calc(100% - 135px)
+}
+</style>

+ 751 - 0
src/pages/main/incomeExcel/incomeExcelAppendix.vue

@@ -0,0 +1,751 @@
+<template>
+    <fullscreen :fullscreen.sync="fullscreen" class="container" style="margin: 0;width: 100%;">
+        <div class="container-box">
+            <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
+            <div style="overflow: hidden;">
+                <div class="search" style="float: left;">
+                    <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
+                </div>
+                <div style="margin-top: 20px;float: right;" class="bigbtns">
+                    <el-button style="margin-left: 20px;" class="btn-check" size="medium" type="primary"
+                               @click="addNew()">新建
+                    </el-button>
+                </div>
+            </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%" v-loading="loading">
+                    <el-table-column prop="appendixName" label="名称" align="center">
+                    </el-table-column>
+                    <el-table-column prop="opTime" label="发起时间" align="center" width="90">
+                    </el-table-column>
+                    <el-table-column prop="deptName" label="发起部门" align="center">
+                    </el-table-column>
+                    <el-table-column prop="userName" label="发起人" align="center">
+                    </el-table-column>
+                    <el-table-column prop="endTime" label="截止时间" align="center">
+                    </el-table-column>
+                    <el-table-column prop="state" label="状态" align="center">
+                        <template slot-scope="scope">
+                            <span v-if="scope.row.state == 0">待办</span>
+                            <span v-if="scope.row.state == 1">已办</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" width="220px" align="center" fixed="right">
+                        <template slot-scope="scope">
+                            <el-button size="mini" @click="openAppendixInfo(scope.row)" v-if="scope.row.type == '1'">
+                                回复详情
+                            </el-button>
+                            <el-button size="mini" @click="processAppendixInfo(scope.row,1)"
+                                       v-if="scope.row.type == '1'">
+                                查看
+                            </el-button>
+                            <el-button size="mini" @click="processAppendixInfo(scope.row,1)"
+                                       v-if="scope.row.type == '2'">
+                                查看
+                            </el-button>
+                            <el-button size="mini" @click="processAppendixInfo(scope.row,2)"
+                                       v-if="scope.row.type == '2' && scope.row.state =='0'">处理
+                            </el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
+                               :total="total">
+                </el-pagination>
+            </div>
+            <el-dialog title="添加" :visible.sync="addDialogStatus" width="40%" :destroy-on-close="true"
+                       :modal-append-to-body="false" :close-on-click-modal="false" :fullscreen="false">
+                <el-form :model="addDialogParam" ref="addInfoList">
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>名称</span>
+                            <el-input v-model="addDialogParam.name" placeholder="名称" v-if="!addDisabled"></el-input>
+                            <label v-else>{{addDialogParam.name}}</label>
+                        </el-form-item>
+                    </div>
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>截止日期</span>
+                            <el-date-picker type="date" placeholder="截止日期" v-model="addDialogParam.endTime"
+                                            :picker-options="pickerOptions" value-format="yyyy-MM-dd"
+                                            v-if="!addDisabled"></el-date-picker>
+                            <label v-else>{{addDialogParam.endTime}}</label>
+                        </el-form-item>
+                    </div>
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>材料说明</span>
+                            <el-input v-model="addDialogParam.remark" placeholder="材料说明"
+                                      v-if="!addDisabled"></el-input>
+                            <label v-else>{{addDialogParam.remark}}</label>
+                        </el-form-item>
+                    </div>
+                    <div class="info-line" v-if="addDialogParam.type == '1'">
+                        <myUpload @uploadBack="uploadBack" :fileInfo="fileInfo"
+                                  :fileList="fileInfo.fileList"></myUpload>
+                    </div>
+                    <div class="info-line" v-if="addDialogParam.type == '2'">
+                        <span>附件材料</span><br/>
+                        <uploadDown :datalist="uploadUserFileList" :dialogStatus="uploadstatus"></uploadDown>
+                    </div>
+                    <div class="info-line" v-if="addDialogParam.type == '2'">
+                        <br/>
+                        <myUpload @uploadBack="uploadBack" :fileInfo="fileInfo"
+                                  :fileList="fileInfo.fileList"></myUpload>
+                    </div>
+                </el-form>
+                <div slot="footer" class="dialog-footer myfooter">
+                    <el-button @click="addDialogStatus = false">取消</el-button>
+                    <el-button @click="checkAddForm()" type="primary" v-if="addDialogParam.type == '1'">确定</el-button>
+                    <el-button @click="processUserAdd()" type="primary" v-if="addDialogParam.type == '2'">确定
+                    </el-button>
+                </div>
+            </el-dialog>
+
+            <el-dialog title="查看" :visible.sync="viewDialogStatus" width="40%" :destroy-on-close="true"
+                       :modal-append-to-body="false" :close-on-click-modal="false" :fullscreen="false">
+                <el-form :model="addDialogParam" ref="addInfoList">
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>名称</span>
+                            {{addDialogParam.name}}
+                        </el-form-item>
+                    </div>
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>截止日期</span>
+                            {{addDialogParam.endTime}}
+                        </el-form-item>
+                    </div>
+                    <div class="info-line">
+                        <el-form-item prop="testInfo">
+                            <span>材料说明</span>
+                            {{addDialogParam.remark}}
+                        </el-form-item>
+                    </div>
+                    <div class="info-line">
+                        <span>附件材料</span><br/>
+                        <uploadDown :datalist="uploadUserFileList" :dialogStatus="uploadstatus"></uploadDown>
+                    </div>
+                    <div class="info-line" v-if="this.userFileList.attList.length > 0">
+                        <br/>
+                        <span>回复附件</span><br/>
+                        <uploadDown :datalist="userFileList" :dialogStatus="uploadstatus"></uploadDown>
+                    </div>
+                </el-form>
+                <div slot="footer" class="dialog-footer myfooter">
+                    <el-button @click="viewDialogStatus = false">关闭</el-button>
+                </div>
+            </el-dialog>
+
+            <el-dialog title="选择接收人" :visible.sync="appendixUserDialog" width="50%" :destroy-on-close="true"
+                       :modal-append-to-body="false" :close-on-click-modal="false">
+                <div>
+                    <el-form :model="exaList" ref="addInfoList">
+                        <el-form-item prop="processUserId" class="info-line online">
+                            <span style="width: 80px;">接收人</span>
+                            <deptTreeUserNew class="tree" @treeCheck="treeCheckonly" :defaultList="defaultList"
+                                             :type="depttype" :closeList="closeList"></deptTreeUserNew>
+                            <div class="tree treeUser">
+                                <p v-for="(item,index) in treeList" :key="index">{{ item.receiveName }}
+                                    <i @click="deletes(item,index)" class="el-icon-error"></i>
+                                </p>
+                            </div>
+                            <el-form-item style="margin-bottom:0;display:none;">
+                                <el-input></el-input>
+                            </el-form-item>
+                        </el-form-item>
+                    </el-form>
+
+                    <div slot="footer" style="text-align: right;padding-bottom: 20px">
+                        <el-button @click="appendixUserDialog = false">取 消</el-button>
+                        <el-button type="primary" @click="checkUserList()">确 定</el-button>
+                    </div>
+                </div>
+            </el-dialog>
+
+            <el-dialog title="回复详情" :visible.sync="appendixInfoStatus" width="70%" :close-on-press-escape="false"
+                       :show-close="true" :before-close="closeAppendixInfo" :destroy-on-close="true"
+                       :modal-append-to-body="false"
+                       :close-on-click-modal="false" :fullscreen="true">
+                <div class="tabbox" style="height: 500px">
+                    <el-table height="calc(100% - 50px)" class="com-table" ref="multipleTable"
+                              :data="appindixInfoData"
+                              tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading">
+                        <el-table-column
+                            type="index"
+                            width="50">
+                        </el-table-column>
+                        <el-table-column prop="deptName" label="回复部门">
+                        </el-table-column>
+                        <el-table-column prop="userName" label="回复人">
+                        </el-table-column>
+                        <el-table-column prop="state" label="回复情况">
+                            <template slot-scope="scope">
+                                <span v-if="scope.row.state == 0">未回复</span>
+                                <span v-if="scope.row.state == 1">已回复</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="isOverTime" label="是否超时">
+                            <template slot-scope="scope">
+                                <span v-if="scope.row.isOverTime == 0">否</span>
+                                <span v-if="scope.row.isOverTime == 1">是</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="回复内容">
+                            <template slot-scope="scope">
+                                <div v-for="item in scope.row.filesList">
+                                    <span style="color: #0b82ff;cursor: pointer"
+                                          @click="downAppendixFile(item.id,item.fileName)">{{
+                                            item.fileName
+                                        }}&nbsp;</span>
+                                </div>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                    <el-pagination class="pageBox" @current-change="appendixInfoChange"
+                                   layout="prev, pager, next" background
+                                   :total="appendixInfoTotal">
+                    </el-pagination>
+                </div>
+                <div class="dialog-footer myfooter">
+                    <el-button @click="exportZip()" type="primary">导出</el-button>
+                    <el-button @click="appendixInfoStatus = false">关闭</el-button>
+                </div>
+            </el-dialog>
+        </div>
+    </fullscreen>
+</template>
+<script>
+import mySearch from "../../../components/search.vue";
+import myUpload from "../../../components/upload";
+import toolList from "../../../components/toolList";
+import myMessageNew from "../../../components/myMessageNew.vue"
+import uploadDown from '../../../components/uploadDown'
+import deptTreeUserNew from "../../../components/deptTreeUserNew";
+
+export default {
+    components: {
+        myUpload,
+        mySearch,
+        toolList,
+        myMessageNew,
+        uploadDown,
+        deptTreeUserNew
+    },
+    data() {
+        return {
+            tableData: [{}],
+            total: 0,
+            appendixInfoTotal: 0,
+            params: {},
+            deleteTag: '',
+            centerDialogVisible: false,
+            loading: false,
+            issuedAddStatus: false,
+            addDialogParam: {},
+            tooltit: '收入附件收集',
+            searchList: [{
+                type: 'input',
+                tit: '名称',
+                value: '',
+                width: '100%',
+            },],
+            pickerOptions: {
+                disabledDate(time) {
+                    return time.getTime() < Date.now();
+                }
+            },
+            fullscreen: false,
+            addDialogStatus: false,
+            fileInfo: {
+                limit: 350,
+                url: '/market/cIncomeExcelAppendix/upload',
+                fileList: []
+            },
+            attList: [],
+            //选择审批人
+            checkexa: false,
+            //审批人用到的
+            treeListonly: {},
+            exaList: {},
+            defaultList: [],
+            treeList: [],
+            closeList: false,
+            depttype: 0,
+            appendixUserDialog: false,
+            viewDialogStatus: false,
+            //提交人下载文件库
+            uploadUserFileList: {
+                url: '/market/cIncomeExcelAppendix/downFile',
+                type: 1,
+                attList: []
+            },
+            //发起人下载文件框
+            userFileList: {
+                url: '/market/cIncomeExcelAppendix/downFile',
+                type: 1,
+                attList: []
+            },
+            uploadStatus: false,
+            addDisabled: false,
+            nowUserId: '',
+            //回复详情
+            appendixInfoStatus: false,
+            appindixInfoData: [{}],
+            appendixInfoPageSize: 1,
+            pageSize: 1,
+            appendixInfoParams: {},
+        }
+    },
+    methods: {
+        closeAppendixInfo() {
+            this.appendixInfoStatus = false;
+        },
+        openAppendixInfo(row) {
+            console.log(row);
+            this.appendixInfoParams = {
+                excelId: row.appendixId,
+                name: row.appendixName
+            }
+            this.appendixInfoPageSize = 1;
+            this.getAppendixInfoPage(this.appendixInfoParams, this.appendixInfoPageSize);
+            this.appendixInfoStatus = true;
+        },
+        processUserAdd() {
+            var _this = this;
+            if (this.attList.length == 0) {
+                this.$message({
+                    message: '请上传附件',
+                    type: 'error'
+                });
+                return;
+            }
+            //执行下发
+            this.$http({
+                url: '/market/cIncomeExcelAppendix/uploadUserAppendix',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    appendixUserId: this.nowUserId,
+                    fileList: _this.attList
+                },
+            }).then((res) => {
+                this.loading = false;
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '添加成功',
+                        type: 'success'
+                    });
+                    this.addDialogStatus = false;
+                    this.getList({}, 1);
+                }
+            });
+        },
+        processAppendixInfo(row, type) {
+            this.addDialogParam = {
+                type: '2'
+            };
+            this.attList = [];
+            this.uploadUserFileList.attList = [];
+            this.userFileList.attList = [];
+            var _this = this;
+            //执行下发
+            this.$http({
+                url: '/market/cIncomeExcelAppendix/queryAppendixInfo',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    excelId: row.id
+                },
+            }).then((res) => {
+                this.loading = false;
+                var d = res.data.body;
+                console.log(d);
+                this.addDialogParam = {
+                    type: '2',
+                    name: d.appendix.name,
+                    remark: d.appendix.remark,
+                    endTime: d.appendix.endTime
+                }
+                this.uploadUserFileList.attList = d.fileList[0];
+                this.userFileList.attList = d.fileList[1];
+                if (type == 1) {
+                    this.viewDialogStatus = true;
+                } else if (type == 2) {
+                    this.addDialogStatus = true;
+                    this.addDisabled = true;
+                    this.nowUserId = row.id;
+                }
+            });
+        },
+        checkAddForm() {
+            if (!this.addDialogParam.name) {
+                this.$message({
+                    message: '名称不能为空',
+                    type: 'error'
+                });
+                return;
+            }
+            if (!this.addDialogParam.remark) {
+                this.$message({
+                    message: '材料说明不能为空',
+                    type: 'error'
+                });
+                return;
+            }
+            if (!this.addDialogParam.endTime) {
+                this.$message({
+                    message: '截止日期不能为空',
+                    type: 'error'
+                });
+                return;
+            }
+            if (this.addDialogParam.name.length > 240) {
+                this.$message({
+                    message: '名称长度不能大于240字',
+                    type: 'error'
+                });
+                return;
+            }
+            if (this.addDialogParam.remark.length > 300) {
+                this.$message({
+                    message: '材料说明长度不能大于300字',
+                    type: 'error'
+                });
+                return;
+            }
+            if (this.attList.length == 0) {
+                this.$message({
+                    message: '请上传附件',
+                    type: 'error'
+                });
+                return;
+            }
+            this.appendixUserDialog = true;
+        },
+        checkUserList() {
+            if (this.treeList.length == 0) {
+                this.$message({
+                    message: '请选择接收人',
+                    type: 'error'
+                });
+            } else {
+                this.processAddNew();
+            }
+        },
+        addNew() {
+            this.addDialogParam = {
+                type: '1'
+            };
+            this.addDisabled = false;
+            this.addDialogStatus = true;
+        },
+        processAddNew() {
+            var _this = this;
+            var userList = [];
+            this.treeList.map((o) => {
+                userList.push({
+                    userId: o.receiveNo
+                });
+            });
+            //执行下发
+            this.$http({
+                url: '/market/cIncomeExcelAppendix/addNewAppendix',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    appendix: this.addDialogParam,
+                    userList: userList,
+                    fileList: _this.attList
+                },
+            }).then((res) => {
+                this.loading = false;
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '添加成功',
+                        type: 'success'
+                    });
+                    this.addDialogStatus = false;
+                    this.appendixUserDialog = false;
+                    this.getList({}, 1);
+                }
+            });
+        },
+        //文件返回值
+        uploadBack(v) {
+            this.attList = v;
+        },
+        //搜索数据
+        searchInfo(v) {
+            this.params = {};
+            v[0] ? this.params.name = v[0] : '';
+            this.getList(this.params, this.pageSize);
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList(this.params, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen
+            }
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList(this.params, this.pageSize);
+        },
+        appendixInfoChange(v) {
+            this.appendixInfoPageSize = v;
+            this.getAppendixInfoPage(this.appendixInfoParams, this.appendixInfoPageSize);
+        },
+        getList(v, n) {
+            this.pageSize = n;
+            this.loading = true;
+            this.tableData = [];
+            let _this = this;
+            this.$http({
+                url: "/market/cIncomeExcelAppendix/queryAppendixList",
+                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;
+                this.loading = false;
+            });
+        },
+        getAppendixInfoPage(v, n) {
+            this.appendixInfoPageSize = n;
+            this.loading = true;
+            this.appindixInfoData = [];
+            this.$http({
+                url: "/market/cIncomeExcelAppendix/queryAppendixUserList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    "page": '{"pageNo":"' + n + '","pageSize":"10"}'
+                },
+                data: v,
+            }).then((res) => {
+                this.appindixInfoData = res.data.data;
+                this.appendixInfoTotal = res.data.totalRecord;
+                this.loading = false;
+            });
+        },
+        //填报人相关
+        deletes(val, index) {
+            this.treeList.splice(index, 1);
+            this.closeList = this.treeList;
+        },
+        treeCheckonly(v) {
+            this.treeList = v;
+            this.treeListonly = v;
+        },
+        treeDelete() {
+            this.treeListonly = {};
+            this.closeList = !this.closeList;
+        },
+        downAppendixFile(fileId, fileName) {
+            this.$http({
+                url: "/market/cIncomeExcelAppendix/downFile",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                responseType: "blob",
+                data: {"id": fileId, "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);
+                }
+            });
+        },
+        exportZip() {
+            let _this = this;
+            _this.$http({
+                url: '/market/cIncomeExcelAppendix/downloadAppendixZip',
+                method: "post",
+                responseType: 'blob',
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    excelId: this.appendixInfoParams.excelId
+                },
+            }).then(res => {
+                if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                    let blob = new Blob([res.data], {
+                        type: "application/x-msdownload"
+                    });
+                    window.navigator.msSaveOrOpenBlob(
+                        blob,
+                        // this.wo.bizName + ".xlsx"
+                        this.appendixInfoParams.name + ".zip"
+                    );
+                } else {
+                    /* 火狐谷歌的文件下载方式 */
+                    var blob = new Blob([res.data]);
+                    var downloadElement = document.createElement("a");
+                    var href = window.URL.createObjectURL(blob);
+                    downloadElement.href = href;
+                    downloadElement.download = this.appendixInfoParams.name + ".zip";
+                    document.body.appendChild(downloadElement);
+                    downloadElement.click();
+                    document.body.removeChild(downloadElement);
+                    window.URL.revokeObjectURL(href);
+                }
+            });
+        }
+    },
+    mounted() {
+        this.getList({}, 1);
+    },
+    created() {
+
+    }
+}
+</script>
+<style scoped lang="scss">
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.tabbox {
+    margin-top: 16px;
+}
+
+.pageBox {
+    text-align: right;
+    margin-top: 10px;
+}
+
+.info-line {
+    width: 100%;
+    display: block;
+    padding-left: 20px;
+
+    div {
+        width: 90%;
+        display: inline-block;
+    }
+
+    span {
+        width: 100px;
+        display: inline-block;
+        text-align: left;
+
+        i {
+            color: red;
+            display: inline-block;
+            padding-right: 5px;
+        }
+    }
+
+    .el-select,
+    .el-input {
+        width: calc(100% - 150px);
+    }
+}
+
+.online {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 100px);
+    }
+
+    span {
+        vertical-align: top;
+    }
+
+    .el-textarea {
+        width: calc(100% - 100px);
+    }
+
+    .tree {
+        width: calc(50% - 60px);
+        display: inline-block;
+        margin-right: 20px;
+        height: 300px;
+        overflow-y: scroll;
+
+        .el-icon-error {
+            float: right;
+            font-size: 20px;
+            margin-top: 9px;
+            cursor: pointer;
+        }
+    }
+
+    .treeUser {
+        margin: 0;
+        border: 1px solid #ddd;
+
+        p {
+            background: #f4f4f4;
+            padding: 0 20px;
+            margin-bottom: 5px;
+        }
+    }
+
+    .treeUserb {
+        width: calc(100% - 100px);
+        border: 1px solid #ddd;
+        background: #f4f4f4;
+        border-radius: 3px;
+        height: auto;
+        overflow: hidden;
+
+        p {
+            display: inline-block;
+            padding: 0 20px;
+            margin-bottom: 5px;
+        }
+    }
+}
+</style>
+

+ 0 - 0
src/pages/main/incomeExcel/incomeExcelInfo.vue


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff