voluntarilyPoint.vue 30 KB

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