index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. <template>
  2. <view class="mainBox">
  3. <uni-nav-bar background-color="#157A2C" color="#fff" fixed="true" statusBar="true" left-icon="back" title="售后工单"
  4. @clickLeft="back">
  5. </uni-nav-bar>
  6. <view class="top-wrapper">
  7. <uni-section>
  8. <uni-easyinput @clear="clearSearch" prefixIcon="search" style="width: 460rpx" v-model="searchVal"
  9. placeholder="名称">
  10. </uni-easyinput>
  11. </uni-section>
  12. <button class="search_btn" @click="doSearch">搜索</button>
  13. <image class="menu_icon" src="~@/static/pda/menu.svg" @click="showSearch"></image>
  14. </view>
  15. <view class="">
  16. <view class="tab_box rx-sc">
  17. <view class="tab_item" v-for="(item,index) in tabList" :key="index"
  18. :class="{active: pickTabIndex == item.value}">
  19. <view @click="changeChartsTab(item.value)">
  20. {{item.label}}
  21. </view>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="wrapper">
  26. <u-list @scrolltolower="scrolltolower" class="listContent" style="height: auto;">
  27. <view v-for="(item, index) in tableList" :key="index" style="position: relative;">
  28. <myCard @addSpareItems="addSpareItems(item.id)" @report="edit('report',item.id)"
  29. @edit="edit('edit',item.id)" @details="edit('view',item.id)" @handleAudit="handleAudit(item)"
  30. @checkAndAccept="checkAndAccept(item)" @evaluate="evaluate(item)" :item="item" :index="index+1"
  31. @receive="receive(item)" :columns="columns" :btnList="btnList">
  32. </myCard>
  33. <u-empty v-show="emptyShow && tableList.length==0" width="300" height="300" textSize="30"></u-empty>
  34. </view>
  35. </u-list>
  36. </view>
  37. <CheckAndAccept ref="acceptRef" @getList='doSearch' />
  38. <Evaluate ref="evaluateRef" @getList='doSearch' />
  39. <u-toast ref="uToast"></u-toast>
  40. <MySearch :show.sync="searchShow" :formItems="formItems" @search="confirmSearch">
  41. </MySearch>
  42. </view>
  43. </template>
  44. <script>
  45. import {
  46. getSalesWorkOrder,
  47. receiveSalesWorkOrder
  48. } from '@/api/salesServiceManagement/workOrder/index.js'
  49. import myCard from '@/pages/saleManage/components/myCard.vue'
  50. import CheckAndAccept from './components/forWork/checkAndAccept.vue'
  51. import Evaluate from './components/forWork/evaluate.vue'
  52. export default {
  53. components: {
  54. myCard,
  55. CheckAndAccept,
  56. Evaluate
  57. },
  58. data() {
  59. return {
  60. searchForm: {},
  61. emptyShow: false,
  62. searchShow: false,
  63. formItems: [{
  64. label: '工单编号:',
  65. prop: 'code',
  66. component: 'MyInput',
  67. props: {
  68. placeholder: '请输入内容',
  69. }
  70. },
  71. {
  72. label: '客户名称:',
  73. prop: 'contactName',
  74. component: 'MyInput',
  75. props: {
  76. placeholder: '请输入内容',
  77. }
  78. },
  79. {
  80. label: '设备名称:',
  81. prop: 'deviceName',
  82. component: 'MyInput',
  83. props: {
  84. placeholder: '请输入内容',
  85. }
  86. },
  87. // {
  88. // label: '故障等级:',
  89. // prop: 'faultLevel',
  90. // component: 'MyInput',
  91. // props: {
  92. // placeholder: '请选择',
  93. // events:{
  94. // focus:(e)=>{
  95. // console.log('123');
  96. // console.log(e);
  97. // }
  98. // }
  99. // }
  100. // },
  101. {
  102. label: '计划单号:',
  103. prop: 'planCode',
  104. component: 'MyInput',
  105. props: {
  106. placeholder: '请输入内容',
  107. }
  108. },
  109. {
  110. label: '计划名称:',
  111. prop: 'planName',
  112. component: 'MyInput',
  113. props: {
  114. placeholder: '请输入内容',
  115. }
  116. },
  117. {
  118. label: '报工人:',
  119. prop: 'executeUserName',
  120. component: 'MyInput',
  121. props: {
  122. placeholder: '请输入内容',
  123. }
  124. },
  125. {
  126. label: '验收人:',
  127. prop: 'accepterUserName',
  128. component: 'MyInput',
  129. props: {
  130. placeholder: '请输入内容',
  131. }
  132. },
  133. ],
  134. tabList: [{
  135. value: 'all',
  136. label: '全部',
  137. },
  138. {
  139. value: '0',
  140. label: '待执行',
  141. },
  142. {
  143. value: '1',
  144. label: '执行中',
  145. },
  146. {
  147. value: '3',
  148. label: '待验收',
  149. },
  150. {
  151. value: '5',
  152. label: '已完成',
  153. },
  154. ],
  155. workOrderStatus: [
  156. // { code: 0, label: '待接收' },
  157. {
  158. code: 0,
  159. label: '待执行'
  160. },
  161. {
  162. code: 1,
  163. label: '已接收'
  164. },
  165. {
  166. code: 2,
  167. label: '执行中'
  168. },
  169. {
  170. code: 3,
  171. label: '待验收'
  172. },
  173. {
  174. code: 4,
  175. label: '待评价'
  176. },
  177. {
  178. code: 5,
  179. label: '已完成'
  180. },
  181. {
  182. code: 6,
  183. label: '验收不通过'
  184. }
  185. ],
  186. pickTabIndex: 'all',
  187. searchVal: '',
  188. isEnd: false,
  189. page: 1,
  190. size: 10,
  191. tableList: [],
  192. columns: [
  193. [{
  194. label: '工单编号:',
  195. prop: 'code',
  196. type: 'title',
  197. className: 'perce100',
  198. }],
  199. [{
  200. label: '计划单号:',
  201. prop: 'planCode'
  202. }],
  203. [{
  204. label: '计划名称:',
  205. prop: 'planName',
  206. }],
  207. [{
  208. label: '报工人:',
  209. prop: 'executeUserName'
  210. }, {
  211. label: '验收人:',
  212. prop: 'accepterUserName',
  213. }],
  214. [{
  215. label: '故障等级:',
  216. prop: 'faultLevel'
  217. }, {
  218. label: '客户名称:',
  219. prop: 'contactName',
  220. }],
  221. [{
  222. label: '设备名称:',
  223. prop: 'categoryName',
  224. formatter: (row) => {
  225. if (!row.deviceDetails) return '';
  226. let str = '';
  227. row.deviceDetails.map((el, idx) => {
  228. if (idx + 1 == row.deviceDetails.length) {
  229. str += el.categoryName;
  230. } else {
  231. str = str + '' + el.categoryName + ',';
  232. }
  233. });
  234. return str;
  235. }
  236. }],
  237. [{
  238. label: '验收时间:',
  239. prop: 'accepterTime'
  240. }, {
  241. label: '开始时间:',
  242. prop: 'acceptTime',
  243. }],
  244. [{
  245. label: '结束时间:',
  246. prop: 'finishTime'
  247. }, {
  248. label: '计划完成时间:',
  249. prop: 'planFinishTime',
  250. }],
  251. [{
  252. label: '实际售后时长:',
  253. prop: 'inFactDuration',
  254. formatter: (row) => {
  255. if (row.inFactDuration || row.inFactDuration == 0) {
  256. let str = ((row.inFactDuration - 0) / 60).toFixed(1);
  257. return str + ' 小时';
  258. }
  259. }
  260. }, {
  261. label: '状态:',
  262. prop: 'orderStatus',
  263. formatter: (row) => {
  264. return this.workOrderStatus.find(
  265. (item) => item.code == row.orderStatus
  266. )?.label;
  267. }
  268. }],
  269. [{
  270. label: '操作:',
  271. prop: 'action',
  272. type: 'action',
  273. className: 'perce100',
  274. }],
  275. ],
  276. btnList: [{
  277. name: '详情',
  278. apiName: 'details',
  279. btnType: 'primary',
  280. type: '2',
  281. pageUrl: '',
  282. }, {
  283. name: '修改',
  284. apiName: 'edit',
  285. btnType: 'primary',
  286. type: '2',
  287. pageUrl: '',
  288. judge: [{
  289. authorities: '',
  290. }, {
  291. key: 'orderStatus',
  292. value: [1, 6],
  293. }],
  294. },
  295. {
  296. name: '报工',
  297. apiName: 'report',
  298. btnType: 'error ',
  299. type: '2',
  300. pageUrl: '',
  301. judge: [{
  302. authorities: '',
  303. }, {
  304. key: 'orderStatus',
  305. value: [1, 6],
  306. }],
  307. }, {
  308. name: '接收',
  309. apiName: 'receive',
  310. btnType: 'error ',
  311. type: '2',
  312. pageUrl: '',
  313. judge: [{
  314. authorities: '',
  315. }, {
  316. key: 'orderStatus',
  317. value: [0],
  318. }],
  319. }, {
  320. name: '转派',
  321. apiName: 'handleAudit',
  322. btnType: 'primary',
  323. type: '2',
  324. pageUrl: '',
  325. judge: [{
  326. authorities: '',
  327. }, {
  328. key: 'orderStatus',
  329. value: [0, 1],
  330. }],
  331. },
  332. {
  333. name: '验收',
  334. apiName: 'checkAndAccept',
  335. btnType: 'primary',
  336. type: '2',
  337. pageUrl: '',
  338. judge: [{
  339. authorities: '',
  340. }, {
  341. key: 'orderStatus',
  342. value: [3, 6],
  343. }],
  344. },
  345. {
  346. name: '评价',
  347. apiName: 'evaluate',
  348. btnType: 'primary',
  349. type: '2',
  350. pageUrl: '',
  351. judge: [{
  352. authorities: '',
  353. }, {
  354. key: 'orderStatus',
  355. value: [4],
  356. }],
  357. },
  358. {
  359. name: '申请配件',
  360. apiName: 'addSpareItems',
  361. btnType: 'primary',
  362. type: '2',
  363. pageUrl: '',
  364. judge: [{
  365. authorities: '',
  366. }, {
  367. key: 'orderStatus',
  368. value: [1, 2],
  369. }],
  370. },
  371. ],
  372. }
  373. },
  374. computed: {},
  375. onLoad() {
  376. },
  377. onShow() {
  378. this.doSearch();
  379. },
  380. created() {
  381. },
  382. onReachBottom() {
  383. this.getList()
  384. },
  385. methods: {
  386. changeChartsTab(value) {
  387. this.pickTabIndex = value;
  388. this.doSearch();
  389. },
  390. doSearch() {
  391. this.isEnd = false;
  392. this.page = 1;
  393. this.getList();
  394. },
  395. //获取列表信息
  396. getList() {
  397. this.emptyShow = false
  398. if (this.isEnd) {
  399. this.$refs.uToast.show({
  400. message: "暂无更多数据",
  401. duration: 1000
  402. })
  403. return
  404. }
  405. uni.showLoading({
  406. title: '加载中'
  407. })
  408. let data = {
  409. pageNum: this.page,
  410. size: this.size,
  411. keyWord: this.searchVal,
  412. ...this.searchForm
  413. }
  414. if (this.pickTabIndex != 'all') {
  415. data.orderStatus = this.pickTabIndex;
  416. }
  417. getSalesWorkOrder(data).then(res => {
  418. if (this.page === 1) {
  419. this.tableList = res.list
  420. if (this.tableList.length === 0) {
  421. this.emptyShow = true
  422. }
  423. } else {
  424. this.tableList.push(...res.list)
  425. }
  426. this.page += 1
  427. this.isEnd = this.tableList.length >= res.count;
  428. uni.hideLoading();
  429. }).catch((e) => {
  430. uni.hideLoading();
  431. })
  432. },
  433. scrolltolower() {
  434. if (this.isEnd) {
  435. return
  436. }
  437. this.getList();
  438. },
  439. // 申请配件
  440. addSpareItems(id) {
  441. uni.navigateTo({
  442. url: `/pages/salesServiceManagement/workOrder/components/accessory?id=${id}`
  443. })
  444. },
  445. // 验收
  446. checkAndAccept(item) {
  447. this.$refs.acceptRef.open(item.id);
  448. },
  449. // 评价
  450. evaluate(item) {
  451. this.$refs.evaluateRef.open(item.id);
  452. },
  453. // 转派
  454. handleAudit(item) {
  455. console.log(item, 'item ---')
  456. uni.navigateTo({
  457. url: `/pages/salesServiceManagement/workOrder/components/forWork/transfer?id=${item.id}`
  458. })
  459. },
  460. // 报工
  461. edit(type, id) {
  462. uni.navigateTo({
  463. url: `/pages/salesServiceManagement/workOrder/components/editPlan?type=${type}&id=${id}`
  464. })
  465. },
  466. // 接收
  467. async receive(item) {
  468. const data = await uni.showModal({
  469. title: '确认接收',
  470. content: '确定要接收这条数据吗?',
  471. confirmText: '接收',
  472. confirmColor: '#157a2c',
  473. });
  474. if (data[1].confirm) {
  475. const res = await receiveSalesWorkOrder(item);
  476. if (!res) return;
  477. this.$refs.uToast.show({
  478. type: "success",
  479. message: "操作成功",
  480. })
  481. this.doSearch();
  482. }
  483. },
  484. clearSearch() {
  485. this.searchVal = ''
  486. this.doSearch()
  487. },
  488. showSearch() {
  489. this.searchShow = true
  490. },
  491. confirmSearch(e) {
  492. console.log(e);
  493. let data = JSON.parse(JSON.stringify(e))
  494. this.searchForm = data
  495. this.doSearch()
  496. }
  497. }
  498. }
  499. </script>
  500. <style lang="scss" scoped>
  501. .top-wrapper {
  502. background-color: #fff;
  503. display: flex;
  504. width: 750rpx;
  505. height: 88rpx;
  506. padding: 16rpx 32rpx;
  507. align-items: center;
  508. gap: 16rpx;
  509. /deep/.uni-section {
  510. margin-top: 0px;
  511. }
  512. /deep/.uni-section-header {
  513. padding: 0px;
  514. }
  515. .search_btn {
  516. width: 120rpx;
  517. height: 70rpx;
  518. line-height: 70rpx;
  519. padding: 0 24rpx;
  520. background: $theme-color;
  521. font-size: 32rpx;
  522. color: #fff;
  523. margin: 0;
  524. margin-left: 26rpx;
  525. }
  526. .menu_icon {
  527. width: 44rpx;
  528. height: 44rpx;
  529. margin-left: 14rpx;
  530. }
  531. }
  532. .tab_box {
  533. width: 100%;
  534. height: 68rpx;
  535. border-bottom: 1rpx solid #E1E1E1;
  536. .tab_item {
  537. height: 68rpx;
  538. line-height: 68rpx;
  539. padding: 0 20rpx;
  540. font-size: 32rpx;
  541. color: #979C9E;
  542. }
  543. .active {
  544. box-sizing: border-box;
  545. border-bottom: 6rpx solid $theme-color;
  546. color: $theme-color;
  547. }
  548. }
  549. /deep/ .u-empty {
  550. margin-top: 200px !important;
  551. }
  552. </style>