voluntarilyPoint.vue 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. <template>
  2. <div>
  3. <el-alert class="diy-tip" title="什么是自动积分?" @close="tips_close" v-if="tips_show" type="success" description show-icon>
  4. <p>系统按照设定的时间(每月/每周/每日) 自动给员工添加B分,比如某员工有一个工程师证,得到公司的认可,公司就会每月给他加分</p>
  5. </el-alert>
  6. <div class="all">
  7. <div class="flex-box">
  8. <div class="terr-left">
  9. <div><el-button size="medium" @click="add_grouping()" type="primary">新增加分组</el-button></div>
  10. <div><el-button size="medium" @click="add_rules_detail" type="primary">新增加分项</el-button></div>
  11. <!-- 循环分组 -->
  12. <el-col :span="24" style="padding-right: 0;" v-loading="rule_trees_load">
  13. <el-menu :default-active="default_active" class="rule_name" :unique-opened="true">
  14. <el-submenu :index="index.toString()" :key="index" v-for="(item, index) in rule_list">
  15. <template slot="title">
  16. <div style="width: 80%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; height: 47px;line-height: 47px;">
  17. <i class="el-icon-edit-outline title_top" @click.stop="edit_grouping(item)"></i>
  18. <span class="title_top">{{ item.name }}</span>
  19. </div>
  20. </template>
  21. <el-menu-item
  22. :key="index2"
  23. :index="returnIndex(index, index2)"
  24. v-for="(data, index2) in item.child"
  25. @click="open_rights(data)"
  26. style="height: 47px;line-height: 47px;"
  27. >
  28. <div style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap">
  29. <span slot="title">{{ data.remark }}</span>
  30. </div>
  31. </el-menu-item>
  32. </el-submenu>
  33. </el-menu>
  34. </el-col>
  35. </div>
  36. <div class="terr-right border-right flex-1">
  37. <el-col :span="24" v-show="rule_list.length == 0 || isShowAdd" style="text-align: center;margin: 0 auto;position: relative;top: 30%;">
  38. <p><img src="@/assets/image/nodata_default.png" width="200px" alt="" /></p>
  39. <p style="color: #909399;">
  40. 还没有
  41. <span v-if="rule_list.length == 0">加分组和</span>
  42. 加分项
  43. </p>
  44. <p style="color: #909399;">
  45. <span v-if="rule_list.length == 0">先</span>
  46. <span style="color: #26A2FF;cursor:pointer;" v-if="rule_list.length == 0" @click="add_grouping()">【新增加分组】</span>
  47. <span v-if="rule_list.length == 0">再</span>
  48. <span v-if="rule_list.length !== 0">请</span>
  49. <span style="color: #26A2FF;cursor:pointer" @click="add_rules_detail">【新增加分项】</span>
  50. </p>
  51. </el-col>
  52. <el-col v-if="!isShowAdd && right_rules_detail.remark">
  53. <el-row>
  54. <el-col :span="24" style="font-size:20px;color:#303133;line-height:36px;">
  55. {{ right_rules_detail.remark }}
  56. <span style="padding-left: 10px;">{{ right_rules_detail.min_point }}B分</span>
  57. <el-button plain style="padding:10px 12px; margin-left: 10px;" @click="edit_rules()">编辑</el-button>
  58. </el-col>
  59. </el-row>
  60. <div class="flex-box btns flex-v-ce">
  61. <div class="flex-1">
  62. <el-button size="small" @click="del_item" type="danger" plain>批量移除</el-button>
  63. <el-button size="small" type="primary" @click="add_employee_show = true">添加人员</el-button>
  64. <el-button size="small" type="primary" plain @click="toleadShw = true">导入自动积分</el-button>
  65. </div>
  66. <div>
  67. <el-select size="small" v-model="employee_id" filterable clearable placeholder="请输入或选择人员">
  68. <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
  69. </el-select>
  70. </div>
  71. </div>
  72. <el-table ref="multipleTable" :data="table_list" tooltip-effect="dark" style="width: 100%;margin-top:20px;" @selection-change="handleSelectionChange">
  73. <el-table-column type="selection" width="45"></el-table-column>
  74. <el-table-column label="姓名">
  75. <template slot-scope="scope">
  76. <div style="display:flex">
  77. <span class="fl">
  78. <userImage
  79. width="50px"
  80. height="50px"
  81. :user_name="scope.row.employee.name"
  82. :img_url="scope.row.employee.img_url"
  83. v-if="scope.row.employee"
  84. ></userImage>
  85. </span>
  86. <span style="margin-left: 10px; line-height: 50px; display: inline-block" v-if="scope.row.employee">{{ scope.row.employee.name }}</span>
  87. </div>
  88. </template>
  89. </el-table-column>
  90. <el-table-column prop="cycle_remark" label="加分周期"></el-table-column>
  91. <el-table-column prop="update_time" label="更新时间">
  92. <template slot-scope="scope">
  93. <div>{{ getUpdate(scope.row.update_time) }}</div>
  94. </template>
  95. </el-table-column>
  96. <template slot="empty">
  97. <noData></noData>
  98. </template>
  99. </el-table>
  100. <!-- 分页 -->
  101. <div style=" text-align: center; padding: 20px;">
  102. <el-pagination
  103. background
  104. layout="total, prev, pager, next"
  105. :current-page="page"
  106. @current-change="handleCurrentChange"
  107. :page-sizes="[10, 20, 50, 100]"
  108. :page-size.sync="pagesize"
  109. :hide-on-single-page="true"
  110. :total="total"
  111. ></el-pagination>
  112. </div>
  113. </el-col>
  114. </div>
  115. </div>
  116. <!-- 可写公共组建: -->
  117. <!-- 新增加分组弹出框 -->
  118. <el-dialog :close-on-click-modal="false" :title="grouping_type ? '编辑加分组' : '新增加分组'" :visible.sync="dialogVisible" width="40%">
  119. <el-form :model="numberValidateForm" ref="numberValidateForm" label-width="100px" class="demo-ruleForm">
  120. <el-form-item label="加分组名称" prop="name" :rules="[{ required: true, message: '请输入加分组名称' }]">
  121. <el-input type="age" v-model="numberValidateForm.name" placeholder="请输入加分组名称"></el-input>
  122. </el-form-item>
  123. </el-form>
  124. <span slot="footer" class="dialog-footer" style=" overflow: hidden;">
  125. <el-button
  126. class="fl"
  127. type="danger"
  128. v-show="grouping_type"
  129. @click="del_grouping(numberValidateForm)"
  130. style="float:left"
  131. :loading="disabled"
  132. :disabled="disabled"
  133. >
  134. 删除
  135. </el-button>
  136. <el-button @click="dialogVisible = false">取 消</el-button>
  137. <el-button type="primary" @click="submitForm('numberValidateForm')" :loading="disabled" :disabled="disabled">确 定</el-button>
  138. </span>
  139. </el-dialog>
  140. <!-- 新增加分项 -->
  141. <el-dialog :title="rules_detail_title ? '编辑加分项' : '新增加分项'" :visible.sync="dialogFormVisible" width="500px">
  142. <el-form :model="rules_detail_form" ref="rules_detail_form" :rules="rules_rules" label-width="120px">
  143. <el-form-item label="加分项名称" :label-width="formLabelWidth" prop="remark">
  144. <el-input v-model="rules_detail_form.remark" placeholder="请输入加分项名称"></el-input>
  145. </el-form-item>
  146. <el-form-item label="加分组" :label-width="formLabelWidth" prop="rule_id">
  147. <el-select v-model="rules_detail_form.rule_id" style="width: 100%;" placeholder="请选择加分组">
  148. <el-option v-for="item in rule_list" :key="item.value" :label="item.name" :value="item.id"></el-option>
  149. </el-select>
  150. </el-form-item>
  151. <el-form-item label="B分" prop="min_point">
  152. <el-input
  153. v-model="rules_detail_form.min_point"
  154. placeholder="请输入B分分值"
  155. oninput="if(this.value=='0'){this.value='';}else{this.value=this.value.replace(/[^0-9]/g,'')}"
  156. ></el-input>
  157. <!-- <span data-v-a17f1960 style="display: block; font-size: 12px; color: rgb(96, 98, 102);text-align: left;">固定加分加B分</span> -->
  158. </el-form-item>
  159. <!-- <el-form-item label="是否与考勤挂钩" prop="is_attendance"><el-switch v-model="is_attendance"></el-switch></el-form-item> -->
  160. <div style="overflow: hidden;">
  161. <el-button
  162. type="danger"
  163. v-show="rules_detail_title"
  164. class="fl"
  165. @click="del_rules_detail(rules_detail_form)"
  166. style="float:left"
  167. :loading="disabled"
  168. :disabled="disabled"
  169. >
  170. 删除
  171. </el-button>
  172. <el-button
  173. v-if="rules_detail_title"
  174. class="fr"
  175. type="primary"
  176. @click="editRule('rules_detail_form')"
  177. style="float:right"
  178. :loading="disabled"
  179. :disabled="disabled"
  180. >
  181. 确 定
  182. </el-button>
  183. <el-button v-else class="fr" type="primary" @click="editRule('rules_detail_form')" style="float:right" :loading="disabled" :disabled="disabled">
  184. 确 定
  185. </el-button>
  186. <el-button class="fr" @click="rules_detail_close('rules_detail_form')" style="float:right">取 消</el-button>
  187. </div>
  188. </el-form>
  189. </el-dialog>
  190. <el-dialog title="添加人员" :visible.sync="add_employee_show" :before-close="add_employee_close" width="700px">
  191. <el-form :model="add_employee_form" ref="add_employee_form" label-width="80px">
  192. <el-form-item label="加分周期" :rules="[{ required: true, message: '请选择加分周期', trigger: 'change' }]">
  193. <el-select v-model="task_cycle_name" placeholder="请选择加分周期">
  194. <el-option v-for="item in task_cycle" :key="item.value" :label="item.name" :value="item.value"></el-option>
  195. </el-select>
  196. </el-form-item>
  197. <div v-loading="staff_loading">
  198. <EmployeeSelector
  199. v-if="add_employee_show"
  200. :max="add_employee_max"
  201. :user_no_select="false"
  202. @confirm="add_employee_confirm"
  203. ref="Employee"
  204. ></EmployeeSelector>
  205. </div>
  206. <el-form-item style="text-align: right; margin-bottom: 0;margin-top: 20px;">
  207. <el-button @click="add_employee_close()">取消</el-button>
  208. <el-button type="primary" @click="sub_add_employee('add_employee_form')" :loading="disabled" :disabled="disabled">完成</el-button>
  209. </el-form-item>
  210. </el-form>
  211. </el-dialog>
  212. <!-- 导入规则 -->
  213. <!-- <el-dialog title="导入自动积分" :visible.sync="import_rules_show" width="500px" @before-close="close_import">
  214. <el-row>
  215. <el-col :span="12">
  216. <div style="text-align: center;line-height: 34px;">
  217. <p>1、导出模板,填写好规则</p>
  218. <p><img src="../../assets/image/rules_mould.png" alt="" /></p>
  219. <p>规则表</p>
  220. <p>
  221. <a target="_blank" :href="publicBASE_API + '/api/download/point_auto'"><el-button type="primary" >下载模板</el-button></a>
  222. </p>
  223. </div>
  224. </el-col>
  225. <el-col :span="12">
  226. <div style="text-align: center;line-height: 34px;">
  227. <p>2、上传填好的规则表</p>
  228. <p><img src="../../assets/image/rules_mould1.png" alt="" /></p>
  229. <p>仅支持xls、xlsx格式文件</p>
  230. <el-upload
  231. class="upload-demo"
  232. :headers="ATOKEN"
  233. :data="{ type: 'auto_integral' }"
  234. ref="upload"
  235. :limit="1"
  236. :action="action"
  237. :on-remove="handleRemove"
  238. :on-success="handleSuccess"
  239. :before-upload="beforeFilesUpload"
  240. :file-list="fileList"
  241. >
  242. <el-button slot="trigger" type="primary">选取文件</el-button>
  243. </el-upload>
  244. </div>
  245. </el-col>
  246. </el-row>
  247. </el-dialog> -->
  248. <toLead :visible.sync="toleadShw" :nowIndex.sync="nowIndex" :tolead="toleadResult" @confirm="tealConfirm" :export_type="'auto_point'" :dstyle="'padding: 40px 80px;'">
  249. <template slot="1">
  250. <el-row v-if="nowIndex == 1">
  251. <el-col :span="12">
  252. <div style="text-align: center;line-height: 34px;">
  253. <p>1、导出模板,填写好规则</p>
  254. <p><img src="../../assets/image/rules_mould.png" alt="" /></p>
  255. <p>规则表</p>
  256. <p>
  257. <a target="_blank" :href="publicBASE_API + '/api/download/point_auto'"><el-button type="primary">下载模板</el-button></a>
  258. </p>
  259. </div>
  260. </el-col>
  261. <el-col :span="12">
  262. <div style="text-align: center;line-height: 34px;">
  263. <p>2、上传填好的规则表</p>
  264. <p><img src="../../assets/image/rules_mould1.png" alt="" /></p>
  265. <p>仅支持xls、xlsx格式文件</p>
  266. <el-upload
  267. class="upload-demo"
  268. :headers="ATOKEN"
  269. :data="{ type: 'auto_integral' }"
  270. ref="upload"
  271. :limit="1"
  272. :action="action"
  273. :on-remove="handleRemove"
  274. :on-success="handleSuccess"
  275. :before-upload="beforeFilesUpload"
  276. :file-list="fileList"
  277. :on-progress="handleOnthecross"
  278. >
  279. <el-button slot="trigger" type="primary">选取文件</el-button>
  280. </el-upload>
  281. <!-- <p><el-button type="primary" @click="submitUpload" :loading="save_loading" v-show="import_btn_show" block>导入</el-button></p> -->
  282. </div>
  283. </el-col>
  284. </el-row>
  285. </template>
  286. </toLead>
  287. </div>
  288. </div>
  289. </template>
  290. <script>
  291. import EmployeeSelector from '@/components/EmployeeSelector';
  292. import toLead from '@/components/toLead';
  293. export default {
  294. data() {
  295. return {
  296. pd_tianjia: false,
  297. default_active: '0-0',
  298. table_list: [],
  299. tips_show: false,
  300. rule_trees_load: false,
  301. dialogVisible: false,
  302. rules_detail_show: false, //是否弹出添加人员弹窗
  303. add_employee_visible: false,
  304. add_employee_max: 0,
  305. add_employee_show: false,
  306. task_cycle_name: '',
  307. add_employee_form: {
  308. employee_ids: []
  309. },
  310. isShowAdd: false,
  311. del_arr: {
  312. ids: []
  313. },
  314. val_page: '', //存入某一页文本框选中的数量
  315. page: 1, //默认页数 为1
  316. total: 0, //返回的总数据
  317. pagesize: 10, //每页显示的数据
  318. table_loading: false,
  319. staff_loading: false,
  320. dialogFormVisible: false,
  321. form: {
  322. name: '',
  323. region: '',
  324. date1: '',
  325. date2: '',
  326. delivery: false,
  327. type: [],
  328. resource: '',
  329. desc: ''
  330. },
  331. formLabelWidth: '120px',
  332. numberValidateForm: {
  333. name: ''
  334. },
  335. disabled: false, //按钮不能被多次点击
  336. grouping_type: '',
  337. rules_detail_title: '',
  338. rule_list: [], //分类集合
  339. item_list: [], //规则集合
  340. right_rules_detail: {},
  341. add_employee_id: '',
  342. rules_detail_form: {
  343. rule_id: '',
  344. range_type: '1',
  345. prize_type: '1',
  346. min_point: '',
  347. remark: '',
  348. is_attendance: '0',
  349. cycle_type: '2',
  350. pt_id: '3'
  351. },
  352. is_attendance: false,
  353. rules_rules: {
  354. remark: [
  355. {
  356. required: true,
  357. message: '请输入规则名称',
  358. trigger: 'blur'
  359. },
  360. {
  361. max: 100,
  362. message: '分类名称不能大于100个字符',
  363. trigger: 'blur'
  364. }
  365. ],
  366. min_point: [
  367. {
  368. required: true,
  369. message: '请输入积分',
  370. trigger: 'blur'
  371. }
  372. ],
  373. rule_id: [
  374. {
  375. required: true,
  376. message: '请选择分类',
  377. trigger: 'blur'
  378. }
  379. ]
  380. },
  381. task_cycle: [
  382. {
  383. name: '每天0点自动加分',
  384. value: 1
  385. },
  386. {
  387. name: '每周一自动加分',
  388. value: 2
  389. },
  390. {
  391. name: '每月1号自动加分',
  392. value: 3
  393. }
  394. ],
  395. action: process.env.VUE_APP_BASE_API + 'api/integral/auto/import',
  396. publicBASE_API: process.env.VUE_APP_BASE_API,
  397. save_loading: false,
  398. ATOKEN: { 'A-TOKEN': this.$getToken(), Accept: 'application/vnd.test.v2+json' },
  399. import_btn_show: false,
  400. fileList: [],
  401. file: null,
  402. import_rules_show: false, //导出弹窗
  403. keyword: '',
  404. employee_map: [],
  405. employee_id: '',
  406. selectData: {},
  407. //导入相关
  408. toleadShw: false,
  409. nowIndex: 1,
  410. toleadResult: {}
  411. };
  412. },
  413. components: {
  414. EmployeeSelector,
  415. toLead
  416. },
  417. created() {
  418. this.getEmployee();
  419. },
  420. watch: {
  421. toleadShw(val) {
  422. if (val) this.nowIndex = 1;
  423. },
  424. employee_id(val) {
  425. this.page = 1;
  426. this.open_right(this.selectData);
  427. }
  428. },
  429. mounted() {
  430. if (localStorage.getItem('voluntarilyPoint')) {
  431. this.tips_show = false;
  432. } else {
  433. this.tips_show = true;
  434. }
  435. this.get_role_lists(true);
  436. },
  437. methods: {
  438. //获取员工列表
  439. getEmployee() {
  440. this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 })
  441. .then(res => {
  442. let list = res.data.data.list;
  443. this.employee_map = list;
  444. })
  445. .finally(err => {});
  446. },
  447. getUpdate(date) {
  448. return this.$moment.unix(date).format('YYYY-MM-DD HH:mm:ss');
  449. },
  450. // 搜索
  451. onFilterChanged() {},
  452. close_import() {
  453. this.import_rules_show = false;
  454. this.import_btn_show = false;
  455. this.$refs.upload.clearFiles();
  456. },
  457. submitUpload() {
  458. this.save_loading = true;
  459. let params = {
  460. file: this.file
  461. };
  462. this.$axios('post', '/api/integral/auto/import', params)
  463. .then(res => {
  464. if (res.data.code == 1) {
  465. // this.import_rules_show = false;
  466. this.close_import(); //成功之后关闭并清除选中的文件
  467. this.$message.success({ message: res.data.msg });
  468. this.get_rule_trees();
  469. } else {
  470. this.$message({ type: 'error', message: res.data.msg });
  471. }
  472. })
  473. .catch(() => {})
  474. .finally(() => {
  475. this.save_loading = false;
  476. });
  477. },
  478. //导入
  479. beforeFilesUpload(file) {
  480. const $ext_list = ['xlsx', 'xls'];
  481. let len = file.name.split('.').length - 1;
  482. const $ext_name = file.name.split('.')[len];
  483. if ($ext_list.indexOf($ext_name) != -1) {
  484. } else {
  485. this.toleadResult.id = 0;
  486. this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)';
  487. this.nowIndex = 3;
  488. // this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
  489. return false;
  490. }
  491. },
  492. tealConfirm() {
  493. this.page = 1;
  494. this.open_right(this.selectData);
  495. },
  496. handleOnthecross(event, file, fileList) {
  497. this.nowIndex = 2;
  498. },
  499. handleSuccess(response) {
  500. if (response.code == 1) {
  501. response.data.id = 1;
  502. } else {
  503. response.data.id = 0;
  504. response.data.name = response.msg;
  505. }
  506. this.toleadResult = response.data;
  507. this.nowIndex = 3;
  508. return;
  509. if (response.code == 1) {
  510. if (response.data.length > 0) {
  511. var htmls = response.data;
  512. var str = "<div class='red'></div>";
  513. htmls.forEach(item => {
  514. str += `<div>${item.errors}</div>`;
  515. });
  516. this.close_import();
  517. this.$notify.error({
  518. title: '导入错误',
  519. dangerouslyUseHTMLString: true,
  520. message: str,
  521. duration: 0,
  522. offset: 50,
  523. customClass: 'notifyBox'
  524. });
  525. } else {
  526. this.file = response.data;
  527. this.$message.success({ message: response.msg });
  528. this.close_import();
  529. this.page = 1;
  530. this.open_right(this.selectData);
  531. }
  532. } else {
  533. this.$message.error({ message: response.msg });
  534. this.close_import();
  535. }
  536. },
  537. handleRemove(file, fileList) {
  538. if (fileList !== null && fileList.length != 0) {
  539. this.import_btn_show = true;
  540. } else {
  541. this.import_btn_show = false;
  542. }
  543. },
  544. returnIndex(str, str2) {
  545. return str + '-' + str2;
  546. },
  547. handleCurrentChange(val) {
  548. this.page = val;
  549. this.open_right();
  550. },
  551. open_rights(data) {
  552. this.page = 1;
  553. this.selectData = data;
  554. this.open_right(data);
  555. },
  556. // 组建
  557. add_employee_confirm(val) {
  558. this.add_employee_form.employee_ids = [];
  559. if (val.employee.length !== 0) {
  560. val.employee.forEach(element => {
  561. this.add_employee_form.employee_ids.push(element.id);
  562. });
  563. }
  564. },
  565. // 添加成员点击取消
  566. add_employee_close() {
  567. this.add_employee_show = false;
  568. },
  569. // 添加成员点击完成
  570. sub_add_employee(form) {
  571. let self = this;
  572. if (!self.task_cycle_name) {
  573. self.$message.error('请选择加分周期');
  574. return false;
  575. }
  576. this.$refs.Employee.confirm(); //调用组件的confirm();
  577. if (this.add_employee_form.employee_ids.length <= 0) {
  578. this.$message.error('请选择员工');
  579. return false;
  580. }
  581. let data = {
  582. employee_ids: this.add_employee_form.employee_ids,
  583. task_cycle: self.task_cycle_name,
  584. item_id: self.add_employee_id,
  585. rule_id: self.add_rulse_id
  586. };
  587. self.$refs[form].validate(valid => {
  588. if (valid) {
  589. if (data.rule_id == '' || data.item_id == '') {
  590. self.$message.error('请先选择细则');
  591. } else {
  592. this.disabled = true;
  593. self.staff_loading = true;
  594. self.$axios('post', '/api/integral/auto/add', data)
  595. .then(res => {
  596. if (res.data.code == 1) {
  597. self.$message.success('此次操作成功' + res.data.data.success + '条,失败' + res.data.data.error + '条,已经存在的' + res.data.data.exist + '条');
  598. self.open_right();
  599. } else {
  600. self.$message.error(res.data.msg);
  601. }
  602. })
  603. .finally(() => {
  604. self.add_employee_show = false;
  605. self.staff_loading = false;
  606. this.disabled = false;
  607. });
  608. }
  609. } else {
  610. return false;
  611. }
  612. });
  613. },
  614. handleSelectionChange(val) {
  615. this.del_arr.ids = [];
  616. val.forEach(element => {
  617. this.del_arr.ids.push(element.id);
  618. });
  619. this.val_page = val;
  620. },
  621. // 批量删除
  622. del_item() {
  623. let self = this;
  624. if (self.del_arr.ids.length !== 0) {
  625. self.$confirm('此操作将永久删除该人员的自动加分, 是否继续?', '提示', {
  626. confirmButtonText: '确定',
  627. cancelButtonText: '取消',
  628. type: 'warning'
  629. }).then(() => {
  630. self.$axios('post', '/api/integral/auto/delete/many', self.del_arr)
  631. .then(res => {
  632. if (res.data.code == 1) {
  633. self.$message.success(res.data.msg);
  634. // 判断当页的总数与选中的数量是否相等,如果相等,此页就无数据,就请求上一页的数据
  635. if (this.table_list.length == this.val_page.length) {
  636. if (this.page !== 1) {
  637. //判断不在第一页的时候执行
  638. this.page = this.page - 1;
  639. }
  640. }
  641. self.open_right();
  642. } else {
  643. self.$message.error(res.data.msg);
  644. }
  645. })
  646. .finally(() => {
  647. self.loading = false;
  648. });
  649. });
  650. } else {
  651. self.$message.error('请选择要移除的人员');
  652. }
  653. },
  654. // 关闭提示语
  655. tips_close() {
  656. localStorage.setItem('voluntarilyPoint', 'true');
  657. this.tips_show = false;
  658. },
  659. //新增加分项
  660. add_rules_detail() {
  661. this.rules_detail_form = {
  662. rule_id: '',
  663. range_type: '1',
  664. prize_type: '1',
  665. min_point: '',
  666. remark: '',
  667. is_attendance: '0',
  668. cycle_type: '2',
  669. pt_id: '3'
  670. };
  671. this.dialogFormVisible = true;
  672. this.rules_detail_title = false;
  673. },
  674. //编辑加分项
  675. editRule(form) {
  676. let self = this;
  677. let data = null;
  678. self.rules_detail_form.max_point = self.rules_detail_form.min_point;
  679. if (this.rules_detail_title == false) {
  680. data = {
  681. items: [self.rules_detail_form]
  682. };
  683. } else {
  684. self.rules_detail_form.item_id = self.rules_detail_form.id;
  685. data = self.rules_detail_form;
  686. data.sync = 2;
  687. }
  688. self.$refs[form].validate(valid => {
  689. if (valid) {
  690. this.disabled = true;
  691. // if (this.is_attendance) {
  692. // self.rules_detail_form.is_attendance = 1;
  693. // } else {
  694. // self.rules_detail_form.is_attendance = 0;
  695. // }
  696. var url = this.rules_detail_title ? 'api/integral/rule/items/edit' : '/api/integral/rule/items';
  697. self.$axios('post', url, data)
  698. .then(res => {
  699. // setTimeout(() => {
  700. // this.is_attendance = false;
  701. // }, 300);
  702. if (res.data.code == 1) {
  703. self.$message.success(res.data.msg);
  704. self.rules_detail_show = false;
  705. if (this.rules_detail_title) {
  706. //当为编辑时
  707. if (self.rules_detail_form.rule_id != self.right_rules_detail.rule_id) {
  708. //当编辑规则修改了上级时
  709. self.get_role_lists(true);
  710. } else {
  711. //正常编辑
  712. self.get_role_lists();
  713. self.right_rules_detail.remark = data.remark;
  714. self.right_rules_detail.min_point = data.min_point;
  715. }
  716. } else {
  717. //当为添加时
  718. self.add_employee_id = res.data.data.item_id; //规则ID
  719. self.add_rulse_id = self.rules_detail_form.rule_id; //分类ID
  720. self.get_role_lists(true, true);
  721. setTimeout(() => {
  722. self.add_employee_show = true;
  723. }, 600);
  724. }
  725. } else {
  726. self.$message.error(res.data.msg);
  727. }
  728. })
  729. .finally(() => {
  730. this.dialogFormVisible = false;
  731. self.disabled = false;
  732. });
  733. } else {
  734. return false;
  735. }
  736. });
  737. },
  738. //点击取消
  739. rules_detail_close(form) {
  740. this.dialogFormVisible = false;
  741. this.rules_detail_show = false;
  742. this.$refs[form].resetFields();
  743. },
  744. //获取右边表格数据
  745. open_right(data, updata) {
  746. let self = this;
  747. self.table_loading = true;
  748. this.isShowAdd = false;
  749. if (data && !updata) {
  750. self.add_employee_id = data.id;
  751. self.add_rulse_id = data.rule_id;
  752. self.right_rules_detail = data;
  753. } else if (updata) {
  754. self.right_rules_detail = data;
  755. } else {
  756. self.add_employee_id = self.right_rules_detail.id;
  757. self.add_rulse_id = self.right_rules_detail.rule_id;
  758. }
  759. var params = {
  760. item_id: self.add_employee_id || '',
  761. employee_id: self.employee_id || '',
  762. page: self.page,
  763. page_size: Number(this.pagesize)
  764. };
  765. self.$axios('get', '/api/integral/auto/list', params)
  766. .then(res => {
  767. if (res.data.code == 1) {
  768. self.table_list = res.data.data.list || [];
  769. self.total = res.data.data.total;
  770. } else {
  771. self.$message.error(res.data.msg);
  772. }
  773. })
  774. .finally(() => {
  775. self.table_loading = false;
  776. });
  777. },
  778. // 编辑规则
  779. edit_rules() {
  780. this.rules_detail_title = true;
  781. this.dialogFormVisible = true;
  782. this.rules_detail_form = JSON.parse(JSON.stringify(this.right_rules_detail));
  783. // this.is_attendance = this.rules_detail_form.is_attendance == '0' ? false : true;
  784. },
  785. // 删除规则
  786. del_rules_detail(item) {
  787. this.$confirm('此操作将永久删除该加分项, 是否继续?', '提示', {
  788. confirmButtonText: '确定',
  789. cancelButtonText: '取消',
  790. type: 'warning'
  791. }).then(() => {
  792. this.disabled = true;
  793. this.$axios('post', '/api/integral/rule/items/destroy', { item_ids: JSON.stringify([item.id]) })
  794. .then(res => {
  795. if (res.data.code == 1) {
  796. this.$message.success('删除成功');
  797. this.rules_detail_show = false;
  798. this.get_role_lists(true);
  799. } else {
  800. this.$message.error(res.data.msg);
  801. this.get_role_lists();
  802. }
  803. })
  804. .finally(() => {
  805. this.dialogFormVisible = false;
  806. this.disabled = false;
  807. });
  808. });
  809. },
  810. //新增加分组展示不同渲染
  811. add_grouping() {
  812. this.numberValidateForm = {
  813. name: ''
  814. };
  815. this.dialogVisible = true;
  816. this.grouping_type = false;
  817. },
  818. // 新增加分组
  819. submitForm(formName) {
  820. this.$refs[formName].validate(valid => {
  821. if (valid) {
  822. let data = this.grouping_type
  823. ? {
  824. rule_id: this.numberValidateForm.id,
  825. pid: '0',
  826. name: this.numberValidateForm.name
  827. }
  828. : {
  829. cycle_type: '2',
  830. pid: '0',
  831. name: this.numberValidateForm.name
  832. };
  833. this.disabled = true;
  834. var url = this.grouping_type ? '/api/integral/rule/edit' : '/api/integral/rule';
  835. this.$axios('post', url, data)
  836. .then(res => {
  837. if (res.data.code == '1') {
  838. this.get_role_lists();
  839. this.$message.success(this.grouping_type ? '修改积分规则' : res.data.msg);
  840. }
  841. })
  842. .finally(() => {
  843. this.dialogVisible = false;
  844. this.disabled = false;
  845. });
  846. } else {
  847. return false;
  848. }
  849. });
  850. },
  851. //修改分组
  852. edit_grouping(item) {
  853. this.dialogVisible = true;
  854. this.numberValidateForm = JSON.parse(JSON.stringify(item));
  855. this.grouping_type = true;
  856. },
  857. //删除分组
  858. del_grouping(item) {
  859. this.$confirm('此操作将永久删除该分类, 是否继续?', '提示', {
  860. confirmButtonText: '确定',
  861. cancelButtonText: '取消',
  862. type: 'warning'
  863. })
  864. .then(() => {
  865. this.disabled = true;
  866. this.$axios('post', '/api/integral/rule/destroy', { rule_id: item.id })
  867. .then(res => {
  868. if (res.data.code == 1) {
  869. this.get_role_lists();
  870. this.$message.success('删除成功');
  871. }
  872. })
  873. .finally(() => {
  874. this.dialogVisible = false;
  875. this.disabled = false;
  876. });
  877. })
  878. .catch(() => {
  879. setTimeout(() => {
  880. this.dialogVisible = false;
  881. }, 300);
  882. });
  883. },
  884. // 获取初始化数据
  885. get_role_lists(is, noUpdata) {
  886. this.table_loading = true;
  887. this.rule_trees_load = true;
  888. this.$axios('get', '/api/integral/rule/trees', { cycle_type: '2' })
  889. .then(res => {
  890. var rule_list = res.data.data.rule_tree || [];
  891. var item_list = res.data.data.item_list || [];
  892. var itemListAll = [];
  893. for (let i in item_list) {
  894. for (let k in item_list[i]) {
  895. itemListAll.push(item_list[i][k]);
  896. }
  897. }
  898. rule_list.map(item => {
  899. item.child = itemListAll.filter(item2 => {
  900. return item2.rule_id == item.id;
  901. });
  902. });
  903. this.rule_list = rule_list;
  904. this.item_list = itemListAll;
  905. if (is) {
  906. this.default_active = '';
  907. if (rule_list[0].child[0]) {
  908. this.right_rules_detail = {};
  909. this.table_list = [];
  910. this.page = 1;
  911. this.selectData = rule_list[0].child[0];
  912. this.open_right(rule_list[0].child[0], noUpdata);
  913. setTimeout(() => {
  914. this.default_active = '0-0';
  915. }, 500);
  916. } else {
  917. this.right_rules_detail = {};
  918. this.isShowAdd = true;
  919. }
  920. }
  921. })
  922. .finally(err => {
  923. setTimeout(() => {
  924. this.rule_trees_load = false;
  925. this.table_loading = false;
  926. }, 700);
  927. });
  928. }
  929. }
  930. };
  931. </script>
  932. <style scoped="scoped" lang="scss">
  933. .rule_name {
  934. border-right: 0;
  935. margin-top: 16px;
  936. li {
  937. border-bottom: 1px #f8f8f8 solid;
  938. overflow: hidden;
  939. white-space: nowrap;
  940. text-overflow: ellipsis;
  941. ::v-deep .el-submenu__title {
  942. padding: 0 10px !important;
  943. i.el-submenu__icon-arrow.el-icon-arrow-down {
  944. color: #909399 !important;
  945. }
  946. }
  947. // li:hover .el-submenu__title {
  948. // background: #e7f6ff;
  949. // }
  950. // ul {
  951. // li.is-active {
  952. // background-color: #e7f6ff !important;
  953. // }
  954. // }
  955. }
  956. // ::v-deep .is-opened .el-submenu__title .title_top {
  957. // color: #409eff !important;
  958. // }
  959. // ::v-deep .is-opened .el-menu .el-menu-item span {
  960. // color: #333;
  961. // }
  962. // ::v-deep .is-opened .el-menu .is-active span {
  963. // color: #409eff;
  964. // }
  965. }
  966. ::v-deep .el-submenu__title {
  967. height: 47px !important;
  968. line-height: 47px !important;
  969. }
  970. .rule_list {
  971. position: relative;
  972. display: table-cell;
  973. }
  974. .rule_list:after {
  975. content: ' ';
  976. position: absolute;
  977. top: 0;
  978. left: 0;
  979. bottom: 0;
  980. width: 1px;
  981. background: #ebeef5;
  982. }
  983. .terr-right {
  984. min-height: calc(100vh - 224px);
  985. .name {
  986. height: 100%;
  987. font-size: 18px;
  988. margin-right: 20px;
  989. }
  990. .btns {
  991. padding-top: 20px;
  992. }
  993. }
  994. .terr-left button {
  995. margin: 0 auto;
  996. display: block;
  997. margin-bottom: 10px;
  998. }
  999. </style>