voluntarilyPoint.vue 29 KB

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