Просмотр исходного кода

Merge branch 'master' into test

syr 3 лет назад
Родитель
Сommit
56a13b717a

+ 1 - 0
package.json

@@ -22,6 +22,7 @@
     "jquery-ui": "^1.12.1",
     "js-audio-recorder": "^1.0.7",
     "jsplumb": "^2.15.5",
+    "luckyexcel": "^1.0.1",
     "moment": "^2.29.1",
     "qs": "^6.9.1",
     "tinymce": "^5.7.1",

+ 7 - 0
public/index.html

@@ -8,6 +8,13 @@
   <link rel="icon" href="<%= BASE_URL %>favicon.ico">
   <title>业务服务工作台</title>
   <script src="static/js/crypoto-js.js"></script>
+  
+  <script src="/static/js/luckysheet/plugins/js/plugin.js"></script>
+  <script src="/static/js/luckysheet/luckysheet.umd.js"></script>
+  <link rel='stylesheet' href='/static/js/luckysheet/plugins/css/pluginsCss.css' />
+  <link rel='stylesheet' href='/static/js/luckysheet/plugins/plugins.css' />
+  <link rel='stylesheet' href='/static/js/luckysheet/css/luckysheet.css' />
+  <link rel='stylesheet' href='/static/js/luckysheet/assets/iconfont/iconfont.css' />
 </head>
 
 <body>

+ 1 - 0
src/App.vue

@@ -17,6 +17,7 @@ export default {
 </script>
 <style lang="scss">
 @import "assets/style";
+@import "assets/simple";
 * {
   padding: 0;
   margin: 0;

+ 843 - 0
src/assets/simple.scss

@@ -0,0 +1,843 @@
+// simple
+.el {
+    &-dialog.is-fullscreen {
+        border-radius: 0;
+    }
+}
+.simple {
+    &-container {
+        overflow: auto;
+        padding: 20px;
+        .el {
+            &-form {
+                &-item {
+                    display: flex;
+                    margin: 0;
+                    padding: 0;
+                    .el-select,
+                    .el-input {
+                        width: 100%;
+                    }
+                    &__label {
+                        white-space: nowrap;
+                    }
+                    &__content {
+                        flex: 1;
+                    }
+                }
+            }
+            &-col {
+                padding-bottom: 20px;
+            }
+            &-textarea__inner {
+                min-height: 100px !important;
+            }
+        }
+    }
+    &-title {
+        padding-bottom: 20px;
+        font-size: 20px;
+        font-weight: bold;
+    }
+    &-table {
+        font-size: 12px;
+        border: 1px solid #dddddd;
+        border-bottom: none;
+        &-click {
+            color: #409eff;
+        }
+        &-break {
+            white-space: break-spaces;
+        }
+    }
+    &-pagination {
+        padding-top: 20px;
+        display: flex;
+        justify-content: flex-end;
+    }
+    &-drawer {
+        &-container {
+            padding: 20px;
+        }
+        &-footer {
+            display: flex;
+            width: 100%;
+            justify-content: flex-end;
+            padding: 20px;
+            border-top: 1px solid #dddddd;
+            position: absolute;
+            bottom: 0;
+        }
+    }
+}
+// padding
+.padding {
+    &-top {
+        &-5 {
+            padding-top: 5px;
+        }
+        &-10 {
+            padding-top: 10px;
+        }
+        &-15 {
+            padding-top: 15px;
+        }
+        &-20 {
+            padding-top: 20px;
+        }
+        &-25 {
+            padding-top: 25px;
+        }
+        &-30 {
+            padding-top: 30px;
+        }
+        &-35 {
+            padding-top: 35px;
+        }
+        &-40 {
+            padding-top: 40px;
+        }
+        &-45 {
+            padding-top: 45px;
+        }
+        &-50 {
+            padding-top: 50px;
+        }
+        &-55 {
+            padding-top: 55px;
+        }
+        &-60 {
+            padding-top: 60px;
+        }
+        &-65 {
+            padding-top: 65px;
+        }
+        &-70 {
+            padding-top: 70px;
+        }
+        &-75 {
+            padding-top: 75px;
+        }
+        &-80 {
+            padding-top: 80px;
+        }
+        &-85 {
+            padding-top: 85px;
+        }
+        &-90 {
+            padding-top: 90px;
+        }
+        &-95 {
+            padding-top: 95px;
+        }
+        &-100 {
+            padding-top: 100px;
+        }
+    }
+    &-bottom {
+        &-5 {
+            padding-bottom: 5px;
+        }
+        &-10 {
+            padding-bottom: 10px;
+        }
+        &-15 {
+            padding-bottom: 15px;
+        }
+        &-20 {
+            padding-bottom: 20px;
+        }
+        &-25 {
+            padding-bottom: 25px;
+        }
+        &-30 {
+            padding-bottom: 30px;
+        }
+        &-35 {
+            padding-bottom: 35px;
+        }
+        &-40 {
+            padding-bottom: 40px;
+        }
+        &-45 {
+            padding-bottom: 45px;
+        }
+        &-50 {
+            padding-bottom: 50px;
+        }
+        &-55 {
+            padding-bottom: 55px;
+        }
+        &-60 {
+            padding-bottom: 60px;
+        }
+        &-65 {
+            padding-bottom: 65px;
+        }
+        &-70 {
+            padding-bottom: 70px;
+        }
+        &-75 {
+            padding-bottom: 75px;
+        }
+        &-80 {
+            padding-bottom: 80px;
+        }
+        &-85 {
+            padding-bottom: 85px;
+        }
+        &-90 {
+            padding-bottom: 90px;
+        }
+        &-95 {
+            padding-bottom: 95px;
+        }
+        &-100 {
+            padding-bottom: 100px;
+        }
+    }
+    &-left {
+        &-5 {
+            padding-left: 5px;
+        }
+        &-10 {
+            padding-left: 10px;
+        }
+        &-15 {
+            padding-left: 15px;
+        }
+        &-20 {
+            padding-left: 20px;
+        }
+        &-25 {
+            padding-left: 25px;
+        }
+        &-30 {
+            padding-left: 30px;
+        }
+        &-35 {
+            padding-left: 35px;
+        }
+        &-40 {
+            padding-left: 40px;
+        }
+        &-45 {
+            padding-left: 45px;
+        }
+        &-50 {
+            padding-left: 50px;
+        }
+        &-55 {
+            padding-left: 55px;
+        }
+        &-60 {
+            padding-left: 60px;
+        }
+        &-65 {
+            padding-left: 65px;
+        }
+        &-70 {
+            padding-left: 70px;
+        }
+        &-75 {
+            padding-left: 75px;
+        }
+        &-80 {
+            padding-left: 80px;
+        }
+        &-85 {
+            padding-left: 85px;
+        }
+        &-90 {
+            padding-left: 90px;
+        }
+        &-95 {
+            padding-left: 95px;
+        }
+        &-100 {
+            padding-left: 100px;
+        }
+    }
+    &-right {
+        &-5 {
+            padding-right: 5px;
+        }
+        &-10 {
+            padding-right: 10px;
+        }
+        &-15 {
+            padding-right: 15px;
+        }
+        &-20 {
+            padding-right: 20px;
+        }
+        &-25 {
+            padding-right: 25px;
+        }
+        &-30 {
+            padding-right: 30px;
+        }
+        &-35 {
+            padding-right: 35px;
+        }
+        &-40 {
+            padding-right: 40px;
+        }
+        &-45 {
+            padding-right: 45px;
+        }
+        &-50 {
+            padding-right: 50px;
+        }
+        &-55 {
+            padding-right: 55px;
+        }
+        &-60 {
+            padding-right: 60px;
+        }
+        &-65 {
+            padding-right: 65px;
+        }
+        &-70 {
+            padding-right: 70px;
+        }
+        &-75 {
+            padding-right: 75px;
+        }
+        &-80 {
+            padding-right: 80px;
+        }
+        &-85 {
+            padding-right: 85px;
+        }
+        &-90 {
+            padding-right: 90px;
+        }
+        &-95 {
+            padding-right: 95px;
+        }
+        &-100 {
+            padding-right: 100px;
+        }
+    }
+}
+// margin
+.margin {
+    &-top {
+        &-5 {
+            margin-top: 5px;
+        }
+        &-10 {
+            margin-top: 10px;
+        }
+        &-15 {
+            margin-top: 15px;
+        }
+        &-20 {
+            margin-top: 20px;
+        }
+        &-25 {
+            margin-top: 25px;
+        }
+        &-30 {
+            margin-top: 30px;
+        }
+        &-35 {
+            margin-top: 35px;
+        }
+        &-40 {
+            margin-top: 40px;
+        }
+        &-45 {
+            margin-top: 45px;
+        }
+        &-50 {
+            margin-top: 50px;
+        }
+        &-55 {
+            margin-top: 55px;
+        }
+        &-60 {
+            margin-top: 60px;
+        }
+        &-65 {
+            margin-top: 65px;
+        }
+        &-70 {
+            margin-top: 70px;
+        }
+        &-75 {
+            margin-top: 75px;
+        }
+        &-80 {
+            margin-top: 80px;
+        }
+        &-95 {
+            margin-top: 95px;
+        }
+        &-100 {
+            margin-top: 100px;
+        }
+    }
+    &-bottom {
+        &-5 {
+            margin-bottom: 5px;
+        }
+        &-10 {
+            margin-bottom: 10px;
+        }
+        &-15 {
+            margin-bottom: 15px;
+        }
+        &-20 {
+            margin-bottom: 20px;
+        }
+        &-25 {
+            margin-bottom: 25px;
+        }
+        &-30 {
+            margin-bottom: 30px;
+        }
+        &-35 {
+            margin-bottom: 35px;
+        }
+        &-40 {
+            margin-bottom: 40px;
+        }
+        &-45 {
+            margin-bottom: 45px;
+        }
+        &-50 {
+            margin-bottom: 50px;
+        }
+        &-55 {
+            margin-bottom: 55px;
+        }
+        &-60 {
+            margin-bottom: 60px;
+        }
+        &-65 {
+            margin-bottom: 65px;
+        }
+        &-70 {
+            margin-bottom: 70px;
+        }
+        &-75 {
+            margin-bottom: 75px;
+        }
+        &-80 {
+            margin-bottom: 80px;
+        }
+        &-85 {
+            margin-bottom: 85px;
+        }
+        &-90 {
+            margin-bottom: 90px;
+        }
+        &-95 {
+            margin-bottom: 95px;
+        }
+        &-100 {
+            margin-bottom: 100px;
+        }
+    }
+    &-left {
+        &-5 {
+            margin-left: 5px;
+        }
+        &-10 {
+            margin-left: 10px;
+        }
+        &-15 {
+            margin-left: 15px;
+        }
+        &-20 {
+            margin-left: 20px;
+        }
+        &-25 {
+            margin-left: 25px;
+        }
+        &-30 {
+            margin-left: 30px;
+        }
+        &-35 {
+            margin-left: 35px;
+        }
+        &-40 {
+            margin-left: 40px;
+        }
+        &-45 {
+            margin-left: 45px;
+        }
+        &-50 {
+            margin-left: 50px;
+        }
+        &-55 {
+            margin-left: 55px;
+        }
+        &-60 {
+            margin-left: 60px;
+        }
+        &-65 {
+            margin-left: 65px;
+        }
+        &-70 {
+            margin-left: 70px;
+        }
+        &-75 {
+            margin-left: 75px;
+        }
+        &-80 {
+            margin-left: 80px;
+        }
+        &-85 {
+            margin-left: 85px;
+        }
+        &-90 {
+            margin-left: 90px;
+        }
+        &-95 {
+            margin-left: 95px;
+        }
+        &-100 {
+            margin-left: 100px;
+        }
+    }
+    &-right {
+        &-5 {
+            margin-right: 5px;
+        }
+        &-10 {
+            margin-right: 10px;
+        }
+        &-15 {
+            margin-right: 15px;
+        }
+        &-20 {
+            margin-right: 20px;
+        }
+        &-25 {
+            margin-right: 25px;
+        }
+        &-30 {
+            margin-right: 30px;
+        }
+        &-35 {
+            margin-right: 35px;
+        }
+        &-40 {
+            margin-right: 40px;
+        }
+        &-45 {
+            margin-right: 45px;
+        }
+        &-50 {
+            margin-right: 50px;
+        }
+        &-55 {
+            margin-right: 55px;
+        }
+        &-60 {
+            margin-right: 60px;
+        }
+        &-65 {
+            margin-right: 65px;
+        }
+        &-70 {
+            margin-right: 70px;
+        }
+        &-75 {
+            margin-right: 75px;
+        }
+        &-80 {
+            margin-right: 80px;
+        }
+        &-85 {
+            margin-right: 85px;
+        }
+        &-90 {
+            margin-right: 90px;
+        }
+        &-95 {
+            margin-right: 95px;
+        }
+        &-100 {
+            margin-right: 100px;
+        }
+    }
+}
+// text
+.text {
+    &-align {
+        &-center {
+            text-align: center;
+        }
+        &-right {
+            text-align: right;
+        }
+        &-left {
+            text-align: left;
+        }
+    }
+    &-line-through {
+        text-decoration-line: line-through;
+    }
+    &-underline {
+        text-decoration: underline;
+    }
+}
+// font
+.font {
+    &-weight {
+        &-normal {
+            font-weight: normal;
+        }
+        &-bold {
+            font-weight: bold;
+        }
+    }
+    &-size {
+        &-12 {
+            font-size: 12px;
+        }
+        &-14 {
+            font-size: 14px;
+        }
+        &-16 {
+            font-size: 16px;
+        }
+        &-18 {
+            font-size: 18px;
+        }
+        &-20 {
+            font-size: 20px;
+        }
+        &-22 {
+            font-size: 22px;
+        }
+        &-24 {
+            font-size: 24px;
+        }
+        &-26 {
+            font-size: 26px;
+        }
+        &-28 {
+            font-size: 28px;
+        }
+        &-30 {
+            font-size: 30px;
+        }
+        &-32 {
+            font-size: 32px;
+        }
+        &-34 {
+            font-size: 34px;
+        }
+        &-36 {
+            font-size: 36px;
+        }
+        &-38 {
+            font-size: 38px;
+        }
+        &-40 {
+            font-size: 40px;
+        }
+        &-42 {
+            font-size: 42px;
+        }
+        &-44 {
+            font-size: 44px;
+        }
+        &-46 {
+            font-size: 46px;
+        }
+        &-48 {
+            font-size: 48px;
+        }
+        &-50 {
+            font-size: 50px;
+        }
+    }
+}
+// flex
+.flex {
+    display: flex;
+    &-1 {
+        flex: 1;
+    }
+    &-auto {
+        @extend .flex;
+        flex: auto;
+    }
+    &-wrap {
+        @extend .flex;
+        flex-wrap: wrap;
+    }
+    &-column {
+        @extend .flex;
+        flex-direction: column;
+    }
+    &-justify {
+        &-start {
+            @extend .flex;
+            justify-content: flex-start;
+        }
+        &-end {
+            @extend .flex;
+            justify-content: flex-end;
+        }
+        &-center {
+            @extend .flex;
+            justify-content: center;
+        }
+        &-between {
+            @extend .flex;
+            justify-content: space-between;
+        }
+        &-align {
+            &-start {
+                @extend .flex;
+                justify-content: flex-start;
+                align-items: center;
+            }
+            &-end {
+                @extend .flex;
+                justify-content: flex-end;
+                align-items: center;
+            }
+            &-center {
+                @extend .flex;
+                justify-content: center;
+                align-items: center;
+            }
+            &-between {
+                @extend .flex;
+                justify-content: space-between;
+                align-items: center;
+            }
+            &-around {
+                @extend .flex;
+                justify-content: space-around;
+                align-items: center;
+            }
+        }
+    }
+}
+// color
+.color {
+    &-ffffff {
+        color: #ffffff;
+    }
+    &-7f7f7f {
+        color: #7f7f7f;
+    }
+    &-10afd1 {
+        color: #10afd1;
+    }
+    &-141414 {
+        color: #141414;
+    }
+    &-414141 {
+        color: #414141;
+    }
+    &-576b95 {
+        color: #576b95;
+    }
+    &-b5b5b5 {
+        color: #b5b5b5;
+    }
+    &-6388E3 {
+        color: #6388e3;
+    }
+}
+// background
+.background {
+    &-fbfbfb {
+        background: #fbfbfb;
+    }
+    &-f3f3f3 {
+        background: #f3f3f3;
+    }
+    &-10afd1 {
+        background: #10afd1;
+    }
+    &-f1f1f3 {
+        background: #f1f1f3;
+    }
+    &-efefef {
+        background: #efefef;
+    }
+}
+// position
+.position {
+    &-relative {
+        position: relative;
+    }
+}
+// overflow
+.overflow {
+    &-hidden {
+        overflow: hidden;
+    }
+}
+// display
+.display {
+    &-block {
+        display: block;
+    }
+    &-inline {
+        display: inline;
+    }
+    &-inline-block {
+        display: inline-block;
+    }
+}
+// cursor
+.cursor {
+    &-pointer {
+        cursor: pointer;
+    }
+}
+// white-space
+.white {
+    &-space {
+        &-nowrap {
+            white-space: nowrap;
+        }
+    }
+}
+// vertical-align
+.vertical-align {
+    &-top {
+        vertical-align: top;
+    }
+    &-middle {
+        vertical-align: middle;
+    }
+    &-bottom {
+        vertical-align: bottom;
+    }
+}
+// line-clamp
+.line-clamp {
+    display: -webkit-box;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    -webkit-box-orient: vertical;
+    &-1 {
+        @extend .line-clamp;
+        -webkit-line-clamp: 1;
+    }
+    &-2 {
+        @extend .line-clamp;
+        -webkit-line-clamp: 2;
+    }
+    &-3 {
+        @extend .line-clamp;
+        -webkit-line-clamp: 3;
+    }
+    &-4 {
+        @extend .line-clamp;
+        -webkit-line-clamp: 4;
+    }
+}

+ 1 - 1
src/components/p-menu.vue

@@ -148,7 +148,7 @@
 			height: 100%;
 			max-height: 100%;
 
-			/deep/ .el-card__body {
+			::v-deep .el-card__body {
 				padding: 0px;
 			}
 		}

+ 3 - 3
src/pages/login/login.vue

@@ -479,17 +479,17 @@
 					}
 
 					.remenber {
-						/deep/.el-form-item__content {
+						::v-deep.el-form-item__content {
 							line-height: 14px;
 						}
 					}
 
 					.checkbox {
-						/deep/.el-checkbox__inner {
+						::v-deep.el-checkbox__inner {
 							border-radius: 50%;
 						}
 
-						/deep/.el-checkbox__label {
+						::v-deep.el-checkbox__label {
 							padding-left: 5px;
 						}
 					}

+ 3 - 3
src/pages/main/advertising/acceptance.vue

@@ -628,12 +628,12 @@ a {
         margin-right: 40px;
     }
 }
-/deep/.online .el-form-item__content {
+::v-deep.online .el-form-item__content {
     width: 100%;
     margin-left: 0 !important;
 }
 
-/deep/.el-upload {
+::v-deep.el-upload {
     width: 100% !important;
     padding: 0 !important;
 }
@@ -680,7 +680,7 @@ a {
         margin-bottom: 5px;
     }
 }
-/deep/.container .el-upload-dragger {
+::v-deep.container .el-upload-dragger {
     height: 120px !important;
 }
 .upload-demo {

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

@@ -1556,12 +1556,12 @@ export default {
         margin-right: 40px;
     }
 }
-/deep/.online .el-form-item__content {
+::v-deep.online .el-form-item__content {
     width: 98%;
     margin-left: 0 !important;
 }
 
-/deep/.el-upload {
+::v-deep.el-upload {
     width: 98% !important;
     padding: 0 !important;
 }

Разница между файлами не показана из-за своего большого размера
+ 1456 - 0
src/pages/main/infotech/index.vue


Разница между файлами не показана из-за своего большого размера
+ 1456 - 0
src/pages/main/infotech/index1.vue


+ 40 - 17
src/pages/main/leader/processInitiation.vue

@@ -36,7 +36,8 @@
 				boxHeight: {
 					height: "auto",
 				},
-                outsideModules: [],
+        outsideModules: [],
+          groupName:"",
 			};
 		},
 		methods: {
@@ -52,6 +53,7 @@
 				}).then((res) => {
 					this.funcData = res.data.lineList;
 					this.outsideModules = res.data.outsideModules;
+          this.groupName = res.data.groupName;
 				});
 			},
 			hAuto() {
@@ -65,24 +67,45 @@
 			},
 			jumpTo(v) {
 				if (v.moduleUrl) {
-				    //加入外部人员权限控制start
-                    if (this.outsideModules.length > 0) {
-                        let moduleIndex = -1;
-                        for (let i = 0; i < this.outsideModules.length; i++) {
-                            if(this.outsideModules[i].moduleUrl == v.moduleUrl){
-                                moduleIndex = i;
-                                break;
-                            }
-                        }
-                        if (moduleIndex < 0) {
-                            global.$vm.$notify.error({
-                                title: "提示",
-                                message: "暂无使用权限",
-                            });
-                            return;
+            if(this.groupName == 'default'){
+                //加入外部人员权限控制start
+                if (this.outsideModules.length > 0) {
+                    let moduleIndex = -1;
+                    for (let i = 0; i < this.outsideModules.length; i++) {
+                        if(this.outsideModules[i].moduleUrl == v.moduleUrl){
+                            moduleIndex = i;
+                            break;
                         }
                     }
-                    //加入外部人员权限控制end
+                    if (moduleIndex < 0) {
+                        global.$vm.$notify.error({
+                            title: "提示",
+                            message: "暂无使用权限",
+                        });
+                        return;
+                    }
+                }
+                //加入外部人员权限控制end
+            }else{
+                let childrenMenus = JSON.parse(window.sessionStorage.childrenMenus);
+                if(childrenMenus != undefined && childrenMenus.length > 0){
+                    let moduleIndex = -1;
+                    for(let a =0;a<childrenMenus.length; a++){
+                      if(childrenMenus[a].jspUrl == v.moduleUrl){
+                          moduleIndex = a;
+                          break;
+                      }
+                    }
+                    if (moduleIndex < 0) {
+                        global.$vm.$notify.error({
+                            title: "提示",
+                            message: "暂无使用权限",
+                        });
+                        return;
+                    }
+                }
+            }
+
 
 					this.$router.push({
 						path: v.moduleUrl,

+ 163 - 0
src/pages/main/performance/analysis.vue

@@ -0,0 +1,163 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-12-03 15:18:11
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2021-12-07 16:02:13
+ * @FilePath     : \spfm-market-front\src\pages\main\performance\analysis.vue
+-->
+<template>
+    <div class="simple-container">
+        <simple-table
+            :list="table_list"
+            :config="table_config"
+            :loading="table_loading"
+            @delete="handleDelete"
+            @modify="handleModify"
+            @check="handleCheck"
+            @edit="handleEdit"
+        ></simple-table>
+    </div>
+</template>
+
+<script>
+import simpleTable from "./components/table.vue";
+export default {
+    props: {
+        edit: {
+            type: Boolean,
+            default: false,
+        },
+    },
+    components: {
+        simpleTable,
+    },
+    data() {
+        return {
+            table_list: [],
+            table_loading: false,
+            table_config: [
+                {
+                    label: "序号",
+                    props: "index",
+                    width: 50,
+                },
+                {
+                    label: "指标名称",
+                    props: "subject",
+                },
+                // {
+                //     label: "来源",
+                //     props: "origin",
+                //     width: 100,
+                // },
+
+                {
+                    label: "工作内容",
+                    props: "content",
+                    width: 300,
+                    type: "textarea",
+                    align: "left",
+                },
+                {
+                    label: "负责人",
+                    props: "leader",
+                },
+
+                // {
+                //     label: "完成标志及计分方法(需体现出完成时间)",
+                //     props: "mark",
+                //     width: 500,
+                //     type: "textarea",
+                //     align: "left",
+                // },
+                // {
+                //     label: "分值",
+                //     width: 50,
+                //     props: "score",
+                // },
+
+                {
+                    label: "本月绩效自评",
+                    props: "personal_month",
+                    width: 300,
+                    children: [
+                        {
+                            label: "完成情况",
+                            props: "personal_month_status",
+                        },
+                        {
+                            label: "完成情况自评",
+                            props: "personal_month_self",
+                        },
+                        // {
+                        //     label: "工作内容",
+                        //     props: "personal_month_content",
+                        // },
+                    ],
+                },
+                {
+                    label: "下月绩效计划",
+                    props: "next_month",
+                    children: [
+                        {
+                            label: "工作内容",
+                            props: "next_month_content",
+                        },
+                        {
+                            label: "计分方法",
+                            props: "next_month_method",
+                        },
+                        {
+                            label: "分值",
+                            width: 50,
+                            props: "score",
+                        },
+                    ],
+                },
+            ],
+        };
+    },
+    watch: {
+        edit() {
+            this.handleInit();
+        },
+    },
+    methods: {
+        handleInit() {
+            this.table_list = JSON.parse(
+                sessionStorage.global_data
+            )[0].template_excel;
+            this.table_config.forEach((element) => {
+                if (["personal_month", "next_month"].includes(element.props)) {
+                    element.children.forEach((element) => {
+                        element.type = this.edit ? "edit" : "";
+                    });
+                }
+            });
+        },
+        handleEdit() {},
+        handleCheck() {},
+        handleDelete() {},
+        handleModify(params) {
+            const object = JSON.parse(sessionStorage.global_data)[0];
+            sessionStorage.setItem(
+                "global_data",
+                JSON.stringify([
+                    {
+                        ...object,
+                        template_excel: params,
+                    },
+                ])
+            );
+            // this.table_list = JSON.parse(
+            //     sessionStorage.global_data
+            // )[0].template_excel;
+        },
+    },
+    mounted() {
+        this.handleInit();
+    },
+};
+</script>
+
+<style></style>

+ 65 - 0
src/pages/main/performance/components/dialog.vue

@@ -0,0 +1,65 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="visible"
+    :fullscreen="fullscreen"
+    :key="reload"
+    :before-close="handleCancel"
+    :modal-append-to-body="false"
+    :width="width"
+  >
+    <!-- 表格主体部分 -->
+    <slot></slot>
+    <!-- 表格底部 -->
+    <div slot="footer">
+      <slot name="footer">
+        <el-button @click="handleCancel" size="small">取消</el-button>
+        <el-button @click="handleConfirm" type="primary" size="small"
+          >确定</el-button
+        >
+      </slot>
+    </div>
+  </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,
+    },
+  },
+  mounted() {
+    console.log("我被初始化了");
+  },
+  methods: {
+    //   确定的回调
+    handleConfirm() {
+      this.$emit("confirm", false);
+    },
+    //   取消的回调
+    handleCancel() {
+      this.$emit("cancel", false);
+    },
+  },
+};
+</script>
+
+<style></style>

+ 94 - 0
src/pages/main/performance/components/form.vue

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

+ 38 - 0
src/pages/main/performance/components/pagination.vue

@@ -0,0 +1,38 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-11-01 18:11:59
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2021-11-02 14:27:11
+ * @FilePath     : \spfm-front\src\pages\main\dataConfig\components\pagination.vue
+-->
+<template>
+    <el-pagination
+        class="simple-pagination"
+        @current-change="handleChange"
+        layout="prev, pager, next"
+        background
+        :current-page="page"
+        :total="total"
+    >
+    </el-pagination>
+</template>
+<script>
+export default {
+    props: {
+        page: {
+            type: Number,
+            default: 0
+        },
+        total: {
+            type: Number,
+            default: 0
+        }
+    },
+    data: () => ({}),
+    methods: {
+        handleChange(page) {
+            this.$emit("change", page);
+        }
+    }
+};
+</script>

+ 88 - 0
src/pages/main/performance/components/sheet.vue

@@ -0,0 +1,88 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-12-04 14:23:58
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2021-12-13 16:15:11
+ * @FilePath     : \spfm-market-front\src\pages\main\performance\components\sheet.vue
+-->
+
+<template>
+    <div class="sheet-container">
+        <div class="flex-justify-align-end margin-bottom-20">
+            <el-upload
+                class="margin-right-10"
+                action
+                :on-change="handleChange"
+                :show-file-list="false"
+            >
+                <el-button type="primary">上传</el-button>
+            </el-upload>
+            <el-button type="primary">保存</el-button>
+            <el-button type="primary">导出</el-button>
+            <el-button type="primary">返回</el-button>
+            <el-button type="primary">全屏显示</el-button>
+        </div>
+        <div id="luckysheet" class="sheet-container-block"></div>
+    </div>
+</template>
+
+<script>
+import luckyexcel from "luckyexcel";
+export default {
+    data() {
+        return {};
+    },
+    methods: {
+        handleInit() {
+            this.handleCreate();
+        },
+        async handleCreate(file) {
+            let that = this;
+            const options = {
+                container: "luckysheet",
+                lang: "zh",
+                showsheetbar: false,
+                hook: {
+                    cellUpdateBefore: function (row, column) {
+                        console.log(row, column);
+                        that.$message.error("您没有编辑权限");
+                        return false;
+                    },
+                },
+            };
+            if (file) {
+                await new Promise((resolve) => {
+                    luckyexcel.transformExcelToLucky(file, (export_json) => {
+                        options.data = export_json.sheets;
+                        options.title = export_json.info.name;
+                        options.userInfo = export_json.info.name.creator;
+                        resolve();
+                    });
+                });
+            }
+
+            window.luckysheet.create(options);
+        },
+        async handleChange(response) {
+            this.handleCreate(response.raw);
+        },
+    },
+    mounted() {
+        this.handleInit();
+    },
+};
+</script>
+
+<style lang="scss" scope>
+.sheet-container {
+    position: fixed;
+    width: calc(100% - 40px);
+    height: 100%;
+    &-block {
+        overflow: hidden;
+        position: absolute;
+        width: 100%;
+        height: 75%;
+    }
+}
+</style>

+ 158 - 0
src/pages/main/performance/components/table.vue

@@ -0,0 +1,158 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-11-01 18:02:58
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2021-12-06 19:51:14
+ * @FilePath     : \spfm-market-front\src\pages\main\performance\components\table.vue
+-->
+<template>
+    <el-table class="simple-table" :data="computed_list" v-loading="loading">
+        <el-table-column
+            v-for="(
+                { props, label, type, width, align, children }, index
+            ) in config"
+            :key="index"
+            :prop="props"
+            :width="width"
+            :label="label"
+            :align="align || 'center'"
+        >
+            <template #default="scope">
+                <div v-if="type === 'edit'">
+                    <el-input
+                        v-if="scope.row[`edit`]"
+                        v-model="scope.row[props]"
+                        autosize
+                        type="textarea"
+                        @change="handleModify"
+                    />
+                </div>
+                <div v-else-if="type === 'textarea'">
+                    <pre class="simple-table-break">{{ scope.row[props] }}</pre>
+                </div>
+                <div v-else-if="type === 'date'">
+                    <div>{{ $formatDate(scope.row[props], "YYYY-MM-DD") }}</div>
+                </div>
+                <div v-else-if="type === 'click'">
+                    <div
+                        class="simple-table-click cursor-pointer"
+                        @click="handleClick(props, scope.row)"
+                    >
+                        {{ scope.row[props] }}
+                    </div>
+                </div>
+                <div v-else>{{ scope.row[props] }}</div>
+            </template>
+            <template v-if="children">
+                <el-table-column
+                    v-for="(
+                        { props, label, width, align, type }, index
+                    ) in children"
+                    :key="index"
+                    :prop="props"
+                    :width="width"
+                    :label="label"
+                    :align="align || 'center'"
+                >
+                    <template #default="scope">
+                        <div v-if="type === 'edit'">
+                            <el-input
+                                v-model="scope.row[props]"
+                                @change="handleModify"
+                                autosize
+                                type="textarea"
+                            />
+                        </div>
+                        <div v-else>{{ scope.row[props] }}</div>
+                    </template>
+                </el-table-column>
+            </template>
+        </el-table-column>
+        <el-table-column
+            v-if="handleRow.length"
+            label="操作"
+            :width="handleRow.length * 50"
+        >
+            <template slot-scope="scope">
+                <span
+                    v-for="(
+                        { label, props, popconfirm, visible }, index
+                    ) in handleRow"
+                    :key="index"
+                    class="padding-right-5"
+                >
+                    <span v-if="handleFormat(visible, scope.row)">
+                        <el-popconfirm
+                            v-if="popconfirm"
+                            :title="`确定要${label}吗?`"
+                            @confirm="handleClick(props, scope.row)"
+                        >
+                            <el-button
+                                slot="reference"
+                                type="text"
+                                size="small"
+                                >{{ label }}</el-button
+                            >
+                        </el-popconfirm>
+                        <el-button
+                            v-else
+                            @click="handleClick(props, scope.row)"
+                            type="text"
+                            size="small"
+                            >{{ label }}</el-button
+                        >
+                    </span>
+                </span>
+            </template>
+        </el-table-column>
+    </el-table>
+</template>
+<script>
+export default {
+    props: {
+        list: {
+            type: Array,
+            default: () => [],
+        },
+        config: {
+            type: Array,
+            default: () => [],
+        },
+        loading: {
+            type: Boolean,
+            default: false,
+        },
+        handleRow: {
+            type: Array,
+            default: () => [],
+        },
+    },
+    computed: {
+        computed_list() {
+            return this.list.map((element) => ({
+                ...element,
+            }));
+        },
+    },
+    methods: {
+        handleFormat(params, data) {
+            let visible = true;
+            if (params) {
+                visible = false;
+                Object.keys(params).forEach((element) => {
+                    if (params[element].includes(data[element])) {
+                        visible = true;
+                    }
+                });
+            }
+            return visible;
+        },
+        handleClick(props, row) {
+            this.$emit(props, row);
+        },
+        handleModify() {
+            this.$emit("modify", this.computed_list);
+        },
+    },
+};
+</script>

+ 436 - 0
src/pages/main/performance/department.vue

@@ -0,0 +1,436 @@
+<template>
+    <div>
+        <div class="simple-container">
+            <simple-form :form="table_form" @search="handleSearch">
+                <!-- :handle="table_handle"
+      @add="handleRulesVisible"
+      @class="handleDrawer('class')"
+      @download="handleDownload" -->
+            </simple-form>
+            <simple-table
+                :list="table_list"
+                :config="table_config"
+                :loading="table_loading"
+                :handle-row="table_handle_row"
+                @check="handleCheck"
+                @edit="handleEdit"
+            ></simple-table>
+            <simple-pagination
+                :page="page"
+                :total="total"
+                @change="handleChange"
+            ></simple-pagination>
+        </div>
+        <simple-dialog
+            fullscreen
+            title="部门绩效"
+            :visible="visible"
+            :reload="reload"
+            width="1200px"
+            @cancel="handleCancel('visible')"
+        >
+            <template>
+                <!-- 按钮部分 -->
+                <div
+                    class="flex-justify-between padding-right-20 padding-left-20"
+                >
+                    <div>
+                        <template v-if="edit_visible">
+                            <el-button
+                                type="primary"
+                                v-if="edit_form.department_status === '待处理'"
+                                @click="handleTransfer"
+                                >转派</el-button
+                            >
+                            <el-button
+                                type="primary"
+                                v-if="edit_form.department_status === '待处理'"
+                                @click="handleSubmit"
+                                >提交</el-button
+                            >
+                            <el-button
+                                type="primary"
+                                v-if="edit_form.department_status === '待审批'"
+                                @click="handleApprove"
+                                >审批</el-button
+                            >
+                        </template>
+                        <el-button type="primary" @click="handleTrack"
+                            >流程跟踪</el-button
+                        >
+                        <el-button type="primary">导出</el-button>
+                    </div>
+                    <div>
+                        <el-button
+                            @click="handleCancel('visible')"
+                            type="primary"
+                            >返回</el-button
+                        >
+                    </div>
+                </div>
+                <!-- 主体部分 -->
+                <analysis
+                    :edit="
+                        edit_form.department_status === '待处理' && edit_visible
+                    "
+                />
+            </template>
+            <template v-slot:footer><div></div></template>
+        </simple-dialog>
+        <simple-dialog
+            title="审批"
+            :visible="approve_visible"
+            :reload="reload"
+            width="500px"
+            props="approve_visible"
+            @cancel="handleCancel('approve_visible')"
+        >
+            <el-form :model="approveForm" ref="approveForm"
+                ><el-form-item
+                    label="审批意见"
+                    prop="comments"
+                    label-width="80px"
+                    ><el-input
+                        type="textarea"
+                        v-model="approveForm.comments"
+                        autosize /></el-form-item
+            ></el-form>
+            <template v-slot:footer
+                ><div>
+                    <div v-if="type === '1'">
+                        <el-button @click="handleCancel('approve_visible')"
+                            >结束</el-button
+                        >
+                        <el-button @click="handleTurn(type)" type="primary"
+                            >转副总审批</el-button
+                        >
+                    </div>
+                    <div v-else-if="type === '2'">
+                        <el-button @click="handleCancel('approve_visible')"
+                            >结束</el-button
+                        >
+                        <el-button @click="handleCancel('approve_visible')"
+                            >打回</el-button
+                        >
+                        <el-button @click="handleTurn(type)" type="primary"
+                            >转总经理审批</el-button
+                        >
+                    </div>
+                    <div v-else>
+                        <el-button @click="handleBack">打回</el-button>
+                        <el-button @click="handleAgree" type="primary"
+                            >同意</el-button
+                        >
+                    </div>
+                </div>
+            </template>
+        </simple-dialog>
+        <simple-dialog
+            title="流程跟踪"
+            :visible="track_visible"
+            :reload="reload"
+            width="600px"
+            props="track_visible"
+            @confirm="handleConfirm"
+            @cancel="handleCancel('track_visible')"
+        >
+            <el-table :data="trackList" border>
+                <el-table-column
+                    prop="link"
+                    label="流程环节"
+                    align="center"
+                    width="180"
+                >
+                </el-table-column>
+                <el-table-column
+                    prop="creatperson"
+                    label="处理人"
+                    align="center"
+                    width="180"
+                >
+                </el-table-column>
+                <el-table-column prop="explain" label="审批说明" align="center">
+                </el-table-column>
+            </el-table>
+        </simple-dialog>
+    </div>
+</template>
+
+<script>
+import simpleForm from "./components/form.vue";
+import simpleTable from "./components/table.vue";
+import simplePagination from "./components/pagination.vue";
+import simpleDialog from "./components/dialog.vue";
+import analysis from "./analysis.vue";
+export default {
+    components: {
+        simpleForm,
+        simpleTable,
+        simplePagination,
+        simpleDialog,
+        analysis,
+    },
+    data() {
+        return {
+            page: 1,
+            total: 5,
+            //   dialog 参数
+            visible: false,
+            edit_visible: false,
+            approve_visible: false,
+            track_visible: false,
+            edit_form: {},
+            reload: 0,
+            // 判断类型
+            type: "3",
+            approverules: {
+                comments: [
+                    {
+                        required: true,
+                        message: "请输入审批意见",
+                        trigger: "blur",
+                    },
+                ],
+            },
+            // 审批意见
+            approveForm: { comments: "" },
+            trackList: [],
+            //   顶部form
+            table_form: [
+                {
+                    label: "绩效分类",
+                    props: "department",
+                    type: "select",
+                    dictionary: [
+                        {
+                            label: "GS",
+                            value: "1",
+                        },
+                        {
+                            label: "KPI",
+                            value: "2",
+                        },
+                    ],
+                },
+                {
+                    label: "下发月份",
+                    props: "month",
+                    type: "month",
+                },
+                {
+                    label: "状态",
+                    props: "service",
+                    type: "select",
+                    dictionary: [
+                        {
+                            label: "待处理",
+                            value: "1",
+                        },
+                        {
+                            label: "待汇总",
+                            value: "2",
+                        },
+                        {
+                            label: "待审批",
+                            value: "3",
+                        },
+                        {
+                            label: "已完成",
+                            value: "4",
+                        },
+                    ],
+                },
+            ],
+            //   列表数据
+            table_list: [],
+            table_loading: false,
+            //   表格里的操作按钮
+            table_handle_row: [
+                {
+                    label: "查看",
+                    props: "check",
+                },
+                {
+                    label: "处理",
+                    props: "edit",
+                    visible: {
+                        department_status: ["待处理", "待审批"],
+                    },
+                },
+            ],
+            //  表头配置
+            table_config: [
+                {
+                    label: "绩效分类",
+                    props: "performance_type",
+                },
+                {
+                    label: "模板名称",
+                    props: "template_name",
+                },
+                {
+                    label: "填报事由",
+                    props: "reason",
+                },
+                {
+                    label: "填报注意事项",
+                    props: "note",
+                },
+                {
+                    label: "截止时间",
+                    props: "date",
+                    type: "date",
+                },
+                {
+                    label: "发起人",
+                    props: "template_number",
+                },
+                {
+                    label: "状态",
+                    props: "department_status",
+                },
+            ],
+        };
+    },
+    mounted() {
+        this.handleInit();
+    },
+    methods: {
+        //   初始化
+        handleInit() {
+            this.trackList = JSON.parse(sessionStorage.global_process);
+            this.table_list = JSON.parse(sessionStorage.global_data).filter(
+                (element) => element.issue_status
+            );
+        },
+        handleChange(page) {
+            this.page = page;
+            this.handleInit();
+        },
+        // 搜索事件
+        handleSearch(data) {
+            console.log(data);
+        },
+        // 编辑按钮
+        handleEdit(row) {
+            console.log(row, "row");
+            this.visible = true;
+            this.edit_visible = true;
+            this.edit_form = row;
+        },
+        handleCheck(row) {
+            console.log(row, "row");
+            this.visible = true;
+            this.edit_visible = false;
+        },
+        handleDelete() {},
+        // dialog事件
+        //权限管理事件
+        handleApprove() {
+            this.approve_visible = true;
+        },
+        handleTrack() {
+            this.track_visible = true;
+        },
+        handleTransfer() {
+            const object = {
+                ...JSON.parse(sessionStorage.global_data)[0],
+                department_status: "待审批",
+            };
+            sessionStorage.setItem("global_data", JSON.stringify([object]));
+            const process_array = JSON.parse(sessionStorage.global_process);
+            process_array.push({
+                link: "转派工单",
+                creatperson: `ADMIN ${this.$formatDate(
+                    new Date(),
+                    "YYYY-MM-DD"
+                )}`,
+                explain: "",
+            });
+            sessionStorage.setItem(
+                "global_process",
+                JSON.stringify(process_array)
+            );
+            this.handleInit();
+            this.handleCancel("visible");
+            this.$message.success("转派成功");
+        },
+        handleTurn(type) {
+            this.handleCancel("approve_visible");
+            console.log(type);
+        },
+        handleConfirm(visible) {
+            console.log(visible);
+            this.track_visible = visible;
+        },
+        // 关闭方法
+        handleCancel(data) {
+            switch (data) {
+                case "visible":
+                    this.visible = false;
+                    break;
+                case "approve_visible":
+                    this.approveForm.comments = "";
+                    this.approve_visible = false;
+                    break;
+                case "track_visible":
+                    this.track_visible = false;
+                    break;
+            }
+        },
+        handleBack() {
+            const object = {
+                ...JSON.parse(sessionStorage.global_data)[0],
+                department_status: "待处理",
+            };
+            sessionStorage.setItem("global_data", JSON.stringify([object]));
+            const process_array = JSON.parse(sessionStorage.global_process);
+            process_array.push({
+                link: "审批驳回",
+                creatperson: `ADMIN ${this.$formatDate(
+                    new Date(),
+                    "YYYY-MM-DD"
+                )}`,
+                explain: this.approveForm.comments,
+            });
+            sessionStorage.setItem(
+                "global_process",
+                JSON.stringify(process_array)
+            );
+            this.handleInit();
+            this.$message.success("打回成功");
+            this.handleCancel("visible");
+            this.handleCancel("approve_visible");
+        },
+        handleAgree() {
+            const object = {
+                ...JSON.parse(sessionStorage.global_data)[0],
+                department_status: "已完成",
+            };
+            sessionStorage.setItem("global_data", JSON.stringify([object]));
+            const process_array = JSON.parse(sessionStorage.global_process);
+            process_array.push({
+                link: "审批通过",
+                creatperson: `ADMIN ${this.$formatDate(
+                    new Date(),
+                    "YYYY-MM-DD"
+                )}`,
+                explain: this.approveForm.comments,
+            });
+            sessionStorage.setItem(
+                "global_process",
+                JSON.stringify(process_array)
+            );
+            this.handleInit();
+            this.$message.success("审批成功");
+            this.handleCancel("visible");
+            this.handleCancel("approve_visible");
+        },
+        handleSubmit() {
+            this.$message.success("提交成功");
+        },
+    },
+};
+</script>
+
+<style></style>

Разница между файлами не показана из-за своего большого размера
+ 212 - 0
src/pages/main/performance/index.vue


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

@@ -0,0 +1,287 @@
+<template>
+    <div>
+        <div class="simple-container">
+            <simple-form
+                :form="table_form"
+                @search="handleSearch"
+            ></simple-form>
+            <simple-table
+                :list="table_list"
+                :config="table_config"
+                :loading="table_loading"
+                :handle-row="table_handle_row"
+                @receiver="handleVisible('receiver')"
+                @detail="handleVisible('template')"
+                @delete="handleDelete"
+                @edit="handleVisible('template')"
+            ></simple-table>
+            <simple-pagination
+                :page="page"
+                :total="total"
+                @change="handleChange"
+            ></simple-pagination>
+        </div>
+        <simple-dialog
+            title="查看"
+            fullscreen
+            @cancel="handleVisible('template')"
+            @confirm="handleVisible('template')"
+            :visible="template_visible"
+            ><div
+                class="flex-justify-align-end padding-right-20 padding-left-20"
+            >
+                <div>
+                    <el-button type="primary">导出</el-button>
+                    <el-button @click="handleVisible('template')" type="primary"
+                        >返回</el-button
+                    >
+                </div>
+            </div>
+            <analysis />
+            <template v-slot:footer><div></div></template>
+        </simple-dialog>
+        <simple-dialog
+            title="回复详情"
+            @cancel="handleVisible('receiver')"
+            @confirm="handleVisible('receiver')"
+            :visible="receiver_visible"
+        >
+            <simple-table
+                :list="receiver_table_list"
+                :config="receiver_table_config"
+                :loading="receiver_table_loading"
+                @receiver="handleVisible('receiver')"
+            ></simple-table>
+        </simple-dialog>
+    </div>
+</template>
+
+<script>
+import analysis from "./analysis.vue";
+import simpleForm from "./components/form.vue";
+import simpleTable from "./components/table.vue";
+import simpleDialog from "./components/dialog.vue";
+import simplePagination from "./components/pagination.vue";
+export default {
+    components: {
+        analysis,
+        simpleTable,
+        simpleDialog,
+        simpleForm,
+        simplePagination,
+    },
+    data() {
+        return {
+            page: 1,
+            rows: 10,
+            total: 0,
+            template_visible: false,
+            receiver_visible: false,
+            table_loading: false,
+            receiver_table_loading: false,
+            table_search: {},
+            table_form: [
+                {
+                    label: "模板名称",
+                    props: "template_name",
+                    type: "select",
+                    dictionary: [
+                        {
+                            label: "GS",
+                            value: "GS",
+                        },
+                        {
+                            label: "KPI",
+                            value: "KPI",
+                        },
+                    ],
+                },
+                {
+                    label: "截止日期",
+                    props: "date",
+                    type: "date",
+                },
+            ],
+            table_list: [],
+            table_handle_row: [
+                {
+                    label: "查看",
+                    props: "detail",
+                },
+                // {
+                //     label: "修改",
+                //     props: "edit",
+                // },
+                {
+                    label: "撤回",
+                    props: "delete",
+                    popconfirm: true,
+                },
+            ],
+            table_config: [
+                {
+                    label: "绩效类型",
+                    props: "performance_type",
+                },
+                {
+                    label: "模板名称",
+                    props: "template_name",
+                },
+                {
+                    label: "填报事由",
+                    props: "reason",
+                },
+                {
+                    label: "填报注意事项",
+                    props: "note",
+                },
+                {
+                    label: "截止时间",
+                    props: "date",
+                    type: "date",
+                },
+                {
+                    label: "接收人",
+                    props: "receiver",
+                    type: "click",
+                },
+            ],
+            receiver_table_list: [
+                {
+                    receiver: "刘洁",
+                    department: "科室1",
+                    date: "",
+                },
+                {
+                    receiver: "李方岩",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "吴磊",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "孙震",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "赵洪松",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "孙川",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "韦琳娜",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "吴磊",
+                    department: "科室2",
+                    date: "",
+                },
+                {
+                    receiver: "刘洁",
+                    department: "科室1",
+                    date: "",
+                },
+                {
+                    receiver: "刘洁",
+                    department: "科室1",
+                    date: "",
+                },
+            ],
+            receiver_table_config: [
+                {
+                    label: "接收人",
+                    props: "receiver",
+                },
+                {
+                    label: "科室",
+                    props: "department",
+                },
+                {
+                    label: "回复时间",
+                    props: "date",
+                },
+            ],
+        };
+    },
+    methods: {
+        async handleInit() {
+            this.table_loading = true;
+            const data = [];
+            let index = 0;
+            while (index < 1) {
+                data.push(
+                    ...JSON.parse(sessionStorage.getItem("global_data")).filter(
+                        (element) => element.issue_status
+                    )
+                );
+                index = index + 1;
+            }
+            this.total = index;
+            this.table_list = data;
+            this.table_loading = false;
+        },
+        handleSearch({ template_name }) {
+            this.table_search = { template_name };
+            this.handleReset();
+            this.handleInit();
+        },
+        handleChange(page) {
+            this.page = page;
+            this.handleInit();
+        },
+        handleVisible(props) {
+            switch (props) {
+                case "template":
+                    this.template_visible = !this.template_visible;
+                    break;
+                case "receiver":
+                    this.receiver_visible = !this.receiver_visible;
+                    break;
+            }
+        },
+        handleReset() {
+            this.page = 1;
+        },
+        handleDelete() {
+            const array = [
+                {
+                    ...JSON.parse(sessionStorage.global_data)[0],
+                    issue_status: 0,
+                },
+            ];
+            sessionStorage.setItem("global_data", JSON.stringify(array));
+            const process_array = JSON.parse(sessionStorage.global_process);
+            process_array.push({
+                link: "撤回工单",
+                creatperson: `ADMIN ${this.$formatDate(
+                    new Date(),
+                    "YYYY-MM-DD"
+                )}`,
+                explain: "",
+            });
+            sessionStorage.setItem(
+                "global_process",
+                JSON.stringify(process_array)
+            );
+            this.$message.success("撤回成功");
+            this.handleInit();
+        },
+    },
+    mounted() {
+        this.handleInit();
+    },
+};
+</script>
+
+<style></style>

+ 351 - 0
src/pages/main/performance/mould.vue

@@ -0,0 +1,351 @@
+<template>
+    <div>
+        <div class="simple-container">
+            <simple-form
+                :form="table_form"
+                :handle="table_handle"
+                @search="handleSearch"
+                @add="handleVisible('add')"
+            ></simple-form>
+            <simple-table
+                :list="table_list"
+                :config="table_config"
+                :loading="table_loading"
+                :handle-row="table_handle_row"
+                @issue="handleVisible('issue')"
+                @detail="handleVisible('template')"
+                @delete="handleDelete"
+            ></simple-table>
+            <simple-pagination
+                :page="page"
+                :total="total"
+                @change="handleChange"
+            ></simple-pagination>
+        </div>
+        <simple-dialog
+            title="查看模板"
+            fullscreen
+            @cancel="handleVisible('template')"
+            @confirm="handleVisible('template')"
+            :visible="template_visible"
+        >
+            <div class="flex-justify-between padding-right-20 padding-left-20">
+                <div>
+                    <el-button type="primary" @click="handleVisible('power')"
+                        >权限设置</el-button
+                    ><el-button type="primary">导出</el-button>
+                </div>
+                <div>
+                    <el-button @click="handleVisible('template')" type="primary"
+                        >返回</el-button
+                    >
+                </div>
+            </div>
+            <analysis />
+            <template v-slot:footer><div></div></template>
+        </simple-dialog>
+        <simple-dialog
+            title="下发"
+            width="500px"
+            @cancel="handleVisible('issue')"
+            @confirm="handleIssue"
+            :visible="issue_visible"
+        >
+            <el-form label-width="100px" :model="form">
+                <el-form-item label="填报事由">
+                    <el-input v-model="form.reason"></el-input>
+                </el-form-item>
+                <el-form-item label="填报注意事项">
+                    <el-input v-model="form.note"></el-input>
+                </el-form-item>
+                <el-form-item label="截止时间">
+                    <el-date-picker v-model="form.date" type="date">
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item label="">
+                    <el-upload
+                        drag
+                        action="https://jsonplaceholder.typicode.com/posts/"
+                        multiple
+                    >
+                        <i class="el-icon-upload"></i>
+                        <div>上传附件</div>
+                    </el-upload>
+                </el-form-item>
+            </el-form>
+        </simple-dialog>
+        <simple-dialog
+            fullscreen
+            title="新增模板"
+            :visible="add_visible"
+            :reload="reload"
+            width="1200px"
+            @confirm="handleVisible('add')"
+            @cancel="handleVisible('add')"
+        >
+            <el-form inline :model="form" label-width="100px">
+                <el-form-item label="绩效类型">
+                    <el-select v-model="form.type">
+                        <el-option label="部门绩效" value="部门绩效"></el-option
+                        ><el-option
+                            label="员工绩效"
+                            value="员工绩效"
+                        ></el-option> </el-select
+                ></el-form-item>
+                <el-form-item label="绩效分类">
+                    <el-select v-model="form.class">
+                        <el-option label="GS" value="GS"></el-option
+                        ><el-option
+                            label="KPI"
+                            value="KPI"
+                        ></el-option> </el-select
+                ></el-form-item>
+                <el-form-item label="">
+                    <el-button type="primary" @click="handleVisible('power')"
+                        >权限设置</el-button
+                    >
+                </el-form-item>
+            </el-form>
+            <simple-sheet />
+            <template v-slot:footer><div></div></template>
+        </simple-dialog>
+        <simple-dialog
+            title="权限设置"
+            :visible="power_visible"
+            :reload="reload"
+            width="700px"
+            @confirm="handleVisible('power')"
+            @cancel="handleVisible('power')"
+        >
+            <el-form :model="form" label-width="100px">
+                <el-form-item label="可编辑列"
+                    ><el-input v-model="form.editrows"
+                /></el-form-item>
+                <el-form-item label="权限规则">
+                    <el-select v-model="form.rule">
+                        <el-option
+                            v-for="item in ruleoptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        ></el-option> </el-select
+                ></el-form-item>
+                <el-form-item label="负责人">
+                    <div>
+                        <el-cascader-panel
+                            v-model="form.charge"
+                            :options="charge_options"
+                            clearable
+                            @change="handleCascader"
+                        ></el-cascader-panel></div
+                ></el-form-item>
+            </el-form>
+        </simple-dialog>
+    </div>
+</template>
+
+<script>
+import analysis from "./analysis.vue";
+import simpleForm from "./components/form.vue";
+import simpleSheet from "./components/sheet.vue";
+import simpleTable from "./components/table.vue";
+import simpleDialog from "./components/dialog.vue";
+import simplePagination from "./components/pagination.vue";
+export default {
+    components: {
+        analysis,
+        simpleTable,
+        simpleDialog,
+        simpleForm,
+        simpleSheet,
+        simplePagination,
+    },
+    data() {
+        return {
+            page: 1,
+            rows: 10,
+            total: 0,
+            form: {},
+            reload: 0,
+            ruleoptions: [
+                {
+                    value: "按行号",
+                    label: "按行号",
+                },
+                {
+                    value: "按科室分配",
+                    label: "按科室分配",
+                },
+                {
+                    value: "按负责人分配",
+                    label: "按负责人分配",
+                },
+                {
+                    value: "所有人员",
+                    label: "",
+                },
+            ],
+            charge_options: [
+                {
+                    label: "科室名称1",
+                    value: "科室名称1",
+                    children: [
+                        {
+                            label: "负责人",
+                            value: "负责人",
+                            children: [{ label: "尹强", value: "尹强" }],
+                        },
+                    ],
+                },
+            ],
+            add_visible: false,
+            power_visible: false,
+            template_visible: false,
+            issue_visible: false,
+            table_loading: false,
+            table_search: {},
+            table_form: [
+                {
+                    label: "模板名称",
+                    props: "template_name",
+                    type: "input",
+                },
+            ],
+            table_list: [],
+            table_handle: [
+                {
+                    label: "新增模板",
+                    props: "add",
+                },
+            ],
+            table_handle_row: [
+                {
+                    label: "下发",
+                    props: "issue",
+                },
+                {
+                    label: "查看",
+                    props: "detail",
+                },
+                {
+                    label: "删除",
+                    props: "delete",
+                    popconfirm: true,
+                },
+            ],
+            table_config: [
+                {
+                    label: "模板名称",
+                    props: "template_name",
+                },
+                {
+                    label: "配置时间",
+                    props: "template_date",
+                },
+                {
+                    label: "配置工号",
+                    props: "template_number",
+                },
+                {
+                    label: "模板分类",
+                    props: "template_class",
+                },
+                {
+                    label: "模板状态",
+                    props: "template_status",
+                },
+                {
+                    label: "模板类型",
+                    props: "template_type",
+                },
+            ],
+        };
+    },
+    methods: {
+        async handleInit() {
+            this.table_loading = true;
+            const data = [];
+            let index = 0;
+            while (index < 1) {
+                data.push(...JSON.parse(sessionStorage.global_data));
+                index = index + 1;
+            }
+            this.total = index;
+            this.table_list = data;
+            this.table_loading = false;
+        },
+        handleSearch({ template_name }) {
+            this.table_search = { template_name };
+            this.handleReset();
+            this.handleInit();
+        },
+        handleAdd() {},
+        // 级联选择
+        handleCascader(data) {
+            console.log(data, "data");
+        },
+        handlePower() {},
+        handleChange(page) {
+            this.page = page;
+            this.handleInit();
+        },
+        handleVisible(props) {
+            switch (props) {
+                case "add":
+                    this.add_visible = !this.add_visible;
+                    break;
+                case "power":
+                    this.power_visible = !this.power_visible;
+                    break;
+                case "template":
+                    this.template_visible = !this.template_visible;
+                    break;
+                case "issue":
+                    this.issue_visible = !this.issue_visible;
+                    break;
+            }
+        },
+        handleReset() {
+            this.page = 1;
+        },
+        handleDelete() {
+            sessionStorage.setItem("global_data", JSON.stringify([]));
+            sessionStorage.setItem("global_process", JSON.stringify([]));
+            this.$message.success("删除成功");
+            this.handleInit();
+        },
+        handleIssue() {
+            const array = [
+                {
+                    ...JSON.parse(sessionStorage.global_data)[0],
+                    department_status: "待处理",
+                    issue_status: 1,
+                    performance_type: "GS",
+                    reason: this.form.reason,
+                    note: this.form.note,
+                    date: this.form.date,
+                    receiver: `刘洁,李方岩,吴磊,孙震,赵洪松,孙川,韦琳娜`,
+                },
+            ];
+            sessionStorage.setItem("global_data", JSON.stringify(array));
+            const process_array = JSON.parse(sessionStorage.global_process);
+            process_array.push({
+                link: "发起工单",
+                creatperson: `ADMIN ${this.$formatDate(new Date(), "YYYY-MM-DD")}`,
+                explain: "",
+            });
+            sessionStorage.setItem(
+                "global_process",
+                JSON.stringify(process_array)
+            );
+            this.$message.success("下发成功");
+            this.handleVisible("issue");
+        },
+    },
+    mounted() {
+        this.handleInit();
+    },
+};
+</script>
+
+<style></style>

+ 153 - 0
src/pages/main/performance/reply.vue

@@ -0,0 +1,153 @@
+<template>
+    <div>
+        <div class="simple-container">
+            <simple-form
+                :form="table_form"
+                :handle="table_handle"
+                @search="handleSearch"
+            ></simple-form>
+            <simple-table
+                :list="table_list"
+                :config="table_config"
+                :loading="table_loading"
+                :handle-row="table_handle_row"
+            ></simple-table>
+            <simple-pagination
+                :page="page"
+                :total="total"
+                @change="handleChange"
+            ></simple-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+import simpleForm from "./components/form.vue";
+import simpleTable from "./components/table.vue";
+import simplePagination from "./components/pagination.vue";
+export default {
+    components: {
+        simpleTable,
+        simpleForm,
+        simplePagination,
+    },
+    data() {
+        return {
+            page: 1,
+            rows: 10,
+            total: 0,
+            table_loading: false,
+            table_search: {},
+            table_form: [
+                {
+                    label: "统计月份",
+                    props: "date",
+                    type: "month",
+                },
+                {
+                    label: "绩效类型",
+                    props: "performance_type",
+                    type: "select",
+                    dictionary: [
+                        {
+                            label: "部门绩效",
+                            value: "部门绩效",
+                        },
+                        {
+                            label: "员工绩效",
+                            value: "员工绩效",
+                        },
+                    ],
+                },
+                {
+                    label: "绩效分类",
+                    props: "performance_class",
+                    type: "select",
+                    dictionary: [
+                        {
+                            label: "GS",
+                            value: "GS",
+                        },
+                        {
+                            label: "KPI",
+                            value: "KPI",
+                        },
+                    ],
+                },
+            ],
+            table_list: [],
+            table_handle: [
+                {
+                    label: "导出",
+                    props: "download",
+                },
+            ],
+            table_handle_row: [],
+            table_config: [
+                {
+                    label: "科室名称",
+                    props: "department_name",
+                },
+                {
+                    label: "科室经理",
+                    props: "department_manager",
+                },
+                {
+                    label: "代办接收数",
+                    props: "received_umber",
+                },
+                {
+                    label: "完成回复率",
+                    props: "response_rate",
+                },
+                {
+                    label: "超期率",
+                    props: "overdue_rate",
+                },
+                {
+                    label: "累计超期时间",
+                    props: "cumulative_overtime",
+                },
+            ],
+        };
+    },
+    methods: {
+        async handleInit() {
+            this.table_loading = true;
+            const data = [];
+            let index = 0;
+            while (index < 10) {
+                data.push({
+                    department_name: `科室${index}`,
+                    department_manager: `经理${index}`,
+                    received_umber: `${index}`,
+                    response_rate: `${index + 1}0`,
+                    overdue_rate: `50%`,
+                    cumulative_overtime: `3`,
+                });
+                index = index + 1;
+            }
+            this.total = index;
+            this.table_list = data;
+            this.table_loading = false;
+        },
+        handleSearch({ template_name }) {
+            this.table_search = { template_name };
+            this.handleReset();
+            this.handleInit();
+        },
+        handleChange(page) {
+            this.page = page;
+            this.handleInit();
+        },
+        handleReset() {
+            this.page = 1;
+        },
+    },
+    mounted() {
+        this.handleInit();
+    },
+};
+</script>
+
+<style></style>

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

@@ -15,7 +15,9 @@ import {
 	Slider,
 	Checkbox,
 	CheckboxGroup,
+	Popconfirm,
 	Cascader,
+	CascaderPanel,
 	Header,
 	Card,
 	Tag,
@@ -90,7 +92,9 @@ Vue.use(Header);
 Vue.use(Aside);
 Vue.use(Card);
 Vue.use(Menu);
+Vue.use(Popconfirm);
 Vue.use(Cascader);
+Vue.use(CascaderPanel);
 Vue.use(MenuItem);
 Vue.use(Submenu);
 Vue.use(Main);

+ 18 - 0
src/router/index.js

@@ -9,6 +9,24 @@ const routes = [{
     component: Index,
     redirect: '/leader',
     children: [
+        {
+            meta: { name:  '宣传稿件审批', keepAlive: false },
+            path: '/infotechgjsp',
+            name: 'infotechgjsp',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/infotech/index.vue'], resolve)
+        },
+        {
+            meta: { name:  '绩效', keepAlive: false },
+            path: '/performance',
+            name: 'performance',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/performance/index.vue'], resolve)
+        },
+        {
+            meta: { name:  '宣传稿件下发', keepAlive: false,type: 1 },
+            path: '/infotechgj',
+            name: 'infotechgj',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/infotech/index1.vue'], resolve)
+        },
 		{
 		    meta: { name:  '营销经验', keepAlive: false },
 		    path: '/experCollecInfo',

+ 2 - 2
vue.config.js

@@ -94,9 +94,9 @@ module.exports = {
                 // target: 'http://192.168.2.149:9600',
                 // target: 'http://10.64.42.70:8088/',
                 // target: 'http://114.215.71.182:29600',
-                // target: 'http://10.230.26.15:8000/spfm',
+                target: 'http://10.230.26.15:8000/spfm',
                 // target: 'http://127.0.0.1:9600/',
-                target: 'http://192.168.0.103:9600/',
+                // target: 'http://192.168.0.103:9600/',
                 // target: 'http://192.168.2.170:9600/',
                 // target: 'http://192.168.2.169:9600/',
                 changeOrigin: true