event_list.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <template>
  2. <div class="event-list__container">
  3. <van-nav-bar title="积分事件" left-text="返回" @click-left="$route_back" left-arrow></van-nav-bar>
  4. <van-search placeholder="请输入姓名或事件内容搜索" v-model="searchParams.keyword" @input="keyVal()"/>
  5. <van-dropdown-menu>
  6. <van-dropdown-item :title="dateItemTitle" ref="dateDropdownItem">
  7. <DateSelectorDropdown :title.sync="dateItemTitle" @onConfirm="onConfirmDate"/>
  8. </van-dropdown-item>
  9. <van-dropdown-item :title="deptDropdownItemTitle" ref="deptDropdownItem">
  10. <template slot="title">
  11. <Wxopendata type="departmentName" :openid="deptDropdownItemTitle"></Wxopendata>
  12. </template>
  13. <DeptSelectorDropdown @onConfirm="onConfirmDept"/>
  14. </van-dropdown-item>
  15. <van-dropdown-item title="规则分类" ref="ruleDropdownItem">
  16. <RuleCategorySelDropdown @onConfirm="onConfirmRule" @onCancel="searchParams.rule_id = null"/>
  17. </van-dropdown-item>
  18. <van-dropdown-item :title="pointTypeDropdownItemTitle" :options="pointTypeOption" v-model="pointType"
  19. @change="onChangePointType"/>
  20. </van-dropdown-menu>
  21. <div class="event-list__content">
  22. <scroller ref="scroller" :on-refresh="refresh" :on-infinite="infinite" noDataText="我也是有底线的" :list="eventData">
  23. <van-cell-group>
  24. <div class="event-list__item" v-for="(item, index) in eventData" :key="index"
  25. @click="viewDetail(item)">
  26. <div class="event-item__name-wrap">
  27. <span class="event-item__name-icon">
  28. <userImage class="about-me__avatar" :img_url="item.employee_img_url" :user_name="item.employee_name" fontSize="0.24rem" width="0.72rem" height="0.72rem"></userImage>
  29. </span>
  30. <span class="event-item__name"><Wxopendata type="userName" :openid="item.employee_name"></Wxopendata></span>
  31. <span class="event-item__value green" v-if="item.point >= 0">+{{ item.point }}{{ types_list[item.pt_id]}}</span>
  32. <span class="event-item__value" v-else>{{ item.point }}{{ types_list[item.pt_id] }}</span>
  33. </div>
  34. <div class="event-content__text">
  35. <span>{{ item.remark }}</span>
  36. </div>
  37. <div class="event-time__text">
  38. <span>{{ moment(item.event_time).format('YYYY-MM-DD') }}</span>
  39. </div>
  40. </div>
  41. </van-cell-group>
  42. <van-empty v-if="!hasData" description="暂无数据..."/>
  43. </scroller>
  44. </div>
  45. </div>
  46. </template>
  47. <script>
  48. import Vue from 'vue'
  49. import moment from 'moment'
  50. import request from '@/utils/request'
  51. import {_debounce, _throttle} from '@/utils/auth'
  52. import {DropdownMenu, DropdownItem, Empty, Search} from 'vant'
  53. import DateSelectorDropdown from '@/components/common/DateSelectorDropdown'
  54. import DeptSelectorDropdown from '@/components/common/DeptSelectorDropdown'
  55. import RuleCategorySelDropdown from '@/components/common/RuleCategorySelDropdown'
  56. import userImage from '@/components/common/user_image'
  57. Vue.use(Empty).use(DropdownMenu).use(DropdownItem).use(Search)
  58. export default {
  59. name: 'event_list',
  60. data () {
  61. const pointTypeId = this.getPointType(this.$route.query.point_type)
  62. return {
  63. loading: true,
  64. isAPerson: this.$route.query.isAPerson || false,
  65. pointType: pointTypeId || -1,
  66. dateItemTitle: '本月',
  67. deptDropdownItemTitle: '全公司',
  68. eventData: [],
  69. moment:moment,
  70. searchParams: {
  71. dept_ids: null,
  72. end_day: null,
  73. employee_ids: null,
  74. month: moment().format('YYYY-MM'),
  75. start_day: null,
  76. page: 1,
  77. page_size: 10,
  78. rule_id: null,
  79. pt_id: pointTypeId,
  80. keyword: ''
  81. },
  82. types_list: {}
  83. }
  84. },
  85. components: {
  86. DateSelectorDropdown,
  87. DeptSelectorDropdown,
  88. RuleCategorySelDropdown,
  89. userImage
  90. },
  91. // watch: {
  92. // 'searchParams.keyword': function (val) {
  93. // let self = this
  94. // self.refresh(function () {
  95. // self.$toast.clear()
  96. // })
  97. // }
  98. // },
  99. computed: {
  100. pointTypeOption () {
  101. const option = [{text: '全部', value: -1}]
  102. this.$store.getters.point_types.forEach(type => {
  103. option.push({text: `${type.name}事件`, value: type.id})
  104. })
  105. return option
  106. },
  107. pointTypeDropdownItemTitle () {
  108. if (this.pointType === -1) {
  109. return '积分分类'
  110. }
  111. return this.pointTypeOption.find(a => a.value === this.pointType).text
  112. },
  113. hasData () {
  114. return this.loading || (Array.isArray(this.eventData) && this.eventData.length > 0)
  115. }
  116. },
  117. created () {
  118. if (this.$route.query.employee_id) {
  119. this.searchParams.employee_ids = this.$route.query.employee_id
  120. }
  121. this.get_point_types()
  122. },
  123. methods: {
  124. keyVal:_debounce(function () {
  125. this.refresh(function () {})
  126. }),
  127. get_point_types () {
  128. let self = this
  129. for (let i in this.$store.getters.point_types) {
  130. self.types_list[this.$store.getters.point_types[i].id] = this.$store.getters.point_types[i].name
  131. }
  132. },
  133. getPointType (code) {
  134. const pointTypes = this.$store.getters.point_types
  135. const index = pointTypes.findIndex(a => a.code === code)
  136. if (index > -1) {
  137. return pointTypes[index].id
  138. }
  139. return null
  140. },
  141. getIconText (employeeName) {
  142. if (employeeName && employeeName.length > 2) {
  143. const len = employeeName.length
  144. return employeeName[len - 2] + employeeName[len - 1]
  145. }
  146. return employeeName
  147. },
  148. viewDetail (item) {
  149. this.$router.push({name: 'event_detail', query: {id: item.id}})
  150. },
  151. refresh (done) {
  152. this.searchParams.page = 1
  153. this.getEventData(done)
  154. },
  155. infinite (done) {
  156. this.searchParams.page++
  157. this.getEventData(done)
  158. },
  159. onConfirmDate (item) {
  160. this.searchParams.page = 1
  161. if (item.dateMode === 1) {
  162. this.searchParams.month = item.startDate
  163. this.searchParams.end_day = null
  164. this.searchParams.start_day = null
  165. } else {
  166. this.searchParams.month = null
  167. this.searchParams.end_day = item.startDate
  168. this.searchParams.start_day = item.endDate
  169. }
  170. this.$refs.dateDropdownItem.toggle()
  171. this.$refs.scroller.triggerPullToRefresh()
  172. },
  173. // 选择员工
  174. // onConfirmDept (deptItem) {
  175. // this.searchParams.page = 1
  176. // if (deptItem.employee.length > 0) {
  177. // let employee_ids = []
  178. // let employee_name = []
  179. // for(let i in deptItem.employee){
  180. // employee_ids.push(deptItem.employee[i].id)
  181. // employee_name.push(deptItem.employee[i].name)
  182. // }
  183. // this.searchParams.employee_ids = employee_ids
  184. // this.deptDropdownItemTitle = employee_name.toString()
  185. // } else {
  186. // this.searchParams.employee_ids = null
  187. // this.deptDropdownItemTitle = '员工'
  188. // }
  189. // this.$refs.deptDropdownItem.toggle()
  190. // this.$refs.scroller.triggerPullToRefresh()
  191. // },
  192. // 选择部门
  193. onConfirmDept (deptItem) {
  194. if (deptItem) {
  195. this.searchParams.dept_ids = deptItem.id
  196. this.deptDropdownItemTitle = deptItem.name
  197. } else {
  198. this.searchParams.dept_ids = null
  199. this.deptDropdownItemTitle = '全公司'
  200. }
  201. this.$refs.deptDropdownItem.toggle()
  202. this.$refs.scroller.triggerPullToRefresh()
  203. },
  204. onConfirmRule (ruleIds) {
  205. this.searchParams.page = 1
  206. this.searchParams.rule_id = ruleIds || null
  207. this.$refs.ruleDropdownItem.toggle()
  208. this.$refs.scroller.triggerPullToRefresh()
  209. },
  210. onChangePointType () {
  211. this.searchParams.page = 1
  212. this.searchParams.pt_id = this.pointType === -1 ? null : this.pointType
  213. this.$refs.scroller.triggerPullToRefresh()
  214. },
  215. getEventData (callback) {
  216. if (this.isAPerson) {
  217. // const isArray = this.eventData;
  218. // let newarray = isArray.filter(item => {
  219. // return item.employee_id == this.$store.getters.user_info.id && item.pt_id == this.pointType
  220. // })
  221. // this.eventData = newarray
  222. this.searchParams.employee_ids = this.$store.getters.user_info.id
  223. }
  224. this.loading = true
  225. request('get', '/api/integral/statistics/integral', this.searchParams).then((res) => {
  226. const {scroller} = this.$refs
  227. if (res.data.code === 1) {
  228. const {list} = res.data.data
  229. if (this.searchParams.page === 1) {
  230. this.eventData = list
  231. } else {
  232. this.eventData = this.eventData.concat(list)
  233. }
  234. scroller.finishInfinite(list.length !== this.searchParams.page_size)
  235. } else {
  236. scroller.finishInfinite(true)
  237. }
  238. }).finally(() => {
  239. this.loading = false
  240. callback && callback()
  241. })
  242. }
  243. }
  244. }
  245. </script>
  246. <style scoped lang="less">
  247. .event-list__container {
  248. position: relative;
  249. & /deep/ .van-nav-bar {
  250. background-color: #26a2ff;
  251. }
  252. /deep/ .van-dropdown-menu__title--active {
  253. color: #26a2ff;
  254. }
  255. & /deep/ .van-dropdown-menu__item {
  256. &:nth-child(1), &:nth-child(2) {
  257. flex-grow: 0.9;
  258. }
  259. &:nth-child(4) {
  260. flex-grow: 1.25;
  261. & /deep/ .van-dropdown-menu__title {
  262. right: 0.06rem;
  263. }
  264. }
  265. }
  266. & .event-list__content {
  267. position: relative;
  268. height: calc(100% - 3rem);
  269. & .van-hairline--top-bottom:after,
  270. .body_com .van-hairline-unset--top-bottom:after {
  271. border: none;
  272. }
  273. }
  274. & .event-list__item {
  275. position: relative;
  276. display: flex;
  277. padding: 0.24rem 0.32rem;
  278. font-size: 0.32rem;
  279. color: #333;
  280. background: #fff;
  281. box-sizing: border-box;
  282. flex-direction: column;
  283. touch-action: none;
  284. &:not(:last-child)::after {
  285. position: absolute;
  286. box-sizing: border-box;
  287. content: ' ';
  288. pointer-events: none;
  289. right: 0;
  290. bottom: 0;
  291. left:0rem;
  292. border-bottom: 1px solid #ebedf0;
  293. -webkit-transform: scaleY(0.5);
  294. transform: scaleY(0.5);
  295. }
  296. & .event-item__name-wrap {
  297. display: flex;
  298. width: 100%;
  299. height: 100%;
  300. align-items: center;
  301. & .event-item__name-icon {
  302. position: relative;
  303. display: flex;
  304. width: 0.72rem;
  305. height: 0.72rem;
  306. font-size: 0.28rem;
  307. color: #fff;
  308. background: #26a2ff;
  309. align-items: center;
  310. justify-content: center;
  311. border-radius: 100%;
  312. }
  313. & .event-item__name {
  314. flex: 1;
  315. padding-left: 0.16rem;
  316. font-size: 0.36rem;
  317. }
  318. & .event-item__value {
  319. font-size: 0.36rem;
  320. color: #ff0000;
  321. text-align: right;
  322. &.green {
  323. color: #4bd964;
  324. }
  325. }
  326. }
  327. & .event-content__text {
  328. position: relative;
  329. padding-left: 0.91rem;
  330. color: #333;
  331. }
  332. & .event-time__text {
  333. position: relative;
  334. padding-top: 0.08rem;
  335. padding-left: 0.91rem;
  336. font-size: 0.28rem;
  337. color: #909399;
  338. }
  339. }
  340. }
  341. </style>