myTicket.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. <template>
  2. <view class="kd-work-container">
  3. <uni-nav-bar fixed="true" statusBar="true" left-icon="back" :title="orderType == 1 ? '工单待办' : '工单已办'" right-icon="scan" @clickLeft="back" @clickRight="HandlScanCode">
  4. <view slot="right">
  5. <u-icon
  6. name="scan"
  7. color="#fff"
  8. size="60"
  9. :custom-style="{
  10. backgroundColor: '#157A2C'
  11. }"></u-icon>
  12. </view>
  13. </uni-nav-bar>
  14. <view class="top-wrapper">
  15. <view class="top-tabs">
  16. <u-tabs
  17. :list="tabList"
  18. :current="tabsCurrent"
  19. @change="handleTabChange"
  20. lineWidth="0"
  21. :activeStyle="{
  22. color: '#157a2c',
  23. fontWeight: 'bold'
  24. }"></u-tabs>
  25. </view>
  26. <image src="~@/static/moreSearch.svg" mode="" @click="moreSearch = !moreSearch"></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 type="text" placeholder="请输入" v-model="searchFrom.code" />
  32. </view>
  33. <view v-if="orderType == 1" class="cell">
  34. <view class="label">状态</view>
  35. <!-- <uni-data-select :key="activeType" :localdata="statusRange[activeType]" v-model="searchFrom.orderStatus"></uni-data-select> -->
  36. <u-checkbox-group v-model="searchFrom.orderStatus" placement="row" size="30" @change="statusChange">
  37. <u-checkbox
  38. v-for="(item, index) in statusRange[activeType]"
  39. :customStyle="{ marginRight: '8px' }"
  40. :label="item.text"
  41. :name="item.value"
  42. labelSize="30"
  43. iconSize="30"
  44. activeColor="#157A2C"></u-checkbox>
  45. </u-checkbox-group>
  46. </view>
  47. <!-- <view class="cell">
  48. <view class="label">紧急程度</view>
  49. <uni-data-select :localdata="doneRange" @change="doneChange" v-model="searchFrom.urgent" :clear="false"></uni-data-select>
  50. </view> -->
  51. <view class="btn-search">
  52. <button @click="reset">重置</button>
  53. <button class="primary" @click="doSearch">搜索</button>
  54. </view>
  55. </view>
  56. </view>
  57. </view>
  58. <view class="work-list">
  59. <u-list @scrolltolower="scrolltolower" :key="activeType" :preLoadScreen="page * 10">
  60. <u-list-item v-for="(item, index) in dataList" :key="index">
  61. <CardTime :time="item.createTime" />
  62. <KdCard :orderTitle="orderTitle" :title="item.code" @handleDetail="handleDetail" :status="true" :item="item" :type="activeType" />
  63. </u-list-item>
  64. <u-list-item v-if="dataList.length === 0">
  65. <view class="nodata">暂无数据</view>
  66. </u-list-item>
  67. </u-list>
  68. </view>
  69. </view>
  70. </template>
  71. <script>
  72. import { getWorkOrderList, statistics } from '@/api/myTicket'
  73. import KdCard from '../components/KdCard/index.vue'
  74. import CardTime from '../components/CardTime.vue'
  75. import { getByFixCode } from '@/api/repair'
  76. import { nextTick } from 'vue'
  77. // import { postJ } from '@/utils/api'
  78. let [isEnd] = [false]
  79. export default {
  80. components: {
  81. KdCard,
  82. CardTime
  83. },
  84. data() {
  85. return {
  86. orderTitle: '',
  87. tabsCurrent: 0, // tabs初始位置
  88. doneRange: [
  89. {
  90. value: 1,
  91. text: '普通'
  92. },
  93. {
  94. value: 2,
  95. text: '紧急'
  96. },
  97. {
  98. value: 3,
  99. text: '重要'
  100. }
  101. ],
  102. tabList: [
  103. // {
  104. // name: '计划维修工单',
  105. // type: 'repair',
  106. // workOrderType: 4,
  107. // url: `/pages/maintain_service/detail/detail?`,
  108. // badge: {
  109. // value: 0
  110. // }
  111. // },
  112. {
  113. name: '保养工单',
  114. type: 'maintenance',
  115. workOrderType: 2,
  116. index: 0,
  117. url: `/pages/maintenance/detail/detail?`,
  118. badge: {
  119. value: 0
  120. }
  121. },
  122. {
  123. name: '巡点检工单',
  124. type: 'patrol',
  125. workOrderType: 1,
  126. index: 1,
  127. url: `/pages/tour_tally/detail/detail?`,
  128. badge: {
  129. value: 0
  130. }
  131. },
  132. // {
  133. // name: '量具送检工单',
  134. // type: 'quantity',
  135. // workOrderType: 5,
  136. // index: 2,
  137. // url: `/pages/quantity/detail/detail?`,
  138. // badge: {
  139. // value: 0
  140. // }
  141. // },
  142. {
  143. name: '维修工单',
  144. type: 'repair',
  145. workOrderType: 3,
  146. index: 2,
  147. // url: `/pages/maintain_service/detail/detail?`,
  148. url: `/pages/maintenanceWorkorder/detail/detail?`,
  149. badge: {
  150. value: 0
  151. }
  152. }
  153. ],
  154. activeType: 'maintenance',
  155. activeIndex: 0,
  156. dataList: [],
  157. moreSearch: false,
  158. statusRange: {
  159. repair: [
  160. {
  161. value: 0,
  162. text: '待接收'
  163. },
  164. {
  165. value: 2,
  166. text: '执行中'
  167. }
  168. // {
  169. // value: 0,
  170. // text: '待接收'
  171. // },
  172. // {
  173. // value: 2,
  174. // text: '待审核'
  175. // },
  176. // {
  177. // value: 4,
  178. // text: '已撤回'
  179. // },
  180. // {
  181. // value: 6,
  182. // text: '已驳回'
  183. // },
  184. // {
  185. // value: 8,
  186. // text: '已派单'
  187. // },
  188. // {
  189. // value: 1,
  190. // text: '执行中'
  191. // },
  192. // {
  193. // value: 5,
  194. // text: '待验收'
  195. // },
  196. // {
  197. // value: 3,
  198. // text: '已完成'
  199. // },
  200. // {
  201. // value: 7,
  202. // text: '未修复'
  203. // }
  204. ],
  205. maintenance: [
  206. {
  207. value: 0,
  208. text: '待接收'
  209. },
  210. {
  211. value: 2,
  212. text: '执行中'
  213. }
  214. // {
  215. // value: 3,
  216. // text: '完成'
  217. // }
  218. ],
  219. patrol: [
  220. {
  221. value: 0,
  222. text: '待接收'
  223. },
  224. {
  225. value: 2,
  226. text: '执行中'
  227. }
  228. // {
  229. // value: 3,
  230. // text: '完成'
  231. // }
  232. ],
  233. quantity: [
  234. {
  235. value: 0,
  236. text: '待接收'
  237. },
  238. {
  239. value: 2,
  240. text: '执行中'
  241. },
  242. {
  243. value: 3,
  244. text: '完成'
  245. }
  246. ],
  247. check: [
  248. {
  249. value: 0,
  250. text: '待接收'
  251. },
  252. {
  253. value: 1,
  254. text: '执行中'
  255. },
  256. {
  257. value: 2,
  258. text: '待审核'
  259. },
  260. {
  261. value: 3,
  262. text: '完成'
  263. },
  264. {
  265. value: 4,
  266. text: '已撤回'
  267. },
  268. {
  269. value: 5,
  270. text: '待验收'
  271. },
  272. {
  273. value: 6,
  274. text: '已驳回'
  275. },
  276. {
  277. value: 7,
  278. text: '未修复'
  279. },
  280. {
  281. value: 8,
  282. text: '已派单'
  283. }
  284. ]
  285. },
  286. searchFrom: {
  287. code: '',
  288. orderStatus: []
  289. },
  290. page: 1,
  291. isInstall: true, // 是否首次进入页面
  292. orderType: 1
  293. }
  294. },
  295. onLoad(e) {
  296. this.$nextTick(() => {
  297. console.log(this)
  298. this.isInstall = false
  299. this.orderType = e.orderType // 1待办 2完成
  300. this.tabsCurrent = Number(e.index) ? Number(e.index) : 0
  301. this.$nextTick(async () => {
  302. if (this.orderType == 1) {
  303. await this.getCount()
  304. }
  305. this.handleTabChange(this.tabList[this.tabsCurrent])
  306. // console.log(this.tabList[this.tabsCurrent],5656)
  307. })
  308. })
  309. },
  310. onShow(e) {
  311. if (this.isInstall) return
  312. this.getList()
  313. this.getCount()
  314. },
  315. methods: {
  316. // 相机扫码
  317. HandlScanCode() {
  318. uni.scanCode({
  319. success: res => {
  320. console.log('res------------------------')
  321. console.log(res.result)
  322. let obj = {}
  323. if (res.result.includes('/')) {
  324. let dataArray = res.result.split('/')
  325. obj = {
  326. fixCode: dataArray[0],
  327. code: ''
  328. }
  329. } else {
  330. obj = {
  331. fixCode: '',
  332. code: res.result
  333. }
  334. }
  335. getByFixCode(obj).then(res => {
  336. uni.navigateTo({
  337. url: `/pages/home/myTicket/detail?deviceId=${res.id}&type=${this.tabList[this.activeIndex].workOrderType}`
  338. })
  339. })
  340. }
  341. })
  342. },
  343. // 紧急度选择
  344. doneChange(id) {},
  345. doSearch() {
  346. this.page = 1
  347. this.getList()
  348. this.moreSearch = false
  349. },
  350. reset() {
  351. this.searchFrom = {
  352. code: '',
  353. orderStatus: []
  354. }
  355. if (this.orderType == 1) {
  356. // 待办 执行中
  357. this.searchFrom.orderStatus = [0, 2, 3]
  358. } else {
  359. // 已完成
  360. this.searchFrom.orderStatus = [4]
  361. }
  362. this.doSearch()
  363. },
  364. statusChange(value) {
  365. console.log(value)
  366. this.searchFrom.orderStatus = value
  367. },
  368. handleDetail(item) {
  369. let url = this.tabList[this.activeIndex]?.url
  370. if (!url) return
  371. // url += `id=${item.id}&workOrderCode=${item.workOrderCode}&BizType=${item.bizType}`
  372. url += `id=${item.id}&planId=${item.planId}&code=${item.code}&&orderType=${this.orderType}`
  373. console.log(url)
  374. uni.navigateTo({
  375. url
  376. })
  377. },
  378. scrolltolower() {
  379. if (isEnd) return
  380. this.page++
  381. this.getList()
  382. },
  383. handleTabChange(item) {
  384. console.log(item)
  385. this.activeType = item.type
  386. this.activeIndex = item.index
  387. this.page = 1
  388. this.reset()
  389. this.moreSearch = false
  390. },
  391. getCount() {
  392. statistics().then(data => {
  393. console.log('onsole.log(data)-----------')
  394. console.log(data)
  395. this.tabList = this.tabList.map(item => {
  396. switch (item.type) {
  397. case 'maintenance':
  398. return { ...item, badge: { value: data.maintenanceNum } }
  399. case 'patrol':
  400. return { ...item, badge: { value: data.patrolInspection } }
  401. case 'quantity':
  402. return { ...item, badge: { value: data.quantityNum } }
  403. case 'repair':
  404. return { ...item, badge: { value: data.repairsNum } }
  405. }
  406. })
  407. })
  408. // Promise.all(
  409. // this.tabList.map(item =>
  410. // getWorkOrderList(
  411. // {
  412. // type: item.workOrderType
  413. // },
  414. // false
  415. // )
  416. // )
  417. // ).then(res => {
  418. // res.forEach((item, index) => {
  419. // console.log(item)
  420. // // if (item?.success) {
  421. // // this.tabList[index].badge.value = item.data.count
  422. // // }
  423. // })
  424. // })
  425. },
  426. getList() {
  427. uni.showLoading({
  428. title: '加载中'
  429. })
  430. console.log('this.searchFrom-----------------')
  431. console.log(this.searchFrom)
  432. const params = {
  433. type: this.tabList[this.activeIndex].workOrderType,
  434. pageNum: this.page,
  435. size: 8,
  436. ...this.searchFrom
  437. }
  438. // 维修
  439. if (this.tabList[this.activeIndex].workOrderType == 3) {
  440. let userInfo = uni.getStorageSync('userInfo')
  441. params.executeUserId = userInfo.userId
  442. if (this.orderType == 1) {
  443. if (!params.orderStatus.includes(3)) {
  444. params.orderStatus.push(3)
  445. }
  446. }
  447. } else {
  448. if (this.orderType == 1) {
  449. if (params.orderStatus.includes(3)) {
  450. let index = params.orderStatus.indexOf(3)
  451. params.orderStatus.splice(index, 1)
  452. }
  453. } else {
  454. params.orderStatus = [3]
  455. }
  456. }
  457. isEnd = false
  458. getWorkOrderList(params)
  459. .then(res => {
  460. if (res.list?.length > 0 && params.type === this.tabList[this.activeIndex].workOrderType) {
  461. // if (params.page === 1) {
  462. // this.dataList = []
  463. // }
  464. // this.dataList.push(...res.data.list.records)
  465. this.dataList = res.list
  466. isEnd = this.dataList.length >= res.count
  467. } else {
  468. this.dataList = []
  469. }
  470. console.log(this.dataList)
  471. uni.hideLoading()
  472. })
  473. .catch(() => {
  474. uni.hideLoading()
  475. })
  476. }
  477. //(1:巡点检;2:保养;3:维修;4:盘点)
  478. // _getMyWorkOrderList(params, loading = true) {
  479. // let str = ''
  480. // for (let key in params) {
  481. // str += '&' + key + '=' + params[key]
  482. // }
  483. // return postJ(this.apiUrl + `/eam/PdaWorkOrder/list?${str.substr(1)}`, {}, loading)
  484. // }
  485. }
  486. }
  487. </script>
  488. <style lang="scss" scoped>
  489. scroll-view ::v-deep ::-webkit-scrollbar {
  490. width: 0;
  491. height: 0;
  492. color: transparent;
  493. }
  494. .kd-work-container {
  495. height: 100vh;
  496. overflow: hidden;
  497. display: flex;
  498. flex-direction: column;
  499. .work-list {
  500. flex: 1;
  501. overflow: hidden;
  502. padding: 16rpx 24rpx;
  503. background-color: $page-bg;
  504. .u-list {
  505. height: 100% !important;
  506. }
  507. }
  508. .nodata {
  509. font-size: 40rpx;
  510. text-align: center;
  511. padding-top: 30rpx;
  512. }
  513. }
  514. .top-wrapper {
  515. display: flex;
  516. align-items: center;
  517. background-color: #fff;
  518. position: relative;
  519. .slide-search {
  520. position: absolute;
  521. top: 100%;
  522. left: 0;
  523. right: 0;
  524. z-index: 10;
  525. background-color: #fff;
  526. .timerange {
  527. width: 90%;
  528. margin: 0 auto 10rpx;
  529. }
  530. .select-box {
  531. display: flex;
  532. padding: 0 10rpx;
  533. .uni-stat__select + .uni-stat__select {
  534. margin-left: 10rpx;
  535. }
  536. }
  537. .more-search {
  538. padding-bottom: 20rpx;
  539. .cell {
  540. display: flex;
  541. align-items: center;
  542. padding-right: 20rpx;
  543. & + .cell {
  544. margin-top: 10rpx;
  545. }
  546. /deep/uni-input {
  547. flex: 1;
  548. height: 70rpx;
  549. border: 1rpx solid #e5e5e5;
  550. border-radius: 8rpx;
  551. font-size: 28rpx;
  552. padding-left: 20rpx;
  553. box-sizing: border-box;
  554. }
  555. .label {
  556. width: 180rpx;
  557. text-align: right;
  558. padding-right: 20rpx;
  559. }
  560. }
  561. /deep/.uni-date__x-input {
  562. height: 70rpx !important;
  563. }
  564. .btn-search {
  565. text-align: right;
  566. padding: 10rpx 10rpx 0;
  567. button {
  568. display: inline-block;
  569. width: 200rpx;
  570. height: 60rpx;
  571. line-height: 58rpx;
  572. font-size: 28rpx;
  573. margin-left: 20rpx;
  574. &.primary {
  575. background-color: $j-primary-border-green;
  576. color: #fff;
  577. }
  578. }
  579. }
  580. }
  581. }
  582. .top-tabs {
  583. flex: 1;
  584. }
  585. /deep/.u-input {
  586. border: 1rpx solid #ccc;
  587. .u-input__content__field-wrapper__field {
  588. height: 40rpx !important;
  589. }
  590. }
  591. image {
  592. width: 52rpx;
  593. height: 52rpx;
  594. margin-left: 10rpx;
  595. }
  596. }
  597. </style>