backlogDetailTab.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <template>
  2. <view class="uni-app">
  3. <view class="status-bar" />
  4. <view class="main-container">
  5. <!-- #ifdef MP-WEIXIN -->
  6. <wk-nav-bar
  7. :command-list="commandList"
  8. :title="title"
  9. @command="handleCommand" />
  10. <!-- #endif -->
  11. <!-- #ifndef MP-WEIXIN -->
  12. <wk-nav-bar :title="title">
  13. <!-- <text
  14. v-if="commandList.length > 0"
  15. class="read-all"
  16. @click="handleReadAll">
  17. 全部已处理
  18. </text> -->
  19. </wk-nav-bar>
  20. <!-- #endif -->
  21. <view class="list-wrapper">
  22. <view class="wk-tabs">
  23. <view
  24. v-for="(tab, index) in tabs"
  25. :key="index"
  26. :class="{active: activeTab === tab.value}"
  27. class="wk-tab-item"
  28. @click="handleToggleTabs(tab.value)">
  29. {{ tab.label }}
  30. </view>
  31. </view>
  32. <wk-scroll-view
  33. :status="listStatus"
  34. :refresh="false"
  35. class="list-scroll"
  36. @loadmore="getList()">
  37. <template v-for="(data, index) in listData">
  38. <detail-customer-item
  39. v-if="activeCom === 'DetailCustomerItem'"
  40. :key="index"
  41. :type="typeObj.type"
  42. :item-data="data"
  43. :open-slider="openSlider"
  44. @refresh="handleRefresh(index)" />
  45. <detail-receivables-item
  46. v-else-if="activeCom === 'DetailReceivablesItem'"
  47. :key="index"
  48. :type="typeObj.type"
  49. :item-data="data"
  50. :open-slider="openSlider"
  51. @refresh="handleRefresh(index)" />
  52. <detail-contract-item
  53. v-else-if="activeCom === 'DetailContractItem'"
  54. :key="index"
  55. :type="typeObj.type"
  56. :item-data="data"
  57. :open-slider="openSlider"
  58. @refresh="handleRefresh(index)" />
  59. <detail-leads-item
  60. v-else-if="activeCom === 'DetailLeadsItem'"
  61. :key="index"
  62. :type="typeObj.type"
  63. :item-data="data"
  64. :open-slider="openSlider"
  65. @refresh="handleRefresh(index)" />
  66. <detail-await-receivables-item
  67. v-else-if="activeCom === 'DetailAwaitReceivablesItem'"
  68. :key="index"
  69. :type="typeObj.type"
  70. :item-data="data"
  71. :open-slider="openSlider"
  72. @refresh="handleRefresh(index)" />
  73. <detail-examination-item
  74. v-else-if="activeCom === 'DetailExaminationItem'"
  75. :key="index"
  76. :type="typeObj.type"
  77. :item-data="data"
  78. :open-slider="openSlider"
  79. @refresh="handleRefresh(index)" />
  80. <detail-business-item
  81. v-else-if="activeCom === 'DetailBusinessItem'"
  82. :key="index"
  83. :type="typeObj.type"
  84. :item-data="data"
  85. @refresh="handleRefresh(index)" />
  86. </template>
  87. </wk-scroll-view>
  88. </view>
  89. </view>
  90. </view>
  91. </template>
  92. <script>
  93. import * as API from 'API/crm/message'
  94. import { WaitingQueryOaExamineList } from 'API/oa/examine.js'
  95. import DetailCustomerItem from './backlog/detailCustomerItem'
  96. import DetailContractItem from './backlog/detailContractItem'
  97. import DetailLeadsItem from './backlog/detailLeadsItem'
  98. import DetailReceivablesItem from './backlog/detailReceivablesItem'
  99. import DetailAwaitReceivablesItem from './backlog/detailAwaitReceivablesItem'
  100. import DetailExaminationItem from './backlog/detailExaminationItem'
  101. import DetailBusinessItem from './backlog/detailBusinessItem.vue'
  102. import mainListMixins from '@/mixins/mainList.js'
  103. export default {
  104. name: 'BacklogDetilTab',
  105. components: {
  106. DetailCustomerItem,
  107. DetailReceivablesItem,
  108. DetailContractItem,
  109. DetailLeadsItem,
  110. DetailAwaitReceivablesItem,
  111. DetailExaminationItem,
  112. DetailBusinessItem
  113. },
  114. mixins: [mainListMixins],
  115. data() {
  116. return {
  117. routerQuery: {},
  118. activeTab: -1,
  119. tabs: [],
  120. title: '',
  121. activeCom: '',
  122. typeObj: {},
  123. filterData: {},
  124. loading: false,
  125. typeMap: [
  126. {
  127. label: '分配给我的线索',
  128. type: 2,
  129. component: 'DetailLeadsItem',
  130. fn: API.FollowLeads,
  131. options: [
  132. {label: '待跟进', value: 1},
  133. {label: '已跟进', value: 2},
  134. ],
  135. optionField: 'type'
  136. }, // 2
  137. {
  138. label: '分配给我的客户',
  139. type: 3,
  140. component: 'DetailCustomerItem',
  141. fn: API.FollowCustomer,
  142. options: [
  143. {label: '待跟进', value: 1},
  144. {label: '已跟进', value: 2},
  145. ],
  146. optionField: 'type'
  147. }, // 3
  148. {
  149. label: '待进入公海的客户',
  150. type: 4,
  151. component: 'DetailCustomerItem',
  152. fn: API.PutInPoolRemind,
  153. options: [
  154. {label: '我的', value: 1},
  155. {label: '我下属的', value: 2}
  156. ],
  157. optionField: 'isSub'
  158. }, // 4
  159. {
  160. label: '即将到期的合同',
  161. type: 8,
  162. component: 'DetailContractItem',
  163. fn: API.EndContract,
  164. options: [
  165. {label: '即将到期', value: 1},
  166. {label: '已到期', value: 2}
  167. ],
  168. optionField: 'type'
  169. }, // 8
  170. {
  171. label: '待审核合同',
  172. type: 5,
  173. component: 'DetailContractItem',
  174. fn: API.CheckContract,
  175. options: [
  176. {label: '待审核', value: 1},
  177. {label: '已审核', value: 2}
  178. ],
  179. optionField: 'type'
  180. }, // 5
  181. {
  182. label: '待审核回款',
  183. type: 6,
  184. component: 'DetailReceivablesItem',
  185. fn: API.CheckReceivables,
  186. options: [
  187. {label: '待审核', value: 1},
  188. {label: '已审核', value: 2}
  189. ],
  190. optionField: 'type'
  191. }, // 6
  192. {
  193. label: '待回款提醒',
  194. type: 7,
  195. component: 'DetailAwaitReceivablesItem',
  196. fn: API.RemindReceivablesPlan,
  197. options: [
  198. {label: '待回款', value: 1},
  199. {label: '已回款', value: 2},
  200. {label: '已逾期', value: 3}
  201. ],
  202. optionField: 'type'
  203. }, // 7
  204. {
  205. label: '待审核的办公',
  206. type: 100,
  207. component: 'DetailExaminationItem',
  208. fn: WaitingQueryOaExamineList,
  209. options: [
  210. {label: '待审核', value: 1},
  211. {label: '已审核', value: 2}
  212. ],
  213. optionField: 'status'
  214. }, // 100
  215. {
  216. label: '今日需联系线索',
  217. type: 11,
  218. component: 'DetailLeadsItem',
  219. fn: API.TodayLeads,
  220. options: [
  221. {label: '今日需联系', value: 1},
  222. {label: '已逾期', value: 2},
  223. {label: '已联系', value: 3}
  224. ],
  225. optionField: 'type'
  226. }, // 11
  227. {
  228. label: '今日需联系商机',
  229. type: 12,
  230. component: 'DetailBusinessItem',
  231. fn: API.TodayBusiness,
  232. options: [
  233. {label: '今日需联系', value: 1},
  234. {label: '已逾期', value: 2},
  235. {label: '已联系', value: 3}
  236. ],
  237. optionField: 'type'
  238. }, // 12
  239. ],
  240. }
  241. },
  242. computed: {
  243. openSlider() {
  244. if (!this.typeObj) return false
  245. return [2, 3].includes(this.typeObj.type) && this.filterData.type === 1
  246. },
  247. commandList() {
  248. if (!this.typeObj) return []
  249. if (this.typeObj.type === 100) return []
  250. return [{
  251. label: '全部已处理',
  252. imgIcon: 'dealStatus',
  253. value: 'readAll'
  254. }]
  255. }
  256. },
  257. onLoad(options) {
  258. this.routerQuery = options
  259. },
  260. onShow() {
  261. this.$nextTick(() => {
  262. this.initCom()
  263. })
  264. },
  265. methods: {
  266. /**
  267. * 初始化数据
  268. */
  269. initCom() {
  270. this.listData = []
  271. let type = this.routerQuery.type || null
  272. let findRes = this.typeMap.find(item => item.type === Number(type))
  273. if (findRes) {
  274. this.title = findRes.label
  275. this.activeCom = findRes.component
  276. this.typeObj = findRes
  277. this.tabs = this.typeObj ? this.typeObj.options : []
  278. this.activeTab = this.tabs.length > 0 ? this.tabs[0].value : -1
  279. this.filterData = {
  280. isSub: 1,
  281. type: 1,
  282. status: 1
  283. }
  284. this.getList(true)
  285. }
  286. },
  287. getList(refresh = false) {
  288. if (this.loading) return;
  289. this.loading = true
  290. if (!this.typeObj.fn || typeof this.typeObj.fn !== 'function') return
  291. if (refresh) {
  292. this.listParams.page = 0
  293. }
  294. this.listParams.page++
  295. let params = {}
  296. if (this.typeObj.type === 100) {
  297. // 如果是办公审批
  298. params = {
  299. ...this.listParams,
  300. status: this.filterData.status
  301. }
  302. } else {
  303. params = {
  304. ...this.listParams,
  305. ...this.filterData
  306. }
  307. delete params.status
  308. }
  309. this.listStatus = 'loading'
  310. this.typeObj.fn(params).then(res => {
  311. this.loading = false
  312. if (this.listParams.page === 1) {
  313. this.listData = []
  314. }
  315. this.listData = this.listData.concat(res.list)
  316. if (res.hasOwnProperty('lastPage')) {
  317. this.listStatus = res.lastPage ? 'noMore' : 'more'
  318. } else {
  319. this.listStatus = res.list.length === 0 ? 'noMore' : 'more'
  320. }
  321. }).catch(() => {
  322. this.listStatus = 'more'
  323. this.loading = false
  324. })
  325. },
  326. handleRefresh() {
  327. this.getList(true)
  328. },
  329. /**
  330. * 切换tab
  331. * @param {Number} val
  332. */
  333. handleToggleTabs(val) {
  334. console.log('vvvv', val)
  335. let field = this.typeObj.optionField || 'type'
  336. if (this.filterData[field] === val) return
  337. this.filterData[field] = val
  338. this.activeTab = val
  339. // sessionStorage.setItem(`backlog_${this.typeObj.type}`, JSON.stringify(this.filterData))
  340. this.getList(true)
  341. },
  342. handleCommand(command) {
  343. console.log('command: ', command)
  344. if (command.value === 'readAll') {
  345. this.handleReadAll()
  346. }
  347. },
  348. handleReadAll() {
  349. API.CrmBacklogAllDeal({
  350. model: this.typeObj.type
  351. }).then(res => {
  352. this.$toast('操作成功')
  353. this.initCom()
  354. }).catch(() => {})
  355. }
  356. }
  357. }
  358. </script>
  359. <style scoped lang="scss">
  360. .list-wrapper {
  361. width: 100%;
  362. height: 100%;
  363. display: flex;
  364. flex-direction: column;
  365. overflow: hidden;
  366. .wk-tabs {
  367. background-color: white;
  368. margin-bottom: 20rpx;
  369. .wk-tab-item {
  370. width: 30%;
  371. }
  372. }
  373. .list-scroll {
  374. flex: 1;
  375. overflow: hidden;
  376. }
  377. }
  378. .read-all {
  379. font-size: $wk-font-base;
  380. margin-right: 20rpx;
  381. }
  382. </style>