work.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. <template>
  2. <view class="kd-work-container">
  3. <uni-nav-bar
  4. fixed="true"
  5. statusBar="true"
  6. left-icon="back"
  7. title="我的工单"
  8. @clickLeft="back"
  9. ></uni-nav-bar>
  10. <view class="top-wrapper">
  11. <view class="top-tabs">
  12. <u-tabs
  13. :list="tabList"
  14. @change="handleTabChange"
  15. lineWidth="0"
  16. :activeStyle="{
  17. color: '#157a2c',
  18. fontWeight: 'bold'
  19. }"
  20. ></u-tabs>
  21. </view>
  22. <image
  23. src="~@/static/moreSearch.svg"
  24. mode=""
  25. @click="moreSearch = !moreSearch"
  26. ></image>
  27. <view class="slide-search">
  28. <view class="more-search" v-show="moreSearch">
  29. <view class="cell">
  30. <view class="label">编号</view>
  31. <input
  32. type="text"
  33. placeholder="请输入"
  34. v-model="searchFrom.workOrderCode"
  35. />
  36. </view>
  37. <view class="cell">
  38. <view class="label">状态</view>
  39. <uni-data-select
  40. :key="activeType"
  41. :localdata="statusRange[activeType]"
  42. v-model="searchFrom.status"
  43. ></uni-data-select>
  44. </view>
  45. <view class="cell" v-if="activeType == 'repair'">
  46. <view class="label">紧急程度</view>
  47. <uni-data-select
  48. :localdata="doneRange"
  49. @change="doneChange"
  50. v-model="searchFrom.urgent"
  51. :clear="false"
  52. ></uni-data-select>
  53. </view>
  54. <view class="btn-search">
  55. <button @click="reset">重置</button>
  56. <button class="primary" @click="doSearch">搜索</button>
  57. </view>
  58. </view>
  59. </view>
  60. </view>
  61. <view class="work-list">
  62. <u-list
  63. @scrolltolower="scrolltolower"
  64. :key="activeType"
  65. :preLoadScreen="page * 10"
  66. >
  67. <u-list-item v-for="(item, index) in dataList" :key="index">
  68. <CardTime :time="item.createTime" />
  69. <KdCard
  70. :title="item.workOrderCode"
  71. @handleDetail="handleDetail"
  72. :status="true"
  73. :item="item"
  74. :type="activeType"
  75. />
  76. </u-list-item>
  77. <u-list-item v-if="dataList.length === 0">
  78. <view class="nodata"> 暂无数据 </view>
  79. </u-list-item>
  80. </u-list>
  81. </view>
  82. </view>
  83. </template>
  84. <script>
  85. import KdCard from '../components/KdCard/index.vue'
  86. import CardTime from '../components/CardTime.vue'
  87. import { postJ } from '@/utils/api'
  88. let [isEnd] = [false]
  89. export default {
  90. components: {
  91. KdCard,
  92. CardTime
  93. },
  94. data () {
  95. return {
  96. doneRange: [
  97. {
  98. value: 1,
  99. text: '普通'
  100. },
  101. {
  102. value: 2,
  103. text: '紧急'
  104. },
  105. {
  106. value: 3,
  107. text: '重要'
  108. }
  109. ],
  110. tabList: [
  111. {
  112. name: '维修工单',
  113. type: 'repair',
  114. workOrderType: 3,
  115. url: `/pages/maintain_service/detail/detail?`,
  116. badge: {
  117. value: 0
  118. }
  119. },
  120. {
  121. name: '计划维修工单',
  122. type: 'repair',
  123. workOrderType: 10,
  124. url: `/pages/maintain_service/detail/detail?`,
  125. badge: {
  126. value: 0
  127. }
  128. },
  129. {
  130. name: '保养工单',
  131. type: 'maintenance',
  132. workOrderType: 2,
  133. url: `/pages/maintenance/detail/detail?`,
  134. badge: {
  135. value: 0
  136. }
  137. },
  138. {
  139. name: '巡点检工单',
  140. type: 'patrol',
  141. workOrderType: 1,
  142. url: `/pages/tour_tally/detail/detail?`,
  143. badge: {
  144. value: 0
  145. }
  146. },
  147. {
  148. name: '盘点工单',
  149. type: 'check',
  150. workOrderType: 4,
  151. url: `/pages/warehouse/workOrder/inventory/inventory?`,
  152. badge: {
  153. value: 0
  154. }
  155. }
  156. ],
  157. activeType: 'repair',
  158. activeIndex: 0,
  159. dataList: [],
  160. moreSearch: false,
  161. statusRange: {
  162. repair: [
  163. // {
  164. // value: 0,
  165. // text: '待接收'
  166. // },
  167. // {
  168. // value: 2,
  169. // text: '待审核'
  170. // },
  171. // {
  172. // value: 4,
  173. // text: '已撤回'
  174. // },
  175. // {
  176. // value: 6,
  177. // text: '已驳回'
  178. // },
  179. {
  180. value: 8,
  181. text: '已派单'
  182. },
  183. {
  184. value: 1,
  185. text: '执行中'
  186. },
  187. {
  188. value: 5,
  189. text: '待验收'
  190. },
  191. {
  192. value: 3,
  193. text: '已完成'
  194. },
  195. {
  196. value: 7,
  197. text: '未修复'
  198. }
  199. ],
  200. maintenance: [
  201. {
  202. value: 0,
  203. text: '待接收'
  204. },
  205. {
  206. value: 1,
  207. text: '执行中'
  208. },
  209. {
  210. value: 3,
  211. text: '完成'
  212. }
  213. ],
  214. patrol: [
  215. {
  216. value: 0,
  217. text: '待接收'
  218. },
  219. {
  220. value: 1,
  221. text: '执行中'
  222. },
  223. {
  224. value: 3,
  225. text: '完成'
  226. }
  227. ],
  228. check: [
  229. {
  230. value: 0,
  231. text: '待接收'
  232. },
  233. {
  234. value: 1,
  235. text: '执行中'
  236. },
  237. {
  238. value: 2,
  239. text: '待审核'
  240. },
  241. {
  242. value: 3,
  243. text: '完成'
  244. },
  245. {
  246. value: 4,
  247. text: '已撤回'
  248. },
  249. {
  250. value: 5,
  251. text: '待验收'
  252. },
  253. {
  254. value: 6,
  255. text: '已驳回'
  256. },
  257. {
  258. value: 7,
  259. text: '未修复'
  260. },
  261. {
  262. value: 8,
  263. text: '已派单'
  264. }
  265. ]
  266. },
  267. searchFrom: {
  268. workOrderCode: '',
  269. status: ''
  270. },
  271. page: 1
  272. }
  273. },
  274. onShow () {
  275. this.getList()
  276. this.getCount()
  277. },
  278. methods: {
  279. // 紧急度选择
  280. doneChange (id) {},
  281. doSearch () {
  282. this.page = 1
  283. this.getList()
  284. this.moreSearch = false
  285. },
  286. reset () {
  287. this.searchFrom = {
  288. workOrderCode: '',
  289. status: ''
  290. }
  291. this.doSearch()
  292. },
  293. statusChange (value) {
  294. this.searchFrom.status = value
  295. },
  296. handleDetail (item) {
  297. let url = this.tabList[this.activeIndex]?.url
  298. if (!url) return
  299. url += `id=${item.id}&workOrderCode=${item.workOrderCode}&BizType=${item.bizType}`
  300. uni.navigateTo({
  301. url
  302. })
  303. console.log(item)
  304. },
  305. scrolltolower () {
  306. if (isEnd) return
  307. this.page++
  308. this.getList()
  309. },
  310. handleTabChange (item) {
  311. this.activeType = item.type
  312. this.activeIndex = item.index
  313. this.page = 1
  314. this.reset()
  315. this.moreSearch = false
  316. },
  317. getCount () {
  318. Promise.all(
  319. this.tabList.map(item =>
  320. this._getMyWorkOrderList(
  321. {
  322. workOrderType: item.workOrderType
  323. },
  324. false
  325. )
  326. )
  327. ).then(res => {
  328. res.forEach((itm, index) => {
  329. if (itm?.success) {
  330. this.tabList[index].badge.value = itm.data.count
  331. }
  332. })
  333. })
  334. },
  335. getList () {
  336. const params = {
  337. workOrderType: this.tabList[this.activeIndex].workOrderType,
  338. page: this.page,
  339. size: 8,
  340. ...this.searchFrom
  341. }
  342. isEnd = false
  343. this._getMyWorkOrderList(params).then(res => {
  344. if (
  345. res?.success &&
  346. params.workOrderType === this.tabList[this.activeIndex].workOrderType
  347. ) {
  348. if (params.page === 1) {
  349. this.dataList = []
  350. }
  351. this.dataList.push(...res.data.list.records)
  352. isEnd = this.dataList.length >= res.data.list.total
  353. }
  354. })
  355. },
  356. //(1:巡点检;2:保养;3:维修;4:盘点)
  357. _getMyWorkOrderList (params, loading = true) {
  358. let str = ''
  359. for (let key in params) {
  360. str += '&' + key + '=' + params[key]
  361. }
  362. return postJ(
  363. this.apiUrl + `/workOrder/getMyWorkOrderList?${str.substr(1)}`,
  364. {},
  365. loading
  366. )
  367. }
  368. }
  369. }
  370. </script>
  371. <style lang="scss" scoped>
  372. .kd-work-container {
  373. height: 100vh;
  374. overflow: hidden;
  375. display: flex;
  376. flex-direction: column;
  377. .work-list {
  378. flex: 1;
  379. overflow: hidden;
  380. padding: 16rpx 24rpx;
  381. background-color: $page-bg;
  382. .u-list {
  383. height: 100% !important;
  384. }
  385. }
  386. .nodata {
  387. font-size: 40rpx;
  388. text-align: center;
  389. padding-top: 30rpx;
  390. }
  391. }
  392. .top-wrapper {
  393. display: flex;
  394. align-items: center;
  395. background-color: #fff;
  396. position: relative;
  397. .slide-search {
  398. position: absolute;
  399. top: 100%;
  400. left: 0;
  401. right: 0;
  402. z-index: 10;
  403. background-color: #fff;
  404. .timerange {
  405. width: 90%;
  406. margin: 0 auto 10rpx;
  407. }
  408. .select-box {
  409. display: flex;
  410. padding: 0 10rpx;
  411. .uni-stat__select + .uni-stat__select {
  412. margin-left: 10rpx;
  413. }
  414. }
  415. .more-search {
  416. padding-bottom: 20rpx;
  417. .cell {
  418. display: flex;
  419. align-items: center;
  420. padding-right: 20rpx;
  421. & + .cell {
  422. margin-top: 10rpx;
  423. }
  424. /deep/uni-input {
  425. flex: 1;
  426. height: 70rpx;
  427. border: 1rpx solid #e5e5e5;
  428. border-radius: 8rpx;
  429. font-size: 28rpx;
  430. padding-left: 20rpx;
  431. box-sizing: border-box;
  432. }
  433. .label {
  434. width: 180rpx;
  435. text-align: right;
  436. padding-right: 20rpx;
  437. }
  438. }
  439. /deep/.uni-date__x-input {
  440. height: 70rpx !important;
  441. }
  442. .btn-search {
  443. text-align: right;
  444. padding: 10rpx 10rpx 0;
  445. button {
  446. display: inline-block;
  447. width: 200rpx;
  448. height: 60rpx;
  449. line-height: 58rpx;
  450. font-size: 28rpx;
  451. margin-left: 20rpx;
  452. &.primary {
  453. background-color: $j-primary-border-green;
  454. color: #fff;
  455. }
  456. }
  457. }
  458. }
  459. }
  460. .top-tabs {
  461. flex: 1;
  462. }
  463. /deep/.u-input {
  464. border: 1rpx solid #ccc;
  465. .u-input__content__field-wrapper__field {
  466. height: 40rpx !important;
  467. }
  468. }
  469. image {
  470. width: 52rpx;
  471. height: 52rpx;
  472. margin-left: 10rpx;
  473. }
  474. }
  475. </style>