rule.vue 33 KB

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