deptRank.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <div class="mrd-container">
  3. <van-nav-bar title="部门对比" left-text="返回" @click-left="$route_back" left-arrow />
  4. <van-dropdown-menu v-if="showSearchBar">
  5. <!-- A/B分 -->
  6. <van-dropdown-item :title="timeScopeText" @open="calendarOpen"></van-dropdown-item>
  7. <van-dropdown-item :title="searchForm.deptName" ref="deptDropdownItem"><DeptSelectorDropdown @onConfirm="onConfirmDept" /></van-dropdown-item>
  8. <van-dropdown-item title="规则" ref="ruleDropdownItem"><RuleCategorySelDropdown @onConfirm="onConfirmRule" @onCancel="searchForm.ruleId = 0"/></van-dropdown-item>
  9. <van-dropdown-item>
  10. <van-icon name="list-switch" slot="title" size="1.5em" />
  11. <template slot="default">
  12. <van-cell center title="积分类型">
  13. <template #right-icon>
  14. <van-radio-group v-model="searchForm.ptId" direction="horizontal">
  15. <van-radio v-for="pt in pts" :key="pt.value" :name="pt.value">{{pt.text}}</van-radio>
  16. </van-radio-group>
  17. </template>
  18. </van-cell>
  19. <van-cell center title="包含子部门">
  20. <van-switch v-model="searchForm.deptIncludeSub" active-color="#26A2FF" slot="right-icon" size="24"/>
  21. </van-cell>
  22. <van-cell center title="包含子规则分类">
  23. <van-switch v-model="searchForm.ruleIncludeSub" active-color="#26A2FF" slot="right-icon" size="24"/>
  24. </van-cell>
  25. </template>
  26. </van-dropdown-item>
  27. </van-dropdown-menu>
  28. <div class="mrd-content">
  29. <scroller
  30. ref="scroller"
  31. :on-refresh="onRefresh"
  32. >
  33. <van-cell v-for="item in dataList" :key="item.id" :title="item.name" :value="item.point"/>
  34. <noData :list="dataList" />
  35. </scroller>
  36. </div>
  37. <van-calendar
  38. v-model="showCalendar"
  39. type="range"
  40. :allow-same-day="true"
  41. :min-date="minDate"
  42. :max-date="maxDate"
  43. :default-date="timeScope"
  44. :show-confirm="false"
  45. color="#26A2FF"
  46. @close="calendarClose"
  47. @confirm="calendarConfirm"
  48. />
  49. </div>
  50. </template>
  51. <script>
  52. import Vue from 'vue';
  53. import moment from "moment/moment";
  54. import { DropdownMenu, DropdownItem ,Calendar,Switch} from 'vant';
  55. import DeptSelectorDropdown from '@/components/DeptSelectorDropdown';
  56. import RuleCategorySelDropdown from '@/components/RuleCategorySelDropdown';
  57. Vue.use(DropdownMenu).use(DropdownItem).use(Calendar).use(Switch);
  58. export default {
  59. name: "dept_rank",
  60. components:{
  61. DeptSelectorDropdown,
  62. RuleCategorySelDropdown
  63. },
  64. data(){
  65. let startDate = new Date();
  66. startDate.setTime(startDate.getTime() - 3600 * 1000 * 24 * 7);
  67. startDate = moment(startDate).format('YYYY-MM-DD');
  68. let endDate = moment().format('YYYY-MM-DD');
  69. let pts = this.$getTypes.map(type => {
  70. return {value:type.id,text:type.name,code:type.code}
  71. });
  72. let ptB = pts.filter(pt => pt.code === 'BF');
  73. ptB = ptB.length > 0 ? ptB[0] : null;
  74. let today = new Date();
  75. let minDate = new Date();
  76. minDate.setTime(today.getTime() - 3600 * 1000 * 24 * 30 * 6);
  77. let maxDate = new Date(today.getFullYear(),today.getMonth(),1);
  78. maxDate.setMonth(maxDate.getMonth() + 1);
  79. maxDate.setDate(0);
  80. return{
  81. pts:pts,
  82. searchForm:{
  83. startDate:startDate,
  84. endDate:endDate,
  85. deptId:0,
  86. deptName:'全公司',
  87. deptIncludeSub:false,
  88. ptId:ptB ? ptB.value : 0,
  89. ptName: ptB ? ptB.text : '',
  90. ruleId:0,
  91. ruleIncludeSub:false,
  92. itemId:0
  93. },
  94. dataList:[],
  95. showCalendar:false,
  96. minDate:minDate,
  97. maxDate:maxDate,
  98. timeScope:[new Date(startDate),new Date(endDate)],
  99. showSearchBar:!this.$supremeAuthority('employee')
  100. }
  101. },
  102. computed:{
  103. timeScopeText(){
  104. return moment(this.searchForm.startDate).format('MM/DD') + '-' + moment(this.searchForm.endDate).format('MM/DD')
  105. },
  106. currentPtName(){
  107. if (this.searchForm.ptId <= 0) return '积分分类';
  108. let pt = this.pts.filter(pt => pt.id === this.searchForm.ptId);
  109. return pt ? pt.name : '积分分类';
  110. }
  111. },
  112. watch:{
  113. timeScope(val){
  114. this.$nextTick(()=>{
  115. this.searchForm.startDate = moment(val[0]).format('YYYY-MM-DD');
  116. this.searchForm.endDate = moment(val[1]).format('YYYY-MM-DD');
  117. })
  118. },
  119. 'searchForm.startDate'(val){
  120. this.onRefresh()
  121. },
  122. 'searchForm.endDate'(val){
  123. this.onRefresh()
  124. },
  125. 'searchForm.deptId'(val){
  126. this.onRefresh()
  127. },
  128. 'searchForm.deptIncludeSub'(val){
  129. this.onRefresh()
  130. },
  131. 'searchForm.ptId'(val){
  132. this.onRefresh()
  133. },
  134. 'searchForm.ruleId'(val){
  135. this.onRefresh()
  136. },
  137. 'searchForm.ruleIncludeSub'(val){
  138. this.onRefresh()
  139. },
  140. },
  141. created() {},
  142. methods:{
  143. calendarOpen(){
  144. this.showCalendar = true;
  145. },
  146. calendarClose(){
  147. this.showCalendar = false;
  148. },
  149. calendarConfirm(event){
  150. const [start,end] = event;
  151. this.timeScope = [start,end];
  152. this.showCalendar = false;
  153. },
  154. truncateString(str,length){
  155. if (str.length > length){
  156. }
  157. return str.length > length ? str.substring(0,length) : str;
  158. },
  159. onConfirmDept(deptItem){
  160. if (deptItem){
  161. this.searchForm.deptId = deptItem.id;
  162. this.searchForm.deptName = this.truncateString(deptItem.name,3);
  163. }else {
  164. this.searchForm.deptId = 0;
  165. this.searchForm.deptName = '全公司';
  166. }
  167. this.$refs.deptDropdownItem.toggle();
  168. },
  169. onConfirmRule(ruleId){
  170. this.searchForm.ruleId = ruleId || 0;
  171. this.$refs.ruleDropdownItem.toggle();
  172. },
  173. onRefresh(done){
  174. if (!this.searchForm.startDate || !this.searchForm.endDate || !this.searchForm.ptId){
  175. if (typeof done === 'function') done();
  176. return;
  177. }
  178. let msg = {
  179. type:'dr',
  180. start_date:this.searchForm.startDate,
  181. end_date:this.searchForm.endDate,
  182. pt_id:this.searchForm.ptId,
  183. dept_id:this.searchForm.deptId,
  184. dept_include_sub:this.searchForm.deptIncludeSub ? 1 : 0,
  185. item_id:0,
  186. rule_id:this.searchForm.ruleId,
  187. rule_include_sub:this.searchForm.ruleIncludeSub ? 1 : 0
  188. }
  189. this.$socketApiTow.sendData(msg,(res) => {
  190. if (res.code !== 1 || res.type !== msg.type){
  191. if (typeof done === 'function') done();
  192. return;
  193. }
  194. this.dataList = res.result.list;
  195. if (typeof done === 'function') done();
  196. })
  197. }
  198. }
  199. }
  200. </script>
  201. <style scoped lang="less">
  202. .mrd-container {
  203. background-color: white;
  204. & .mrd-content {
  205. margin-top: 0.2rem;
  206. position: relative;
  207. height: calc(100% - 2.1rem);
  208. }
  209. }
  210. </style>