IntegralPkCreateApplicationTeamBtn.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. <template>
  2. <div style="display: inline;">
  3. <el-button @click="openCreateDialog" type="primary" plain style="margin-left:5px;">录入团队积分</el-button>
  4. <el-dialog
  5. top="50px"
  6. append-to-body
  7. title="PK积分事件录入"
  8. width="600px"
  9. height="300px"
  10. :visible.sync="dialogCreateVisible"
  11. :close-on-click-modal="false"
  12. @open="setDefaultValueForDialog">
  13. <el-form ref="newEventForm" :model="newEventForm" :rules="rules" @submit.native.prevent style="padding:0 30px;">
  14. <el-form-item prop="team_id" label="选择团队" :label-width="formLabelWidth">
  15. <el-select
  16. @change="setTeamId"
  17. v-model="newEventForm.team_id"
  18. filterable
  19. placeholder="选择团队">
  20. <el-option
  21. v-for="item in teamOptions"
  22. :key="item.id"
  23. :label="item.name"
  24. :value="item.id">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="事件日期" prop="event_time" :label-width="formLabelWidth">
  29. <el-date-picker
  30. style="width:290px;"
  31. v-model="newEventForm.event_time"
  32. type="date"
  33. value-format="timestamp"
  34. placeholder="选择日期"
  35. :picker-options="assistantOptions">
  36. </el-date-picker>
  37. </el-form-item>
  38. <el-form-item label="积分规则" prop="rule_id" :label-width="formLabelWidth">
  39. <el-select
  40. style="width:290px;"
  41. v-model="newEventForm.rule_id"
  42. >
  43. <!-- @change="loadAvailableItems(newEventForm, initializeItemData)" -->
  44. <el-option
  45. v-for="item in availableRuleOptions"
  46. :key="item.id"
  47. :label="item.name"
  48. :value="item.id">
  49. </el-option>
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="备注内容" :label-width="formLabelWidth"
  53. class="gap-top-8"
  54. auto-complete="off" style="margin-top:20px;">
  55. <el-input placeholder="备注" v-model="newEventForm.remark" type="textarea" style="width:290px;"
  56. :disabled="newEventForm.rule_id==0"></el-input>
  57. </el-form-item>
  58. <el-form-item label="积分数量" :label-width="formLabelWidth" prop="point">
  59. <el-input-number
  60. class="gap-left-8"
  61. v-model="newEventForm.point"
  62. :disabled="newEventForm.rule_id==0">
  63. </el-input-number>
  64. </el-form-item>
  65. </el-form>
  66. <div slot="footer" class="dialog-footer">
  67. <el-button @click="dialogCreateVisible = false">取 消</el-button>
  68. <el-button type="primary" @click="submitCreateForm('newEventForm')">确 定</el-button>
  69. </div>
  70. </el-dialog>
  71. </div>
  72. </template>
  73. <script>
  74. import qs from 'qs'
  75. export default {
  76. props: {
  77. pk_id: {
  78. type: String,
  79. default: ''
  80. }
  81. },
  82. data() {
  83. let validateTarget = (rule, value, callback) => {
  84. /*if (!value || value.length == 0) {
  85. return callback(new Error('请选择奖扣积分对象'))
  86. } else {
  87. callback()
  88. }*/
  89. callback()
  90. //return true
  91. }
  92. let validateTeam = (rule, value, callback) => {
  93. if (!value || value == 0) {
  94. return callback(new Error('请选择一个团队'))
  95. } else {
  96. callback()
  97. }
  98. }
  99. let validateCategory = (rule, value, callback) => {
  100. if (!value || value.length == 0) {
  101. return callback(new Error('请选择积分分类'))
  102. } else {
  103. callback()
  104. }
  105. }
  106. let validateRule = (rule, value, callback) => {
  107. if (!value || isNaN(value)) {
  108. return callback(new Error('请选择积分规则'))
  109. } else {
  110. callback()
  111. }
  112. }
  113. let validateItem = (rule, value, callback) => {
  114. if (isNaN(value) || parseInt(value) == 0) {
  115. return callback(new Error('请填写有效的积分数值'))
  116. }
  117. callback()
  118. }
  119. return {
  120. memberList: [],
  121. teamOptions: [],
  122. profile: this.$store.getters.user_info,
  123. totalCount: 0,
  124. tableData: null,
  125. currentPage: 1,
  126. multipleSelection: [],
  127. dialogCreateVisible: false,
  128. dialogEditVisible: false,
  129. dialogExcelVisible: false,
  130. formLabelWidth: '128px',
  131. newEventForm: {
  132. target_id: [],
  133. rule_id: '',
  134. event_time: '',
  135. team_id_set: '',
  136. remark: '',
  137. point: 0,
  138. pk_id: this.pk_id
  139. },
  140. eventForm: {
  141. id: '',
  142. target_name: '',
  143. event_time: '',
  144. category_path: '',
  145. rule_name: '',
  146. point: '',
  147. remark: '',
  148. item: {
  149. content: '',
  150. is_range: false,
  151. is_negative: false,
  152. point_type: '',
  153. value_1: 0,
  154. value_2: 0
  155. }
  156. },
  157. itemSelectForm: {
  158. target_id_set: [],
  159. category_id: [],
  160. rule_id: '',
  161. event_time: '',
  162. items: [],
  163. get_category: 1
  164. },
  165. selectedItems: [],
  166. rules: {
  167. target_id_set: [
  168. {validator: validateTarget, trigger: 'change'}
  169. ],
  170. rule_id: [
  171. {validator: validateRule, trigger: 'change'}
  172. ],
  173. team_id_set: [
  174. {validator: validateTeam, trigger: 'change'}
  175. ],
  176. point: [
  177. {validator: validateItem, trigger: 'change'}
  178. ],
  179. },
  180. itemRules: {
  181. validator: validateItem, trigger: 'change'
  182. },
  183. deptTree: [],
  184. filter: {
  185. keywords: '',
  186. target_id_set: [],
  187. category_id: [],
  188. point_type: 0,
  189. time_range: ''
  190. },
  191. categoryTree: [],
  192. employeeOptions: [],
  193. pointTypes: [],
  194. availableRuleOptions: [],
  195. assistantOptions: {
  196. disabledDate(time) {
  197. return time.getTime() > Date.now()
  198. },
  199. shortcuts: [{
  200. text: '今天',
  201. onClick(picker) {
  202. picker.$emit('pick', new Date())
  203. }
  204. }, {
  205. text: '昨天',
  206. onClick(picker) {
  207. const date = new Date()
  208. date.setTime(date.getTime() - 3600 * 1000 * 24)
  209. picker.$emit('pick', date)
  210. }
  211. }]
  212. },
  213. instantPickerOptions: {
  214. shortcuts: [{
  215. text: '本周',
  216. onClick(picker) {
  217. const now = new Date(new Date().toLocaleDateString())
  218. let start = now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000
  219. let end = start + 7 * 24 * 60 * 60 * 1000 - 1000
  220. picker.$emit('pick', [start, end])
  221. }
  222. }, {
  223. text: '上周',
  224. onClick(picker) {
  225. const now = new Date(new Date().toLocaleDateString())
  226. let start = now.getTime() - (now.getDay() + 6) * 24 * 60 * 60 * 1000
  227. let end = start + 7 * 24 * 60 * 60 * 1000 - 1000
  228. picker.$emit('pick', [start, end])
  229. }
  230. }, {
  231. text: '本月',
  232. onClick(picker) {
  233. const now = new Date()
  234. let startDate = new Date(now.getFullYear(), now.getMonth(), 1)
  235. let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0)
  236. picker.$emit('pick', [startDate.getTime(), endDate.getTime()])
  237. }
  238. }, {
  239. text: '上月',
  240. onClick(picker) {
  241. const now = new Date();
  242. let startDate = new Date(now.getFullYear() - (now.getMonth() > 0 ? 0 : 1), (now.getMonth() + 11) % 12, 1)
  243. let endDate = new Date(now.getFullYear(), now.getMonth(), 0)
  244. picker.$emit('pick', [startDate.getTime(), endDate.getTime()])
  245. }
  246. }]
  247. }
  248. }
  249. },
  250. methods: {
  251. openCreateDialog() {
  252. let self = this
  253. this.newEventForm = {
  254. target_id_set: [],
  255. rule_id: '',
  256. event_time: '',
  257. team_id_set: '',
  258. remark: '',
  259. point: 0,
  260. remark: '',
  261. pk_id: this.pk_id
  262. }
  263. this.dialogCreateVisible = true
  264. this.loadTeamListData()
  265. this.loadAvailableRules()
  266. this.$nextTick(() => {
  267. let form = self.$refs['newEventForm']
  268. form.clearValidate()
  269. })
  270. },
  271. setTeamId() {
  272. for (let i in this.teamOptions) {
  273. if (this.teamOptions[i].id == this.newEventForm.team_id_set) {
  274. this.memberList = this.teamOptions[i].member
  275. this.newEventForm.target_id_set = []
  276. }
  277. }
  278. },
  279. dateFormatter: function (row, column, cellValue) {
  280. return this.$moment(cellValue * 1000).format('YYYY年MM月DD日')
  281. },
  282. loadPointType: function () {
  283. var self = this
  284. this.$http('get','/integral.php/ajax_request_common/get_point_types').then(function (response) {
  285. if (response.status == 200) {
  286. let jsonData = response.data
  287. try {
  288. self.pointTypes = jsonData
  289. } catch (err) {
  290. console.log(err)
  291. }
  292. }
  293. }).catch(function (error) {
  294. console.log(error)
  295. })
  296. },
  297. toggleSelection: function (rows) {
  298. if (rows) {
  299. rows.forEach(row => {
  300. this.$refs.multipleTable.toggleRowSelection(row)
  301. })
  302. } else {
  303. this.$refs.multipleTable.clearSelection()
  304. }
  305. },
  306. //选择积分分类时更新积分规则
  307. loadAvailableRules: function () {
  308. var self = this
  309. this.$http('get','/api/integral/pk/rules',{
  310. pk_id: self.pk_id,
  311. page: 1,
  312. page_size: 20
  313. }).then(function (response) {
  314. if (response.status == 200) {
  315. let jsonData = response.data.data.list.list
  316. try {
  317. self.availableRuleOptions = jsonData
  318. } catch (err) {
  319. console.log(err)
  320. }
  321. }
  322. }).catch(function (error) {
  323. console.log(error)
  324. })
  325. },
  326. //选择积分规则时更新细则列表
  327. loadAvailableItems: function (formObj, callback) {
  328. if (!formObj) {
  329. return;
  330. }
  331. let ruleId = formObj.rule_id
  332. if (isNaN(ruleId) || ruleId < 0) {
  333. return;
  334. }
  335. let params = {
  336. rule_id: ruleId
  337. };
  338. if (formObj.get_category) {
  339. params.get_category = formObj.get_category
  340. }
  341. this.$http('get','/integral.php/ajax_request_common/get_integral_items_by_rule',params).then(function (response) {
  342. if (response.status == 200) {
  343. let jsonData = response.data
  344. try {
  345. if (callback) {
  346. jsonData = callback.call(null, jsonData)
  347. }
  348. formObj.items = jsonData
  349. } catch (err) {
  350. console.log(err)
  351. }
  352. }
  353. }).catch(function (error) {
  354. console.log(error)
  355. })
  356. },
  357. initializeItemData: function (jsonData) {
  358. for (let index = 0; index < jsonData.length; index++) {
  359. let item = jsonData[index]
  360. item.checked = false
  361. item.point = item.value_1
  362. item.remark = ''
  363. }
  364. return jsonData
  365. },
  366. applyItemSelection: function (jsonData) {
  367. let selectedItemIds = this.selectedItems.map(x => x.id)
  368. for (let index = 0; index < jsonData.length; index++) {
  369. let item = jsonData[index];
  370. item.checked = selectedItemIds.indexOf(item.id) > -1
  371. }
  372. return jsonData
  373. },
  374. generatePointIndication: function (item) {
  375. let propertyText = item.is_negative == 1 ? '扣除' : '奖励';
  376. let valueText = item.is_range == 1 ? item.value_1 + '~' + item.value_2 : item.value_1
  377. let typeText = ''
  378. for (let index = 0; index < this.pointTypes.length; index++) {
  379. let pointType = this.pointTypes[index]
  380. if (item.point_type == pointType.value) {
  381. typeText = pointType.label
  382. break
  383. }
  384. }
  385. return '标准: ' + propertyText + ' ' + valueText + ' ' + typeText
  386. },
  387. handleSelectionChange: function (val) {
  388. this.multipleSelection = val
  389. },
  390. resetCreateDialog: function () {
  391. let form = this.$refs['newEventForm']
  392. form.clearValidate()
  393. this.newEventForm.rule_id = ''
  394. this.newEventForm.items = []
  395. },
  396. openEditDialog: function (eventId) {
  397. var self = this
  398. this.$http('get','/integral.php/ajax_request_common/get_event_detail',{id: eventId}).then(function (response) {
  399. if (response.status == 200) {
  400. let jsonData = response.data
  401. try {
  402. self.eventForm = self.processDetailData(jsonData)
  403. self.dialogEditVisible = true
  404. } catch (err) {
  405. console.log(err)
  406. }
  407. }
  408. }).catch(function (error) {
  409. console.log(error)
  410. })
  411. },
  412. onDismissEditDialog: function () {
  413. let form = this.$refs['eventForm']
  414. form.clearValidate();
  415. this.eventForm = {
  416. id: '',
  417. target_name: '',
  418. event_time: '',
  419. category_path: '',
  420. rule_name: '',
  421. point: '',
  422. remark: '',
  423. item: {
  424. content: '',
  425. is_range: false,
  426. is_negative: false,
  427. point_type: '',
  428. value_1: 0,
  429. value_2: 0
  430. }
  431. };
  432. },
  433. submitCreateForm: function (formName) {
  434. var form = this.$refs[formName]
  435. var self = this
  436. form.validate((valid) => {
  437. if (valid) {
  438. if (form) {
  439. self.sendCreateRequest()
  440. }
  441. } else {
  442. return false
  443. }
  444. })
  445. },
  446. // 积分录入
  447. sendCreateRequest() {
  448. let datenew = this.$moment(this.newEventForm.event_time).format('YYYY-MM-DD')
  449. let dataObj = this.newEventForm
  450. dataObj.event_time = datenew;
  451. dataObj.log_type = 'team';
  452. console.log()
  453. //let formData = qs.stringify({row: dataObj})
  454. var self = this
  455. this.$http('post','/api/integral/pk/log',dataObj,
  456. // headers: {
  457. // 'Content-Type': 'application/x-www-form-urlencoded'
  458. // }
  459. ).then(function (response) {
  460. let message = ""
  461. let status = 0
  462. if (response.status == 200) {
  463. let data = response.data
  464. if (data.code == 1) {
  465. self.$message({
  466. message: data.msg,
  467. type: 'success'
  468. })
  469. self.$parent.$parent.$parent.loadLogList()
  470. self.currentPage = 1
  471. self.dialogCreateVisible = false
  472. //self.loadEventList()
  473. //self.resetCreateDialog()
  474. } else {
  475. self.$message({
  476. message: data.msg,
  477. type: 'error'
  478. })
  479. }
  480. } else {
  481. self.$message({
  482. message: '服务器出现问题',
  483. type: 'error'
  484. })
  485. }
  486. }).catch(function (error) {
  487. console.log(error)
  488. })
  489. },
  490. sendEditRequest: function () {
  491. let dataObj = this.eventForm
  492. if (isNaN(dataObj.point) || !dataObj.point) {
  493. this.$message({
  494. message: '请填写积分数值',
  495. type: 'error'
  496. });
  497. this.$refs['pointEditor'].focus()
  498. return
  499. }
  500. let formData = {
  501. id: dataObj.id,
  502. event_time: parseInt(dataObj.event_time / 1000),
  503. point: dataObj.point,
  504. remark: dataObj.remark,
  505. is_negative: dataObj.item.is_negative
  506. };
  507. var self = this;
  508. this.$http('post','/integral.php/ajax_request_common/update_event',formData,'','',
  509. {transformRequest: [(data) => {
  510. let paramArray = new Array()
  511. for (let it in data) {
  512. paramArray.push(encodeURIComponent(it) + '=' + encodeURIComponent(data[it]))
  513. }
  514. return paramArray.join("&")
  515. }]},
  516. // headers: {
  517. // 'Content-Type': 'application/x-www-form-urlencoded'
  518. // }
  519. ).then(function (response) {
  520. let message = ""
  521. let status = 0
  522. if (response.status == 200) {
  523. let data = response.data
  524. status = isNaN(data.status) ? 0 : parseInt(data.status)
  525. switch (status) {
  526. case 1:
  527. message = "修改积分事件成功";
  528. break
  529. case -1:
  530. message = "表单参数错误";
  531. break
  532. default:
  533. message = "修改积分事件失败";
  534. }
  535. } else {
  536. message = "服务器出现问题";
  537. }
  538. self.$message({
  539. message: message,
  540. type: status == 1 ? 'success' : 'error'
  541. })
  542. if (status == 1) {
  543. self.loadEventList()
  544. self.dialogEditVisible = false;
  545. }
  546. }).catch(function (error) {
  547. console.log(error)
  548. })
  549. },
  550. confirmDelete(eventId) {
  551. this.$confirm('确定要删除此积分事件吗?', '删除积分事件', {
  552. confirmButtonText: '确定',
  553. cancelButtonText: '取消',
  554. type: 'warning'
  555. }).then(() => {
  556. this.deleteItem(eventId)
  557. }).catch(() => {
  558. //console.log('已取消删除');
  559. })
  560. },
  561. confirmMultipleDelete() {
  562. if (this.multipleSelection.length < 1) {
  563. return false
  564. }
  565. this.$confirm('确定要删除选中的积分事件吗?', '批量删除积分事件', {
  566. confirmButtonText: '确定',
  567. cancelButtonText: '取消',
  568. type: 'warning'
  569. }).then(() => {
  570. let targetArr = []
  571. for (let index in this.multipleSelection) {
  572. targetArr.push(this.multipleSelection[index].id)
  573. }
  574. let targetIds = targetArr.join(",")
  575. this.deleteItem(targetIds, true)
  576. }).catch(() => {
  577. //console.log('已取消删除');
  578. })
  579. },
  580. deleteItem(eventId, isMultiple) {
  581. if (!eventId) {
  582. return false;
  583. }
  584. isMultiple = isMultiple || false
  585. let url = ""
  586. let params = null
  587. if (isMultiple) {
  588. url = '/integral.php/ajax_request_common/delete_event_multiple'
  589. params = {
  590. ids: eventId
  591. }
  592. } else {
  593. url = '/integral.php/ajax_request_common/delete_event'
  594. params = {
  595. id: eventId
  596. }
  597. }
  598. var self = this
  599. this.$http('get',url,params).then(function (response) {
  600. let message = ""
  601. let status = 0
  602. if (response.status == 200) {
  603. var data = response.data
  604. status = isNaN(data.status) ? 0 : parseInt(data.status)
  605. switch (status) {
  606. case 1:
  607. message = "删除积分事件成功";
  608. break;
  609. case -1:
  610. message = "表单参数错误";
  611. break;
  612. default:
  613. message = data.info ? data.info : "删除积分事件失败";
  614. }
  615. } else {
  616. message = "服务器出现问题";
  617. }
  618. self.$message({
  619. message: message,
  620. type: status == 1 ? 'success' : 'error'
  621. })
  622. if (status == 1) {
  623. self.loadEventList()
  624. }
  625. }).catch(function (error) {
  626. console.log(error)
  627. })
  628. },
  629. // 获取团队
  630. loadTeamListData() {
  631. var self = this
  632. let params = {
  633. pk_id: self.pk_id,
  634. page: 1,
  635. page_size: 20
  636. }
  637. this.$http('get','/api/integral/pk/teams',params).then(function (response) {
  638. if (response.status == 200) {
  639. var jsonData = response.data.data.list.list
  640. try {
  641. self.teamOptions = jsonData
  642. } catch (err) {
  643. console.log(err)
  644. }
  645. }
  646. }).catch(function (error) {
  647. console.log(error)
  648. })
  649. },
  650. //获取控件所需数据
  651. loadWidgetData: function () {
  652. var self = this
  653. this.$http('get','/integral.php/ajax_request_common/prepare_integral_options',{
  654. id: this.profile.id,
  655. category_tree: 1,
  656. employee_list: 1
  657. }).then(function (response) {
  658. if (response.status == 200) {
  659. var jsonData = response.data
  660. try {
  661. self.categoryTree = jsonData.category_tree
  662. } catch (err) {
  663. console.log(err)
  664. }
  665. }
  666. }).catch(function (error) {
  667. console.log(error)
  668. })
  669. },
  670. //获取可录入积分对象的列表
  671. loadTargetRange: function () {
  672. var self = this
  673. this.$http('get','/integral.php/ajax_request_common/load_target_range',{recorder_id: this.profile.id}).then(function (response) {
  674. if (response.status == 200) {
  675. var jsonData = response.data
  676. try {
  677. self.employeeOptions = jsonData
  678. } catch (err) {
  679. console.log(err)
  680. }
  681. }
  682. }).catch(function (error) {
  683. console.log(error)
  684. })
  685. },
  686. setDefaultValueForDialog: function () {
  687. if (!this.newEventForm.event_time) {
  688. this.newEventForm.event_time = new Date().getTime()
  689. }
  690. },
  691. processDetailData: function (object) {
  692. //时间戳转换
  693. object.event_time *= 1000
  694. return object
  695. },
  696. updateItemSelection: function (item, checked) {
  697. if (checked) {
  698. let itemIds = this.selectedItems.map(x => x.id)
  699. if (itemIds && (itemIds.length == 0 || itemIds.indexOf(item.id) < 0)) {
  700. this.selectedItems.push(item)
  701. }
  702. } else {
  703. this.selectedItems = this.selectedItems.filter(x => {
  704. if (x.id != item.id) {
  705. return x
  706. }
  707. })
  708. }
  709. },
  710. removeItemSelection: function (itemId) {
  711. let index = this.selectedItems.map(x => x.id).indexOf(itemId)
  712. if (!isNaN(index) && index > -1) {
  713. this.selectedItems.splice(index, 1)
  714. let itemArray = this.itemSelectForm.items
  715. for (let i = 0; i < itemArray.length; i++) {
  716. if (itemArray[i].id == itemId) {
  717. itemArray[i].checked = false
  718. }
  719. }
  720. }
  721. }
  722. },
  723. created() {
  724. this.loadTeamListData()
  725. }
  726. }
  727. </script>