guojy 2 年之前
父节点
当前提交
5353e69b29
共有 42 个文件被更改,包括 4766 次插入638 次删除
  1. 1096 182
      package-lock.json
  2. 1 1
      package.json
  3. 136 0
      src/api/print.js
  4. 11 4
      src/api/websocket.js
  5. 48 16
      src/assets/css/iconfont.css
  6. 0 0
      src/assets/css/iconfont.js
  7. 56 0
      src/assets/css/iconfont.json
  8. 二进制
      src/assets/css/iconfont.ttf
  9. 二进制
      src/assets/css/iconfont.woff
  10. 二进制
      src/assets/css/iconfont.woff2
  11. 28 0
      src/assets/css/reset.css
  12. 140 0
      src/components/BrawerBox.vue
  13. 1 1
      src/components/EmployeeSelector.vue
  14. 56 45
      src/components/applicationIntegrationPopup.vue
  15. 63 50
      src/components/bonusPointsPopup.vue
  16. 5 0
      src/components/upload.vue
  17. 1 0
      src/home.vue
  18. 1 0
      src/index.vue
  19. 16 4
      src/main.js
  20. 59 2
      src/router/index.js
  21. 1 1
      src/views/abPoint/apply_list.vue
  22. 2 2
      src/views/abPoint/award_punish.vue
  23. 830 0
      src/views/abPoint/lottery_ticket.vue
  24. 830 0
      src/views/award/grantAward.vue
  25. 321 0
      src/views/award/lotteryTicket_statistics.vue
  26. 81 0
      src/views/award/myAward.vue
  27. 8 0
      src/views/award/myGrantAward.vue
  28. 118 0
      src/views/award/print - 副本.vue
  29. 601 0
      src/views/award/print.vue
  30. 1 1
      src/views/common/repeatTaskDetailsPopup.vue
  31. 13 14
      src/views/common/rewardTask.vue
  32. 6 6
      src/views/common/rewardTaskAmend.vue
  33. 7 7
      src/views/common/temporaryTask.vue
  34. 6 6
      src/views/common/temporaryTaskAmend.vue
  35. 3 3
      src/views/ranking/JfDetail.vue
  36. 28 5
      src/views/ranking/integral_event.vue
  37. 31 4
      src/views/ranking/integral_event_two.vue
  38. 0 246
      src/views/ranking/lotteryTicket_statistics.vue
  39. 137 31
      src/views/ranking/manager_statistics.vue
  40. 19 3
      src/views/set/rule.vue
  41. 1 1
      src/views/set/screenSet.vue
  42. 4 3
      src/views/workbench/review.vue

文件差异内容过多而无法显示
+ 1096 - 182
package-lock.json


+ 1 - 1
package.json

@@ -50,4 +50,4 @@
     "uglifyjs-webpack-plugin": "^2.2.0",
     "vue-template-compiler": "^2.6.11"
   }
-}
+}

+ 136 - 0
src/api/print.js

@@ -0,0 +1,136 @@
+
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print = function (dom, options) {
+  if (!(this instanceof Print)) return new Print(dom, options);
+
+  this.options = this.extend({
+    'noPrint': '.no-print'
+  }, options);
+
+  if ((typeof dom) === "string") {
+    this.dom = document.querySelector(dom);
+  } else {
+    this.isDOM(dom)
+    this.dom = this.isDOM(dom) ? dom : dom.$el;
+  }
+
+  this.init();
+};
+Print.prototype = {
+  init: function () {
+    var content = this.getStyle() + this.getHtml();
+    this.writeIframe(content);
+  },
+  extend: function (obj, obj2) {
+    for (var k in obj2) {
+      obj[k] = obj2[k];
+    }
+    return obj;
+  },
+
+  getStyle: function () {
+    var str = "",
+      styles = document.querySelectorAll('style,link');
+    for (var i = 0; i < styles.length; i++) {
+      str += styles[i].outerHTML;
+    }
+    str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
+
+    return str;
+  },
+
+  getHtml: function () {
+    var inputs = document.querySelectorAll('input');
+    var textareas = document.querySelectorAll('textarea');
+    var selects = document.querySelectorAll('select');
+
+    for (var k = 0; k < inputs.length; k++) {
+      if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+        if (inputs[k].checked == true) {
+          inputs[k].setAttribute('checked', "checked")
+        } else {
+          inputs[k].removeAttribute('checked')
+        }
+      } else if (inputs[k].type == "text") {
+        inputs[k].setAttribute('value', inputs[k].value)
+      } else {
+        inputs[k].setAttribute('value', inputs[k].value)
+      }
+    }
+
+    for (var k2 = 0; k2 < textareas.length; k2++) {
+      if (textareas[k2].type == 'textarea') {
+        textareas[k2].innerHTML = textareas[k2].value
+      }
+    }
+
+    for (var k3 = 0; k3 < selects.length; k3++) {
+      if (selects[k3].type == 'select-one') {
+        var child = selects[k3].children;
+        for (var i in child) {
+          if (child[i].tagName == 'OPTION') {
+            if (child[i].selected == true) {
+              child[i].setAttribute('selected', "selected")
+            } else {
+              child[i].removeAttribute('selected')
+            }
+          }
+        }
+      }
+    }
+
+    return this.dom.outerHTML;
+  },
+
+  writeIframe: function (content) {
+    var w, doc, iframe = document.createElement('iframe'),
+      f = document.body.appendChild(iframe);
+    iframe.id = "myIframe";
+    //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+    iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
+    w = f.contentWindow || f.contentDocument;
+    doc = f.contentDocument || f.contentWindow.document;
+    doc.open();
+    doc.write(content);
+    doc.close();
+    var _this = this
+    iframe.onload = function(){
+      _this.toPrint(w);
+      setTimeout(function () {
+        document.body.removeChild(iframe)
+      }, 100)
+    }
+  },
+
+  toPrint: function (frameWindow) {
+    try {
+      setTimeout(function () {
+        frameWindow.focus();
+        try {
+          if (!frameWindow.document.execCommand('print', false, null)) {
+            frameWindow.print();
+          }
+        } catch (e) {
+          frameWindow.print();
+        }
+        frameWindow.close();
+      }, 10);
+    } catch (err) {
+      console.log('err', err);
+    }
+  },
+  isDOM: (typeof HTMLElement === 'object') ?
+    function (obj) {
+      return obj instanceof HTMLElement;
+    } :
+    function (obj) {
+      return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
+    }
+};
+const MyPlugin = {}
+MyPlugin.install = function (Vue, options) {
+  // 4. 添加实例方法
+  Vue.prototype.$print = Print
+}
+export default MyPlugin

+ 11 - 4
src/api/websocket.js

@@ -52,8 +52,13 @@ let closewebsocket = () => {
 	}
 }
 
-let initWebSocket = () => {
+let initWebSocket = (is) => {
 	//初始化 websocket
+	if(is){
+		wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws2/';
+	}else{
+		wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws/';
+	}
 	ws = new WebSocket(wsurl)
 	ws.onmessage = websocketonmessage
 	ws.onopen = websocketonopen
@@ -61,8 +66,10 @@ let initWebSocket = () => {
 	ws.onclose = websocketclose
 }
 
-// 发送数据
-let sendData = (data, callback) => {
+
+// 发送数据  is是使用ws2API 后面要清掉
+let sendData = (data, callback,is) => {
+			// console.log(data)
 	weboscket_callback = callback
 	//  判断 data 数据类型
 	if (typeof data == 'string') {
@@ -80,7 +87,7 @@ let sendData = (data, callback) => {
 		}
 	}else {
 		// 未打开,则开启后重新调用
-		initWebSocket()
+		initWebSocket(is)
 		let wsData = {type: 'auth',token: getToken(),machine:generateUUID()};
 		sendData(wsData, callback)
 		sendData(data, callback)

+ 48 - 16
src/assets/css/iconfont.css

@@ -1,9 +1,8 @@
 @font-face {
-	font-family: "iconfont";
-	/* Project id 2916418 */
-	src: url('iconfont.woff2?t=1637991685964') format('woff2'),
-		url('iconfont.woff?t=1637991685964') format('woff'),
-		url('iconfont.ttf?t=1637991685964') format('truetype');
+  font-family: "iconfont"; /* Project id 2916418 */
+  src: url('iconfont.woff2?t=1682412478314') format('woff2'),
+       url('iconfont.woff?t=1682412478314') format('woff'),
+       url('iconfont.ttf?t=1682412478314') format('truetype');
 }
 
 .iconfont {
@@ -17,46 +16,79 @@
 	color: #303133 !important;
 }
 
+.icon-piao:before {
+  content: "\e647";
+}
+
+.icon-shouye1:before {
+  content: "\e6cb";
+}
+
+.icon-tianshenpi:before {
+  content: "\eb67";
+}
+
+.icon-gongdanqueren:before {
+  content: "\ec36";
+}
+
+.icon-yonghujihuo:before {
+  content: "\e72f";
+}
+
+.icon-RectangleCopy:before {
+  content: "\e730";
+}
+
+.icon-star-half:before {
+  content: "\e9a1";
+}
+
+.icon-a-chaosongrenchaosongyonghu-01:before {
+  content: "\e731";
+}
+
 .icon-shezhi_jichushezhi:before {
-	content: "\e70c";
+  content: "\e70c";
 }
 
 .icon-shezhi_jiaose:before {
-	content: "\e70f";
+  content: "\e70f";
 }
 
 .icon-shezhi_zidongjifen:before {
-	content: "\e710";
+  content: "\e710";
 }
 
 .icon-shezhi_zuzhijiagou:before {
-	content: "\e711";
+  content: "\e711";
 }
 
 .icon-fulizhongxin:before {
-	content: "\e652";
+  content: "\e652";
 }
 
 .icon-kaoqin_kaoqinyuebaobiao:before {
-	content: "\e708";
+  content: "\e708";
 }
 
 .icon-shezhi_jifenguize:before {
-	content: "\e70d";
+  content: "\e70d";
 }
 
 .icon-PC_gongzuotai_ABfen:before {
-	content: "\e71d";
+  content: "\e71d";
 }
 
 .icon-dingdingPC_shezhi1:before {
-	content: "\e725";
+  content: "\e725";
 }
 
 .icon-dingdingPC_tongji1:before {
-	content: "\e726";
+  content: "\e726";
 }
 
 .icon-shouye:before {
-	content: "\e639";
+  content: "\e639";
 }
+

文件差异内容过多而无法显示
+ 0 - 0
src/assets/css/iconfont.js


+ 56 - 0
src/assets/css/iconfont.json

@@ -5,6 +5,62 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "4251745",
+      "name": "票",
+      "font_class": "piao",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "768745",
+      "name": "进行中",
+      "font_class": "shouye1",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "3868280",
+      "name": "提案审批",
+      "font_class": "tianshenpi",
+      "unicode": "eb67",
+      "unicode_decimal": 60263
+    },
+    {
+      "icon_id": "5769241",
+      "name": "工单确认",
+      "font_class": "gongdanqueren",
+      "unicode": "ec36",
+      "unicode_decimal": 60470
+    },
+    {
+      "icon_id": "7285970",
+      "name": "用户激活",
+      "font_class": "yonghujihuo",
+      "unicode": "e72f",
+      "unicode_decimal": 59183
+    },
+    {
+      "icon_id": "7553650",
+      "name": "目标制定",
+      "font_class": "RectangleCopy",
+      "unicode": "e730",
+      "unicode_decimal": 59184
+    },
+    {
+      "icon_id": "18170319",
+      "name": "星,星星,星形,半星",
+      "font_class": "star-half",
+      "unicode": "e9a1",
+      "unicode_decimal": 59809
+    },
+    {
+      "icon_id": "27499516",
+      "name": "抄送人、抄送用户-01",
+      "font_class": "a-chaosongrenchaosongyonghu-01",
+      "unicode": "e731",
+      "unicode_decimal": 59185
+    },
     {
       "icon_id": "15023955",
       "name": "设置_基础设置",

二进制
src/assets/css/iconfont.ttf


二进制
src/assets/css/iconfont.woff


二进制
src/assets/css/iconfont.woff2


+ 28 - 0
src/assets/css/reset.css

@@ -22,6 +22,10 @@ legend { color:#000; }
 fieldset, img { border:0; }
 button, input, select, textarea { font-size:100%; }
 table { border-collapse:collapse; border-spacing:0; }
+label {
+    font-weight: 600;
+}
+
 .icon {
   width: 1em;
   height: 1em;
@@ -33,9 +37,22 @@ table { border-collapse:collapse; border-spacing:0; }
 	min-height: calc(100vh - 110px);
 }
 
+
 .el-form-item__content {
 	line-height: 36px !important;
 }
+a:focus,
+a:active {
+  outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+  cursor: pointer;
+  color: inherit;
+  text-decoration: none;
+}
 
 /* 盒子模型 */
 .flex-box {
@@ -381,3 +398,14 @@ table { border-collapse:collapse; border-spacing:0; }
 	background-color: rgba(144, 147, 153, 0.3);
 	height: 20px;
 }
+/* 上传组件 */
+.el-upload--picture-card {
+  width: 100px !important;
+  height: 100px !important;
+  line-height: 100px !important;
+}
+.el-upload-list--picture-card .el-upload-list__item {
+
+  width: 100px !important;
+  height: 100px !important;
+}

+ 140 - 0
src/components/BrawerBox.vue

@@ -0,0 +1,140 @@
+<template>
+  <el-drawer :visible.sync="showDrawerTow" :append-to-body="true" :before-close="handleClose" @open="openD()" :with-header="false" :wrapperClosable="closeModal">
+    <input ref="input" tabindex="0" style="position: absolute;right: 0;top: 0;width: 0px;opacity: 0;" />
+    <header class="drawer-header flex-box-ce">
+      <span class="flex-1">{{ drawerTitle }}</span>
+      <i v-if="closeModal" @click="handleClose2" class="el-icon-close"></i>
+    </header>
+    <div class="drawer-main"><slot name="main"></slot></div>
+    <footer v-if="footNo" class="drawer-footer flex-box-end flex-v-ce"><slot name="footer"></slot></footer>
+  </el-drawer>
+</template>
+<script>
+export default {
+  name: 'BrawerBox',
+  props: {
+    showDrawer: {
+      type: Boolean,
+      default: false
+    },
+    drawerTitle: {
+      type: String,
+      default: '设置'
+    },
+    closeModal: {
+      //是否可以通过点击 modal 关闭 Dialog
+      type: Boolean,
+      default: true
+    },
+    footNo: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      showDrawerTow: false
+    };
+  },
+  watch: {
+    showDrawer(val) {
+      this.showDrawerTow = val;
+      if (val) {
+        this.openend();
+      }
+    }
+  },
+  methods: {
+    // 解决打开首页输入组件自动聚焦问题
+    openend() {
+      this.$nextTick(() => {
+        this.$refs.input.focus();
+        setTimeout(() => {
+          this.$refs.input.blur();
+        }, 200);
+      });
+    },
+    openD() {},
+    handleClose(done) {
+      this.$emit('update:showDrawer', false);
+      this.showDrawerTow = false;
+      done();
+    },
+    handleClose2() {
+      this.$emit('update:showDrawer', false);
+      this.showDrawerTow = false;
+    }
+  }
+};
+</script>
+
+<style scoped="scoped">
+.el-icon-close {
+  cursor: pointer;
+  padding: 8px;
+  position: relative;
+  right: -8px;
+}
+.el-icon-close:hover {
+  color: #f56c6c;
+}
+::v-deep .li .el-checkbox__label {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  display: block;
+  width: 440px;
+}
+::v-deep .li .el-radio__label {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  display: block;
+  width: 100%;
+  max-width: 440px;
+}
+::v-deep .el-drawer {
+  width: 550px !important;
+}
+.drawer-header {
+  height: 60px;
+  border-bottom: 1px solid #ebebeb;
+  line-height: 60px;
+  font-size: 18px;
+  font-weight: 500;
+  padding: 0 20px;
+}
+.drawer-main {
+  height: calc(100vh - 120px);
+  padding: 20px;
+  overflow-y: scroll;
+  min-width: 450px;
+  font-size: 14px;
+}
+.drawer-main::-webkit-scrollbar-track {
+  -webkit-box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.3);
+  border-radius: 5px;
+  background-color: rgba(216, 216, 216, 0.8);
+}
+.drawer-main::-webkit-scrollbar {
+  width: 5px;
+  background-color: rgba(201, 201, 201, 0);
+}
+.drawer-main::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  -webkit-box-shadow: inset 0 0 5px rgb(153, 145, 145) (160, 154, 154);
+  background-color: rgb(168, 167, 167);
+}
+.drawer-footer {
+  background-color: #fff;
+  border-top: 1px solid #ebebeb;
+  padding: 10px 20px;
+  font-size: 14px;
+}
+::v-deep .width-150 {
+  width: 180px;
+}
+::v-deep :focus {
+  outline: 0;
+}
+</style>

+ 1 - 1
src/components/EmployeeSelector.vue

@@ -391,7 +391,7 @@ export default {
 				list = [...userlist].filter(x => [...list].some(y => y.id === x.id));
 				employee_selected_list=[...userlist].filter(x => [...employee_selected_list].some(y => y.id === x.id));
 			}
-			console.log(userlist,list)
+			// console.log(userlist,list)
 			list.map(item => {
 				item['checked'] = false;
 				for (var i in employee_selected_list) {

+ 56 - 45
src/components/applicationIntegrationPopup.vue

@@ -1,22 +1,19 @@
 <template>
 	<div>
 		<!-- 奖扣ab分弹窗 -->
-		<el-dialog :title="title" :visible.sync="visible" :close-on-click-modal="false" :before-close="closeDialog2" width="600px">
+		<el-dialog :title="title" :visible.sync="visible" top="3%" :close-on-click-modal="false" :before-close="closeDialog2" width="700px">
 			<div>
-				<el-form :model="dialogData" ref="dialogData" label-width="80px" v-loading="loading">
+				<el-form :model="dialogData" ref="dialogData" label-width="100px" v-loading="loading">
 					<div v-for="(item, index) in dialogData.items" :key="index" @click="setIndex(index)">
-						<div style="overflow: hidden;" class="flex-box flex-v-ce">
-							<span style="line-height: 36px;" class="flex-1">申请明细({{ index + 1 }})</span>
-							<el-button type="text" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
+						<div class="title flex-box-ce flex-d-center">
+							<span class="span">申请明细({{ index + 1 }})</span>
+							<el-link type="danger" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-link>
 						</div>
 						<el-form-item label="奖扣对象" :prop="'items.' + index + '.employeeName'" :rules="[{ required: true, message: '请选择奖扣对象', trigger: 'change' }]">
-							<el-row>
-								<el-col :span="18">
-									<el-input auto-complete="off" v-model="item.employeeName" placeholder="请选择奖扣对象"></el-input>
-									<div @click="item.show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
-								</el-col>
-							</el-row>
-
+							<div class="width_400">
+								<el-input auto-complete="off" v-model="item.employeeName" placeholder="请选择奖扣对象"></el-input>
+								<div @click="item.show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+							</div>
 							<el-dialog title="选择人员" width="640px" :visible.sync="item.show_employee_selector" append-to-body :before-close="handleClose">
 								<EmployeeSelector
 									v-if="item.show_employee_selector"
@@ -42,6 +39,7 @@
 							<el-cascader
 								v-model="item.rule_item_list_value"
 								ref="ruleItem"
+								class="width_400"
 								:popper-class="'itemClass'"
 								:options="rule_item_list"
 								@change="ruleItemChange"
@@ -66,17 +64,14 @@
 						</el-form-item>
 
 						<el-form-item label="发生时间" :prop="'items.' + index + '.event_time'" :rules="[{ required: true, message: '请选择时间', trigger: 'blur' }]">
-							<el-row>
-								<el-col :span="18">
-									<el-date-picker
-										v-model="item.event_time"
-										:picker-options="pickerBeginDateBefore"
-										type="date"
-										placeholder="请选择时间"
-										value-format="yyyy-MM-dd"
-									></el-date-picker>
-								</el-col>
-							</el-row>
+							<el-date-picker
+							    :clearable="false"
+								v-model="item.event_time"
+								:picker-options="pickerBeginDateBefore"
+								type="date"
+								placeholder="请选择时间"
+								value-format="yyyy-MM-dd"
+							></el-date-picker>
 						</el-form-item>
 
 						<el-form-item
@@ -84,30 +79,28 @@
 							:prop="'items.' + index + '.remark'"
 							:rules="[{ required: true, message: '请输入事件内容', trigger: 'blur' }, { min: 3, max: 300, message: '长度在 3 到 300 个字符', trigger: 'blur' }]"
 						>
-							<el-row>
-								<el-col :span="18"><el-input type="textarea" rows="5" placeholder="请输入事件内容" style="width: 100%;" v-model="item.remark"></el-input></el-col>
-							</el-row>
+							<el-input type="textarea" placeholder="请输入事件内容"  clearable maxlength="300" show-word-limit rows="4" v-model="item.remark" ></el-input>
+							<el-button @click="item.remark=''" type="danger" plain size="mini" style="position: absolute;right: 0px;bottom: -30px;z-index: 99999;">清空</el-button>
 						</el-form-item>
 
 						<el-form-item label="图片" label-width="100px">
-							<uploadOss
-								:headers="Xtoken"
-								class="avatar-uploader"
-								:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							  <upload
+								:headers="$xtoken"
+								:action="$action"
+								:limit="3"
+								list_type="picture-card"
+								:accept="$acceptImg"
+								:multiple="true"
+								ref="clearPicture"
 								:show-file-list="true"
 								:file-list="item.fileList"
 								:on-success="handleFilesSuccess"
 								:on-preview="onFilePreView"
 								:before-upload="beforeUpload"
 								:on-remove="onFileRemove"
-								:limit="3"
-								accept="image/jpeg,image/png"
-								:multiple="true"
-								ref="clearPicture"
-							>
-								<el-button size="small" type="primary">点击上传</el-button>
-								(最多选择3张)
-							</uploadOss>
+							  >
+								<i class="el-icon-plus"></i>
+							</upload>
 						</el-form-item>
 
 						<el-form-item
@@ -116,12 +109,10 @@
 							:prop="'items.' + index + '.approvalName'"
 							:rules="[{ required: true, message: '请选择审批人', trigger: 'blur' }]"
 						>
-							<el-row>
-								<el-col :span="18">
+							<div class="width_400">
 									<el-input auto-complete="off" v-model="item.approvalName" placeholder="请选择审批人"></el-input>
 									<div @click="approval_selected_null(item)" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
-								</el-col>
-							</el-row>
+							</div>
 							<el-dialog title="选择人员" width="640px" :visible.sync="item.show_approval_selector" append-to-body :before-close="handleClose">
 								<EmployeeSelector
 									:can_select_employee="true"
@@ -247,7 +238,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
-import uploadOss from '@/components/upload';
+import upload from '@/components/upload';
 export default {
 	name: 'applicationIntegration',
 	// 数据
@@ -347,7 +338,7 @@ export default {
 			config:{},
 		};
 	},
-	components: { EmployeeSelector, uploadOss },
+	components: { EmployeeSelector, upload },
 	async mounted() {
 		this.config=this.$store.state.config;
 		this.user_info = this.$getUserData();
@@ -813,7 +804,27 @@ export default {
 	}
 };
 </script>
-<style lang="scss">
+<style lang="scss" scoped>
+::v-deep .el-input__count{
+  right: 70px;
+  bottom: -36px;
+}	
+.title{
+	background-color: #f4f9fd;
+	border: 1px solid #e4f0fc;
+	padding-right: 10px;
+	margin-bottom: 16px;
+}
+.title .span{
+	line-height: 36px;
+	width: 100px;
+	text-align: right;
+	font-weight: 700;
+}
+.width_400{
+	width: 400px;
+	position: relative;
+}	
 .itemClass .el-cascader-menu .el-cascader-menu__wrap li.el-cascader-node {
 	height: auto;
 	max-width: 500px;

+ 63 - 50
src/components/bonusPointsPopup.vue

@@ -1,28 +1,25 @@
 <template>
 	<div>
 		<!-- 奖扣ab分弹窗 -->
-		<el-dialog :title="title" :visible.sync="visible" top="3%" :close-on-click-modal="false" :before-close="closePopup" width="600px">
+		<el-dialog :title="title" :visible.sync="visible" top="3%" :close-on-click-modal="false" :before-close="closePopup" width="700px">
 			<div>
-				<el-form :model="dialogData" ref="dialogData" label-width="80px" v-loading="loading">
+				<el-form :model="dialogData" ref="dialogData" label-width="100px" v-loading="loading">
 					<el-form-item label="奖扣对象" prop="members" :rules="[{ required: true, message: '请选择奖扣对象', trigger: 'change' }]">
-						<el-row>
-							<el-col :span="18">
-								<el-input auto-complete="off" v-model="employeeName" placeholder="请选择奖扣对象"></el-input>
-								<div @click="noPersonnelListTips" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
-								<slot></slot>
-							</el-col>
-						</el-row>
+						<div class="width_400">
+							<el-input auto-complete="off" v-model="employeeName" placeholder="请选择奖扣对象" ></el-input>
+							<div @click="noPersonnelListTips" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+						</div>
+						<slot></slot>
 					</el-form-item>
 					<div v-for="(item, index) in dialogData.items" :key="index" @click.stop="setIndex(index)">
-						<div style="overflow: hidden;">
-							<span style="line-height: 36px;">录入明细({{ index + 1 }})</span>
-							<el-button type="text" class="fr" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
+						<div class="title flex-box-ce flex-d-center">
+							<span class="span">录入明细({{ index + 1 }})</span>
+							<el-link type="danger" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-link>
 						</div>
 						<el-form-item label="指定规则">
-							<el-switch :disabled="ruleOnoff" @change="switchChange(index, item.rule_switch)" v-model="item.rule_switch"></el-switch>
+							<el-switch  :disabled="ruleOnoff" @change="switchChange(index, item.rule_switch)" v-model="item.rule_switch"></el-switch>
 						</el-form-item>
 						<el-form-item
-							class="test_cascader_id"
 							label="选择分类"
 							v-if="!item.rule_switch"
 							:prop="'items.' + index + '.rule_list_value'"
@@ -33,6 +30,7 @@
 								:ref="'ruleCascader'+index"
 								:popper-class="'ruleClass'"
 								filterable
+								class="width_400"
 								@expand-change="setIndex(index)"
 								clearable
 								:options="rule_list"
@@ -50,6 +48,7 @@
 							<el-cascader
 								v-model="item.rule_item_list_value"
 								ref="ruleItem"
+								class="width_400"
 								:popper-class="'itemClass'"
 								filterable
 								clearable
@@ -72,62 +71,58 @@
 							</div>
 							<div style="line-height: 24px;">{{ item.rule_item_details.name }}</div>
 						</el-form-item>
+						
 						<el-form-item label="积分" :prop="'items.' + index + '.point'" :rules="[{ required: true, message: '请输入分值', trigger: 'blur' }]">
-							<el-input-number v-if="item.rule_item_details.range_type == 2" :min="item.min" :max="item.max" v-model.number="item.point"></el-input-number>
-							<el-input-number v-else :disabled="item.rule_item_details.range_type == 1" v-model.number="item.point"></el-input-number>
+							<el-input-number style="width: 220px;" v-if="item.rule_item_details.range_type == 2" :min="item.min" :max="item.max" v-model.number="item.point"></el-input-number>
+							<el-input-number style="width: 220px;" v-else :disabled="item.rule_item_details.range_type == 1" v-model.number="item.point"></el-input-number>
 						</el-form-item>
 
 						<el-form-item label="发生时间" :prop="'items.' + index + '.event_time'" :rules="[{ required: true, message: '请选择时间', trigger: 'blur' }]">
-							<el-row>
-								<el-col :span="18">
-									<el-date-picker
-										v-model="item.event_time"
-										:picker-options="pickerBeginDateBefore"
-										type="date"
-										placeholder="请选择时间"
-										value-format="yyyy-MM-dd"
-									></el-date-picker>
-								</el-col>
-							</el-row>
+							<el-date-picker
+								:clearable="false"
+								v-model="item.event_time"
+								:picker-options="pickerBeginDateBefore"
+								type="date"
+								placeholder="请选择时间"
+								value-format="yyyy-MM-dd"
+							></el-date-picker>
+						</el-form-item>
+						<el-form-item label="发放奖票">
+							<el-switch  :disabled="ruleOnoff" @change="switchChange(index, item.rule_switch)" v-model="item.rule_switch"></el-switch>
 						</el-form-item>
-
 						<el-form-item
 							label="事件内容"
 							:prop="'items.' + index + '.remark'"
 							:rules="[{ required: true, message: '请输入事件内容', trigger: 'blur' }, { min: 2, max: 300, message: '长度在 2 到 300 个字符', trigger: 'blur' }]"
 						>
-							<el-row>
-								<el-col :span="18"><el-input type="textarea" placeholder="请输入事件内容" style="width: 100%;" :rows="5" maxlength="300" v-model="item.remark" ></el-input></el-col>
-							</el-row>
+							<el-input type="textarea" placeholder="请输入事件内容"  clearable maxlength="300" show-word-limit rows="4" v-model="item.remark" ></el-input>
+							<el-button @click="item.remark=''" type="danger" plain size="mini" style="position: absolute;right: 0px;bottom: -30px;z-index: 99999;">清空</el-button>
 						</el-form-item>
 
 						<el-form-item label="图片">
-							<upload
-								:headers="Xtoken"
-								class="avatar-uploader"
-								:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							  <upload
+								:headers="$xtoken"
+								:action="$action"
+								:limit="3"
+								list_type="picture-card"
+								:accept="$acceptImg"
+								:multiple="true"
+								ref="clearPicture"
 								:show-file-list="true"
 								:file-list="item.fileList"
 								:on-success="handleFilesSuccess"
 								:on-preview="onFilePreView"
 								:before-upload="beforeUpload"
 								:on-remove="onFileRemove"
-								:limit="3"
-								accept="image/jpeg,image/png"
-								:multiple="true"
-								ref="clearPicture"
-							>
-								<el-button size="small" type="primary">点击上传</el-button>
-								(最多选择3张)
+							  >
+								<i class="el-icon-plus"></i>
 							</upload>
 						</el-form-item>
 						<el-form-item label="递交审批" v-if="$getUserData().is_creator == 0">
-							<el-row>
-								<el-col :span="18">
-									<el-input auto-complete="off" v-model="item.approvalName" placeholder="请选择审批人"></el-input>
-									<div @click="item.show_approval_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
-								</el-col>
-							</el-row>
+							<div class="width_400">
+								<el-input auto-complete="off" v-model="item.approvalName" placeholder="请选择审批人"></el-input>
+								<div @click="item.show_approval_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+							</div>
 							<el-dialog title="选择人员" width="640px" :visible.sync="item.show_approval_selector" append-to-body :before-close="handleClose">
 								<EmployeeSelector
 									v-if="item.show_approval_selector"
@@ -319,7 +314,6 @@ export default {
 					return time.getTime() > Date.now();
 				}
 			},
-			Xtoken: { 'X-Token': this.$getToken() },
 			btn_loading: false,
 			loading: false,
 			dialogData: {
@@ -949,7 +943,26 @@ export default {
 	}
 };
 </script>
-<style lang="scss">
+<style lang="scss" scoped>
+::v-deep .el-input__count{
+  right: 70px;
+  bottom: -36px;
+}	
+.title{
+	background-color: #f4f9fd;
+	border: 1px solid #e4f0fc;
+	padding-right: 10px;
+}
+.title .span{
+	line-height: 36px;
+	width: 100px;
+	text-align: right;
+	font-weight: 700;
+}
+.width_400{
+	width: 400px;
+	position: relative;
+}
 .itemClass .el-cascader-menu .el-cascader-menu__wrap .el-scrollbar__view li.el-cascader-node {
 	height: auto;
 	max-width: 500px;

+ 5 - 0
src/components/upload.vue

@@ -14,6 +14,7 @@
 			:before-upload="_beforeUpload"
 			:on-exceed="_onExceed"
 			:limit="limit"
+			:list-type="list_type"
 			:accept="accept"
 			:on-change="handleChange"
 			:multiple="multiple"
@@ -47,6 +48,10 @@ export default {
 				return {};
 			}
 		},
+		list_type:{
+		  type: String,
+		  default: 'text'
+		},
 		data: Object, //上传时附带的额外参数
 		multiple: Boolean, //是否支持多选文件
 		name: {

+ 1 - 0
src/home.vue

@@ -458,6 +458,7 @@
 			</div>
 			<div style="margin-top: 10px;text-align: center;color: #666;">请使用钉钉APP扫描二维码</div>
 		</el-dialog>
+		
 		<examinePopup :title="'审核详情'" :id="detail_id" :show.sync="detailShow"></examinePopup>
 		<el-dialog class="dialog" :show-close="false" :visible.sync="dialogVisible" width="400px" >
 			<div style="height: 80px;background-image: linear-gradient(180deg, #01A2FE 0%, #0067FF 100%);

+ 1 - 0
src/index.vue

@@ -401,6 +401,7 @@ export default {
 				{ name: 'A/B分', children: this.returnRoutersArr('abPoint'), icon: 'icon-PC_gongzuotai_ABfen' },
 				{ name: '任务', children: this.returnRoutersArr('task'), icon: 'icon-kaoqin_kaoqinyuebaobiao' },
 				{ name: '统计', children: this.returnRoutersArr('ranking'), icon: 'icon-dingdingPC_tongji1' },
+				// { name: '奖票', children: this.returnRoutersArr('award'), icon: 'icon-piao' },
 			];
 			//this.$authoritys('权限名') 判断权限
 			if (this.$authoritys('creator') || this.$authoritys('admin') || this.$authoritys('point_manager') || this.$authoritys('dept_manager')) {

+ 16 - 4
src/main.js

@@ -3,11 +3,11 @@ import App from './App.vue'
 import router from './router'
 import store from './store'
 import ElementUI from 'element-ui';
-import moment from 'moment' // 时间库
 import 'element-ui/lib/theme-chalk/index.css';
+import moment from 'moment' // 时间库
 import * as dd from 'dingtalk-jsapi';
 import VConsole from 'vconsole'
-import './icons' // icon
+import './icons'
 import axios from 'axios'
 import service from './api/axios'
 import echarts from 'echarts'
@@ -15,12 +15,16 @@ import NProgress from 'nprogress';
 import 'nprogress/nprogress.css'
 import {returnDeptName, getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator,supremeAuthority,authoritys,getTypsName,generateUUID,getCache,setCache,removeCache} from './api/auth';
 import * as socketApi from './api/websocket'
+import print from "./api/print.js";
+Vue.use(print)
 
 // 头像
 import userImage from '@/components/UserImage'
-import noData from '@/components/noData'
+import NoData from '@/components/NoData'
+import BrawerBox from '@/components/BrawerBox';
+Vue.component('BrawerBox', BrawerBox)
 Vue.component('userImage', userImage)
-Vue.component('noData', noData)
+Vue.component('noData', NoData)
 Vue.use(ElementUI);
 if (process.env.NODE_ENV === 'development') {
   new VConsole()
@@ -46,6 +50,14 @@ Vue.prototype.$setCache = setCache
 Vue.prototype.$removeCache = removeCache
 Vue.prototype.$returnDeptName = returnDeptName
 
+// 上传相关
+Vue.prototype.$action = 'https://integralsys.oss-cn-shenzhen.aliyuncs.com'
+Vue.prototype.$acceptImg = 'image/jpeg,image/png'
+Vue.prototype.$acceptFile = 'application/pdf,application/vnd.ms-excel,application/msword,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+Vue.prototype.$acceptImgFile='image/jpeg,image/png,application/pdf,application/vnd.ms-excel,application/msword,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+Vue.prototype.$xtoken={ 'X-Token': getToken() };
+
+
 Vue.prototype.$http = service;
 var CancelToken = axios.CancelToken;
 Vue.$httpRequestList = [];

+ 59 - 2
src/router/index.js

@@ -102,6 +102,64 @@ const routes = [{
 					jurisdiction: ['employee'] //什么权限隐藏
 				}
 			},
+			
+			
+			{
+				path: '/grantAward',
+				name: '发放奖票',
+				component: () => import(/* webpackChunkName: "print" */'@/views/award/grantAward'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'award',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
+			{
+				path: '/myGrantAward',
+				name: '我发放的',
+				component: () => import(/* webpackChunkName: "print" */'@/views/award/myGrantAward'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'award',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
+			{
+				path: '/myAward',
+				name: '我的奖票',
+				component: () => import(/* webpackChunkName: "print" */'@/views/award/myAward'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'award',
+					jurisdiction: []
+				}
+			},
+			{
+				path: '/print',
+				name: '奖票打印',
+				component: () => import(/* webpackChunkName: "print" */'@/views/award/print'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'award',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
+			{
+				path: '/lotteryTicket_statistics',
+				name: '奖票统计',
+				component: () => import( /* webpackChunkName: "lotteryTicket_statistics" */
+					'@/views/award/lotteryTicket_statistics'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'award',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
+			
+			
+			
+			
+			
 			{
 				path: '/dept_rank',
 				name: '阶段排名',
@@ -209,8 +267,7 @@ const routes = [{
 			{
 				path: '/lotteryTicket_statistics',
 				name: '奖票统计',
-				component: () => import( /* webpackChunkName: "lotteryTicket_statistics" */
-					'@/views/ranking/lotteryTicket_statistics'),
+				component: () => import( /* webpackChunkName: "lotteryTicket_statistics" */'@/views/award/lotteryTicket_statistics'),
 				meta: {
 					icon: 'icon-shezhi_jichushezhi',
 					groupCode: 'ranking',

+ 1 - 1
src/views/abPoint/apply_list.vue

@@ -204,7 +204,7 @@
 				</el-row>
 		
 				<el-row v-show="detail_info2.rule_list">
-					<el-col :span="6">任务描述</el-col>
+					<el-col :span="6">事件内容</el-col>
 					<el-col :span="18" v-if="detail_info2.remark">{{ detail_info2.remark && (detail_info2.remark.customize || detail_info2.remark.rule) }}</el-col>
 				</el-row>
 		

+ 2 - 2
src/views/abPoint/award_punish.vue

@@ -113,7 +113,7 @@
 				</el-row>
 
 				<el-row :gutter="10">
-					<el-col :span="4">任务描述</el-col>
+					<el-col :span="4">事件内容</el-col>
 					<el-col :span="20" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
 				</el-row>
 
@@ -503,7 +503,7 @@ export default {
 					source_type: '1',
 					keyword: this.keyword,
 					employee_ids: this.select_employee_id,
-					order_key:'update_time'
+					// order_key:'update_time'
 				};
 			} else if (this.tabs == 'waiting') {
 				data = {

+ 830 - 0
src/views/abPoint/lottery_ticket.vue

@@ -0,0 +1,830 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<el-form ref="form" :inline="true" label-width="80px">
+				<el-form-item label="人员">
+					<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
+						<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="发放状态">
+					<el-select class="date-picker-width" size="medium" v-model="formData.status"  placeholder="请选择复核状态">
+						<el-option v-for="item in dcArr" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="相关性">
+					<el-select class="date-picker-width" size="medium" v-model="formData.status"  placeholder="请选择复核状态">
+						<el-option v-for="item in source_type" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="时间">
+					<el-date-picker
+						v-model="time_slot"
+						type="daterange"
+						size="medium"
+						value-format="yyyy-MM-dd"
+						range-separator="至"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+					></el-date-picker>
+				</el-form-item>
+				<el-form-item>
+					<el-input size="medium" v-model="formData.keyword" placeholder="输入关键字查找" max="200"></el-input>
+				</el-form-item>
+				<el-form-item>
+					<el-button class="first-element-btn" size="medium" v-if="employeeOrdept" :disabled="deleteDisabled" @click="deleteInBatches" type="danger">批量删除</el-button>
+				</el-form-item>
+
+				<div class="diy-tip1" style="margin-bottom: 10px;">
+					<div>当前数据:{{ total }}条</div>
+				</div>
+			</el-form>
+
+			<!-- 表格 -->
+			<div>
+				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
+					<el-table-column v-if="employeeOrdept" type="selection" width="55"></el-table-column>
+					<el-table-column prop="employee_name" label="姓名" align="left" min-width="125px">
+						<template slot-scope="scope">
+							<div class="flex-box">
+								<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="dept" show-overflow-tooltip label="部门" align="left" min-width="120px"></el-table-column>
+					<el-table-column prop="point" label="积分" align="left" min-width="120px">
+						<template slot-scope="scope">
+							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
+						<template slot-scope="scope">
+							<el-tooltip class="item" effect="dark" placement="top">
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>
+					<el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
+						<template slot-scope="scope">
+							{{ scope.row.event_time }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
+						<template slot-scope="scope">
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 2">任务</span>
+							<span v-show="scope.row.source_type == 3">积分系统分配</span>
+							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 6">绩效任务包</span>
+							<span v-show="scope.row.source_type == 8">积分导入</span>
+							<span v-show="scope.row.source_type == 9">A分转B分</span>
+							<span v-show="scope.row.source_type == 10">钉钉汇报(日志)奖扣分</span>
+							<span v-show="scope.row.source_type > 10">其他</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="update_time" label="录入时间" align="left" width="140px">
+						<template slot-scope="scope">
+							<!-- {{ cuttString(scope.row.create_time) }} -->
+							{{ scope.row.update_time }}
+						</template>
+					</el-table-column>
+
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center class="pagination">
+					<el-pagination
+						background
+						@size-change="handleSizeChange"
+						@current-change="handleCurrentChange"
+						:current-page="formData.page"
+						:page-sizes="[10, 20, 50, 100]"
+						layout="total, sizes, prev, pager, next"
+						:page-size="pageLimit"
+						:total="total"
+					></el-pagination>
+				</center>
+			</div>
+		</div>
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info.employee_name" :img_url="detail_info.img_url" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
+						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+					</div>
+				</el-row>
+
+				<el-row >
+					<el-col :span="6">事件内容</el-col>
+					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.files && detail_info.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<div v-show="detail_info.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">
+							{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10 && see_log">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="close_integral_event">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
+			</div>
+		</el-drawer>
+
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorC">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+
+	</div>
+</template>
+<script>
+import Steps from '@/components/Steps';
+import Review from '@/components/Review';
+import toLead from '@/components/toLead';
+export default {
+	data() {
+		return {
+			isDevelopment:process.env.NODE_ENV === 'development',
+			deleteDisabled: true,
+			action: process.env.VUE_APP_BASE_API + 'api/integral/import',
+			ATOKEN: { 'A-TOKEN': this.$getToken(), Accept: 'application/vnd.test.v2+json' },
+
+			loading: false,
+			page_size: 10,
+			point_types: this.$getTyps(),
+			dept_name: [],
+			dept_tree: [],
+			formData: {
+				page: 1,
+				page_size: 10,
+				status:1,
+				dc_status:JSON.stringify([1]),
+				// order_key:'update_time',
+			},
+			time_slot: null,
+			rule_trees: [],
+			props: { checkStrictly: true, value: 'id', label: 'name', children: 'child' },
+			rule: [],
+			list: [],
+			total: null,
+			detail_info: null,
+			detail_popup: false,
+			detail_loading: false,
+			pageLimit: 10,
+			excelImportShow: false,
+			update_btn: false,
+			error_list: [],
+			importErrorInfoShow: false,
+			fileList: [],
+			employeeOrdept: !this.$authoritys('employee') && !this.$authoritys('dept_manager'),
+			select_employee_id: '',
+			employee_map: [],
+			selectionID: [], //删除的事件ID
+			// 查看日志
+			showLog: false,
+			see_log: 1,
+			ding_report: {
+				contents: [],
+				images: []
+			},
+			source_type: [
+			  { id: 0, name: '我奖扣的' },
+			  { id: 1, name: '全部事件' },
+			],
+			dcArr: [
+			  { id: 0, name: '全部' },
+			  { id: 1, name: '已发放' },
+			  { id: 2, name: '未放发' },
+			],
+			u_start:null
+		};
+	},
+	components: { Steps, toLead,Review },
+	created() {
+		this.getEmployee();
+	},
+	mounted() {
+		this.deriveRestrict();
+		this.getDepartment();
+		this.get_rule_trees();
+		this.get_integral_list(this.formData);
+		this.see_log = this.$store.state.config.see_log;
+		this.point_types = this.getTypes();
+	},
+	watch: {
+		selectionID() {
+			if (this.selectionID.length == 0) {
+				this.deleteDisabled = true;
+			} else {
+				this.deleteDisabled = false;
+			}
+		},
+		'formData.pt_id'(val, old_val) {
+			this.formData.page = 1;
+			!val ? delete this.formData.pt_id : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.status'(val) {
+			this.formData.dc_status=JSON.stringify([val]);
+			// if(val==0){
+			// 	this.formData.dc_status=JSON.stringify([1,2]);
+			// }else if(val==1){
+			// 	this.formData.dc_status=JSON.stringify([1]);
+			// }else{
+			// 	this.formData.dc_status=JSON.stringify([2]);
+			// }
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		'formData.page'(val, old_val) {
+			this.get_integral_list(this.formData);
+		},
+		select_employee_id(val) {
+		  this.formData.page = 1;
+		  this.formData.employee_ids = val;
+		  this.get_integral_list(this.formData);
+		},
+		time_slot(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.start_day = val[0];
+				this.formData.end_day = val[1];
+			} else {
+				delete this.formData.start_day;
+				delete this.formData.end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		u_start(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.u_start_day = val[0];
+				this.formData.u_end_day = val[1];
+			} else {
+				delete this.formData.u_start_day;
+				delete this.formData.u_end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		dept_name(val, old_val) {
+			this.formData.page = 1;
+			if (val.length !== 0) {
+				this.formData.dept_ids = val[val.length - 1];
+			} else {
+				this.formData.dept_ids = 0;
+			}
+			this.$nextTick(() => {
+				this.$refs.dept.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+	},
+	methods: {
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
+		deriveRestrict() {
+			this.deriveNum = 0;
+			this.$axios('GET', '/api/site/info').then(res => {
+				if (res.data.code == 1) {
+					this.deriveNum = Number(res.data.data.export_max_num);
+				}
+			});
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		handleRemove(file, fileList) {
+			// if (fileList !== null && fileList.length != 0) {
+			// 	this.import_btn_show = true;
+			// } else {
+			// 	this.import_btn_show = false;
+			// }
+		},
+		// 导入相关
+		close_import() {
+			this.excelImportShow = false;
+			this.$refs.upload.clearFiles();
+		},
+		// keyword
+		keyWordSelect() {
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		downloadTemplate() {
+			window.open(process.env.VUE_APP_BASE_API + 'api/download/integral/template');
+		},
+		uploadFile() {
+			let params = {};
+			params.file = this.file;
+			this.update_btn = true;
+			this.$axios('post', '/api/integral/import', params, 'v2')
+				.then(res => {
+					if (res.data.code == 1) {
+						if (res.data.data.error.length == 0) {
+							this.$message({ type: 'success', message: '导入成功' });
+							this.excelImportShow = false;
+						} else {
+							this.$message({ type: 'error', message: '导入错误' });
+							this.error_list = res.data.data.error;
+							this.importErrorInfoShow = true;
+						}
+					} else {
+						this.$message({ type: 'error', message: res.data.msg });
+					}
+				})
+				.finally(() => {
+					setTimeout(() => {
+						this.update_btn = false;
+					}, 3000);
+				});
+		},
+		tealConfirm() {
+			this.keyWordSelect();
+		},
+		handleOnthecross(event, file, fileList) {
+			this.nowIndex = 2;
+		},
+		handlePictureCardPrediv(response) {
+			if (response.code == 1) {
+				response.data.id = 1;
+			} else {
+				response.data.id = 0;
+				response.data.name = response.msg;
+			}
+			this.toleadResult = response.data;
+			this.nowIndex = 3;
+			return;
+			// this.nowIndex = 3
+			if (response.code == 1) {
+				if (response.data.error.length > 0) {
+					var htmls = response.data.error;
+					var str = "<div class='red'></div>";
+					htmls.forEach(item => {
+						str += `<div>${item}</div>`;
+					});
+					// this.close_import();
+					this.$notify.error({
+						title: '导入错误',
+						dangerouslyUseHTMLString: true,
+						message: str,
+						duration: 0,
+						offset: 50,
+						customClass: 'notifyBox'
+					});
+				} else {
+					this.file = response.data;
+					this.$message.success({ message: response.msg });
+					this.keyWordSelect();
+					this.close_import();
+				}
+			} else {
+				this.$message.error({ message: response.msg });
+			}
+		},
+		beforeFilesUpload(file) {
+			const $ext_list = ['xlsx', 'xls'];
+			let len = file.name.split('.').length - 1;
+			const $ext_name = file.name.split('.')[len];
+			if ($ext_list.indexOf($ext_name) != -1) {
+			} else {
+				this.toleadResult.id = 0;
+				this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)';
+				this.nowIndex = 3;
+				// this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
+				return false;
+			}
+		},
+		exportExcel() {
+			if (this.deriveNum > 0 && this.total >= this.deriveNum) {
+				this.$message.warning('当前数据已超出' + this.deriveNum + '条,请拆分时间段分批导出');
+				return;
+			}
+			window.open(
+				process.env.VUE_APP_BASE_API +
+					'api/download/integral?employee_id=' +
+					this.$getUserData().id +
+					'&page=' +
+					this.formData.page +
+					'&page_size=' +	
+					this.formData.page_size +
+					(this.formData.employee_ids ? '&employee_ids=' + this.formData.employee_ids : '') +
+					(this.formData.rule_id ? '&rule_id=' + this.formData.rule_id : '') +
+					(this.formData.pt_id ? '&pt_id=' + this.formData.pt_id : '') +
+					(this.formData.dept_ids ? '&dept_ids=' + this.formData.dept_ids : '') +
+					(this.formData.start_day ? '&start_day=' + this.formData.start_day : '') +
+					(this.formData.end_day ? '&end_day=' + this.formData.end_day : '') +
+					(this.formData.dc_status ? '&dc_status=' + this.formData.dc_status : '') +
+					(this.formData.keyword ? '&keyword=' + this.formData.keyword : ''),
+				'_blank'
+			);
+		},
+		// end 文件上传
+		handleSizeChange(val) {
+			this.pageLimit = val;
+			this.formData.page_size = this.pageLimit;
+			this.get_integral_list(this.formData);
+		},
+		cuttString(data) {
+			return data.substring(5);
+		},
+		deleteInBatches() {
+			if (this.selectionID.length < 1) {
+				return false;
+			}
+			this.$confirm('此操作将永久删除选中的积分事件, 确认要删除吗?', '批量删除事件', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			})
+				.then(() => {
+					this.loading = true;
+					this.$axios('POST', '/api/integral/statistics/integral/many', { event_ids: this.selectionID })
+						.then(res => {
+							if (res.data.code == 1) {
+								this.$message({
+									message: res.data.msg,
+									type: 'success'
+								});
+								if (this.selectionID.length == this.list.length) {
+									if (this.formData.page > 1) {
+										this.formData.page = this.formData.page - 1;
+									}
+								}
+								this.get_integral_list(this.formData);
+							} else {
+								this.$message.error(res.data.msg);
+							}
+						})
+						.finally(() => {
+							this.loading = false;
+						});
+				})
+				.catch(() => {});
+		},
+		deleteEvents(selection) {
+			let listId = [];
+			selection.forEach(item => {
+				listId.push(item.id);
+			});
+			this.selectionID = listId;
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		//获取规则
+		get_rule_trees() {
+			this.$axios('get', '/api/integral/rule/trees').then(res => {
+				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
+			});
+		},
+		get_integral_list(data) {
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/integral', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.list = res.data.data.list;
+						if(data.page==1){
+							this.total = res.data.data.total;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.loading = false;
+				});
+		},
+		handleCurrentChange(val) {
+			this.formData.page = val;
+		},
+		rule_null(val) {
+			if (val.length == 0) {
+				this.formData.rule_id = 0;
+			} else {
+				this.formData.rule_id = this.rule[this.rule.length - 1];
+			}
+			this.$nextTick(() => {
+				this.$refs.rule.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_integral_list(this.formData);
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		close_integral_event() {
+			this.detail_popup = false;
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 规则递归 children
+		getRuleTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i].child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i].child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getRuleTreeData(data[i].child);
+				}
+			}
+			return data;
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+.remark {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+}
+.title {
+	text-align: center;
+	font-weight: 700;
+	max-width: 70%;
+	margin: 20px auto;
+	margin-top: 0;
+	font-size: 18px;
+}
+.key {
+	font-weight: 700;
+	font-size: 16px;
+}
+.value {
+	font-size: 14px;
+	margin: 10px 0;
+	margin-bottom: 20px;
+}
+.imgs {
+	width: 80px;
+	height: 80px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+}
+header.el-drawer__header {
+	font-size: 18px;
+	font-family: MicrosoftYaHei;
+	color: #303133;
+	width: 500px;
+	span {
+		:focus {
+			outline: 0;
+		}
+	}
+}
+.display_flex {
+	display: flex;
+}
+.label {
+	line-height: 36px;
+	padding-right: 10px;
+}
+.time_section {
+	.el-range-editor {
+		width: 330px;
+	}
+}
+.pagination {
+	padding: 20px 0;
+}
+.detail_popup {
+	padding: 20px;
+	height: calc(100vh - 140px);
+	overflow: auto;
+	padding-bottom: 100px;
+	.row_title {
+		position: relative;
+		margin: 0 0 20px 0;
+		padding-top: 12px;
+		font-size: 16px;
+		color: #303133;
+		line-height: 22px;
+	}
+	.row_title:before {
+		position: absolute;
+		top: 0;
+		content: ' ';
+		width: 100%;
+		border-top: 1px #f8f8f8 solid;
+	}
+	.el-row {
+		margin-bottom: 10px;
+		font-size: 14px;
+		.el-col-4 {
+			color: #606266;
+		}
+	}
+}
+span.point {
+	font-size: 16px;
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+	border-bottom: 1px #efefef solid;
+}
+.row_tips {
+	display: block;
+	color: #909399;
+	font-size: 12px;
+	margin-top: 0px;
+}
+.el-range-editor--medium .el-range-separator {
+	width: 25px;
+}
+.integral_event_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+}
+.examine_steps ::v-deep .el-step.is-vertical .el-step__title {
+	padding-bottom: 0;
+}
+
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #67c23a !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+</style>

+ 830 - 0
src/views/award/grantAward.vue

@@ -0,0 +1,830 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<el-form ref="form" :inline="true" label-width="80px">
+				<el-form-item label="人员">
+					<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
+						<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="发放状态">
+					<el-select class="date-picker-width" size="medium" v-model="formData.status"  placeholder="请选择复核状态">
+						<el-option v-for="item in dcArr" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="相关性">
+					<el-select class="date-picker-width" size="medium" v-model="formData.status"  placeholder="请选择复核状态">
+						<el-option v-for="item in source_type" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="时间">
+					<el-date-picker
+						v-model="time_slot"
+						type="daterange"
+						size="medium"
+						value-format="yyyy-MM-dd"
+						range-separator="至"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+					></el-date-picker>
+				</el-form-item>
+				<el-form-item>
+					<el-input size="medium" v-model="formData.keyword" placeholder="输入关键字查找" max="200"></el-input>
+				</el-form-item>
+				<el-form-item>
+					<el-button class="first-element-btn" size="medium" v-if="employeeOrdept" :disabled="deleteDisabled" @click="deleteInBatches" type="danger">批量删除</el-button>
+				</el-form-item>
+
+				<div class="diy-tip1" style="margin-bottom: 10px;">
+					<div>当前数据:{{ total }}条</div>
+				</div>
+			</el-form>
+
+			<!-- 表格 -->
+			<div>
+				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
+					<el-table-column v-if="employeeOrdept" type="selection" width="55"></el-table-column>
+					<el-table-column prop="employee_name" label="姓名" align="left" min-width="125px">
+						<template slot-scope="scope">
+							<div class="flex-box">
+								<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="dept" show-overflow-tooltip label="部门" align="left" min-width="120px"></el-table-column>
+					<el-table-column prop="point" label="积分" align="left" min-width="120px">
+						<template slot-scope="scope">
+							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
+						<template slot-scope="scope">
+							<el-tooltip class="item" effect="dark" placement="top">
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>
+					<el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
+						<template slot-scope="scope">
+							{{ scope.row.event_time }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
+						<template slot-scope="scope">
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 2">任务</span>
+							<span v-show="scope.row.source_type == 3">积分系统分配</span>
+							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 6">绩效任务包</span>
+							<span v-show="scope.row.source_type == 8">积分导入</span>
+							<span v-show="scope.row.source_type == 9">A分转B分</span>
+							<span v-show="scope.row.source_type == 10">钉钉汇报(日志)奖扣分</span>
+							<span v-show="scope.row.source_type > 10">其他</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="update_time" label="录入时间" align="left" width="140px">
+						<template slot-scope="scope">
+							<!-- {{ cuttString(scope.row.create_time) }} -->
+							{{ scope.row.update_time }}
+						</template>
+					</el-table-column>
+
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center class="pagination">
+					<el-pagination
+						background
+						@size-change="handleSizeChange"
+						@current-change="handleCurrentChange"
+						:current-page="formData.page"
+						:page-sizes="[10, 20, 50, 100]"
+						layout="total, sizes, prev, pager, next"
+						:page-size="pageLimit"
+						:total="total"
+					></el-pagination>
+				</center>
+			</div>
+		</div>
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info.employee_name" :img_url="detail_info.img_url" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
+						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+					</div>
+				</el-row>
+
+				<el-row >
+					<el-col :span="6">事件内容</el-col>
+					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.files && detail_info.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<div v-show="detail_info.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">
+							{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10 && see_log">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="close_integral_event">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
+			</div>
+		</el-drawer>
+
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorC">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+
+	</div>
+</template>
+<script>
+import Steps from '@/components/Steps';
+import Review from '@/components/Review';
+import toLead from '@/components/toLead';
+export default {
+	data() {
+		return {
+			isDevelopment:process.env.NODE_ENV === 'development',
+			deleteDisabled: true,
+			action: process.env.VUE_APP_BASE_API + 'api/integral/import',
+			ATOKEN: { 'A-TOKEN': this.$getToken(), Accept: 'application/vnd.test.v2+json' },
+
+			loading: false,
+			page_size: 10,
+			point_types: this.$getTyps(),
+			dept_name: [],
+			dept_tree: [],
+			formData: {
+				page: 1,
+				page_size: 10,
+				status:1,
+				dc_status:JSON.stringify([1]),
+				// order_key:'update_time',
+			},
+			time_slot: null,
+			rule_trees: [],
+			props: { checkStrictly: true, value: 'id', label: 'name', children: 'child' },
+			rule: [],
+			list: [],
+			total: null,
+			detail_info: null,
+			detail_popup: false,
+			detail_loading: false,
+			pageLimit: 10,
+			excelImportShow: false,
+			update_btn: false,
+			error_list: [],
+			importErrorInfoShow: false,
+			fileList: [],
+			employeeOrdept: !this.$authoritys('employee') && !this.$authoritys('dept_manager'),
+			select_employee_id: '',
+			employee_map: [],
+			selectionID: [], //删除的事件ID
+			// 查看日志
+			showLog: false,
+			see_log: 1,
+			ding_report: {
+				contents: [],
+				images: []
+			},
+			source_type: [
+			  { id: 0, name: '我奖扣的' },
+			  { id: 1, name: '全部事件' },
+			],
+			dcArr: [
+			  { id: 0, name: '全部' },
+			  { id: 1, name: '已发放' },
+			  { id: 2, name: '未放发' },
+			],
+			u_start:null
+		};
+	},
+	components: { Steps, toLead,Review },
+	created() {
+		this.getEmployee();
+	},
+	mounted() {
+		this.deriveRestrict();
+		this.getDepartment();
+		this.get_rule_trees();
+		this.get_integral_list(this.formData);
+		this.see_log = this.$store.state.config.see_log;
+		this.point_types = this.getTypes();
+	},
+	watch: {
+		selectionID() {
+			if (this.selectionID.length == 0) {
+				this.deleteDisabled = true;
+			} else {
+				this.deleteDisabled = false;
+			}
+		},
+		'formData.pt_id'(val, old_val) {
+			this.formData.page = 1;
+			!val ? delete this.formData.pt_id : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.status'(val) {
+			this.formData.dc_status=JSON.stringify([val]);
+			// if(val==0){
+			// 	this.formData.dc_status=JSON.stringify([1,2]);
+			// }else if(val==1){
+			// 	this.formData.dc_status=JSON.stringify([1]);
+			// }else{
+			// 	this.formData.dc_status=JSON.stringify([2]);
+			// }
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		'formData.page'(val, old_val) {
+			this.get_integral_list(this.formData);
+		},
+		select_employee_id(val) {
+		  this.formData.page = 1;
+		  this.formData.employee_ids = val;
+		  this.get_integral_list(this.formData);
+		},
+		time_slot(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.start_day = val[0];
+				this.formData.end_day = val[1];
+			} else {
+				delete this.formData.start_day;
+				delete this.formData.end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		u_start(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.u_start_day = val[0];
+				this.formData.u_end_day = val[1];
+			} else {
+				delete this.formData.u_start_day;
+				delete this.formData.u_end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		dept_name(val, old_val) {
+			this.formData.page = 1;
+			if (val.length !== 0) {
+				this.formData.dept_ids = val[val.length - 1];
+			} else {
+				this.formData.dept_ids = 0;
+			}
+			this.$nextTick(() => {
+				this.$refs.dept.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+	},
+	methods: {
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
+		deriveRestrict() {
+			this.deriveNum = 0;
+			this.$axios('GET', '/api/site/info').then(res => {
+				if (res.data.code == 1) {
+					this.deriveNum = Number(res.data.data.export_max_num);
+				}
+			});
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		handleRemove(file, fileList) {
+			// if (fileList !== null && fileList.length != 0) {
+			// 	this.import_btn_show = true;
+			// } else {
+			// 	this.import_btn_show = false;
+			// }
+		},
+		// 导入相关
+		close_import() {
+			this.excelImportShow = false;
+			this.$refs.upload.clearFiles();
+		},
+		// keyword
+		keyWordSelect() {
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		downloadTemplate() {
+			window.open(process.env.VUE_APP_BASE_API + 'api/download/integral/template');
+		},
+		uploadFile() {
+			let params = {};
+			params.file = this.file;
+			this.update_btn = true;
+			this.$axios('post', '/api/integral/import', params, 'v2')
+				.then(res => {
+					if (res.data.code == 1) {
+						if (res.data.data.error.length == 0) {
+							this.$message({ type: 'success', message: '导入成功' });
+							this.excelImportShow = false;
+						} else {
+							this.$message({ type: 'error', message: '导入错误' });
+							this.error_list = res.data.data.error;
+							this.importErrorInfoShow = true;
+						}
+					} else {
+						this.$message({ type: 'error', message: res.data.msg });
+					}
+				})
+				.finally(() => {
+					setTimeout(() => {
+						this.update_btn = false;
+					}, 3000);
+				});
+		},
+		tealConfirm() {
+			this.keyWordSelect();
+		},
+		handleOnthecross(event, file, fileList) {
+			this.nowIndex = 2;
+		},
+		handlePictureCardPrediv(response) {
+			if (response.code == 1) {
+				response.data.id = 1;
+			} else {
+				response.data.id = 0;
+				response.data.name = response.msg;
+			}
+			this.toleadResult = response.data;
+			this.nowIndex = 3;
+			return;
+			// this.nowIndex = 3
+			if (response.code == 1) {
+				if (response.data.error.length > 0) {
+					var htmls = response.data.error;
+					var str = "<div class='red'></div>";
+					htmls.forEach(item => {
+						str += `<div>${item}</div>`;
+					});
+					// this.close_import();
+					this.$notify.error({
+						title: '导入错误',
+						dangerouslyUseHTMLString: true,
+						message: str,
+						duration: 0,
+						offset: 50,
+						customClass: 'notifyBox'
+					});
+				} else {
+					this.file = response.data;
+					this.$message.success({ message: response.msg });
+					this.keyWordSelect();
+					this.close_import();
+				}
+			} else {
+				this.$message.error({ message: response.msg });
+			}
+		},
+		beforeFilesUpload(file) {
+			const $ext_list = ['xlsx', 'xls'];
+			let len = file.name.split('.').length - 1;
+			const $ext_name = file.name.split('.')[len];
+			if ($ext_list.indexOf($ext_name) != -1) {
+			} else {
+				this.toleadResult.id = 0;
+				this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)';
+				this.nowIndex = 3;
+				// this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
+				return false;
+			}
+		},
+		exportExcel() {
+			if (this.deriveNum > 0 && this.total >= this.deriveNum) {
+				this.$message.warning('当前数据已超出' + this.deriveNum + '条,请拆分时间段分批导出');
+				return;
+			}
+			window.open(
+				process.env.VUE_APP_BASE_API +
+					'api/download/integral?employee_id=' +
+					this.$getUserData().id +
+					'&page=' +
+					this.formData.page +
+					'&page_size=' +	
+					this.formData.page_size +
+					(this.formData.employee_ids ? '&employee_ids=' + this.formData.employee_ids : '') +
+					(this.formData.rule_id ? '&rule_id=' + this.formData.rule_id : '') +
+					(this.formData.pt_id ? '&pt_id=' + this.formData.pt_id : '') +
+					(this.formData.dept_ids ? '&dept_ids=' + this.formData.dept_ids : '') +
+					(this.formData.start_day ? '&start_day=' + this.formData.start_day : '') +
+					(this.formData.end_day ? '&end_day=' + this.formData.end_day : '') +
+					(this.formData.dc_status ? '&dc_status=' + this.formData.dc_status : '') +
+					(this.formData.keyword ? '&keyword=' + this.formData.keyword : ''),
+				'_blank'
+			);
+		},
+		// end 文件上传
+		handleSizeChange(val) {
+			this.pageLimit = val;
+			this.formData.page_size = this.pageLimit;
+			this.get_integral_list(this.formData);
+		},
+		cuttString(data) {
+			return data.substring(5);
+		},
+		deleteInBatches() {
+			if (this.selectionID.length < 1) {
+				return false;
+			}
+			this.$confirm('此操作将永久删除选中的积分事件, 确认要删除吗?', '批量删除事件', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			})
+				.then(() => {
+					this.loading = true;
+					this.$axios('POST', '/api/integral/statistics/integral/many', { event_ids: this.selectionID })
+						.then(res => {
+							if (res.data.code == 1) {
+								this.$message({
+									message: res.data.msg,
+									type: 'success'
+								});
+								if (this.selectionID.length == this.list.length) {
+									if (this.formData.page > 1) {
+										this.formData.page = this.formData.page - 1;
+									}
+								}
+								this.get_integral_list(this.formData);
+							} else {
+								this.$message.error(res.data.msg);
+							}
+						})
+						.finally(() => {
+							this.loading = false;
+						});
+				})
+				.catch(() => {});
+		},
+		deleteEvents(selection) {
+			let listId = [];
+			selection.forEach(item => {
+				listId.push(item.id);
+			});
+			this.selectionID = listId;
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		//获取规则
+		get_rule_trees() {
+			this.$axios('get', '/api/integral/rule/trees').then(res => {
+				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
+			});
+		},
+		get_integral_list(data) {
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/integral', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.list = res.data.data.list;
+						if(data.page==1){
+							this.total = res.data.data.total;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.loading = false;
+				});
+		},
+		handleCurrentChange(val) {
+			this.formData.page = val;
+		},
+		rule_null(val) {
+			if (val.length == 0) {
+				this.formData.rule_id = 0;
+			} else {
+				this.formData.rule_id = this.rule[this.rule.length - 1];
+			}
+			this.$nextTick(() => {
+				this.$refs.rule.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_integral_list(this.formData);
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		close_integral_event() {
+			this.detail_popup = false;
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 规则递归 children
+		getRuleTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i].child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i].child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getRuleTreeData(data[i].child);
+				}
+			}
+			return data;
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+.remark {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+}
+.title {
+	text-align: center;
+	font-weight: 700;
+	max-width: 70%;
+	margin: 20px auto;
+	margin-top: 0;
+	font-size: 18px;
+}
+.key {
+	font-weight: 700;
+	font-size: 16px;
+}
+.value {
+	font-size: 14px;
+	margin: 10px 0;
+	margin-bottom: 20px;
+}
+.imgs {
+	width: 80px;
+	height: 80px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+}
+header.el-drawer__header {
+	font-size: 18px;
+	font-family: MicrosoftYaHei;
+	color: #303133;
+	width: 500px;
+	span {
+		:focus {
+			outline: 0;
+		}
+	}
+}
+.display_flex {
+	display: flex;
+}
+.label {
+	line-height: 36px;
+	padding-right: 10px;
+}
+.time_section {
+	.el-range-editor {
+		width: 330px;
+	}
+}
+.pagination {
+	padding: 20px 0;
+}
+.detail_popup {
+	padding: 20px;
+	height: calc(100vh - 140px);
+	overflow: auto;
+	padding-bottom: 100px;
+	.row_title {
+		position: relative;
+		margin: 0 0 20px 0;
+		padding-top: 12px;
+		font-size: 16px;
+		color: #303133;
+		line-height: 22px;
+	}
+	.row_title:before {
+		position: absolute;
+		top: 0;
+		content: ' ';
+		width: 100%;
+		border-top: 1px #f8f8f8 solid;
+	}
+	.el-row {
+		margin-bottom: 10px;
+		font-size: 14px;
+		.el-col-4 {
+			color: #606266;
+		}
+	}
+}
+span.point {
+	font-size: 16px;
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+	border-bottom: 1px #efefef solid;
+}
+.row_tips {
+	display: block;
+	color: #909399;
+	font-size: 12px;
+	margin-top: 0px;
+}
+.el-range-editor--medium .el-range-separator {
+	width: 25px;
+}
+.integral_event_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+}
+.examine_steps ::v-deep .el-step.is-vertical .el-step__title {
+	padding-bottom: 0;
+}
+
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #67c23a !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+</style>

+ 321 - 0
src/views/award/lotteryTicket_statistics.vue

@@ -0,0 +1,321 @@
+<template>
+  <div>
+    <div class="flex-box flex-d-center">
+	  <div class="flex-box-ce">
+		  <div><el-date-picker v-model="formData.month" type="month" placeholder="请选择月份" value-format="yyyy-MM"></el-date-picker></div>
+		  <div style="width:200px;margin: 0 10px;">
+		    <el-cascader
+		      v-model="dept_name"
+		      :options="dept_tree"
+		      @change="dept1_null"
+		      :props="{
+		        checkStrictly: true,
+		        value: 'id',
+		        label: 'name',
+		        children: '_child',
+		      }"
+		      ref="dept1"
+		      filterable
+		      change-on-select
+		      placeholder="全公司"
+		      clearable
+		    ></el-cascader>
+		  </div>
+		  <div class="search">
+		    <el-input v-model="formData.keywords"  placeholder="输入同事姓名"  @keyup.enter.native="get_all_integral"><el-button class="buttonCLo" slot="append" @click="get_all_integral" icon="el-icon-search"></el-button></el-input>
+		  </div>
+	  </div>
+	  <!-- <div><el-button type="primary" plain size="medium" style="margin-left:20px">打印奖票</el-button></div> -->
+    </div>
+
+    <div class="all">
+      <div>
+        <el-table :data="all_integral_list" style="width: 100%" v-loading="loading">
+          <el-table-column prop="employee_name" label="姓名" align="left" width="200">
+            <template slot-scope="scope">
+              <div style="display:flex">
+                <span class="fl">
+                  <userImage  width="50px"  height="50px" fontSize="1" :user_name="scope.row.name" :img_url="scope.row.img_url"></userImage>
+                </span>
+                <span style="margin-left: 20px; line-height: 50px; display: inline-block">{{ scope.row.name }}</span >
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="performance" label="部门" align="left">
+            <template slot-scope="scope">
+              <span>{{ scope.row.dept_name }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="a" label="奖票数量" align="left">
+            <template slot-scope="scope">
+              <span>{{ scope.row.ticketNumber }}</span>
+            </template>
+          </el-table-column>
+<!-- 		  <el-table-column width="150">
+		  	<template slot-scope="scope">
+		  		<span  class="blue" style="cursor: pointer;" @click="openTable(scope.row)">查看奖票明细</span>
+		  	</template>
+		  </el-table-column> -->
+          <template slot="empty">
+            <noData></noData>
+          </template>
+        </el-table>
+        <center style="padding: 20px 0;">
+          <el-pagination background   @size-change="handleSizeChange" @current-change="handleCurrentChange"  :current-page="formData.page" 
+		  :page-sizes="[10, 20, 50, 100]"  layout="total, sizes, prev, pager, next" :page-size="pageLimit1"   :total="total"> 
+		  </el-pagination>
+        </center>
+      </div>
+    </div>
+  
+	<!-- 对齐我的目标详情 -->
+	<el-dialog title="临时奖扣分明细" :visible.sync="isShowTable" :append-to-body="true" width="1000px" top="5%">
+	  <div>
+	      <div>
+	        <el-table :data="tableList" style="width: 100%;" v-loading="loading">
+	            <el-table-column prop="name" min-width="300" label="奖扣记录">
+	              <template slot-scope="scope">
+	                 <span>{{scope.row.remark.item_name}}</span>
+	              </template>
+	            </el-table-column>
+	            <el-table-column prop="point" label="分值">
+	              <template slot-scope="scope">
+	                 <span :class="scope.row.point>0?'red':'green'"><span v-if="scope.row.point>0">+</span> {{scope.row.point}}分</span>
+	              </template>
+	            </el-table-column>
+	            <el-table-column prop="ct" label="创建时间"></el-table-column>
+	            <el-table-column label="操作">
+	              <template slot-scope="scope">
+	                 <el-link type="primary" :underline="false" @click="openDetail(scope.row)">查看详情</el-link>
+	              </template>
+	            </el-table-column>
+	            <template slot="empty">
+	            	<noData></noData>
+	            </template>
+	        </el-table>
+	      </div>
+	      <el-pagination style="text-align: center;margin-top: 20px;"  :current-page.sync="page" :page-sizes="[5,10,15]"  layout="total,prev,pager,next,sizes" :total="total" @size-change="handleSizeChange2"  @current-change="handleCurrentChange2" :page-size="page_size"></el-pagination>
+	  </div>
+	  <div class="flex-box-end" style="margin-top: 20px;">
+	  	<el-button @click="isShowTable=false">关 闭</el-button>
+	  </div>
+	</el-dialog>
+	
+	<!-- 检查单详情 -->
+	<BrawerBox :showDrawer.sync="isShowDetail"  drawerTitle="奖扣分详情">
+	  <template slot="main">
+	    <div>
+	      <div class="flex-box-v">
+	        <div class="message-box">
+	          <div class="flex-box-ce">
+	            <div class="fontColorC">奖扣分对象</div>
+	            <!-- <div class="flex-1">{{$getEmployeeMapItem(detail.employee_id).name}}</div> -->
+	          </div>
+	          <div class="flex-box-ce">
+	            <div class="fontColorC">分值</div>
+	            <div class="flex-1" :class="detail.point>0?'red':'green'"><span v-if="detail.point>0">+</span>{{detail.point}}分</div>
+	          </div>
+	          <div class="flex-box-ce">
+	            <div class="fontColorC">备注</div>
+	            <div class="flex-1">{{detail.remark.remark||'无'}}</div>
+	          </div>
+	          <div v-if="detail.files.length>0" class="flex-box">
+	              <div class="fontColorC">图片</div>
+	              <div class="files-box flex-box-ce" v-for="(f,index) in detail.files" :key="index" style="margin-right: 10px;">
+	                <el-image style="width: 40px; height: 40px;cursor: pointer;border-radius: 5px;" :src="f.file" :preview-src-list="[f.file]"></el-image>
+	              </div>
+	          </div>
+	          <div class="flex-box-ce">
+	            <div class="fontColorC">提交人</div>
+	            <!-- <div class="flex-1">{{$getEmployeeMapItem(detail.publisher_id).name}}</div> -->
+	          </div>
+	          <div class="flex-box-ce">
+	            <div class="fontColorC">提交时间</div>
+	            <div class="flex-1">{{ detail.ct }}</div>
+	          </div>
+	        </div>
+	      </div>
+	      <div class="message-box" style="margin-top: 20px;">
+	        <div class="label">检查标准</div>
+	        <div class="flex-box">
+	          <div class="fontColorC">检查项</div>
+	          <div class="flex-1">{{detail.remark.item_name}}</div>
+	        </div>
+	        <div class="flex-box" style="margin: 16px 0;">
+	          <div class="fontColorC">标准分值</div>
+	          <div class="flex-1">{{Math.abs(detail.point)}}分</div>
+	        </div>
+	        <div class="flex-box">
+	          <div class="fontColorC">检查项内容</div>
+	          <div class="flex-1">{{detail.remark.item_desc}}</div>
+	        </div>
+	      </div>
+	    </div>
+	  </template>
+	  <template slot="footer">
+	      <el-button type="danger" v-if="detail.can_delete" plain @click="deleteUser">删除</el-button>
+	      <div class="flex-1"></div>
+	      <el-button  plain @click="isShowDetail=false">关 闭</el-button>
+	  </template>
+	</BrawerBox>
+  </div>
+</template>
+<script>
+
+export default {
+  data() {
+    return {
+      loading: false,
+      all_integral_list: null,
+      formData: {
+        month: this.$moment().format("YYYY-MM"),
+        keywords: "",
+        dept_id: "",
+        page: 1,
+        page_size: 10
+      },
+      total: 0,
+      //部门
+      dept_name: [],
+      dept_tree: [],
+      pageLimit1: 10,
+	  
+	  page: 1,
+	  total: 0,
+	  page_size: 10,
+	  isShowTable:false,
+	  tableList:[],
+	  isShowDetail:false,
+	  detail:{remark:{},files:[]},
+    };
+  },
+  watch: {
+    "formData.month"(val, old_val) {
+      this.formData.page = 1;
+      this.get_all_integral();
+    },
+    "formData.dept_id"(val, old_val) {
+      if (!val) {
+        this.formData.dept_id = 0;
+      }
+      this.formData.page = 1;
+      this.get_all_integral();
+    }
+  },
+  mounted() {
+    this.get_all_integral();
+    this.getDepartment(); //部门
+  },
+  methods: {
+	openTable(item){
+		this.isShowDetail=true;
+	},
+	openDetail(item){
+		
+	},
+	//分页
+	handleSizeChange2(val) {
+	  this.pageLimit1 = val;
+	  this.formData.page_size = this.pageLimit1;
+	  this.get_all_integral();
+	},
+	handleCurrentChange2(val) {
+	  this.formData.page = val;
+	  this.get_all_integral();
+	},
+    //分页
+    handleSizeChange(val) {
+      this.pageLimit1 = val;
+      this.formData.page_size = this.pageLimit1;
+      this.get_all_integral();
+    },
+    handleCurrentChange(val) {
+      this.formData.page = val;
+      this.get_all_integral();
+    },
+    //请求数据
+    get_all_integral() {
+      this.loading = true;
+      this.$axios("get", "/api/integral/statistics/ticket", this.formData).then(res => {
+          if (res.data.code == 1) {
+            this.all_integral_list = res.data.data.list;
+            this.total = res.data.data.total;
+          } else {
+            this.$message.error(res.data.data.msg);
+          }
+        }).finally(() => {
+          this.loading = false;
+        });
+    },
+    dept1_null(val) {
+      //部门
+      if (val.length == 0) {
+        this.formData.dept_id = 0;
+      } else {
+        this.formData.dept_id = this.dept_name[this.dept_name.length - 1];
+      }
+      this.$nextTick(() => {
+        this.$refs.dept1.dropDownVisible = false;
+      });
+    },
+    //获取部门
+    getDepartment() {
+      this.$axios("get", "/api/department/tree").then((res) => {
+        this.dept_tree = this.getTreeData(res.data.data.list);
+      });
+    },
+    // 递归判断列表,把最后的children设为undefined
+    getTreeData(data) {
+      for (var i = 0; i < data.length; i++) {
+        if (data[i]._child.length < 1) {
+          // children若为空数组,则将children设为undefined
+          data[i]._child = undefined;
+        } else {
+          // children若不为空数组,则继续 递归调用 本方法
+          this.getTreeData(data[i]._child);
+        }
+      }
+      return data;
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+  .message-box .label{
+    font-size: 18px;
+    font-weight: 600;
+    margin-bottom: 20px;
+  }
+  .message-box .flex-box-ce{
+    margin-bottom:16px ;
+  }
+  .message-box .fontColorC{
+    width: 100px;
+  }
+.el-date-editor.el-input {
+  width: auto;
+}
+.date-picker-width {
+  width: 145px !important;
+}
+
+.search ::v-deep .el-input-group__append{
+  background: #FFF;
+}
+.search ::v-deep .el-input-group__append:active {
+  background: #26a2ff;
+}
+.search ::v-deep .el-input-group__append:active .el-icon-search {
+  color: #fff;
+}
+</style>
+<style scoped="scoped" lang="scss">
+
+  .all{
+    margin-top:10px;
+    padding:10px 20px 0px 20px;
+    min-height: calc(100vh - 204px);
+    
+  }
+</style>

+ 81 - 0
src/views/award/myAward.vue

@@ -0,0 +1,81 @@
+<template>
+	<div>
+		<button @click="insert">insert at random index</button>
+		<button @click="reset">reset</button>
+		<TransitionGroup tag="ul" name="fade" class="container">
+		  <div v-for="item in items" class="item" :key="item">
+		    {{ item }}
+		    <button @click="remove(item)">x</button>
+		  </div>
+		</TransitionGroup>
+	</div>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			getInitialItems:[1, 2, 3, 4, 5],
+			items:[1, 2, 3, 4, 5],
+			id:6
+		}
+	},
+	methods: {
+		insert() {
+		  const i = Math.round(Math.random() * this.items.length)
+		  this.items.splice(i, 0, this.id++)
+		},
+		reset() {
+		  this.items=[1, 2, 3, 4, 5];
+		},
+		remove(item) {
+		  const i = this.items.indexOf(item)
+		  if (i > -1) {
+			this.items.splice(i, 1)
+		  }
+		}
+	},
+	created() {
+
+	},
+	mounted() {
+		
+		
+	}
+};
+</script>
+
+<style scoped>
+.container {
+  position: relative;
+  padding: 0;
+}
+
+.item {
+  width: 100%;
+  height: 30px;
+  background-color: #f3f3f3;
+  border: 1px solid #666;
+  box-sizing: border-box;
+}
+
+/* 1. 声明过渡效果 */
+.fade-move,
+.fade-enter-active,
+.fade-leave-active {
+  transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);	
+}
+
+/* 2. 声明进入和离开的状态 */
+.fade-enter-from,
+.fade-leave-to {
+  opacity: 0;
+  transform: scaleY(0.01) translate(30px, 0);
+}
+
+/* 3. 确保离开的项目被移除出了布局流
+      以便正确地计算移动时的动画效果。 */
+.fade-leave-active {
+  position: absolute;
+}
+</style>

+ 8 - 0
src/views/award/myGrantAward.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 118 - 0
src/views/award/print - 副本.vue

@@ -0,0 +1,118 @@
+<template>
+  <div class="dashboard-container">
+    <el-button @click='allPrint'>批量打印</el-button>
+    <el-table :data="tableData" style="width: 100%" border @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55">
+      </el-table-column>
+      <el-table-column prop="id" label="id" width="180">
+      </el-table-column>
+      <el-table-column label="图片" width="180">
+        <template slot-scope="scope">
+          <img :src="scope.row.src" class="table_img">
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="100">
+        <template slot-scope="scope">
+          <el-button @click="print(scope.row)" type="text" size="small">打印</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+
+    <!--startprint-->
+    <div id="printcontent" ref='printcontent'>
+		<div style="width: 100%;height: 100%;" v-for="item in multipleSelection" :key='item.id'>
+			<div  class="print_img">我要打印</div>
+		</div>
+    </div>
+    <!--endprint-->
+  </div>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        tableData: [{
+            id: 1,
+            src:'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg'
+          },
+          {
+            id: 2,
+            src:'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg'
+          },
+          {
+            id: 3,
+            src:'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg'
+          }
+        ],
+        multipleSelection: [],   //存放将要打印的数据
+      }
+    },
+    methods: {
+      print(row={}) {
+        if(row.src){
+          this.multipleSelection.push(row)
+        }
+        this.$nextTick(()=>{
+          var bdhtml=window.document.body.innerHTML;       // 获取body的内容
+          var jubuData = document.getElementById("printcontent").innerHTML; //获取要打印的区域内容
+          window.document.body.innerHTML= jubuData;        
+          window.print();                                  // 调用浏览器的打印功能
+          window.document.body.innerHTML=bdhtml;           // body替换为原来的内容
+          // window.location.reload();                        //刷新页面,如果不刷新页面再次点击不生效或打印使用新窗口实现打印
+        })
+      },
+      allPrint(){
+        this.print()
+      },
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+	.print_img{
+	  display: block;
+	  width: 20cm;
+	  height: 10cm;
+	  text-align: center;
+	  border: 1px solid #000;
+	  position: absolute;
+	  z-index: 9;
+	}
+  .dashboard-container {
+    .table_img {
+      width: 50px;
+      height: 50px;
+    }
+    #printcontent{
+      // display: none;
+	  position: relative;
+	  width: 30cm;
+	  height: 30cm;
+	  background-color:rosybrown;
+    }
+  }
+  //使用媒体查询    设置预览时的样式
+  @media print{
+    @page {
+	  // size: 11cm 21cm;
+	  // margin:0cm;
+      // size: portrait;   //设置打印布局portrait为纵向;landscape为横向
+    }
+    #printcontent{
+      width: 100%;
+    }
+   //  .print_img{
+   //    display: block;
+   //    width: 20cm;
+   //    height: 10cm;
+	  // text-align: center;
+	  // border: 1px solid #000;
+   //  }
+  }
+
+</style>

+ 601 - 0
src/views/award/print.vue

@@ -0,0 +1,601 @@
+<template>
+	<div>
+		<div>
+			<div ref="print" v-if="isPrint">
+				<div v-for="(item,index) in selectionItems" :key="item.id" style="width: 100%;height: 100%;">
+					<div :style="{width:printW+'cm',height:printH+'cm'}" style="position: relative;">
+						
+						
+						<template v-for="item in inputs">
+							<div class="input-item" :style="{left:item.x+'cm',top:item.y+'cm',width:item.w? item.w+'cm':'auto'}" style="z-index: 2;height: 2.33rem;">
+								 {{item.name}}
+							</div>
+						</template>
+						
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="all padding-20">
+			<el-form :inline="true" label-width="60px">
+				<el-form-item label="时间">
+					<el-date-picker
+						size="medium"
+						v-model="formData.time_range"
+						type="daterange"
+						value-format="yyyy-MM-dd"
+						range-separator="至"
+						:clearable="false"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+						:picker-options="instantPickerOptions"
+					></el-date-picker>
+				</el-form-item>
+				<el-form-item label="部门">
+					<el-cascader
+						size="medium"
+						v-model="dept_name"
+						:options="dept_tree"
+						:props="{ checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
+						ref="dept"
+						clearable
+						filterable
+						placeholder="全公司"
+					></el-cascader>
+				</el-form-item>
+				<el-form-item label="人员">
+					<el-select style="width: 300px;" size="medium" multiple  v-model="employeeId" placeholder="请输入或选择人员">
+						<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+			</el-form>
+			<div  class="flex-box-end">
+				<el-button size="small" @click="dialogVisible=true"  plain type="primary">打印配置</el-button>
+				<el-button size="small"  type="primary" @click="printFn">打印</el-button>
+			</div>
+			<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @selection-change="deleteEvents">
+				<el-table-column width="50" type="selection"></el-table-column>
+				<el-table-column label="姓名" align="left">
+					<template slot-scope="scope">
+						<div class="flex-box">
+							<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+							<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+						</div>
+					</template>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
+				<el-table-column label="奖票事件" align="left" prop="point"></el-table-column>
+				<el-table-column label="积分" align="left" prop="point"></el-table-column>
+				<el-table-column label="奖票时间" align="left" prop="point"></el-table-column>
+				<el-table-column label="发放人" align="left" prop="point"></el-table-column>
+				<el-table-column label="状态">
+					<template slot-scope="scope">
+						<span  class="blue" style="cursor: pointer;">查看详情</span>
+					</template>
+				</el-table-column>
+				<template slot="empty">
+					<div class="nopoint_box">
+						<div class="noimg noperson"></div>
+						<span class="title">没有对应的数据</span>
+					</div>
+				</template>
+			</el-table>
+			<center style="padding: 20px 0;">
+				<el-pagination
+					background
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:current-page="page"
+					:page-sizes="[10, 20, 50, 100]"
+					layout="total, sizes, prev, pager, next"
+					:page-size="page_size"
+					:total="total"
+				></el-pagination>
+			</center>
+		</div>
+		<!-- 打印配置 -->
+		<el-dialog title="打印配置" :visible.sync="dialogVisible" width="900px">
+			<div class="flex-box-ce">
+				<div class="flex-box-ce flex-1">
+					<div class="input-item" :class="selectInput.id==item.id? 'activeInput':''"  @click="selectInput=item" style="margin-right: 10px;position: relative;" v-for="item in inputs" :key="item.id">{{item.name}}</div>
+				</div>
+				<div class="flex-box-ce">
+					<div class="flex-box-ce">
+						<div class="label">奖票宽</div>
+						<el-input style="width: 60px;" size="small" v-model="printW" @input="[checkCountry($event, 1),(printW = printW.match(/\d+(\.\d{0,1})?/) ? printW.match(/\d+(\.\d{0,1})?/)[0] : '')]"></el-input>
+						<span style="font-size: 12px;position: relative;top: 5px;left: 5px;">cm</span>
+					</div>
+					<div class="flex-box-ce" style="margin-left: 30px;">
+						<div class="label">奖票高</div>
+						<el-input style="width: 60px;" size="small" v-model="printH" @input="[checkCountry($event, 2),(printH = printH.match(/\d+(\.\d{0,1})?/) ? printH.match(/\d+(\.\d{0,1})?/)[0] : '')]"></el-input>
+						<span style="font-size: 12px;position: relative;top: 5px;left: 5px;">cm</span>
+					</div>
+				</div>
+			</div>	
+			<div class="flex-box-ce" style="margin: 20px 0;">
+				<div class="flex-box-ce">
+					<div class="label">X</div>
+					<el-input style="width: 60px;" size="small" v-model.number="selectInput.x" @input="[checkCountry($event, 3),(selectInput.x = selectInput.x.match(/\d+(\.\d{0,1})?/) ? selectInput.x.match(/\d+(\.\d{0,1})?/)[0] : '')]"></el-input>
+					<span style="font-size: 12px;position: relative;top: 5px;left: 5px;">cm</span>
+				</div>
+				<div class="flex-box-ce" style="margin-left: 20px;">
+					<div class="label">Y</div>
+					<el-input style="width: 60px;" size="small" v-model="selectInput.y" @input="[checkCountry($event, 4),(selectInput.y = selectInput.y.match(/\d+(\.\d{0,1})?/) ? selectInput.y.match(/\d+(\.\d{0,1})?/)[0] : '')]"></el-input>
+					<span style="font-size: 12px;position: relative;top: 5px;left: 5px;">cm</span>
+				</div>
+				<div class="flex-box-ce" style="margin-left: 20px;" v-if="selectInput.id==2">
+					<div class="label">宽</div>
+					<el-input style="width: 60px;" size="small" v-model="selectInput.w" @input="[checkCountry($event, 5),(selectInput.w = selectInput.w.match(/\d+(\.\d{0,1})?/) ? selectInput.w.match(/\d+(\.\d{0,1})?/)[0] : '')]"></el-input>
+					<span style="font-size: 12px;position: relative;top: 5px;left: 5px;">cm</span>
+				</div>
+				<div class="flex-1"></div>
+				<el-popover placement="top-end" width="800" trigger="hover">
+				  <div><img src="@/assets/image/321.jpg" style="width: 100%;"/></div>
+				  <div class="blue cursor" slot="reference">检查单示例</div>
+				</el-popover>
+				
+			</div>
+			<div style="width: 100%;height: 10cm;background-color: #f1f1f1;position: relative;">
+				<div :style="{width:printW+'cm',height:printH+'cm'}" style="position:relative;background-color: #fff;margin: 0 auto;top: 50%;transform: translate(0, -50%);">
+					<template v-for="item in inputs">
+						<div class="input-item" style="height: 2.33rem;" v-if="item.id==2" :class="{activeInput:item.id==selectInput.id}" :style="{left:item.x+'cm',top:item.y+'cm',width:item.w? item.w+'cm':'auto'}">
+							 {{item.name}}
+						</div>
+						<div v-else class="input-item" :class="{activeInput:item.id==selectInput.id}" :style="{left:item.x+'cm',top:item.y+'cm',width:item.w? item.w+'cm':'auto'}">
+							 {{item.name}}
+						</div>
+					</template>
+				</div>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="dialogVisible = false" size="medium">取 消</el-button>
+				<el-button type="primary" @click="sumbit" size="medium">保 持</el-button>
+			</span>
+		</el-dialog>
+		
+		<el-dialog @close="closeCode"  :visible.sync="innerVisible" width="444px">
+			<div style="border-radius: 15px;border: 1px solid #f1f1f1;padding: 10px; width: 346px;box-sizing: border-box;margin: 0 auto;">
+				<div id="qrcode" ref="qrcode"></div>
+			</div>
+			<div style="margin-top: 10px;text-align: center;color: #666;">请使用钉钉APP扫描二维码</div>
+		</el-dialog>
+	</div>
+</template>
+<script>
+import moment from 'moment';
+import QRCode from 'qrcodejs2';
+export default {
+	data() {
+		return {
+			instantPickerOptions: {
+				shortcuts: [
+					{
+						text: '今天',
+						onClick(picker) {
+							const now = new Date(new Date().toLocaleDateString());
+							const start = now.getTime();
+							picker.$emit('pick', [moment(start).format('YYYY-MM-DD'), moment(start).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '昨天',
+						onClick(picker) {
+							const now = new Date(new Date().toLocaleDateString());
+							const start = now.getTime() - 60 * 60 * 24 * 1000;
+							picker.$emit('pick', [moment(start).format('YYYY-MM-DD'),moment(start).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '本周',
+						onClick(picker) {
+							const now = new Date(new Date().toLocaleDateString());
+							const start = now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000;
+							const end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
+							picker.$emit('pick', [moment(start).format('YYYY-MM-DD'), moment(end).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '上周',
+						onClick(picker) {
+							const now = new Date(new Date().toLocaleDateString());
+							const start = now.getTime() - (now.getDay() + 6) * 24 * 60 * 60 * 1000;
+							const end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
+							picker.$emit('pick', [moment(start).format('YYYY-MM-DD'), moment(end).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '本月',
+						onClick(picker) {
+						const now = new Date();
+							const startDate = new Date(now.getFullYear(), now.getMonth(), 1);
+							const endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+							picker.$emit('pick', [moment(startDate.getTime()).format('YYYY-MM-DD'), moment(endDate.getTime()).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '上月',
+						onClick(picker) {
+							const now = new Date();
+							const startDate = new Date(now.getFullYear() - (now.getMonth() > 0 ? 0 : 1), (now.getMonth() + 11) % 12, 1);
+							const endDate = new Date(now.getFullYear(), now.getMonth(), 0);
+							picker.$emit('pick', [moment(startDate.getTime()).format('YYYY-MM-DD'), moment(endDate.getTime()).format('YYYY-MM-DD')]);
+						}
+					},
+					{
+						text: '本季',
+						onClick(picker) {
+							const quarter=Math.ceil((new Date().getMonth()+1)/3)
+							let str=moment().format(`YYYY-${(quarter-1)*3+1}-01`);
+							let ent=moment(moment().format(`YYYY-${(quarter-1)*3+1}-01`)).add(2,`month`).endOf('month').format("YYYY-MM-DD");
+							console.log(str,ent)
+							picker.$emit('pick',[str,ent]);
+						}
+					},
+					{
+						text: '本年',
+						onClick(picker) {
+							let year=moment().format('YYYY');
+							picker.$emit('pick', [year+'-01-01',year+'-12-31']);
+						}
+					},
+				],
+			    onPick: (obj) => {
+					if(!this.dialogVisible){
+			       	  	this.pickerMinDate = new Date(obj.minDate).getTime();
+					}
+			    },
+				disabledDate : time => {
+			        if (this.pickerMinDate && !this.dialogVisible) {
+			            const day1 =  30 * 24 * 3600 * 1000//限制只能选一个月的范围区间
+			            let maxTime = this.pickerMinDate + day1
+			            let minTime = this.pickerMinDate - day1
+			            return time.getTime() > maxTime || time.getTime()<minTime
+			        }
+				}
+			},
+			total:0,
+			page: 1,
+			page_size: 10,
+			formData: {
+				dept_id: '0',
+				time_range: []
+			},
+			dept_name: [],
+			dept_tree: [],
+			loading: false,
+			list:[],
+			employee_map: this.$getCache('SET_EMPLOYEE_MAP'),
+			employeeId:[],
+			dialogVisible:false,
+			printW:18,
+			printH:7.5,
+			inputs:{
+				name:{name:'姓名',x:1,y:1.4,w:0,id:1},
+				event:{name:'奖票事件',x:1,y:2.4,w:15,id:2},
+				point:{name:'积分分值',x:1,y:3.9,w:0,id:3},
+				name2:{name:'发放人',x:15,y:4.9,w:0,id:4},
+				date:{name:'奖票日期',x:15,y:5.9,w:0,id:5},
+			},
+			selectInput:{name:'姓名',x:1,y:1.4,w:0,id:1},
+			innerVisible:false,
+			selectionItems:[1,2,3,4,5,6],
+			isPrint:false,
+		};
+	},
+	watch: {
+		'formData.time_range'(){
+			this.selectBtn();
+		},
+		dept_name(val) {
+			if (val.length !== 0) {
+				this.formData.dept_id = val[val.length - 1];
+			} else {
+				this.formData.dept_id = 0;
+			}
+			this.employeeId=[];
+			this.$nextTick(() => {
+				this.$refs.dept.dropDownVisible = false;
+				this.getEmployeeList();
+				this.selectBtn();
+			});
+		},
+	},
+	methods: {
+		printFn() {
+			//传入dom结构即可
+			this.isPrint=true;
+			this.$nextTick(()=>{
+				this.$print(this.$refs.print);
+				this.isPrint=false;
+			})
+		},
+		ruleQRcode() {
+			this.innerVisible = true;
+			// 使用$nextTick确保数据渲染
+			this.$nextTick(() => {
+				this.payOrder();
+			});
+		},
+		payOrder () {// 展示二维码
+			let url = 'dingtalk://dingtalkclient/action/open_micro_app'
+			let appid = '?appId='+this.$appId
+			let corpId = '&corpId='+this.$getCache('corpId')
+			let page = '&page='+encodeURIComponent(`pages/reportBox/report/report?employee_id=${encodeURIComponent(this.$getUserData().id)}`)//encodeURIComponent('小米')
+			let urls = url+appid+corpId+page
+			var qrcode = new QRCode('qrcode', {
+				text: urls, // 二维码内容
+				width: 325,
+				height: 325,
+				render: 'table', // 设置渲染方式(有两种方式 table和canvas,默认是canvas)
+				colorDark: '#34373e', // 二维码色
+				colorLight: '#ffffff', // 背景色
+				correctLevel: QRCode.CorrectLevel.H // 容错等级,H是heigh,最高,所以二维码看起来很密
+			})
+		},
+		// 关闭弹框,清除已经生成的二维码
+		closeCode() {
+			setTimeout(() => {
+				this.$refs.qrcode.innerHTML = '';
+			}, 150);
+		},
+		checkCountry(e,index) {
+		  if(index==1){
+			  if(this.printW > 22){
+			  	this.printW='22';
+			  }
+		  }
+		  if(index==2){
+			  if(this.printH > 9){
+				this.printH='9';
+			  }
+		  }
+		},
+		deleteEvents(selection) {
+			this.selectionItems = selection;
+			this.selectionID = selection.map(item => {
+				return item.id;
+			});
+		},
+		selectBtn(){
+			this.page=1;
+			this.get_list();
+		},
+		getEmployeeList() {
+			this.$axios('get', '/api/employee/list', { dept_id: this.formData.dept_id }).then(res => {
+				this.employee_map = res.data.data.list;
+			});
+		},
+		sumbit(){
+			
+		},
+		//请求数据
+		get_list() {
+			let data={
+				page:this.page,
+				page_size:this.page_size
+			};
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/ranking', data, 'v2').then(res => {
+				this.labelName = this.formData.pt_id == 2 ? 'A分' : 'B分';
+				if (res.data.code == 1) {
+					this.list =this.$returnDeptName(res.data.data.list);
+					this.total = res.data.data.total;
+				} else {
+					this.$message.error(res.data.data.msg);
+				}
+			})
+			.finally(() => {
+				this.loading = false;
+			});
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				data[i].obj = { id: data[i].id, name: data[i].name };
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 页面变更
+		handleCurrentChange(val) {
+			this.page = val;
+			this.get_list();
+		},
+		handleSizeChange(val) {
+			this.page = 1;
+			this.page_size = val;
+			this.get_list();
+		},
+	},
+	created() {
+		if(this.$getToken()){
+			this.getEmployeeList();
+			this.getDepartment();
+		}else{
+			this.innerVisible=true;
+		}
+	},
+	mounted() {
+		
+	    
+	}
+};
+</script>
+<style scoped lang="scss">
+.print_img{
+  width: 20cm;
+  height: 10cm;
+  text-align: center;
+  border: 1px solid #000;
+  z-index: 9;
+}	
+.print-box{
+	margin: auto;
+	background-color: #fff;
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}	
+.input-item{
+	background: #f4f4f5;
+	border-radius: 4px;
+	padding:6px 10px;
+	cursor: pointer;
+	color: #909399;
+	position: absolute;
+}
+.activeInput{
+	background-color: #ECF5FF;
+	color: #26a2ff;
+}
+.label{
+	text-align: right;
+	vertical-align: middle;
+	float: left;
+	font-size: 14px;
+	color: #606266;
+	line-height: 40px;
+	padding: 0 12px 0 0;
+	box-sizing: border-box;
+	font-weight: 600;
+}
+.search_box {
+	::v-deep button:active {
+		background: #26a2ff;
+	}
+	::v-deep button:active .el-icon-search {
+		color: #fff;
+	}
+}
+.date-picker-width {
+	width: 100% !important;
+}
+.nopoint_box {
+	display: inline-block;
+	text-align: center;
+	width: 100%;
+	margin-bottom: 10px;
+}
+.noimg {
+	display: inline-block;
+	width: 110px;
+	height: 110px;
+	margin: 22px auto 16px;
+	/* background:url("/static/images/nodata_default.png") no-repeat center; */
+	background-size: 99%;
+}
+.noperson {
+	display: inline-block;
+	width: 110px;
+	height: 110px;
+	line-height: none;
+	margin: 22px auto 16px;
+	background: url('/static/images/noperson_default.png') no-repeat center;
+	background-size: 99%;
+}
+.title {
+	display: block;
+	text-align: center;
+	font-size: 12px !important;
+	line-height: 30px;
+	color: #909399 !important;
+	padding: 0;
+}
+.nopoint_box a {
+	color: #26a2ff;
+}
+.chart_content {
+	.chart-legend__wrap {
+		text-align: right;
+		padding: 20px;
+		padding-right: 50px;
+		& .chart-legend__pink {
+			position: relative;
+			padding-left: 12px;
+			padding-right: 5px;
+			&:after {
+				content: '';
+				position: absolute;
+				margin-top: -2px;
+				top: 35%;
+				left: 0;
+				width: 8px;
+				height: 8px;
+				background: #f56c6c;
+				border-radius: 100%;
+			}
+		}
+
+		& .chart-legend__green {
+			position: relative;
+			padding-left: 12px;
+			&:after {
+				content: '';
+				position: absolute;
+				margin-top: -2px;
+				top: 35%;
+				left: 0;
+				width: 8px;
+				height: 8px;
+				background: #53b87f;
+				border-radius: 100%;
+			}
+		}
+	}
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+}
+.manager_statistics_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+	::v-deep .el-row .el-checkbox .el-checkbox__label {
+		line-height: 20px;
+	}
+}
+.diy_tip_bg {
+	background: #f5f6f9;
+	overflow: hidden;
+	.diy-tip {
+		margin-bottom: 15px;
+		border: 1px solid #67c23a;
+		padding: 20px 16px;
+		p {
+			color: #67c23a !important;
+			font-size: 14px;
+			margin: 0 !important;
+			padding: 4px 0;
+		}
+	}
+}
+::v-deep .el-dialog {
+	// top: 21%;
+}
+.picker_er {
+	margin-top: 20px;
+}
+.el-range-editor--medium.el-input__inner {
+	width: 280px;
+}
+::v-deep .el-cascader .el-input .el-input__inner {
+	width: 150px;
+}
+.el-checkbox.is-bordered.el-checkbox--medium {
+	padding: 9px 20px 7px 10px;
+}
+</style>

+ 1 - 1
src/views/common/repeatTaskDetailsPopup.vue

@@ -13,7 +13,7 @@
 						<div class="content_text">{{ workDetailData.name }}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.remark">
-						<div class="label">任务描述</div>
+						<div class="label">任务备注</div>
 						<div class="content_text">{{ workDetailData.remark }}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData">

+ 13 - 14
src/views/common/rewardTask.vue

@@ -1,22 +1,22 @@
 <template>
 	<div>
 		<!-- 悬赏任务弹窗 -->
-		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="660px" top="3%">
+		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="3%">
 			<div v-loading="forTheTaskLoading">
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
-				<el-form :model="formData" ref="formData" label-width="90px">
+				<el-form :model="formData" ref="formData" label-width="100px">
 					<el-form-item
 						label="任务内容"
 						prop="task_name"
-						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]"
+						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 100, message: '长度在 3 到 100 个字符', trigger: 'blur' }]"
 					>
 						<el-input
 							type="textarea"
 							rows="3"
-							maxlength="20"
+							maxlength="100"
 							show-word-limit
 							v-model="formData.task_name"
-							placeholder="请输入任务内容(限20字)"
+							placeholder="请输入任务内容(限100字)"
 							class="reward_textarea"
 						></el-input>
 					</el-form-item>
@@ -75,15 +75,14 @@
 					</el-form-item>
 
 					<el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'blur' }]">
-						<el-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
-						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
+						<el-input-number style="width: 220px;" v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number style="width: 220px;" v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 					<el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
-						<el-row>
-							<el-col :span="18">
-								<el-input auto-complete="off" v-model="reviewerName" placeholder="请选择审批人"></el-input>
-								<div @click="show_reviewer_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
-							</el-col>
+						<div style="width: 220px;position: relative;">
+							<el-input auto-complete="off" v-model="reviewerName" placeholder="请选择审批人"></el-input>
+							<div @click="show_reviewer_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+						</div>
 						</el-row>
 						<el-dialog title="选择审批人" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
 							<EmployeeSelector
@@ -91,7 +90,7 @@
 								ref="members"
 								:multi="false"
 								:use_Administrator_list="true"
-								:selected="reviewer_selected"
+								:selected="reviewer_selected"	
 								@confirm="reviewer_confirm"
 							/>
 							<span slot="footer" class="dialog-footer">
@@ -147,7 +146,7 @@
 					</el-form-item>
 
 					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
-						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务内容(限300字)"></el-input>
+						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
 					<el-form-item label="图片">
 						<upload

+ 6 - 6
src/views/common/rewardTaskAmend.vue

@@ -1,16 +1,16 @@
 <template>
 	<div>
 		<!-- 悬赏任务弹窗 -->
-		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="5%">
+		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="5%">
 			<div v-loading="forTheTaskLoading">
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
-				<el-form :model="formData" ref="formData" label-width="80px">
+				<el-form :model="formData" ref="formData" label-width="100px">
 					<el-form-item
 						label="任务内容"
 						prop="task_name"
-						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]"
+						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 100, message: '长度在 3 到 100 个字符', trigger: 'blur' }]"
 					>
-						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea"></el-input>
+						<el-input type="textarea" rows="3" maxlength="100" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限100字)" class="reward_textarea"></el-input>
 					</el-form-item>
 					<el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
 						<el-radio-group v-model="formData.pt_id" @change="from_ptId">
@@ -122,8 +122,8 @@
 						</el-select>
 					</el-form-item>
 
-					<el-form-item label="任务描述" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
-						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务内容(限300字)"></el-input>
+					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
+						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
 					
 					<el-form-item label="图片">

+ 7 - 7
src/views/common/temporaryTask.vue

@@ -1,16 +1,16 @@
 <template>
 	<div>
 		<!-- 临时任务弹窗 -->
-		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="3%">
+		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="3%">
 			<div>
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
-				<el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
+				<el-form :model="formData" ref="formData" label-width="100px" v-loading="taskload">
 					<el-form-item
 						label="任务内容"
 						prop="task_name"
-						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]"
+						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max:100, message: '长度在 3 到 100 个字符', trigger: 'blur' }]"
 					>
-						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+						<el-input type="textarea" rows="3" maxlength="100" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限100字)"></el-input>
 					</el-form-item>
 
 					<el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
@@ -69,8 +69,8 @@
 					</el-form-item>
 
 					<el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'change' }]">
-						<el-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
-						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
+						<el-input-number style="width: 220px;" v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number style="width: 220px;" v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 
 					<el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
@@ -158,7 +158,7 @@
 					</el-form-item>
 
 					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
-						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
 
 					<el-form-item label="图片">

+ 6 - 6
src/views/common/temporaryTaskAmend.vue

@@ -1,16 +1,16 @@
 <template>
 	<div>
 		<!-- 临时任务弹窗 -->
-		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="5%">
+		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="5%">
 			<div>
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
-				<el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
+				<el-form :model="formData" ref="formData" label-width="100px" v-loading="taskload">
 					<el-form-item
 						label="任务内容"
 						prop="task_name"
-						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]"
+						:rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 100, message: '长度在 3 到 100 个字符', trigger: 'blur' }]"
 					>
-						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+						<el-input type="textarea" rows="3" maxlength="100" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限100字)"></el-input>
 					</el-form-item>
 					<el-form-item label="指定规则">
 						 <el-switch  v-model="isSelectType" @change="isSelectTypeActive"></el-switch>
@@ -146,8 +146,8 @@
 						</el-select>
 					</el-form-item>
 
-					<el-form-item label="任务描述" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
-						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
+						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
 					
 					<el-form-item label="图片">

+ 3 - 3
src/views/ranking/JfDetail.vue

@@ -13,9 +13,9 @@
 						<div v-for="(item, index) in userInfo.dept_list" :key="index">{{ item.dept_name }}<span v-if="userInfo.dept_list.length-index>1"> , </span></div>
 					</div>
 				</div>
-				<el-select class="date-picker-width" size="medium" v-model="formData.source_type2" placeholder="全部">
+<!-- 				<el-select class="date-picker-width" size="medium" v-model="formData.source_type2" placeholder="全部">
 					<el-option v-for="item in source_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
-				</el-select>
+				</el-select> -->
 			</div>
 			<div class="diy-tip1" style="margin-bottom: 10px;">
 				<div v-if="type==1||type==3">分值:<span class="blue">{{point}}</span> (当前明细不包含基础分和工龄分)</div>
@@ -110,7 +110,7 @@
 				</el-row>
 
 				<el-row v-show="detail_info.rule_list">
-					<el-col :span="6">任务描述</el-col>
+					<el-col :span="6">事件内容</el-col>
 					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
 				</el-row>
 

+ 28 - 5
src/views/ranking/integral_event.vue

@@ -54,6 +54,17 @@
 						end-placeholder="结束日期"
 					></el-date-picker>
 				</el-form-item>
+				<el-form-item label="更新时间" v-if="isDevelopment">
+					<el-date-picker
+						v-model="u_start"
+						type="daterange"
+						size="medium"
+						value-format="yyyy-MM-dd"
+						range-separator="至"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+					></el-date-picker>
+				</el-form-item>
 				<el-form-item>
 					<div class="flex-box-ce">
 						<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
@@ -166,7 +177,7 @@
 				</el-row>
 
 				<el-row >
-					<el-col :span="6">任务描述</el-col>
+					<el-col :span="6">事件内容</el-col>
 					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
 				</el-row>
 
@@ -351,6 +362,7 @@ import toLead from '@/components/toLead';
 export default {
 	data() {
 		return {
+			isDevelopment:process.env.NODE_ENV === 'development',
 			deleteDisabled: true,
 			action: process.env.VUE_APP_BASE_API + 'api/integral/import',
 			ATOKEN: { 'A-TOKEN': this.$getToken(), Accept: 'application/vnd.test.v2+json' },
@@ -367,7 +379,7 @@ export default {
 				page_size: 10,
 				status:1,
 				dc_status:JSON.stringify([1]),
-				order_key:'update_time'
+				// order_key:'update_time',
 			},
 			time_slot: null,
 			rule_trees: [],
@@ -417,7 +429,8 @@ export default {
 				{ id: 1, name: '复核通过' },
 				{ id: 0, name: '待复核' },
 				{ id: 2, name: '复核不通过' },
-			]
+			],
+			u_start:null
 		};
 	},
 	components: { Steps, toLead,Review },
@@ -484,6 +497,17 @@ export default {
 			}
 			this.get_integral_list(this.formData);
 		},
+		u_start(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.u_start_day = val[0];
+				this.formData.u_end_day = val[1];
+			} else {
+				delete this.formData.u_start_day;
+				delete this.formData.u_end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
 		dept_name(val, old_val) {
 			this.formData.page = 1;
 			if (val.length !== 0) {
@@ -495,7 +519,7 @@ export default {
 				this.$refs.dept.dropDownVisible = false;
 				this.get_integral_list(this.formData);
 			});
-		}
+		},
 	},
 	methods: {
 		//获取员工列表
@@ -633,7 +657,6 @@ export default {
 					this.formData.page +
 					'&page_size=' +	
 					this.formData.page_size +
-					'&order_key=update_time'+
 					(this.formData.employee_ids ? '&employee_ids=' + this.formData.employee_ids : '') +
 					(this.formData.rule_id ? '&rule_id=' + this.formData.rule_id : '') +
 					(this.formData.pt_id ? '&pt_id=' + this.formData.pt_id : '') +

+ 31 - 4
src/views/ranking/integral_event_two.vue

@@ -110,7 +110,7 @@
 			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
 				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
 					<div class="flex-box flex-v-ce">
-						<userImage :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
+						<userImage  :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
 						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
 						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
 						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
@@ -118,7 +118,7 @@
 				</el-row>
 
 				<el-row v-show="detail_info.rule_list">
-					<el-col :span="6">任务描述</el-col>
+					<el-col :span="6">事件内容</el-col>
 					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
 				</el-row>
 
@@ -377,7 +377,7 @@ export default {
 		this.getEmployee();
 		this.getDataAccess();
 		
-		document.getElementById('main').scrollTop = 0;
+		// document.getElementById('main').scrollTop = 0;
 	},
 	mounted() {
 		this.deriveRestrict();
@@ -676,7 +676,34 @@ export default {
 				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
 			});
 		},
+		opneWebSocket(item) {
+			this.loading = true;
+			let data={
+				type:"esi",
+				recorder_id:item.recorder_id,
+				page:item.page,
+				page_size:item.page_size,
+				month:item.month,
+				dc_status:item.dc_status,
+				keyword:item.keyword,
+				pt_id:item.pt_id,
+				source_type:item.source_type,
+			};
+			if(item.employee_ids){
+				data.employee_id=item.employee_ids
+			}
+			this.$socketApi.sendData(data,(res)=>{
+				if (res.code == 1&&res.type=='esi') {
+					this.list = res.result.list;
+					this.total = res.result.total;
+					this.loading = false;
+					this.$socketApi.closewebsocket();
+				}
+			},true)
+		},
 		get_integral_list(data) {
+			this.opneWebSocket(data);
+			return false
 			this.loading = true;
 			this.$axios('get', '/api/integral/statistics/integral', data)
 				.then(res => {
@@ -760,7 +787,7 @@ export default {
 			}
 			return data;
 		}
-	}
+	},
 };
 </script>
 <style scoped lang="scss">

+ 0 - 246
src/views/ranking/lotteryTicket_statistics.vue

@@ -1,246 +0,0 @@
-<template>
-  <div>
-    <div class="flex-box-ce">
-      <div>
-        <el-date-picker
-          v-model="formData.month"
-          type="month"
-          placeholder="请选择月份"
-          value-format="yyyy-MM"
-        ></el-date-picker
-      ></div>
-      <div style="width:200px;margin: 0 10px;">
-        <el-cascader
-          v-model="dept_name"
-          :options="dept_tree"
-          @change="dept1_null"
-          :props="{
-            checkStrictly: true,
-            value: 'id',
-            label: 'name',
-            children: '_child',
-          }"
-          ref="dept1"
-          filterable
-          change-on-select
-          placeholder="全公司"
-          clearable
-        ></el-cascader>
-      </div>
-
-      <div class="search">
-        <el-input
-          v-model="formData.keywords"
-          placeholder="输入同事姓名"
-          @keyup.enter.native="get_all_integral"
-        >
-          <el-button
-            class="buttonCLo"
-            slot="append"
-            @click="get_all_integral"
-            icon="el-icon-search"
-          ></el-button>
-        </el-input>
-      </div>
-    </div>
-
-    <div class="all">
-      <div>
-        <el-table
-          :data="all_integral_list"
-          style="width: 100%"
-          v-loading="loading"
-        >
-          <el-table-column prop="employee_name" label="姓名" align="left">
-            <template slot-scope="scope">
-              <div style="display:flex">
-                <span class="fl">
-                  <userImage
-                    width="50px"
-                    height="50px"
-                    fontSize="1"
-                    :user_name="scope.row.name"
-                    :img_url="scope.row.img_url"
-                  ></userImage>
-                </span>
-                <span
-                  style="margin-left: 20px; line-height: 50px; display: inline-block"
-                  >{{ scope.row.name }}</span
-                >
-              </div>
-            </template>
-          </el-table-column>
-<!--          <el-table-column prop="performance" label="部门" align="left">
-            <template slot-scope="scope">
-              <span>{{ scope.row.dept_name }}</span>
-            </template>
-          </el-table-column> -->
-          <el-table-column prop="a" label="奖票数量" align="left">
-            <template slot-scope="scope">
-              <span>{{ scope.row.ticketNumber }}</span>
-            </template>
-          </el-table-column>
-          <template slot="empty">
-            <noData></noData>
-          </template>
-        </el-table>
-        <center style="padding: 20px 0;">
-          <el-pagination
-            background
-            @size-change="handleSizeChange1"
-            @current-change="handleCurrentChange"
-            :current-page="formData.page"
-				    :page-sizes="[10, 20, 50, 100]"
-            layout="total, sizes, prev, pager, next"
-            :page-size="pageLimit1"
-            :total="total"
-          >
-          </el-pagination>
-        </center>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-
-export default {
-  data() {
-    return {
-      loading: false,
-      all_integral_list: null,
-      formData: {
-        month: this.$moment().format("YYYY-MM"),
-        keywords: "",
-        dept_id: "",
-        page: 1,
-        page_size: 10
-      },
-      total: 0,
-      //部门
-      dept_name: [],
-      dept_tree: [],
-      pageLimit1: 10
-    };
-  },
-  watch: {
-    "formData.month"(val, old_val) {
-      this.formData.page = 1;
-      this.get_all_integral();
-    },
-    "formData.dept_id"(val, old_val) {
-      if (!val) {
-        this.formData.dept_id = 0;
-      }
-      this.formData.page = 1;
-      this.get_all_integral();
-    }
-  },
-  mounted() {
-    this.get_all_integral();
-    this.getDepartment(); //部门
-  },
-  methods: {
-    //分页
-    handleSizeChange1(val) {
-      this.pageLimit1 = val;
-      this.formData.page_size = this.pageLimit1;
-      this.get_all_integral();
-    },
-    handleCurrentChange(val) {
-      this.formData.page = val;
-      this.get_all_integral();
-    },
-    //请求数据
-    get_all_integral() {
-      let self = this;
-      self.loading = true;
-      self
-        .$axios("get", "/api/integral/statistics/ticket", self.formData)
-        .then(res => {
-          if (res.data.code == 1) {
-            self.all_integral_list = res.data.data.list;
-            self.total = res.data.data.total;
-          } else {
-            self.$message.error(res.data.data.msg);
-          }
-        })
-        .finally(() => {
-          self.loading = false;
-        });
-    },
-    dept1_null(val) {
-      //部门
-      if (val.length == 0) {
-        this.formData.dept_id = 0;
-      } else {
-        this.formData.dept_id = this.dept_name[this.dept_name.length - 1];
-      }
-      this.$nextTick(() => {
-        this.$refs.dept1.dropDownVisible = false;
-      });
-    },
-    // // 递归判断列表,把最后的children设为undefined
-    // getTreeData(data) {
-    //   for (var i = 0; i < data.length; i++) {
-    //     if (data[i].children.length < 1) {
-    //       // children若为空数组,则将children设为undefined
-    //       data[i].children = undefined;
-    //     } else {
-    //       // children若不为空数组,则继续 递归调用 本方法
-    //       this.getTreeData(data[i].children);
-    //     }
-    //   }
-    //   return data;
-    // },
-
-    
-    //获取部门
-    getDepartment() {
-      this.$axios("get", "/api/department/tree").then((res) => {
-        this.dept_tree = this.getTreeData(res.data.data.list);
-      });
-    },
-    // 递归判断列表,把最后的children设为undefined
-    getTreeData(data) {
-      for (var i = 0; i < data.length; i++) {
-        if (data[i]._child.length < 1) {
-          // children若为空数组,则将children设为undefined
-          data[i]._child = undefined;
-        } else {
-          // children若不为空数组,则继续 递归调用 本方法
-          this.getTreeData(data[i]._child);
-        }
-      }
-      return data;
-    },
-  }
-};
-</script>
-
-<style scoped lang="scss">
-.el-date-editor.el-input {
-  width: auto;
-}
-.date-picker-width {
-  width: 145px !important;
-}
-
-.search ::v-deep .el-input-group__append{
-  background: #FFF;
-}
-.search ::v-deep .el-input-group__append:active {
-  background: #26a2ff;
-}
-.search ::v-deep .el-input-group__append:active .el-icon-search {
-  color: #fff;
-}
-</style>
-<style scoped="scoped" lang="scss">
-
-  .all{
-    margin-top:10px;
-    padding:10px 20px 0px 20px;
-    min-height: calc(100vh - 204px);
-    
-  }
-</style>

+ 137 - 31
src/views/ranking/manager_statistics.vue

@@ -54,14 +54,22 @@
 						<!-- 达标选项 -->
 						<br />
 						<el-form-item><el-checkbox v-model="allPass" size="medium" label="只看全部达标的"></el-checkbox></el-form-item>
-
 						<!-- 导出报表 -->
-						<el-form-item><el-button type="primary" plain @click="exportExcel" size="medium" style="margin-left:20px">导出报表</el-button></el-form-item>
+						<el-form-item>
+							<downloadexcel
+							:fetch="exportExcel"
+							:fields="json_fields"
+							:before-generate="startDownload"
+							:before-finish="finishDownload"
+							>
+								<el-button type="primary" plain  size="medium" style="margin-left:20px">导出报表</el-button>
+							</downloadexcel>
+						</el-form-item>
 					</el-form>
 					<div class="flex-box-end">
 						<span class="orange">*管理者奖扣任务均为B分,对A分不做要求*</span>
 					</div>
-					<el-table :data="last" style="width: 100%;cursor: pointer;" v-loading="loading"  @row-click="openDetail">
+					<el-table :data="last" style="width: 100%;cursor: pointer;" v-loading="loading2"  @row-click="openDetail">
 						<el-table-column label="管理者">
 							<template slot-scope="scope">
 								<div class="flex-box flex-v-ce">
@@ -93,7 +101,7 @@
 									<b>{{ scope.row.ratio.reward_ratio }}&nbsp;:1</b>
 									<span :class="scope.row.ratio.status == 1 ? 'green' : ''">{{ scope.row.ratio.status == 1 ? '达标' : '' }}</span>
 									<br />
-									<span class="span_h">
+									<span class="span_h">	
 										比例目标 小于 {{ scope.row.ratio.target }}
 										<b>:</b>
 										&nbsp;1
@@ -263,9 +271,23 @@
 	</div>
 </template>
 <script>
+import downloadexcel from "vue-json-excel";	
 export default {
+	components:{downloadexcel},
 	data() {
 		return {
+			json_fields:{
+				'姓名':'name',
+				'部门':'dept',
+				'实际奖分':'point',
+				'奖分目标':'target',
+				'实际扣分':'point2',
+				'扣分目标':'target2',
+				'实际奖扣比例':'jkbl',
+				'比例目标':'blmb',
+				'实际奖扣人次':'sjjk',
+				'人次目标':'rcmb',
+			},
 			last: [],
 			//完成情况
 			condition: {
@@ -282,6 +304,7 @@ export default {
 
 			//对比
 			loading: false,
+			loading2: false,
 			choose_time: '',
 			input: '',
 			radio: '1',
@@ -326,6 +349,49 @@ export default {
 		}
 	},
 	methods: {
+		opneWebSocket(index) {
+			let data={};
+			if(index==2){
+				this.loading =true ;
+				data={
+					type:"es_avg",
+					employee_id:this.$getUserData().id,
+					page:this.formData.page,
+					page_size:this.formData.page_size,
+					month:this.formData.month,
+					dept_id:this.formData.dept_id,
+					keyword:this.formData.keyword
+				};
+			}else{
+				this.loading2 = true;
+				data={
+					type:"es",
+					employee_id:this.$getUserData().id,
+					page:this.condition.page,
+					page_size:this.condition.page_size,
+					month:this.condition.month,
+					dept_id:this.condition.dept_id,
+					complete:this.condition.complete||0,
+					keyword:this.condition.keyword
+				};
+			}
+			this.$socketApi.sendData(data,(res)=>{
+				if (res.code == 1&&res.type=='es') {
+					this.last = res.result.list;
+					this.totals = res.result.total;
+					this.$nextTick(()=>{
+						this.loading2 = false;
+					})
+				}
+				if (res.code == 1&&res.type=='es_avg') {
+					this.list =this.$returnDeptName(res.result.list);
+					this.total = res.result.total;
+					this.$nextTick(()=>{
+						this.loading = false;
+					})
+				}
+			},true)
+		},
 		openDetail(e){
 			let data={
 				date:this.condition.month,
@@ -336,19 +402,19 @@ export default {
 		},
 		//情况
 		get_last() {
+			this.opneWebSocket(1);
+			return false
 			this.loading = true;
-			this.$axios('get', '/api/integral/statistics/prize/list', this.condition, 'v4')
-				.then(res => {
-					if (res.data.code == 1) {
-						this.last = res.data.data.list;
-						this.totals = res.data.data.total;
-					} else {
-						this.$message.error(res.data.data.msg);
-					}
-				})
-				.finally(() => {
-					this.loading = false;
-				});
+			this.$axios('get', '/api/integral/statistics/prize/list', this.condition, 'v4').then(res => {
+				if (res.data.code == 1) {
+					this.last = res.data.data.list;
+					this.totals = res.data.data.total;
+				} else {
+					this.$message.error(res.data.data.msg);
+				}
+			}).finally(() => {
+				this.loading = false;
+			});
 		},
 		//部门
 		get_last_dept_null(val) {
@@ -368,20 +434,53 @@ export default {
 			this.get_last();
 		},
 		//导出报表
-		exportExcel() {
-			let data = '';
-			//部门
-			this.condition.dept_id > 0 ? (data += '&dept_id=' + this.condition.dept_id) : (data += '&dept_id=0');
-			//时间
-			data += '&month=' + this.condition.month;
-			//搜索框
-			this.condition.keyword == '' ? (data += '&keyword=') : (data += '&keyword=' + this.condition.keyword);
-			//是否达标
-			this.condition.complete != 0 ? (data += '&complete=' + this.condition.complete) : (data += '&complete=0');
-			//当前页数
-			data += '&page=1&page_size=9999';
-			window.open(process.env.VUE_APP_BASE_API + 'api/download/prize/list/v4?employee_id=' + this.$getUserData().id + data, '_blank');
-			this.dialogVisible = false;
+		async exportExcel() {
+			// let data = '';
+			// //部门
+			// this.condition.dept_id > 0 ? (data += '&dept_id=' + this.condition.dept_id) : (data += '&dept_id=0');
+			// //时间
+			// data += '&month=' + this.condition.month;
+			// //搜索框
+			// this.condition.keyword == '' ? (data += '&keyword=') : (data += '&keyword=' + this.condition.keyword);
+			// //是否达标
+			// this.condition.complete != 0 ? (data += '&complete=' + this.condition.complete) : (data += '&complete=0');
+			// //当前页数
+			// data += '&page=1&page_size=9999';
+			// window.open(process.env.VUE_APP_BASE_API + 'api/download/prize/list/v4?employee_id=' + this.$getUserData().id + data, '_blank');
+			let data={
+				type:"es",
+				employee_id:this.$getUserData().id,
+				page:1,
+				page_size:10000,
+				month:this.condition.month,
+				dept_id:this.condition.dept_id,
+				complete:this.condition.complete||0,
+				keyword:this.condition.keyword
+			};
+			let arr=[];
+			this.$socketApi.sendData(data,(res)=>{
+				if (res.code == 1&&res.type=='es') {
+					let list = res.result.list;
+					list.forEach(item=>{
+						item.point=item.reward.point;
+						item.target=item.reward.target;
+						item.point2=item.deduction.point;
+						item.target2=item.deduction.target;
+						item.jkbl=item.ratio.enable == 1? item.ratio.reward_ratio+':1':'-';
+						item.blmb=item.ratio.target+':1';
+						item.sjjk=item.exec.count;
+						item.rcmb=item.exec.target;
+					})
+					arr=list;
+				}
+			},true)
+			return arr;
+		},
+		startDownload(){
+			console.log('show loading');
+		},
+		finishDownload(){
+			console.log('hide loading');
 		},
 		//分页选择显示多少条
 		handleCurrentChange_xq(val) {
@@ -402,6 +501,8 @@ export default {
 			this.get_list();
 		},
 		get_list() {
+			this.opneWebSocket(2);
+			return false
 			this.loading = true;
 			this.$axios('get', '/api/integral/statistics/prize/list', this.formData, 'v3')
 				.then(res => {
@@ -559,10 +660,15 @@ export default {
 			return data;
 		}
 	},
+	created() {
+		this.get_last();
+	},
 	mounted() {
 		this.getDepartment();
 		this.get_list();
-		this.get_last();
+	},
+	beforeDestroy() {
+		this.$socketApi.closewebsocket();
 	}
 };
 </script>

+ 19 - 3
src/views/set/rule.vue

@@ -14,7 +14,7 @@
 				</div>
 				<div class="terr-right border-right flex-1">
 					<div class="flex-box flex-v-ce" style="margin-bottom: 12px;">
-						<div class="name">{{ selectItem.name }}</div>
+						<div class="name">{{ selectItem.name }}  <span style="font-size: 13px;cursor: pointer;" @click="copy()" v-if="selectItem.id">(分类id:<span>{{selectItem.id}}</span>)</span></div>
 						<el-button size="medium" plain v-if="selectItem.id" @click="edit_class">编辑</el-button>
 					</div>
 					<div class="flex-box-ce fontColorB"  v-if="selectItem.dept_info.length>0">
@@ -27,7 +27,7 @@
 							<el-button size="small" type="success" @click="toleadShw = true" plain>导入规则</el-button>
 							<el-button size="small" type="success" @click="derivedRule" plain>导出规则</el-button>
 						</div>
-						<div class="" style="display:inline-block; width:180px;margin:0px 0 0 10px;">
+						<div  style="display:inline-block; width:180px;margin:0px 0 0 10px;">
 							<el-input
 								placeholder="搜索规则内容"
 								ref="search-bar"
@@ -389,6 +389,22 @@ export default {
 		this.getDepartment();
 	},
 	methods: {
+		copy (index) {
+				  //创建input标签
+				  var input = document.createElement('input')
+				  //将input的值设置为需要复制的内容
+				  input.value =this.selectItem.id
+				  //添加input标签
+				  document.body.appendChild(input)
+				  //选中input标签
+				  input.select()
+				  //执行复制
+				  document.execCommand('copy')
+				  //成功提示信息
+				  this.$message.success('分类ID复制成功')
+				  //移除input标签
+				  document.body.removeChild(input)
+		},
 		//编辑分组
 		edit_class() {
 			this.class_show = true;
@@ -1066,7 +1082,7 @@ export default {
 		},
 		//删除分组
 		del_dept() {
-			this.$confirm('此操作将永久删除该分, 是否继续?', '提示', {
+			this.$confirm('此操作将永久删除该分, 是否继续?', '提示', {
 				confirmButtonText: '确定',
 				cancelButtonText: '取消',
 				type: 'warning'

+ 1 - 1
src/views/set/screenSet.vue

@@ -399,7 +399,7 @@ export default {
 			sourceOptions: [
 				{
 					value: 1,
-					label: '积分录入'
+					label: '积分奖扣'
 				},
 				{
 					value: 2,

+ 4 - 3
src/views/workbench/review.vue

@@ -202,7 +202,7 @@
 				</el-row>
 
 				<el-row v-show="detail_info.rule_list">
-					<el-col :span="6">任务描述</el-col>
+					<el-col :span="6">事件内容</el-col>
 					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
 				</el-row>
 
@@ -366,7 +366,7 @@ export default {
 				page: 1,
 				page_size: 10,
 				dc_status:JSON.stringify([0]),
-				order_key:'update_time'
+				// order_key:'update_time'
 			},
 			time_slot: null,
 			rule_trees: [],
@@ -499,8 +499,10 @@ export default {
 			this.formData.page = 1;
 			if(val=='review'){//待复核
 				this.formData.dc_status=JSON.stringify([0]);
+				delete this.formData.order_key
 			}else{
 				this.dc_status=0;
+				this.formData.order_key='update_time';
 				this.formData.dc_status=JSON.stringify([1,2]);
 			}
 			this.get_integral_list(this.formData);
@@ -540,7 +542,6 @@ export default {
 				if (valid) {
 					this.noData.comment=this.newForm.comment;
 					this.noData.point=this.newForm.point;
-					console.log(this.newForm.point)
 					if(!isNaN(this.newForm.point)){
 						this.setLoading=true;
 						this.webSocket(this.noData)

部分文件因为文件数量过多而无法显示