PointAutoCreateBtn.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. <template>
  2. <a class="integral-create-review-btn">
  3. <el-button @click="dialogCreateVisible = true" type="primary" plain>创建规则</el-button>
  4. <el-button @click="openDialog = true" type="primary" plain>高级设置</el-button>
  5. <el-dialog
  6. append-to-body
  7. class="integral-create-review-dialog"
  8. title="积分事件录入"
  9. width="1000px"
  10. top="50px"
  11. ref="integral_create_review_dialog"
  12. :visible.sync="dialogCreateVisible"
  13. :close-on-click-modal="false"
  14. @open="setDefaultValueForDialog"
  15. >
  16. <el-steps :active="activeIndex" finish-status="success" simple style="margin:10px 22px">
  17. <el-step title="选择对象"></el-step>
  18. <el-step title="选择分类和规则"></el-step>
  19. <el-step title="提交保存"></el-step>
  20. </el-steps>
  21. <el-row :gutter="15" style="padding:0px 30px;">
  22. <el-col :span="24" v-show="activeIndex==0" style="margin-top:10px;">
  23. <EmployeeSelector @check="set_target_ids"></EmployeeSelector>
  24. </el-col>
  25. <el-col
  26. :span="24"
  27. v-show="activeIndex==1"
  28. style="padding-left:0; padding-right:0; margin-top:10px;"
  29. >
  30. <el-form
  31. ref="newEventForm"
  32. :model="newEventForm"
  33. :rules="rules"
  34. @submit.native.prevent
  35. style="padding:0;"
  36. >
  37. <el-row>
  38. <el-col :span="8" style="padding-left:0;">
  39. <el-scrollbar
  40. wrap-class="column-wrapper scrollable-items-container check-item-box"
  41. :native="false"
  42. style="height: 450px; margin-right: 10px; border:1px solid #eee; border-bottom:1px solid #eee; border-right:1px solid #eee;"
  43. >
  44. <div style="padding:15px;">
  45. <el-tree
  46. ref="category_tree_com"
  47. highlight-current
  48. :default-expand-all="true"
  49. :expand-on-click-node="false"
  50. :data="categoryTree"
  51. @node-click="handleNodeClick"
  52. ></el-tree>
  53. </div>
  54. </el-scrollbar>
  55. <el-form-item label prop="target_id_set" style="display: none;"></el-form-item>
  56. </el-col>
  57. <el-col :span="16">
  58. <div style="padding:8px; padding-top:0;">
  59. <el-row :gutter="15" style="padding-right:0;">
  60. <el-col :span="12">
  61. <el-form-item label prop="event_time" style="margin-bottom:0;">
  62. <el-select
  63. placeholder="请选择规则"
  64. v-model="newEventForm.rule_id"
  65. :disabled="!newEventForm.category_id || newEventForm.category_id.length == 0"
  66. @change="loadAvailableItems(newEventForm, initializeItemData)"
  67. style="width:100%;"
  68. >
  69. <el-option
  70. v-for="item in availableRuleOptions"
  71. :key="item.id"
  72. :label="item.name"
  73. :value="item.id"
  74. ></el-option>
  75. </el-select>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :span="12" style="padding-right:0;">
  79. <el-form-item label prop="rule_id" style="margin-bottom:0;">
  80. <el-select
  81. v-model="newEventForm.query_time"
  82. placeholder="自动执行周期"
  83. style="width:100%;"
  84. >
  85. <el-option key="0" label="每天" value="0"></el-option>
  86. <el-option key="2" label="每月" value="2"></el-option>
  87. </el-select>
  88. </el-form-item>
  89. </el-col>
  90. </el-row>
  91. </div>
  92. <el-form-item label prop="category_id" style="display: none;"></el-form-item>
  93. <el-scrollbar
  94. wrap-class="column-wrapper scrollable-items-container check-item-box"
  95. :native="false"
  96. style="height: 396px;"
  97. v-loading="setformloading"
  98. >
  99. <el-form-item
  100. v-for="(item, key) in newEventForm.items"
  101. :key="item.id"
  102. :prop="'items.' + key"
  103. :rules="itemRules"
  104. style="padding-left:10px; overflow: hidden; margin-bottom:0;"
  105. >
  106. <el-tooltip
  107. class="item"
  108. effect="dark"
  109. :content="item.content"
  110. placement="left-start"
  111. >
  112. <el-card shadow="hover" style="margin-bottom: 15px; padding:0;">
  113. <el-checkbox
  114. :disabled="item.is_range==1"
  115. style="text-overflow:ellipsis; width:100%; overflow: hidden; line-height: 1; padding:15px;"
  116. v-model="item.checked"
  117. :label="item.content"
  118. ></el-checkbox>
  119. <div style="clear:both;"></div>
  120. <div style="padding:15px; padding-top:0;" v-show="false">
  121. <span
  122. style="display: block; float: left; line-height: 36px; margin-top:10px;"
  123. class="gap-left-8"
  124. >{{ generatePointIndication(item) }}</span>
  125. <el-input-number
  126. class="gap-left-8"
  127. v-model="item.point"
  128. :min="item.value_1"
  129. :max="item.is_range ? item.value_2 : item.value_1"
  130. v-show="item.checked"
  131. style="width:150px; float:right; margin-left:15px; margin-top:10px;"
  132. ></el-input-number>
  133. <div style="clear:both;"></div>
  134. <el-form-item
  135. class="gap-top-8"
  136. v-show="item.checked"
  137. auto-complete="off"
  138. style="margin-top:15px; width:100%;"
  139. >
  140. <el-input v-model="item.remark" placeholder="备注" type="textarea"></el-input>
  141. </el-form-item>
  142. </div>
  143. </el-card>
  144. </el-tooltip>
  145. </el-form-item>
  146. </el-scrollbar>
  147. </el-col>
  148. </el-row>
  149. </el-form>
  150. </el-col>
  151. </el-row>
  152. <el-row :gutter="15" style="margin:0 15px;" v-show="activeIndex == 2">
  153. <el-col :span="7">
  154. <el-card class="box-card card-box-item" shadow="never" style="margin-top:15px;">
  155. <el-scrollbar
  156. wrap-class="column-wrapper scrollable-items-container check-item-box dept_tree"
  157. :native="false"
  158. style="height: 350px;"
  159. >
  160. <div style="padding-right:15px;">
  161. <el-table
  162. :data="target_list"
  163. :border="false"
  164. tooltip-effect="dark"
  165. style="width: 100%"
  166. >
  167. <el-table-column prop="name" :label="'已选择人员('+(target_list.length)+'人)'">
  168. <template slot-scope="scope">
  169. <div class="rank_head" style="cursor: pointer;">
  170. <img
  171. v-if="scope.row.img_url != null"
  172. v-bind:src="scope.row.img_url"
  173. width="42px"
  174. height="42px"
  175. >
  176. <img
  177. v-if="scope.row.img_url == null"
  178. src="static/images/head_default.png"
  179. width="42px"
  180. height="42px"
  181. >
  182. {{scope.row.name}}
  183. </div>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. </div>
  188. </el-scrollbar>
  189. </el-card>
  190. </el-col>
  191. <el-col :span="17">
  192. <el-card
  193. v-for="(item,index) in newEventForm.items"
  194. :key="index"
  195. v-if="item.checked"
  196. class="box-card card-box-item"
  197. shadow="hover"
  198. style="margin-top:15px; padding:0"
  199. >
  200. <p>{{item.content}}</p>
  201. <p>备注:{{item.remark}}</p>
  202. <p v-if="item.is_negative == 0">奖分:
  203. <el-tag>{{item.point}}</el-tag>
  204. </p>
  205. <p v-if="item.is_negative == 1">扣分:
  206. <el-tag type="danger">{{item.point}}</el-tag>
  207. </p>
  208. </el-card>
  209. </el-col>
  210. </el-row>
  211. <div slot="footer" class="dialog-footer">
  212. <el-button @click="dialogCreateVisible = false">取 消</el-button>
  213. <el-button @click="activeIndexPrev" v-show="activeIndex > 0">上一步</el-button>
  214. <el-button @click="activeIndexNext" type="primary" v-show="activeIndex < 2">下一步</el-button>
  215. <el-button
  216. v-show="activeIndex == 2"
  217. :loading="submitLoading"
  218. type="primary"
  219. @click="submitCreateForm('newEventForm')"
  220. >提 交</el-button>
  221. </div>
  222. </el-dialog>
  223. <!-- 高级设置弹窗 -->
  224. <el-dialog
  225. append-to-body
  226. title="高级设置"
  227. width="700px"
  228. top="50px"
  229. ref="openChange"
  230. custom-class="setClass"
  231. :visible.sync="openDialog"
  232. :close-on-click-modal="false"
  233. @open="getOpenChange()"
  234. >
  235. <div style="width: 380px;font-size: 12px;color:#909399;margin-bottom: 28px;line-height: 17px;">
  236. <p style="margin-bottom: 0px;">勾选后,自动加分与考勤挂钩,按实际出勤天数计算加分</p>
  237. <p style="margin-top: 5px;">计算方式:月实际加分=月初始加分*(月实际出勤天数/月应出勤天数)</p>
  238. </div>
  239. <el-scrollbar
  240. wrap-class="column-wrapper scrollable-items-container check-item-box dept_tree"
  241. :native="false"
  242. style="height: 500px;">
  243. <div v-for="(item, i) in rule_list" :key="i" @click="handleClick(item.items)" >
  244. <div style="color:#606266;font-size: 16px;">{{item.rule_name}}</div>
  245. <div style="margin: 15px 0;"></div>
  246. <el-checkbox-group v-model="checkedCities" style="padding-bottom:15px;" @change="handleCheckedCitiesChange">
  247. <el-checkbox style="padding-left: 16px;padding-bottom: 10px;" v-for="item in item.items" :key="item.id" :label="item.id">{{item.content}}</el-checkbox>
  248. </el-checkbox-group>
  249. <div v-if="rule_list.length-1 != i" style="width: 608px;border-top: 1px solid #E7E6EB;margin: 20px auto;"></div>
  250. </div>
  251. </el-scrollbar>
  252. <el-button style="margin: 40px 0 0 210px;" @click="openDialog=false"> 取消</el-button>
  253. <el-button style="margin: 40px 0 0 10px;" type="primary" @click="saveBook"> 保存</el-button>
  254. </el-dialog>
  255. </a>
  256. </template>
  257. <script>
  258. import EmployeeSelector from "@/views/integral/EmployeeSelector";
  259. import { getToken } from "@/utils/auth";
  260. export default {
  261. components: { EmployeeSelector },
  262. name: "IntegralCreateReviewBtn",
  263. data() {
  264. let validateTarget = (rule, value, callback) => {
  265. if (!value || value.length == 0) {
  266. this.$message({
  267. message: "请选择奖扣积分对象",
  268. type: "error"
  269. });
  270. return callback(new Error("请选择奖扣积分对象"));
  271. } else {
  272. callback();
  273. }
  274. };
  275. let validateCategory = (rule, value, callback) => {
  276. if (!value || value.length == 0) {
  277. return callback(new Error("请选择积分分类"));
  278. } else {
  279. callback();
  280. }
  281. };
  282. let validateRule = (rule, value, callback) => {
  283. if (!value || isNaN(value)) {
  284. return callback(new Error("请选择积分规则"));
  285. } else {
  286. callback();
  287. }
  288. };
  289. let validateItem = (rule, value, callback) => {
  290. if (isNaN(value.point) || parseInt(value.point) == 0) {
  291. return callback(new Error("请填写有效的积分数值"));
  292. }
  293. callback();
  294. };
  295. return {
  296. checkItems:[],
  297. rule_list:[],
  298. isIndeterBook:false,
  299. citiesExactly:[],
  300. openDialog: false, // 高级设置弹窗
  301. checkAll: false,
  302. checkedCities: [], // 学历选中后数组
  303. cities: ["北京", "上海", "杭州"], // 学历循环数组
  304. checkBook: [], // 职务循环
  305. certificate: [], // 选中职务循环
  306. isIndeterminate: true,
  307. setformloading: false,
  308. submitLoading: false,
  309. activeIndex: 0,
  310. dialogWidth: "510px",
  311. dialogWidth_left: 16,
  312. dialogWidth_right: 0,
  313. dialogWidth_employee: 8,
  314. profile: this.$store.getters.user_info,
  315. totalCount: 0,
  316. tableData: null,
  317. currentPage: 1,
  318. multipleSelection: [],
  319. dialogCreateVisible: false,
  320. dialogEditVisible: false,
  321. dialogExcelVisible: false,
  322. formLabelWidth: "90px",
  323. newEventForm: {
  324. query_time: "",
  325. target_id_set: [],
  326. category_id: [],
  327. rule_id: "",
  328. event_time: "",
  329. items: []
  330. },
  331. eventForm: {
  332. id: "",
  333. target_name: "",
  334. event_time: "",
  335. category_path: "",
  336. rule_name: "",
  337. point: "",
  338. remark: "",
  339. item: {
  340. content: "",
  341. is_range: false,
  342. is_negative: false,
  343. point_type: "",
  344. value_1: 0,
  345. value_2: 0
  346. }
  347. },
  348. target_list: [],
  349. itemSelectForm: {
  350. target_id_set: [],
  351. category_id: [],
  352. rule_id: "",
  353. event_time: "",
  354. items: [],
  355. get_category: 1
  356. },
  357. selectedItems: [],
  358. rules: {
  359. target_id_set: [{ validator: validateTarget, trigger: "blur" }],
  360. category_id: [{ validator: validateCategory, trigger: "blur" }],
  361. rule_id: [{ validator: validateRule, trigger: "v" }]
  362. },
  363. itemRules: {
  364. validator: validateItem,
  365. trigger: "blur"
  366. },
  367. deptTree: [],
  368. filter: {
  369. keywords: "",
  370. target_id_set: [],
  371. category_id: [],
  372. point_type: 0,
  373. time_range: ""
  374. },
  375. categoryTree: [],
  376. employeeOptions: [],
  377. pointTypes: [],
  378. availableRuleOptions: [],
  379. sendArray:[],
  380. assistantOptions: {
  381. disabledDate(time) {
  382. return time.getTime() > Date.now();
  383. },
  384. shortcuts: [
  385. {
  386. text: "今天",
  387. onClick(picker) {
  388. picker.$emit("pick", new Date());
  389. }
  390. },
  391. {
  392. text: "昨天",
  393. onClick(picker) {
  394. const date = new Date();
  395. date.setTime(date.getTime() - 3600 * 1000 * 24);
  396. picker.$emit("pick", date);
  397. }
  398. }
  399. ]
  400. },
  401. instantPickerOptions: {
  402. shortcuts: [
  403. {
  404. text: "本周",
  405. onClick(picker) {
  406. const now = new Date(new Date().toLocaleDateString());
  407. let start =
  408. now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000;
  409. let end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
  410. picker.$emit("pick", [start, end]);
  411. }
  412. },
  413. {
  414. text: "上周",
  415. onClick(picker) {
  416. const now = new Date(new Date().toLocaleDateString());
  417. let start =
  418. now.getTime() - (now.getDay() + 6) * 24 * 60 * 60 * 1000;
  419. let end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
  420. picker.$emit("pick", [start, end]);
  421. }
  422. },
  423. {
  424. text: "本月",
  425. onClick(picker) {
  426. const now = new Date();
  427. let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
  428. let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
  429. picker.$emit("pick", [startDate.getTime(), endDate.getTime()]);
  430. }
  431. },
  432. {
  433. text: "上月",
  434. onClick(picker) {
  435. const now = new Date();
  436. let startDate = new Date(
  437. now.getFullYear() - (now.getMonth() > 0 ? 0 : 1),
  438. (now.getMonth() + 11) % 12,
  439. 1
  440. );
  441. let endDate = new Date(now.getFullYear(), now.getMonth(), 0);
  442. picker.$emit("pick", [startDate.getTime(), endDate.getTime()]);
  443. }
  444. }
  445. ]
  446. }
  447. };
  448. },
  449. methods: {
  450. handleClick(item) {
  451. this.checkItems = item;
  452. },
  453. // 全选
  454. // handleCheckAllChange(val) {
  455. // console.log(val)
  456. // this.isIndeterminate = false;
  457. // let array = [];
  458. // for(var i = 0; i < this.checkItems.length; i ++) {
  459. // array.push( this.checkItems[i].id);
  460. // }
  461. // this.checkedCities = val ? array : [];
  462. // },
  463. // 选中
  464. handleCheckedCitiesChange(value) {
  465. let checkedCount = value.length;
  466. this.checkAll = checkedCount === this.checkItems.length;
  467. this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkItems.length;
  468. },
  469. // 保存设置
  470. saveBook() {
  471. const self = this;
  472. let NoCheckList = self.rule_list;
  473. let data = [];
  474. let is_attendance = 1;
  475. let newArray = [];
  476. for(var item in NoCheckList) {
  477. for(var i = 0; i<NoCheckList[item].items.length; i ++) {
  478. newArray.push(NoCheckList[item].items[i].id)
  479. }
  480. }
  481. let spliceArray = newArray.filter(i=> self.checkedCities.indexOf(i) == -1)
  482. var array =[];
  483. for(var i = 0; i<spliceArray.length; i++ ) {
  484. let id = spliceArray[i];
  485. let is_attendance = 0;
  486. array.push({id,is_attendance});
  487. }
  488. let dataArray = [];
  489. for(var i = 0; i< self.checkedCities.length; i++ ) {
  490. let id = self.checkedCities[i];
  491. data.push({id,is_attendance});
  492. }
  493. dataArray = array.concat(data);
  494. self.sendArray = dataArray;
  495. this.$http('post',"/integral.php/employee_attendance/attendance_fixed_submit",{data: self.sendArray})
  496. .then(function(response) {
  497. if (response.status == 200 && response.data.code == 1000) {
  498. self.$message({
  499. message: "设置成功",
  500. type: "success"
  501. });
  502. self.openDialog = false;
  503. try {
  504. } catch (err) {
  505. console.log(err);
  506. }
  507. }else {
  508. self.$message({
  509. message: response.data.msg,
  510. type: "error"
  511. });
  512. }
  513. })
  514. .catch(function(error) {
  515. console.log(error);
  516. });
  517. },
  518. // 获取高级设置里面的数据
  519. getOpenChange() {
  520. this.checkedCities = [];
  521. const self = this;
  522. this.$http('post',"/integral.php/employee_attendance/checked_items")
  523. .then(function(response) {
  524. if (response.status == 200) {
  525. let { data={} } = response.data;
  526. let newArray = [];
  527. self.rule_list = data.rule_list;
  528. for(var item in data.rule_list) {
  529. for(var i = 0; i<data.rule_list[item].items.length; i ++) {
  530. if(data.rule_list[item].items[i].is_attendance == 1) {
  531. let id = data.rule_list[item].items[i].id;
  532. self.checkedCities.push(id);
  533. }
  534. }
  535. }
  536. console.log(self.checkedCities)
  537. try {
  538. } catch (err) {
  539. console.log(err);
  540. }
  541. }
  542. })
  543. .catch(function(error) {
  544. console.log(error);
  545. });
  546. },
  547. activeIndexNext() {
  548. const self = this;
  549. if (
  550. this.activeIndex == 0 &&
  551. self.newEventForm.target_id_set.length == 0
  552. ) {
  553. this.$message({
  554. message: "请选择奖扣积分对象",
  555. type: "error"
  556. });
  557. return false;
  558. }
  559. if (this.activeIndex == 1) {
  560. if (self.newEventForm.rule_id == "") {
  561. this.$message({
  562. message: "请选择积分规则",
  563. type: "error"
  564. });
  565. return false;
  566. }
  567. let checked = 0;
  568. for (let i in this.newEventForm.items) {
  569. if (this.newEventForm.items[i].checked) {
  570. checked++;
  571. }
  572. }
  573. if (checked == 0) {
  574. this.$message({
  575. message: "没有选中积分细则",
  576. type: "error"
  577. });
  578. return false;
  579. }
  580. }
  581. this.activeIndex++;
  582. },
  583. activeIndexPrev() {
  584. this.activeIndex--;
  585. },
  586. dateFormatter: function(row, column, cellValue) {
  587. return this.$moment(cellValue * 1000).format("YYYY年MM月DD日");
  588. },
  589. //employee_checked(dd){console.log(dd,'dfasdfa')},
  590. set_target_ids(data) {
  591. const self = this;
  592. self.newEventForm.target_id_set = [];
  593. for (let i in data) {
  594. self.newEventForm.target_id_set.push(data[i].id);
  595. }
  596. self.target_list = data;
  597. },
  598. handleNodeClick(data) {
  599. this.newEventForm.category_id = [data.value];
  600. this.loadAvailableRules(this.newEventForm);
  601. },
  602. loadPointType: function() {
  603. var self = this;
  604. this.$http('get',"/integral.php/ajax_request_common/get_point_types")
  605. .then(function(response) {
  606. if (response.status == 200) {
  607. let jsonData = response.data;
  608. try {
  609. self.pointTypes = jsonData;
  610. } catch (err) {
  611. console.log(err);
  612. }
  613. }
  614. })
  615. .catch(function(error) {
  616. console.log(error);
  617. });
  618. },
  619. toggleSelection: function(rows) {
  620. if (rows) {
  621. rows.forEach(row => {
  622. this.$refs.multipleTable.toggleRowSelection(row);
  623. });
  624. } else {
  625. this.$refs.multipleTable.clearSelection();
  626. }
  627. },
  628. //选择积分分类时更新积分规则
  629. loadAvailableRules: function(formObj) {
  630. this.setformloading = true;
  631. if (!formObj) {
  632. return;
  633. }
  634. let categoryPath = formObj.category_id;
  635. if (!categoryPath || categoryPath.length == 0) {
  636. return;
  637. }
  638. var self = this;
  639. this.$http('get',"/integral.php/ajax_request_common/get_integral_rules_by_category",{category_id: categoryPath[categoryPath.length - 1],type: 1})
  640. .then(function(response) {
  641. self.setformloading = false;
  642. if (response.status == 200) {
  643. let jsonData = response.data;
  644. try {
  645. self.availableRuleOptions = jsonData;
  646. formObj.rule_id = "";
  647. formObj.items = [];
  648. } catch (err) {
  649. console.log(err);
  650. }
  651. }
  652. })
  653. .catch(function(error) {
  654. console.log(error);
  655. });
  656. },
  657. //选择积分规则时更新细则列表
  658. loadAvailableItems: function(formObj, callback) {
  659. const self = this;
  660. if (!formObj) {
  661. return;
  662. }
  663. let ruleId = formObj.rule_id;
  664. if (isNaN(ruleId) || ruleId < 0) {
  665. return;
  666. }
  667. let params = {
  668. rule_id: ruleId
  669. };
  670. if (formObj.get_category) {
  671. params.get_category = formObj.get_category;
  672. }
  673. this.$http('get',"/integral.php/ajax_request_common/get_integral_items_by_rule",params)
  674. .then(function(response) {
  675. if (response.status == 200) {
  676. let jsonData = response.data;
  677. try {
  678. if (callback) {
  679. jsonData = callback.call(null, jsonData);
  680. }
  681. formObj.items = jsonData;
  682. } catch (err) {
  683. console.log(err);
  684. }
  685. }
  686. })
  687. .catch(function(error) {
  688. console.log(error);
  689. });
  690. },
  691. initializeItemData: function(jsonData) {
  692. for (let index = 0; index < jsonData.length; index++) {
  693. let item = jsonData[index];
  694. item.checked = false;
  695. item.point = item.value_1;
  696. item.remark = "";
  697. }
  698. return jsonData;
  699. },
  700. applyItemSelection: function(jsonData) {
  701. let selectedItemIds = this.selectedItems.map(x => x.id);
  702. for (let index = 0; index < jsonData.length; index++) {
  703. let item = jsonData[index];
  704. item.checked = selectedItemIds.indexOf(item.id) > -1;
  705. }
  706. return jsonData;
  707. },
  708. generatePointIndication: function(item) {
  709. let propertyText = item.is_negative == 1 ? "扣除" : "奖励";
  710. let valueText =
  711. item.is_range == 1 ? item.value_1 + "~" + item.value_2 : item.value_1;
  712. let typeText = "";
  713. for (let index = 0; index < this.pointTypes.length; index++) {
  714. let pointType = this.pointTypes[index];
  715. if (item.point_type == pointType.value) {
  716. typeText = pointType.label;
  717. break;
  718. }
  719. }
  720. return "标准: " + propertyText + " " + valueText + " " + typeText;
  721. },
  722. handleSelectionChange: function(val) {
  723. this.multipleSelection = val;
  724. },
  725. resetCreateDialog: function() {
  726. this.newEventForm.rule_id = "";
  727. this.newEventForm.items = [];
  728. this.dialogWidth = "510px";
  729. this.newEventForm.category_id = [];
  730. this.newEventForm.rule_id = "";
  731. this.newEventForm.event_time = "";
  732. this.newEventForm.items = [];
  733. let form = this.$refs["newEventForm"];
  734. form.clearValidate();
  735. this.activeIndex = 0;
  736. },
  737. openEditDialog: function(eventId) {
  738. var self = this;
  739. this.$http('get',"/integral.php/ajax_request_common/get_event_detail",{id: eventId})
  740. .then(function(response) {
  741. if (response.status == 200) {
  742. let jsonData = response.data;
  743. try {
  744. self.eventForm = self.processDetailData(jsonData);
  745. self.dialogEditVisible = true;
  746. } catch (err) {
  747. console.log(err);
  748. }
  749. }
  750. })
  751. .catch(function(error) {
  752. console.log(error);
  753. });
  754. },
  755. onDismissEditDialog: function() {
  756. let form = this.$refs["eventForm"];
  757. form.clearValidate();
  758. this.eventForm = {
  759. id: "",
  760. target_name: "",
  761. event_time: "",
  762. category_path: "",
  763. rule_name: "",
  764. point: "",
  765. remark: "",
  766. item: {
  767. content: "",
  768. is_range: false,
  769. is_negative: false,
  770. point_type: "",
  771. value_1: 0,
  772. value_2: 0
  773. }
  774. };
  775. },
  776. submitCreateForm: function(formName) {
  777. var form = this.$refs[formName];
  778. var self = this;
  779. form.validate(valid => {
  780. if (valid) {
  781. if (form) {
  782. self.sendCreateRequest();
  783. }
  784. } else {
  785. //console.log('验证未通过');
  786. return false;
  787. }
  788. });
  789. },
  790. sendCreateRequest: function() {
  791. let dataObj = this.newEventForm;
  792. let formData = {};
  793. let emptyItems = false;
  794. for (let item in dataObj) {
  795. if (item == "category_id") {
  796. continue;
  797. }
  798. if (item == "items") {
  799. let checkedRuleItems = dataObj[item].filter(x => x.checked);
  800. if (!checkedRuleItems || checkedRuleItems.length == 0) {
  801. emptyItems = true;
  802. break;
  803. }
  804. formData[item] = JSON.stringify(checkedRuleItems);
  805. } else if (item == "target_id_set") {
  806. formData[item] = dataObj[item].join(",");
  807. } else if (item == "event_time") {
  808. formData[item] = parseInt(dataObj[item] / 1000);
  809. } else {
  810. formData[item] = dataObj[item];
  811. }
  812. }
  813. if (emptyItems) {
  814. this.$message({
  815. message: "没有选中积分细则",
  816. type: "error"
  817. });
  818. return;
  819. }
  820. formData["recorder_id"] = this.profile.id;
  821. var self = this;
  822. self.submitLoading = true;
  823. this.$http("post","/integral.php/point_auto_setting/add",formData,'','',
  824. {transformRequest: [
  825. data => {
  826. let paramArray = new Array();
  827. for (let it in data) {
  828. paramArray.push(
  829. encodeURIComponent(it) + "=" + encodeURIComponent(data[it])
  830. );
  831. }
  832. return paramArray.join("&");
  833. }
  834. ]},
  835. // headers: {
  836. // "Content-Type": "application/x-www-form-urlencoded"
  837. // }
  838. )
  839. .then(function(response) {
  840. self.submitLoading = false;
  841. let message = "";
  842. let status = 0;
  843. if (response.status == 200) {
  844. self.$emit("send_success", response);
  845. let data = response.data;
  846. status = isNaN(data.code) ? 0 : parseInt(data.code);
  847. switch (status) {
  848. case 1:
  849. message =
  850. "操作完成,成功设置" +
  851. data.data.ret.length +
  852. "条记录," +
  853. data.data.ex +
  854. "条记录已经存在";
  855. break;
  856. case -1:
  857. message = "表单参数错误";
  858. break;
  859. default:
  860. message = data.info
  861. ? data.info
  862. : "操作失败," + data.data.ex + "条记录已经存在";
  863. }
  864. } else {
  865. message = "服务器出现问题";
  866. }
  867. self.$message({
  868. message: message,
  869. type: status == 1 ? "success" : "error"
  870. });
  871. if (status == 1) {
  872. //self.dialogCreateVisible = false
  873. self.resetCreateDialog();
  874. }
  875. })
  876. .catch(function(error) {
  877. self.submitLoading = false;
  878. console.log(error);
  879. });
  880. },
  881. sendEditRequest: function() {
  882. let dataObj = this.eventForm;
  883. if (isNaN(dataObj.point) || !dataObj.point) {
  884. this.$message({
  885. message: "请填写积分数值",
  886. type: "error"
  887. });
  888. this.$refs["pointEditor"].focus();
  889. return;
  890. }
  891. let formData = {
  892. id: dataObj.id,
  893. event_time: parseInt(dataObj.event_time / 1000),
  894. point: dataObj.point,
  895. remark: dataObj.remark,
  896. is_negative: dataObj.item.is_negative
  897. };
  898. var self = this;
  899. this.$http("post","/integral.php/ajax_request_common/update_event",formData,'','',
  900. {transformRequest: [
  901. data => {
  902. let paramArray = new Array();
  903. for (let it in data) {
  904. paramArray.push(
  905. encodeURIComponent(it) + "=" + encodeURIComponent(data[it])
  906. );
  907. }
  908. return paramArray.join("&");
  909. }
  910. ]},
  911. // headers: {
  912. // "Content-Type": "application/x-www-form-urlencoded"
  913. // }
  914. )
  915. .then(function(response) {
  916. let message = "";
  917. let status = 0;
  918. if (response.status == 200) {
  919. let data = response.data;
  920. status = isNaN(data.status) ? 0 : parseInt(data.status);
  921. switch (status) {
  922. case 1:
  923. message = "修改积分事件成功";
  924. break;
  925. case -1:
  926. message = "表单参数错误";
  927. break;
  928. default:
  929. message = "修改积分事件失败";
  930. }
  931. } else {
  932. message = "服务器出现问题";
  933. }
  934. self.$message({
  935. message: message,
  936. type: status == 1 ? "success" : "error"
  937. });
  938. if (status == 1) {
  939. self.loadEventList();
  940. self.dialogEditVisible = false;
  941. }
  942. })
  943. .catch(function(error) {
  944. console.log(error);
  945. });
  946. },
  947. confirmDelete(eventId) {
  948. this.$confirm("确定要删除此积分事件吗?", "删除积分事件", {
  949. confirmButtonText: "确定",
  950. cancelButtonText: "取消",
  951. type: "warning"
  952. })
  953. .then(() => {
  954. this.deleteItem(eventId);
  955. })
  956. .catch(() => {
  957. //console.log('已取消删除');
  958. });
  959. },
  960. confirmMultipleDelete() {
  961. if (this.multipleSelection.length < 1) {
  962. return false;
  963. }
  964. this.$confirm("确定要删除选中的积分事件吗?", "批量删除积分事件", {
  965. confirmButtonText: "确定",
  966. cancelButtonText: "取消",
  967. type: "warning"
  968. })
  969. .then(() => {
  970. let targetArr = [];
  971. for (let index in this.multipleSelection) {
  972. targetArr.push(this.multipleSelection[index].id);
  973. }
  974. let targetIds = targetArr.join(",");
  975. this.deleteItem(targetIds, true);
  976. })
  977. .catch(() => {
  978. //console.log('已取消删除');
  979. });
  980. },
  981. deleteItem(eventId, isMultiple) {
  982. if (!eventId) {
  983. return false;
  984. }
  985. isMultiple = isMultiple || false;
  986. let url = "";
  987. let params = null;
  988. if (isMultiple) {
  989. url = "/integral.php/ajax_request_common/delete_event_multiple";
  990. params = {
  991. ids: eventId
  992. };
  993. } else {
  994. url = "/integral.php/ajax_request_common/delete_event";
  995. params = {
  996. id: eventId
  997. };
  998. }
  999. var self = this;
  1000. this.$http('get',url,params)
  1001. .then(function(response) {
  1002. let message = "";
  1003. let status = 0;
  1004. if (response.status == 200) {
  1005. var data = response.data;
  1006. status = isNaN(data.status) ? 0 : parseInt(data.status);
  1007. switch (status) {
  1008. case 1:
  1009. message = "删除积分事件成功";
  1010. break;
  1011. case -1:
  1012. message = "表单参数错误";
  1013. break;
  1014. default:
  1015. message = data.info ? data.info : "删除积分事件失败";
  1016. }
  1017. } else {
  1018. message = "服务器出现问题";
  1019. }
  1020. self.$message({
  1021. message: message,
  1022. type: status == 1 ? "success" : "error"
  1023. });
  1024. if (status == 1) {
  1025. self.loadEventList();
  1026. }
  1027. })
  1028. .catch(function(error) {
  1029. console.log(error);
  1030. });
  1031. },
  1032. //获取控件所需数据
  1033. loadWidgetData: function() {
  1034. var self = this;
  1035. this.$http('get',"/integral.php/ajax_request_common/prepare_integral_options",{id: this.profile.id,category_tree: 1,employee_list: 1})
  1036. .then(function(response) {
  1037. if (response.status == 200) {
  1038. var jsonData = response.data;
  1039. try {
  1040. self.categoryTree = jsonData.category_tree;
  1041. } catch (err) {
  1042. console.log(err);
  1043. }
  1044. }
  1045. })
  1046. .catch(function(error) {
  1047. console.log(error);
  1048. });
  1049. },
  1050. //获取可录入积分对象的列表
  1051. loadTargetRange: function() {
  1052. var self = this;
  1053. this.$http('get',"/integral.php/ajax_request_common/load_target_range",{recorder_id: this.profile.id})
  1054. .then(function(response) {
  1055. if (response.status == 200) {
  1056. var jsonData = response.data;
  1057. try {
  1058. self.employeeOptions = jsonData;
  1059. } catch (err) {
  1060. console.log(err);
  1061. }
  1062. }
  1063. })
  1064. .catch(function(error) {
  1065. console.log(error);
  1066. });
  1067. },
  1068. setDefaultValueForDialog: function() {
  1069. if (!this.newEventForm.event_time) {
  1070. this.newEventForm.event_time = new Date().getTime();
  1071. }
  1072. },
  1073. processDetailData: function(object) {
  1074. //时间戳转换
  1075. object.event_time *= 1000;
  1076. return object;
  1077. },
  1078. updateItemSelection: function(item, checked) {
  1079. if (checked) {
  1080. let itemIds = this.selectedItems.map(x => x.id);
  1081. if (itemIds && (itemIds.length == 0 || itemIds.indexOf(item.id) < 0)) {
  1082. this.selectedItems.push(item);
  1083. }
  1084. } else {
  1085. this.selectedItems = this.selectedItems.filter(x => {
  1086. if (x.id != item.id) {
  1087. return x;
  1088. }
  1089. });
  1090. }
  1091. },
  1092. removeItemSelection: function(itemId) {
  1093. let index = this.selectedItems.map(x => x.id).indexOf(itemId);
  1094. if (!isNaN(index) && index > -1) {
  1095. this.selectedItems.splice(index, 1);
  1096. let itemArray = this.itemSelectForm.items;
  1097. for (let i = 0; i < itemArray.length; i++) {
  1098. if (itemArray[i].id == itemId) {
  1099. itemArray[i].checked = false;
  1100. }
  1101. }
  1102. }
  1103. }
  1104. },
  1105. created() {
  1106. this.loadWidgetData();
  1107. this.loadTargetRange();
  1108. }
  1109. };
  1110. </script>
  1111. <style scoped>
  1112. .integral-create-review-btn .tpzs3 {
  1113. margin: 0 auto;
  1114. width: 40px;
  1115. height: 40px;
  1116. background-image: url(/images/jflr.png);
  1117. background-size: 100%;
  1118. }
  1119. .integral-create-review-btn .card-panel-description {
  1120. width: 100%;
  1121. text-align: center;
  1122. color: #666;
  1123. }
  1124. .integral-create-review-btn .card-panel-text {
  1125. line-height: 40px;
  1126. font-size: 20px;
  1127. font-weight: bold;
  1128. }
  1129. .integral-create-review-btn .card-panel-text2 {
  1130. font-size: 14px;
  1131. line-height: 20px;
  1132. color: rgba(102, 102, 102, 1);
  1133. }
  1134. .check-item-box .el-card__body {
  1135. padding: 0;
  1136. line-height: 1;
  1137. }
  1138. .integral-create-review-dialog .el-dialog__header {
  1139. display: none;
  1140. }
  1141. .integral-create-review-dialog .el-dialog__body {
  1142. padding-bottom: 0;
  1143. }
  1144. .integral-create-review-dialog .card-box-item .el-card__body {
  1145. padding: 5px 15px;
  1146. }
  1147. /deep/ .setClass .el-dialog__body {
  1148. padding-left: 25px;
  1149. padding-top: 0px;
  1150. }
  1151. </style>