AfterSales.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template>
  2. <view class="after_sales">
  3. <block v-for="item in tableList" :key="item.id">
  4. <!-- <view class="sales_info" v-if="tableList.length > 0">
  5. <view>名称:{{ fieldRow('categoryName') }}</view>
  6. <view>类型:{{ fieldRow('productCategoryName') }}</view>
  7. <view>编码:{{ fieldRow('categoryCode') }}</view>
  8. <view>发货条码:{{ fieldRow('barcodes') }}</view>
  9. <view>发货时间:{{ fieldRow('shipmentDate') }}</view>
  10. <view>质保有效期:{{ fieldRow('guaranteePeriodDeadline') }}</view>
  11. <view>计量数量:{{ fieldRow('measureQuantity') }}</view>
  12. <view class="action" v-if="type != 'view'">
  13. <text class="text">
  14. 操作:
  15. </text>
  16. <u-button @click="goProblem('add')" :plain="true" :hairline="true" size='mini' type="default"
  17. text="添加故障"></u-button>
  18. <u-button v-if="!isReport" @click="del" :plain="true" :hairline="true" size='mini' type="default"
  19. class="delete" text="删除"></u-button>
  20. </view>
  21. </view> -->
  22. <view class="sales_info">
  23. <view>名称:{{ item.categoryName }}</view>
  24. <view>类型:{{ item.productCategoryName }}</view>
  25. <view>编码:{{ item.categoryCode }}</view>
  26. <view>发货条码:{{ item.barcodes }}</view>
  27. <view>发货时间:{{ item.shipmentDate }}</view>
  28. <view>质保有效期:{{ item.guaranteePeriodDeadline }}</view>
  29. <view>计量数量:{{ item.measureQuantity }}</view>
  30. <view class="action" v-if="type != 'view'">
  31. <text class="text">
  32. 操作:
  33. </text>
  34. <!-- <u-button @click="goProblem('add','',item.id)" :plain="true" :hairline="true" size='mini'
  35. type="default" text="添加故障"></u-button> -->
  36. <u-button @click="addFault('add','',item.id)" :plain="true" :hairline="true" size='mini'
  37. type="default" :text="afterSalesType == '3'?'添加质量反馈':'添加故障'"></u-button>
  38. <u-button v-if="!isReport" @click="del(item.id)" :plain="true" :hairline="true" size='mini'
  39. type="default" class="delete" text="删除"></u-button>
  40. </view>
  41. <!-- <block v-for="item"></block> -->
  42. </view>
  43. </block>
  44. <div class="wapper">
  45. <view v-for="(item, index) in faultDetails" :key="index" class="view_box" style="position: relative;">
  46. <myCard @edit="goProblem('edit',item)" @del="delProblem(item)" :item="item" :index="index+1"
  47. :columns="columns" :btnList="btnData">
  48. <view class="images" slot="imageUrl">
  49. <PreviewPhoto type="view" :imageList="imagesData(item)" />
  50. </view>
  51. </myCard>
  52. </view>
  53. </div>
  54. </view>
  55. </template>
  56. <script>
  57. import PreviewPhoto from "@/pages/maintenance/check/components/PreviewPhoto.vue"
  58. import myCard from '@/pages/saleManage/components/myCard.vue'
  59. import {
  60. getByCode
  61. } from '@/api/pda/common.js'
  62. export default {
  63. components: {
  64. myCard,
  65. PreviewPhoto
  66. },
  67. props: {
  68. itemList: {
  69. type: Array,
  70. default: () => []
  71. },
  72. type: {
  73. type: String,
  74. default: 'edit'
  75. },
  76. // 是否是售后工单的 报工或者修改进入
  77. isReport: {
  78. type: Boolean,
  79. default: false
  80. },
  81. afterSalesType: {
  82. type: String,
  83. default: ''
  84. },
  85. },
  86. watch: {
  87. itemList: {
  88. handler(newVal) {
  89. let list = JSON.parse(JSON.stringify(newVal));
  90. list.map((el) => {
  91. el.faultDetails = el.faultDetails ? el.faultDetails : []
  92. })
  93. this.tableList = list
  94. },
  95. deep: true,
  96. immediate: true
  97. },
  98. },
  99. computed: {
  100. columns() {
  101. return [
  102. [{
  103. label: this.afterSalesType == 3 ? '质量类型:' : '故障类型:',
  104. prop: 'type',
  105. className: 'perce100',
  106. formatter: (row) => {
  107. let options = this.afterSalesType == 3 ? this.after_sale_quality_type : this
  108. .typeOptions
  109. const user = options.find(item => item.value === row.type);
  110. return user?.text
  111. }
  112. }],
  113. [{
  114. label: this.afterSalesType == 3 ? '质量问题反馈:' : '故障现象:',
  115. prop: 'faultPhenomenon',
  116. }],
  117. [{
  118. label: this.afterSalesType == 3 ? '质量问题分析:' : '故障原因:',
  119. prop: 'faultReason'
  120. }],
  121. [{
  122. label: this.afterSalesType == 3 ? '质量处理方式:' : '维修过程:',
  123. prop: 'maintenanceProcess',
  124. }],
  125. [{
  126. label: '图片:',
  127. prop: 'maintenanceProcess',
  128. slot: 'imageUrl',
  129. className: 'perce100 image_url',
  130. }],
  131. [{
  132. label: '操作:',
  133. prop: 'action',
  134. type: this.type != 'view' ? 'action' : '',
  135. className: 'perce100',
  136. }],
  137. ]
  138. },
  139. faultDetails() {
  140. let arr = []
  141. console.log(this.tableList);
  142. if (this.tableList.length > 0) {
  143. this.tableList.forEach(item =>
  144. arr.push(...item.faultDetails.map((val, index) => {
  145. val['parentId'] = item.id
  146. val['currentIndex'] = index
  147. return val
  148. })))
  149. }
  150. console.log(arr);
  151. return arr
  152. },
  153. fieldRow() {
  154. return (field) => {
  155. if (this.tableList.length == 0) return '';
  156. return this.tableList[0][field]
  157. }
  158. },
  159. btnData() {
  160. if (this.type == 'view') {
  161. return []
  162. }
  163. if (this.isReport) {
  164. this.btnList[1].judge = [{
  165. authorities: '',
  166. }, {
  167. key: 'customize',
  168. value: ['5'],
  169. }]
  170. }
  171. return this.btnList;
  172. },
  173. imagesData() {
  174. return (item) => {
  175. console.log(item, 'item')
  176. let list = item.imageUrl || [];
  177. return list;
  178. }
  179. }
  180. },
  181. data() {
  182. return {
  183. dataId: '',
  184. typeOptions: [{
  185. text: '维修',
  186. value: '1'
  187. },
  188. {
  189. text: '保养',
  190. value: '2'
  191. },
  192. {
  193. text: '安装',
  194. value: '3'
  195. }
  196. ],
  197. after_sale_quality_type: [],
  198. // columns: [
  199. // [{
  200. // label: '故障类型:',
  201. // prop: 'type',
  202. // className: 'perce100',
  203. // formatter: (row) => {
  204. // const user = this.typeOptions.find(item => item.value === row.type);
  205. // return user.text
  206. // }
  207. // }],
  208. // [{
  209. // label: '故障现象:',
  210. // prop: 'faultPhenomenon',
  211. // }],
  212. // [{
  213. // label: '故障原因:',
  214. // prop: 'faultReason'
  215. // }],
  216. // [{
  217. // label: '维修过程:',
  218. // prop: 'maintenanceProcess',
  219. // }],
  220. // [{
  221. // label: '图片:',
  222. // prop: 'maintenanceProcess',
  223. // slot: 'imageUrl',
  224. // className: 'perce100 image_url',
  225. // }],
  226. // [{
  227. // label: '操作:',
  228. // prop: 'action',
  229. // type: this.type != 'view' ? 'action' : '',
  230. // className: 'perce100',
  231. // }],
  232. // ],
  233. btnList: [{
  234. name: '编辑',
  235. apiName: 'edit',
  236. btnType: 'error',
  237. type: '2',
  238. pageUrl: '',
  239. },
  240. {
  241. name: '删除',
  242. apiName: 'del',
  243. btnType: 'error',
  244. type: '2',
  245. pageUrl: '',
  246. }
  247. ],
  248. tableList: []
  249. }
  250. },
  251. onLoad({}) {
  252. },
  253. created() {
  254. this.getByCode();
  255. uni.$off('updateFaultList')
  256. uni.$on('updateFaultList', ({
  257. type,
  258. data,
  259. index
  260. }) => {
  261. console.log(type);
  262. console.log(this.tableList);
  263. console.log(data);
  264. if (type === 'add') {
  265. this.tableList.find(item => item.id === this.dataId).faultDetails.push(data)
  266. } else {
  267. let faultDetails = this.tableList.find(item => item.id === this.dataId).faultDetails
  268. this.$set(faultDetails,index,data)
  269. }
  270. })
  271. },
  272. methods: {
  273. getByCode() {
  274. const codeS = ['after_sale_quality_type']
  275. codeS.forEach(async (code) => {
  276. const codeValue = await getByCode(code);
  277. this[code] = codeValue.map(item => {
  278. const key = Object.keys(item)[0]
  279. return {
  280. value: key,
  281. text: item[key]
  282. }
  283. })
  284. })
  285. },
  286. del(id) {
  287. console.log(id);
  288. console.log(this.tableList);
  289. uni.showModal({
  290. title: '确认删除',
  291. content: '确定要删除这条售后对象吗?',
  292. confirmText: '删除',
  293. confirmColor: '#FF4D4F',
  294. success: (res) => {
  295. if (res.confirm) {
  296. this.tableList = this.tableList.filter(item => item.id !== id);
  297. } else if (res.cancel) {
  298. // 用户点击了取消按钮
  299. console.log('用户取消删除');
  300. }
  301. }
  302. });
  303. },
  304. // 删除故障
  305. delProblem(data) {
  306. uni.showModal({
  307. title: '确认删除',
  308. content: '确定要删除这条故障吗?',
  309. confirmText: '删除',
  310. confirmColor: '#FF4D4F',
  311. success: (res) => {
  312. if (res.confirm) {
  313. this.tableList.find(item=>item.id==data.parentId).faultDetails.splice(data.currentIndex, 1);
  314. } else if (res.cancel) {
  315. // 用户点击了取消按钮
  316. console.log('用户取消删除');
  317. }
  318. }
  319. });
  320. },
  321. // 现在只针对做 一 对 多 的 故障数据
  322. goProblem(type, obj = {}) {
  323. this.dataId = obj.parentId
  324. let str = this.type == 'report' ? 'report' : '';
  325. let resD = JSON.parse(JSON.stringify(obj));
  326. let arr = [];
  327. if (resD.imageUrl && resD.imageUrl.length > 0) {
  328. arr = JSON.stringify(resD.imageUrl);
  329. delete resD.imageUrl;
  330. }
  331. console.log(arr, 'arr ----')
  332. let data = JSON.stringify(resD);
  333. uni.navigateTo({
  334. url: `/pages/salesServiceManagement/demandList/components/faultAdd?type=${type}&index=${obj.currentIndex}&data=${data}&str=${str}&arr=${encodeURIComponent(arr)}&afterSalesType=` +
  335. this.afterSalesType
  336. })
  337. },
  338. addFault(type, index, id) {
  339. this.dataId = id
  340. console.log(id);
  341. let str = this.type == 'report' ? 'report' : '';
  342. // let resD = JSON.parse(JSON.stringify(obj));
  343. uni.navigateTo({
  344. url: `/pages/salesServiceManagement/demandList/components/faultAdd?type=${type}&str=${str}&afterSalesType=` +
  345. this.afterSalesType
  346. })
  347. },
  348. // 返回列表数据
  349. getTabData() {
  350. if (!this.isReport) return this.tableList || [];
  351. let list = this.tableList.map((el) => {
  352. if (el.customize) {
  353. delete el.customize;
  354. }
  355. return el;
  356. })
  357. return list;
  358. }
  359. },
  360. }
  361. </script>
  362. <style lang="scss" scoped>
  363. .after_sales {
  364. height: calc(100vh - 246rpx);
  365. .sales_info {
  366. padding: 8px 16px;
  367. font-size: 13px;
  368. font-style: normal;
  369. font-weight: 400;
  370. line-height: 22px;
  371. word-wrap: break-word;
  372. border-bottom: 6rpx solid #E1E1E1;
  373. .action {
  374. display: flex;
  375. line-height: 22px;
  376. .text {
  377. margin-right: 12rpx;
  378. }
  379. /deep/ .u-button {
  380. width: 120rpx;
  381. font-size: 26rpx;
  382. margin-left: 10rpx;
  383. margin-right: 0rpx;
  384. background: #157a2c;
  385. color: #fff !important;
  386. }
  387. }
  388. }
  389. .wapper {
  390. height: calc(100% - 338rpx);
  391. .view_box {
  392. /deep/ .card_box {
  393. .image_url {
  394. width: 110%;
  395. .item_one {
  396. .text {
  397. display: block;
  398. width: calc(100% - 80rpx);
  399. }
  400. }
  401. }
  402. }
  403. }
  404. }
  405. }
  406. </style>