rule.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. <template>
  2. <div class="all-box">
  3. <!-- 头部提示 -->
  4. <el-alert class="diy-tip" title="如何使用积分规则?" type="success" @close="tips_close" v-if="tips_show" description show-icon>
  5. <p>先【添加规则分类】,再【添加规则】</p>
  6. </el-alert>
  7. <div class="all">
  8. <div class="flex-box" v-loading="rule_loading">
  9. <div class="terr-left">
  10. <el-button size="medium" @click="add_class" type="primary">+ 添加规则分类</el-button>
  11. <div class="rule_class_box">
  12. <el-tree
  13. accordion
  14. :data="rule_tree"
  15. class="cate-tree"
  16. :props="defaultProps"
  17. :highlight-current="true"
  18. @node-click="handleNodeClick"
  19. ></el-tree>
  20. </div>
  21. </div>
  22. <div class="terr-right border-right flex-1">
  23. <div class="flex-box flex-v-ce">
  24. <div class="name">{{ selectItem.name }}</div>
  25. <el-button size="medium" plain v-if="selectItem.id" @click="edit_class">编辑</el-button>
  26. </div>
  27. <div class="flex-box btns flex-v-ce">
  28. <el-button size="small" @click="del_item" type="danger" plain>批量删除</el-button>
  29. <el-button size="small" @click="add_rule" type="primary">添加规则</el-button>
  30. <el-button size="small" type="success" @click="import_rules_show = true" plain>导入规则</el-button>
  31. </div>
  32. <el-table stripe ref="multipleTable" :data="item_list" tooltip-effect="dark" @selection-change="handleSelectionChange" @row-click="editDetails" align="center">
  33. <el-table-column type="selection" width="55"></el-table-column>
  34. <el-table-column prop="remark" label="内容" align="left"></el-table-column>
  35. <el-table-column label="分值" align="center">
  36. <template slot-scope="scope">
  37. <div v-if="scope.row.range_type == 1">
  38. <span :class="scope.row.min_point > 0 ? 'red' : 'green'">{{ scope.row.min_point }} {{ scope.row.pt_Obj.name }}</span>
  39. </div>
  40. <div v-if="scope.row.range_type == 2">
  41. <span :class="scope.row.min_point > 0 ? 'red' : 'green'">{{ scope.row.min_point }}</span>
  42. <span :class="scope.row.max_point > 0 ? 'red' : 'green'">{{ scope.row.max_point }} {{ scope.row.pt_Obj.name }}</span>
  43. </div>
  44. </template>
  45. </el-table-column>
  46. <template slot="empty">
  47. <noData></noData>
  48. </template>
  49. </el-table>
  50. </div>
  51. </div>
  52. </div>
  53. <!-- 编辑添加分类 -->
  54. <el-dialog :title="class_type == 'add' ? '添加规则分类' : '编辑规则分类'" :visible.sync="class_show" @close="add_dept_close('dept_formdata')" :close-on-click-modal="false" width="500px">
  55. <el-form :model="dept_formdata" ref="dept_formdata" :rules="dept_formdata_rules" label-width="80px">
  56. <el-form-item label="规则分类" prop="name"><el-input v-model="dept_formdata.name"></el-input></el-form-item>
  57. <el-form-item label="上级分类">
  58. <el-cascader
  59. ref="dept"
  60. v-model="dept_formdata.pid"
  61. :options="rule_tree"
  62. :props="{ checkStrictly: true, label: 'name', value: 'id', children: 'child' }"
  63. clearable
  64. filterable
  65. ></el-cascader>
  66. </el-form-item>
  67. <div class="flex-box">
  68. <el-button type="danger" @click="del_dept" v-show="class_type == 'edit'">删除分类</el-button>
  69. <div class="flex-1"></div>
  70. <el-button @click="add_dept_close('dept_formdata')">取消</el-button>
  71. <el-button type="primary" @click="submit_add_dept('dept_formdata')" :loading="dept_loading">确定</el-button>
  72. </div>
  73. </el-form>
  74. </el-dialog>
  75. <!-- 添加编辑规则 -->
  76. <el-dialog :title="rule_type == 'add' ? '添加规则' : '编辑规则'" :visible.sync="rule_show" :close-on-click-modal="false" width="600px">
  77. <el-form :model="rules_detail_form" ref="rules_detail_form" :rules="rules" label-width="80px">
  78. <el-form-item label="规则内容" prop="remark">
  79. <el-input v-model="rules_detail_form.remark" placeholder="请输入规则内容" type="textarea" :rows="3" maxlength="100" show-word-limit></el-input>
  80. </el-form-item>
  81. <el-form-item label="所属分类" prop="rule_id">
  82. <div style="position: relative;">
  83. <div
  84. style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: 9;"
  85. @click="not_data"
  86. v-show="rule_tree !== null && rule_tree.length == 0"
  87. ></div>
  88. <el-cascader
  89. ref="dept2"
  90. placeholder="请选择分类"
  91. v-model="rules_detail_form.rule_id"
  92. :options="rule_tree"
  93. :props="{ checkStrictly: true, label: 'name', value: 'id', children: 'child' }"
  94. clearable
  95. filterable
  96. ></el-cascader>
  97. </div>
  98. </el-form-item>
  99. <el-form-item label="规则类型" prop="pt_id">
  100. <el-radio v-model="rules_detail_form.pt_id" :label="item.id" v-for="(item, index) in point_types" :key="index" v-show="item.name !== '绩效分'">
  101. {{ item.name }}
  102. </el-radio>
  103. </el-form-item>
  104. <el-form-item label="规则积分" prop="range_type">
  105. <el-radio-group v-model="rules_detail_form.range_type">
  106. <el-radio :label="item.value" v-for="(item, index) in range_type_arr" :key="index">{{ item.name }}</el-radio>
  107. </el-radio-group>
  108. </el-form-item>
  109. <div class="flex-box flex-v-ce">
  110. <el-form-item prop="min_point2" class="select_width">
  111. <el-input placeholder="请输入分值" v-model.number="rules_detail_form.min_point2" type="age" class="input-with-select">
  112. <el-select v-model="integral_select_name1" slot="prepend" placeholder="请选择类型">
  113. <el-option v-for="(item, index) in integral_select" :key="index" :label="item.name" :value="item.value"></el-option>
  114. </el-select>
  115. </el-input>
  116. </el-form-item>
  117. <div v-if="rules_detail_form.range_type == 2" style="position: relative;bottom: 10px;padding: 0 10px;">至</div>
  118. <el-form-item prop="max_point2" v-if="rules_detail_form.range_type == 2" class="form-right select_width">
  119. <el-input placeholder="请输入分值" v-model.number="rules_detail_form.max_point2" type="age" class="input-with-select">
  120. <el-select v-model="integral_select_name2" slot="prepend" placeholder="请选择类型">
  121. <el-option v-for="(item, index) in integral_select" :key="index" :label="item.name" :value="item.value"></el-option>
  122. </el-select>
  123. </el-input>
  124. </el-form-item>
  125. </div>
  126. <!-- <el-form-item prop="min_point">
  127. <el-row :gutter="20" class="select_width">
  128. <el-col :span="11">
  129. <el-input
  130. placeholder="请输入分值"
  131. v-model.number="rules_detail_form.min_point"
  132. type="age" class="input-with-select"
  133. >
  134. <el-select v-model="integral_select_name1" slot="prepend" placeholder="请选择类型">
  135. <el-option v-for="(item, index) in integral_select" :key="index" :label="item.name" :value="item.value"></el-option>
  136. </el-select>
  137. </el-input>
  138. </el-col>
  139. <el-col :span="1" v-show="rules_detail_form.range_type == 2">至</el-col>
  140. <el-col :span="11" v-show="rules_detail_form.range_type == 2">
  141. <el-input
  142. placeholder="请输入分值"
  143. v-model.number="rules_detail_form.max_point"
  144. type="age" class="input-with-select"
  145. >
  146. <el-select v-model="integral_select_name2" slot="prepend" placeholder="请选择类型">
  147. <el-option v-for="(item, index) in integral_select" :key="index" :label="item.name" :value="item.value"></el-option>
  148. </el-select>
  149. </el-input>
  150. </el-col>
  151. </el-row>
  152. </el-form-item> -->
  153. <div class="flex-box flex-v-ce">
  154. <el-button type="danger" @click="del_rule" :loading="delRule_loading" v-show="rule_type == 'edit'">删除规则</el-button>
  155. <div class="flex-1"></div>
  156. <el-button @click="rule_close('rules_detail_form')">取消</el-button>
  157. <el-button type="primary" v-show="rule_type == 'add'" :loading="rule_loading2" @click="add_submit_rule('rules_detail_form')">确定</el-button>
  158. <el-button type="primary" v-show="rule_type == 'edit'" :loading="rule_loading2" @click="edit_submit_rule('rules_detail_form')">确定</el-button>
  159. </div>
  160. </el-form>
  161. </el-dialog>
  162. <!-- 导入规则 -->
  163. <el-dialog title="导入规则" :visible.sync="import_rules_show" width="500px" @before-close="close_import">
  164. <el-row>
  165. <el-col :span="12">
  166. <div class="text-center">
  167. <p>1、下载规则模版,填写好规则</p>
  168. <p><img src="@/assets/image/rules_mould.png" alt="" /></p>
  169. <p>规则表</p>
  170. <p>
  171. <a target="_blank" :href="downloadUrl"><el-button type="primary">下载模板</el-button></a>
  172. </p>
  173. </div>
  174. </el-col>
  175. <el-col :span="12">
  176. <div class="text-center">
  177. <p>2、上传填好的规则表</p>
  178. <p><img src="@/assets/image/rules_mould1.png" alt="" /></p>
  179. <p>仅支持xls、xlsx格式文件</p>
  180. <el-upload
  181. class="upload-demo"
  182. :headers="ATOKEN"
  183. ref="upload"
  184. :limit="1"
  185. :action="action"
  186. :on-preview="handlePreview"
  187. :on-remove="handleRemove"
  188. :on-success="handleSuccess"
  189. :before-upload="beforeFilesUpload"
  190. :file-list="fileList"
  191. >
  192. <el-button slot="trigger" type="primary">选取文件</el-button>
  193. </el-upload>
  194. <!-- <p><el-button type="primary" @click="submitUpload" :loading="save_loading" v-show="import_btn_show" block>导入</el-button></p> -->
  195. </div>
  196. </el-col>
  197. </el-row>
  198. </el-dialog>
  199. </div>
  200. </template>
  201. <script>
  202. import noData from '@/components/noData';
  203. export default {
  204. data() {
  205. return {
  206. action:process.env.VUE_APP_BASE_API+'api/rule/import',
  207. downloadUrl:process.env.VUE_APP_BASE_API+'api/download/rule_item',
  208. ATOKEN: { 'A-TOKEN': this.$getToken(),'Accept':'application/vnd.test.v2+json' },
  209. tips_show: true,
  210. rule_loading: false,
  211. rule_tree: [],
  212. item_list: [],
  213. all_item_list: [],
  214. defaultProps: {
  215. id: 'id',
  216. children: 'child',
  217. label: 'name'
  218. },
  219. selectItem: { name: '积分规则' }, //选择的分类
  220. //添加分类
  221. class_show: false,
  222. delRule_loading:false,
  223. dept_formdata_rules: {
  224. name: [
  225. {
  226. required: true,
  227. message: '请输入规则分类',
  228. trigger: 'blur'
  229. },
  230. {
  231. min: 2,
  232. max: 20,
  233. message: '长度在 2 到 20 个字符',
  234. trigger: 'blur'
  235. }
  236. ]
  237. },
  238. dept_formdata: {
  239. name: '',
  240. pid: '0',
  241. cycle_type: '1'
  242. },
  243. class_type: 'add',
  244. dept_loading:false,
  245. // 规则相关
  246. del_item_id: [], //选择规则ID集合
  247. rule_loading2: false,
  248. rule_type: 'add',
  249. rule_show: false,
  250. rules_detail_form: {
  251. rule_id: '',
  252. range_type: '1',
  253. prize_type: '0',
  254. min_point: 0,
  255. max_point: 0,
  256. min_point2: 0,
  257. max_point2: 0,
  258. remark: '',
  259. is_attendance: '0',
  260. cycle_type: '1',
  261. pt_id: 0
  262. },
  263. rules: {
  264. remark: [
  265. {
  266. required: true,
  267. message: '请输入规则名称',
  268. trigger: 'blur'
  269. }
  270. ],
  271. rule_id: [
  272. {
  273. required: true,
  274. message: '请选择分类',
  275. trigger: 'change'
  276. }
  277. ],
  278. // min_point2:[{ required: true, message: '分值不能为空'},{ pattern: /^[1-9]\d*$/, message: '分值必须为数字值'}],
  279. // max_point2:[{ required: true, message: '分值不能为空'},{ pattern: /^[1-9]\d*$/, message: '分值必须为数字值'}],
  280. },
  281. integral_select_name1: '1',
  282. integral_select_name2: '1',
  283. point_types: [],
  284. range_type_arr: [
  285. {
  286. name: '固定分值',
  287. value: '1'
  288. },
  289. {
  290. name: '范围分值',
  291. value: '2'
  292. }
  293. ],
  294. integral_select: [
  295. {
  296. name: '奖分',
  297. value: '1'
  298. },
  299. {
  300. name: '扣分',
  301. value: '2'
  302. }
  303. ],
  304. //导入规则
  305. import_rules_show: false,
  306. save_loading: false,
  307. import_btn_show: false,
  308. fileList: [],
  309. file: null,
  310. flName:'',
  311. };
  312. },
  313. components: {
  314. noData
  315. },
  316. watch:{
  317. 'dept_formdata.pid'(val, old_val) {
  318. this.$nextTick(()=>{
  319. this.$refs.dept.dropDownVisible = false;
  320. })
  321. },
  322. 'rules_detail_form.rule_id'(val, old_val) {
  323. this.$nextTick(()=>{
  324. this.$refs.dept2.dropDownVisible = false;
  325. })
  326. }
  327. },
  328. created() {
  329. this.point_types = this.$getTyps().reverse()
  330. },
  331. mounted() {
  332. this.$nextTick(function() {
  333. if (localStorage.getItem('rule')) {
  334. this.tips_show = false;
  335. } else {
  336. this.tips_show = true;
  337. }
  338. });
  339. var that=this;
  340. // setTimeout(function(){
  341. that.getData();
  342. // },1000);
  343. },
  344. methods: {
  345. // 导入相关
  346. close_import() {
  347. this.import_rules_show = false;
  348. this.import_btn_show = false;
  349. this.$refs.upload.clearFiles();
  350. },
  351. submitUpload() {
  352. this.save_loading = true;
  353. let params = {
  354. file: this.file
  355. };
  356. this.$axios('post','/api/rule/import', params,).then(res => {
  357. if (res.data.code == 1) {
  358. this.close_import();
  359. this.$message.success({ message: res.data.msg });
  360. this.getData();
  361. } else {
  362. this.$message({ type: 'error', message: res.data.msg });
  363. }
  364. }).finally(() => {
  365. this.save_loading = false;
  366. });
  367. },
  368. handleSuccess(response) {
  369. if (response.code == 1) {
  370. if(response.data.length>0){
  371. var htmls=response.data;
  372. var str="<div class='red'></div>";
  373. htmls.forEach(item=>{
  374. str+=`<div>${item.errors}</div>`;
  375. })
  376. this.close_import();
  377. this.$notify.error({
  378. title: '导入错误',
  379. dangerouslyUseHTMLString: true,
  380. message: str,
  381. duration:0,
  382. offset:50,
  383. customClass:'notifyBox',
  384. });
  385. }else{
  386. this.file = response.data;
  387. this.$message.success({ message: response.msg });
  388. this.getData();
  389. this.close_import();
  390. }
  391. }
  392. },
  393. handleRemove(file, fileList) {
  394. if (fileList !== null && fileList.length != 0) {
  395. this.import_btn_show = true;
  396. } else {
  397. this.import_btn_show = false;
  398. }
  399. },
  400. handlePreview(file) {
  401. console.log(file);
  402. },
  403. imgChange(file, fileList) {
  404. if (fileList !== null && fileList.length != 0) {
  405. this.import_btn_show = true;
  406. } else {
  407. this.import_btn_show = false;
  408. }
  409. },
  410. beforeFilesUpload(file) {
  411. const $ext_list = ['xlsx', 'xls'];
  412. let len = file.name.split('.').length - 1;
  413. const $ext_name = file.name.split('.')[len];
  414. if ($ext_list.indexOf($ext_name) != -1) {
  415. this.import_btn_show = true;
  416. } else {
  417. this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
  418. return false;
  419. }
  420. },
  421. edit_submit_rule(form) {
  422. let self = this;
  423. self.$refs[form].validate(valid => {
  424. if (valid) {
  425. if(self.rules_detail_form.min_point2==0||!self.rules_detail_form.min_point2){
  426. this.$message.error('请输入积分分值');
  427. return
  428. }
  429. self.rules_detail_form.min_point=self.rules_detail_form.min_point2;
  430. self.rules_detail_form.max_point=self.rules_detail_form.max_point2;
  431. if (self.integral_select_name1 != '1' && self.rules_detail_form.min_point >= 0) {
  432. self.rules_detail_form.min_point = '-' + self.rules_detail_form.min_point;
  433. }
  434. if (self.integral_select_name2 != '1' && self.rules_detail_form.max_point >= 0) {
  435. self.rules_detail_form.max_point = '-' + self.rules_detail_form.max_point;
  436. }
  437. if (self.rules_detail_form.range_type == 1) {
  438. self.rules_detail_form.max_point = self.rules_detail_form.min_point;
  439. }
  440. if(Array.isArray(self.rules_detail_form.rule_id)){
  441. self.rules_detail_form.rule_id=self.rules_detail_form.rule_id[self.rules_detail_form.rule_id.length-1];
  442. }
  443. if (parseFloat(self.rules_detail_form.min_point) > parseFloat(self.rules_detail_form.max_point)) {
  444. this.$confirm(
  445. '填写的规则积分是' +
  446. self.rules_detail_form.min_point +
  447. ' ~ ' +
  448. self.rules_detail_form.max_point +
  449. ',应该是 ' +
  450. self.rules_detail_form.max_point +
  451. ' ~ ' +
  452. self.rules_detail_form.min_point +
  453. '吧?',
  454. '提示',
  455. {
  456. confirmButtonText: '确定',
  457. cancelButtonText: '取消',
  458. type: 'warning'
  459. }
  460. )
  461. .then(() => {
  462. this.rule_loading2=true;
  463. let min_point = self.rules_detail_form.min_point;
  464. self.rules_detail_form.min_point = self.rules_detail_form.max_point;
  465. self.rules_detail_form.max_point = min_point;
  466. let data = self.rules_detail_form;
  467. data.item_id = self.rules_detail_form.id;
  468. if (self.rules_detail_form.min_point == 0 && self.rules_detail_form.range_type == 1) {
  469. self.$message.error('积分不能为零');
  470. this.rule_loading2=false;
  471. return false;
  472. }
  473. this.$axios('post','/api/integral/rule/items/edit', data).then(res => {
  474. if (res.data.code == 1) {
  475. self.$message.success(res.data.msg);
  476. self.getData();
  477. self.rule_close(form);
  478. }
  479. }).finally(err=>{
  480. this.rule_loading2=false;
  481. });
  482. })
  483. } else {
  484. this.rule_loading2=true;
  485. self.rules_detail_form.item_id = self.rules_detail_form.id;
  486. let data = self.rules_detail_form;
  487. data.item_id = self.rules_detail_form.id;
  488. if (self.rules_detail_form.min_point == 0 && self.rules_detail_form.range_type == 1) {
  489. self.$message.error('积分不能为零');
  490. this.rule_loading2=false;
  491. return false;
  492. }
  493. this.$axios('post','/api/integral/rule/items/edit', data).then(res => {
  494. if (res.data.code == 1) {
  495. self.$message.success(res.data.msg);
  496. self.getData();
  497. self.rule_close(form);
  498. }
  499. }).finally(() => {
  500. this.rule_loading2 = false;
  501. });
  502. }
  503. } else {
  504. this.rule_loading2=false;
  505. return false;
  506. }
  507. });
  508. },
  509. //添加规则
  510. add_submit_rule(form) {
  511. let self = this;
  512. self.$refs[form].validate(valid => {
  513. if (valid) {
  514. self.rules_detail_form.min_point=self.rules_detail_form.min_point2;
  515. self.rules_detail_form.max_point=self.rules_detail_form.max_point2;
  516. if (self.integral_select_name1 != '1' && self.rules_detail_form.min_point >= 0) {
  517. self.rules_detail_form.min_point = '-' + self.rules_detail_form.min_point;
  518. }
  519. if (self.integral_select_name2 != '1' && self.rules_detail_form.max_point >= 0) {
  520. self.rules_detail_form.max_point = '-' + self.rules_detail_form.max_point;
  521. }
  522. if (self.rules_detail_form.range_type == 1) {
  523. self.rules_detail_form.max_point = self.rules_detail_form.min_point;
  524. }
  525. if(self.rules_detail_form.min_point==0||!self.rules_detail_form.min_point||self.rules_detail_form.max_point==0||!self.rules_detail_form.max_point){
  526. this.$message.error('请输入积分分值');
  527. return
  528. }
  529. if(Array.isArray(self.rules_detail_form.rule_id)){
  530. self.rules_detail_form.rule_id=self.rules_detail_form.rule_id[self.rules_detail_form.rule_id.length-1];
  531. }
  532. if (parseFloat(self.rules_detail_form.min_point) > parseFloat(self.rules_detail_form.max_point)) {
  533. this.$confirm(
  534. '填写的规则积分是' +self.rules_detail_form.min_point +' ~ ' +self.rules_detail_form.max_point +',应该是 ' +self.rules_detail_form.max_point +
  535. ' ~ ' +self.rules_detail_form.min_point +'吧?','提示',
  536. {
  537. confirmButtonText: '确定',
  538. cancelButtonText: '取消',
  539. type: 'warning'
  540. }
  541. ).then(() => {
  542. this.rule_loading2=true;
  543. let min_point = self.rules_detail_form.min_point;
  544. self.rules_detail_form.min_point = self.rules_detail_form.max_point;
  545. self.rules_detail_form.max_point = min_point;
  546. if (self.rules_detail_form.min_point == 0 && self.rules_detail_form.range_type == 1) {
  547. self.$message.error('积分不能为零');
  548. this.rule_loading2=false;
  549. return false;
  550. }
  551. let data = {
  552. items: [self.rules_detail_form]
  553. };
  554. this.$axios('post','/api/integral/rule/items', data).then(res => {
  555. if (res.data.code == 1) {
  556. self.$message.success(res.data.msg);
  557. self.getData();
  558. self.rule_close(form);
  559. }
  560. }).finally(() => {
  561. this.rule_loading2 = false;
  562. });
  563. });
  564. } else {
  565. this.rule_loading2=true;
  566. self.rules_detail_form.item_id = self.rules_detail_form.id;
  567. if (self.rules_detail_form.min_point == 0 && self.rules_detail_form.range_type == 1) {
  568. self.$message.error('积分不能为零');
  569. this.rule_loading2=false;
  570. return false;
  571. }
  572. let data = {
  573. items: [self.rules_detail_form]
  574. };
  575. this.$axios('post','/api/integral/rule/items', data).then(res => {
  576. if (res.data.code == 1) {
  577. self.$message.success(res.data.msg);
  578. self.getData();
  579. self.rule_close(form);
  580. }
  581. }).finally(() => {
  582. this.rule_loading2 = false;
  583. });
  584. }
  585. } else {
  586. this.rule_loading2=false;
  587. return false;
  588. }
  589. });
  590. },
  591. //删除规则
  592. del_rule() {
  593. let self = this;
  594. let data = {
  595. item_id: [this.rules_detail_form.id]
  596. };
  597. this.delRule_loading=true;
  598. self.$confirm('此操作将永久删除该选项, 是否继续?', '提示').then(() => {
  599. this.$axios('post','/api/integral/rule/items/destroy', data).then(res => {
  600. if (res.data.code == 1) {
  601. self.$message.success(res.data.msg);
  602. self.rule_show = false;
  603. self.getData(true);
  604. }
  605. }).finally(() => {
  606. this.delRule_loading = false;
  607. });
  608. },(err)=>{
  609. this.delRule_loading = false;
  610. });
  611. },
  612. //关闭规则弹窗
  613. rule_close(form) {
  614. this.rule_show = false;
  615. this.$refs[form].resetFields();
  616. },
  617. not_data() {
  618. this.$confirm('暂时没有积分分类,是否前往添加?', '提示', {
  619. confirmButtonText: '确定',
  620. cancelButtonText: '取消',
  621. type: 'warning'
  622. }).then(() => {
  623. this.rule_show = false;
  624. this.class_show = true;
  625. })
  626. },
  627. add_rule() {
  628. this.rule_show = true;
  629. this.rule_type = 'add';
  630. this.rules_detail_form = {
  631. rule_id: '',
  632. range_type: '1',
  633. prize_type: '0',
  634. min_point: '',
  635. max_point: '',
  636. min_point2: '',
  637. max_point2: '',
  638. remark: '',
  639. is_attendance: '0',
  640. cycle_type: '1',
  641. pt_id: 3
  642. };
  643. this.integral_select_name1 = '1';
  644. this.integral_select_name2 = '1';
  645. },
  646. //批量删除
  647. del_item() {
  648. if (this.del_item_id.length == 0) {
  649. this.$message.error('请选择积分细则');
  650. return false;
  651. }
  652. this.$confirm('此操作将永久删除该选项, 是否继续?', '提示', {
  653. confirmButtonText: '确定',
  654. cancelButtonText: '取消',
  655. type: 'warning'
  656. }).then(() => {
  657. let data = {
  658. item_id: this.del_item_id
  659. };
  660. this.$axios('post','/api/integral/rule/items/destroy', data).then(res => {
  661. if (res.data.code == 1) {
  662. this.$message.success(res.data.msg);
  663. this.getData();
  664. this.handleNodeClick(this.selectItem);
  665. }
  666. })
  667. });
  668. },
  669. editDetails(val) {
  670. this.rules_detail_form = JSON.parse(JSON.stringify(val));
  671. this.rules_detail_form.min_point2=this.rules_detail_form.min_point;
  672. this.rules_detail_form.max_point2=this.rules_detail_form.max_point;
  673. if (this.rules_detail_form.min_point == this.rules_detail_form.max_point) {
  674. this.rules_detail_form.range_type = '1';
  675. } else {
  676. this.rules_detail_form.range_type = '2';
  677. }
  678. if (this.rules_detail_form.min_point < 0) {
  679. this.integral_select_name1 = '2';
  680. let str=this.rules_detail_form.min_point;
  681. this.rules_detail_form.min_point=str.toString().substring(1);
  682. this.rules_detail_form.min_point2=str.toString().substring(1);
  683. } else {
  684. this.integral_select_name1 = '1';
  685. }
  686. if (this.rules_detail_form.max_point < 0) {
  687. this.integral_select_name2 = '2';
  688. let str=this.rules_detail_form.max_point;
  689. this.rules_detail_form.max_point=str.toString().substring(1);
  690. this.rules_detail_form.max_point2=str.toString().substring(1);
  691. } else {
  692. this.integral_select_name2 = '1';
  693. }
  694. this.rule_show = true;
  695. this.rule_type = 'edit';
  696. },
  697. handleSelectionChange(val) {
  698. this.del_item_id = [];
  699. val.forEach(element => {
  700. this.del_item_id.push(element.id);
  701. });
  702. },
  703. handleNodeClick(e) {
  704. var items = this.getItemData(e);
  705. this.selectItem = {
  706. child: e.child,
  707. id: e.id,
  708. name:e.name,
  709. pid: e.pid,
  710. };
  711. this.flName=e.name;
  712. this.item_list = items;
  713. },
  714. getItemData(e) {
  715. var ids = [];
  716. var lists = [];
  717. if (e.child && e.child.length > 0) {
  718. ids.push(e.id);
  719. e.child.map(item => {
  720. ids.push(item.id);
  721. if (item.child && item.child.length > 0) {
  722. item.child.map(item1 => {
  723. ids.push(item1.id);
  724. if (item1.child && item1.child.length > 0) {
  725. item1.child.map(item2 => {
  726. ids.push(item2.id);
  727. });
  728. }
  729. });
  730. }
  731. });
  732. for (var i = 0; i < ids.length; i++) {
  733. lists.push(...this.filterItem(ids[i]));
  734. }
  735. } else {
  736. lists = this.filterItem(e.id);
  737. }
  738. return lists;
  739. },
  740. //根据分类ID获取对应的规则
  741. filterItem(id) {
  742. var all_item_list = this.all_item_list;
  743. var items = all_item_list.filter(item => {
  744. return item.rule_id == id;
  745. });
  746. return items;
  747. },
  748. getData(is) {
  749. this.rule_loading = true;
  750. var that = this;
  751. this.$axios('get','/api/integral/rule/trees', {cycle_type: 1}).then(res => {
  752. var item_list = res.data.data.item_list || [];
  753. var list = [];
  754. for (let i in item_list) {
  755. for (let k in item_list[i]) {
  756. item_list[i][k].pt_Obj = that.$getTyps(item_list[i][k].pt_id);
  757. list.push(item_list[i][k]);
  758. }
  759. }
  760. that.rule_tree = res.data.data.rule_tree || [];
  761. that.item_list = list;
  762. that.all_item_list = list;
  763. if (is) {
  764. that.handleNodeClick(that.selectItem);
  765. } else {
  766. this.selectItem = { name: '积分规则' }; //选择的分类
  767. }
  768. }).finally(() => {
  769. this.rule_loading = false;
  770. });
  771. },
  772. //编辑分组
  773. edit_class() {
  774. this.class_show = true;
  775. this.class_type = 'edit';
  776. this.dept_formdata={
  777. child: this.selectItem.child,
  778. id: this.selectItem.id,
  779. name: this.selectItem.name,
  780. pid: this.selectItem.pid,
  781. }
  782. },
  783. //添加分组
  784. submit_add_dept(form) {
  785. this.dept_loading=true;
  786. let that = this;
  787. that.$refs[form].validate(valid => {
  788. if (valid) {
  789. if (that.class_type == 'edit') {
  790. delete that.dept_formdata.child;
  791. that.dept_formdata.rule_id = that.dept_formdata.id;
  792. if(typeof(that.dept_formdata.pid)=='number'){
  793. }else{
  794. if(that.dept_formdata.pid.length>0){
  795. that.dept_formdata.pid =that.dept_formdata.pid[that.dept_formdata.pid.length - 1];
  796. }else{
  797. that.dept_formdata.pid=0;
  798. }
  799. }
  800. this.$axios('post','/api/integral/rule/edit', that.dept_formdata).then(res => {
  801. if (res.data.code == 1) {
  802. that.selectItem.name=that.dept_formdata.name;
  803. that.$message.success('修改积分分类成功');
  804. this.getData(true);
  805. this.add_dept_close('dept_formdata');
  806. }
  807. }).finally(() => {
  808. this.dept_loading = false;
  809. });
  810. } else {
  811. if (that.dept_formdata.pid !== null && that.dept_formdata.pid.length == 0) {
  812. that.dept_formdata.pid = 0;
  813. } else {
  814. that.dept_formdata.pid = that.dept_formdata.pid[that.dept_formdata.pid.length - 1];
  815. }
  816. this.$axios('post','/api/integral/rule', that.dept_formdata).then(res => {
  817. if (res.data.code == 1) {
  818. that.$message.success('添加积分分类成功');
  819. this.getData(true);
  820. this.add_dept_close('dept_formdata');
  821. }
  822. }).finally(() => {
  823. this.dept_loading = false;
  824. });
  825. }
  826. } else {
  827. this.dept_loading=false;
  828. }
  829. });
  830. },
  831. //删除分组
  832. del_dept() {
  833. this.$confirm('此操作将永久删除该分组, 是否继续?', '提示', {
  834. confirmButtonText: '确定',
  835. cancelButtonText: '取消',
  836. type: 'warning'
  837. }).then(() => {
  838. this.$axios('post','/api/integral/rule/destroy', { rule_id: this.selectItem.id }).then(res => {
  839. if (res.data.code == 1) {
  840. this.$message.success(res.data.msg);
  841. this.getData();
  842. this.add_dept_close('dept_formdata');
  843. }
  844. });
  845. });
  846. },
  847. //关闭弹窗
  848. add_dept_close(form) {
  849. this.class_show = false;
  850. this.$refs[form].resetFields();
  851. },
  852. //关闭提示
  853. tips_close() {
  854. localStorage.setItem('rule', 'true');
  855. this.tips_show = false;
  856. },
  857. //添加分类
  858. add_class() {
  859. this.class_show = true;
  860. this.class_type = 'add';
  861. this.dept_formdata = {
  862. name: '',
  863. pid: '0',
  864. cycle_type: '1'
  865. };
  866. }
  867. }
  868. };
  869. </script>
  870. <style scoped lang="scss">
  871. .select_width .el-select {
  872. width: 80px;
  873. background-color: #fff;
  874. border: 1px solid #f1f1f1;
  875. border-left: none;
  876. color: #222;
  877. border-radius: 5px;
  878. }
  879. .text-center {
  880. text-align: center;
  881. }
  882. .text-center p {
  883. padding: 10px 0;
  884. }
  885. .terr-right {
  886. .name {
  887. font-size: 18px;
  888. margin-right: 20px;
  889. }
  890. .btns button {
  891. margin-top: 20px;
  892. margin-right: 5px;
  893. }
  894. }
  895. .rule_class_box {
  896. ::v-deep .el-tree-node {
  897. border-bottom: 1px #f8f8f8 solid;
  898. }
  899. ::v-deep .el-tree-node__content {
  900. padding: 10px 0;
  901. // border-bottom: 1px #f8f8f8 solid;
  902. }
  903. ::v-deep .el-tree-node__content:hover {
  904. background: #ecf5ff;
  905. border-radius: 4px;
  906. }
  907. ::v-deep .is-current .el-tree-node__content .el-icon-caret-right {
  908. color: #409eff !important;
  909. }
  910. ::v-deep .is-current .el-tree-node__content .el-tree-node__label {
  911. color: #409eff !important;
  912. }
  913. ::v-deep .is-current .el-tree-node__children .el-icon-caret-right {
  914. color: #c0c4cc !important;
  915. }
  916. ::v-deep .is-current .el-tree-node__children .el-tree-node__label {
  917. color: #606266 !important;
  918. }
  919. ::v-deep .el-tree-node__label {
  920. overflow: hidden;
  921. text-overflow: ellipsis;
  922. white-space: nowrap;
  923. }
  924. }
  925. .form-right ::v-deep .el-form-item__content{
  926. margin-left: 0px !important;
  927. }
  928. .terr-left button {
  929. margin: 0 auto;
  930. display: block;
  931. margin-bottom: 20px;
  932. }
  933. </style>