index.vue 9.4 KB

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