detail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. <template>
  2. <div class="sellOutOrderDetail pagePadding">
  3. <div
  4. style="width: 100%"
  5. v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
  6. >
  7. <div
  8. class="detail-page-title"
  9. >
  10. <span>发货申请单编号:</span
  11. ><span v-if="sitem">{{ sitem.outCode }}</span>
  12. <el-button
  13. class="fr"
  14. v-if="
  15. (status === '2' || status === '3') &&
  16. powers.some((item) => item == '049')
  17. "
  18. type="primary"
  19. plain
  20. :size="'mini'"
  21. style="margin: 0 0 0 10px"
  22. @click="wellReturnCode"
  23. >新建售后申请单
  24. </el-button>
  25. <el-button
  26. class="fr"
  27. v-if="status === '2' && powers.some((item) => item == '088')"
  28. type="primary"
  29. plain
  30. :size="'mini'"
  31. style="margin: 0 0 0 10px"
  32. @click="wentReceive"
  33. >确认收货
  34. </el-button>
  35. </div>
  36. <!--
  37. <status-bar
  38. v-if="newTime !== ''"
  39. :newTime="newTime"
  40. :options="statusOptions"
  41. :status="status"
  42. /> -->
  43. <el-tabs v-model="activeTabs">
  44. <el-tab-pane label="业务详情" name="1">
  45. <el-collapse v-model="activeNames" style="margin: -18px 0 0 0">
  46. <el-collapse-item title="发货申请单详情" name="1">
  47. <show-data-table
  48. :newTime="newTime"
  49. v-if="newTime !== ''"
  50. :sitem="sitem"
  51. :columns="showColumns"
  52. >
  53. <template slot="status">
  54. <el-tag
  55. :size="'mini'"
  56. :type="sitem.status == '0' ? 'warning' : ''"
  57. v-text="
  58. (
  59. statusOptions.find(
  60. (item) => item.value == sitem.status
  61. ) || {}
  62. ).label || '--'
  63. "
  64. ></el-tag>
  65. </template>
  66. <template slot="order_type">
  67. <el-tag :size="'mini'" :type="''">{{
  68. sitem.status === "1" ? "发货申请单" : "咨询发货申请单"
  69. }}</el-tag>
  70. </template>
  71. <template slot="sale_price">
  72. <span>{{
  73. private_field &&
  74. private_field.length > 0 &&
  75. private_field.some((item) => item == "2")
  76. ? sitem.sale_price
  77. : "***"
  78. }}</span>
  79. </template>
  80. <template slot="total_price">
  81. <span>{{
  82. private_field &&
  83. private_field.length > 0 &&
  84. private_field.some((item) => item == "2")
  85. ? sitem.total_price
  86. : "***"
  87. }}</span>
  88. </template>
  89. </show-data-table>
  90. </el-collapse-item>
  91. <el-collapse-item title="商品信息" name="2">
  92. <show-goods-data-table
  93. :newTime="newTime"
  94. v-if="newTime !== ''"
  95. :type="sitem.order_type"
  96. :skucode="sitem.skuCode"
  97. :spucode="sitem.good_code"
  98. />
  99. </el-collapse-item>
  100. <el-collapse-item
  101. title="库管发货"
  102. name="3"
  103. v-if="status === '1' && powers.some((item) => item == '080')"
  104. >
  105. <want-deliver
  106. :newTime="newTime"
  107. v-if="newTime !== ''"
  108. :sitem="sitem"
  109. @refresh="initData"
  110. />
  111. </el-collapse-item>
  112. <el-collapse-item
  113. title="售后申请单结果"
  114. name="4"
  115. v-if="
  116. returnCode &&
  117. returnCode_type &&
  118. sitem &&
  119. sitem.order_return &&
  120. resitem
  121. "
  122. >
  123. <show-data-table
  124. :newTime="newTime"
  125. v-if="newTime !== '' && resitem"
  126. :sitem="resitem"
  127. :border="
  128. !(
  129. (resitem.is_receive === '1' && returnCode_type === '4') ||
  130. (resitem.is_receive === '1' && returnCode_type === '5')
  131. )
  132. "
  133. :columns="rshowColumns"
  134. >
  135. <template slot="status">
  136. <el-tag
  137. :size="'mini'"
  138. :type="resitem.status == '0' ? 'warning' : ''"
  139. v-text="
  140. (
  141. (resitem.is_receive === '0'
  142. ? status2Options
  143. : status1Options
  144. ).find((item) => item.id === resitem.status) || {}
  145. ).label || '--'
  146. "
  147. ></el-tag>
  148. <el-tooltip
  149. v-if="resitem.status === '3' && resitem.is_receive === '0'"
  150. class="fr"
  151. effect="dark"
  152. content="同意退货"
  153. style="padding: 3px 0 0 0"
  154. placement="top"
  155. >
  156. <i
  157. class="el-icon-video-play tb-icon"
  158. @click="agree_return"
  159. ></i>
  160. </el-tooltip>
  161. <el-tooltip
  162. class="fr"
  163. effect="dark"
  164. content="取消申请"
  165. style="padding: 3px 0 0 0"
  166. v-if="
  167. resitem.status === '1' ||
  168. resitem.status === '2' ||
  169. resitem.status === '3' ||
  170. resitem.status === '4'
  171. "
  172. placement="top"
  173. >
  174. <i
  175. class="el-icon-circle-close tb-icon"
  176. @click="close_return"
  177. ></i>
  178. </el-tooltip>
  179. </template>
  180. <template slot="order_type">
  181. <el-tag
  182. :size="'mini'"
  183. v-text="
  184. (
  185. orderOptions.find(
  186. (item) => item.id == resitem.order_type
  187. ) || {}
  188. ).label || '--'
  189. "
  190. ></el-tag>
  191. </template>
  192. <template slot="is_receive">
  193. <el-tag :size="'mini'" :type="''">{{
  194. resitem.is_receive === "1"
  195. ? "已收到货"
  196. : resitem.is_receive === "0"
  197. ? "未收到"
  198. : "--"
  199. }}</el-tag>
  200. </template>
  201. <template slot="except_code">
  202. <el-tag
  203. :size="'mini'"
  204. v-text="
  205. (
  206. expect_options.find(
  207. (item) => item.value == resitem.except_code
  208. ) || {}
  209. ).label || '--'
  210. "
  211. ></el-tag>
  212. </template>
  213. <template slot="error_img">
  214. <img
  215. class="fl hover"
  216. style="width: 23px; height: 23px; margin: 0 5px 0 0"
  217. v-viewer
  218. v-for="(si, i) in resitem.error_img"
  219. :src="si"
  220. :key="si + i"
  221. />
  222. </template>
  223. </show-data-table>
  224. <show-data-table
  225. :newTime="newTime"
  226. v-if="
  227. resitem &&
  228. resitem.is_receive === '1' &&
  229. (returnCode_type === '4' || returnCode_type === '5')
  230. "
  231. :sitem="resitem"
  232. border
  233. :columns="returnShowColumns"
  234. >
  235. <template slot="is_th">
  236. <el-tag
  237. :size="'mini'"
  238. v-text="
  239. (
  240. is_th_options.find(
  241. (item) => item.value == resitem.is_th
  242. ) || {}
  243. ).label || '--'
  244. "
  245. ></el-tag>
  246. </template>
  247. <template slot="addr">
  248. <span
  249. >{{ resitem.contactor }}---{{ resitem.mobile }}---{{
  250. resitem.addr_cn
  251. }}{{ resitem.addr }}</span
  252. >
  253. </template>
  254. </show-data-table>
  255. <show-data-table
  256. :newTime="newTime"
  257. v-if="
  258. newTime !== '' &&
  259. resitem &&
  260. resitem.is_receive === '1' &&
  261. returnCode_type === '5'
  262. "
  263. :sitem="resitem"
  264. border
  265. :columns="returnShowResColumns"
  266. >
  267. </show-data-table>
  268. <return-express
  269. :sitem="resitem"
  270. :newTime="newTime"
  271. v-if="newTime !== '' && returnCode_type === '4'"
  272. @refresh="initData"
  273. />
  274. </el-collapse-item>
  275. </el-collapse>
  276. </el-tab-pane>
  277. <el-tab-pane label="审批记录" name="2">
  278. <process-time-line
  279. v-if="newTime !== ''"
  280. :newTime="newTime"
  281. :type="'CKD'"
  282. :orderCode="queryId"
  283. />
  284. </el-tab-pane>
  285. </el-tabs>
  286. <div>
  287. <add-Edit-A
  288. :id="'add'"
  289. :sitem="sitem"
  290. :show-model="showModel"
  291. :is-detail="false"
  292. @refresh="initData"
  293. @cancel="showModel = false"
  294. />
  295. </div>
  296. </div>
  297. <div v-else>
  298. <no-auth></no-auth>
  299. </div>
  300. </div>
  301. </template>
  302. <script>
  303. import mixinPage from "@/mixins/elPaginationHandle";
  304. import resToken from "@/mixins/resToken";
  305. import asyncRequest from "@/apis/service/sellOut/sellOutOrder";
  306. import addEditForm from "./components/addEditForm.vue"; //发货申请单详情
  307. import addEditA from "./components/addEditA";
  308. import { showColumns } from "./columns";
  309. import { sellshowColumns } from "@/views/sellOut/sellAfterApply/columns";
  310. import returnExpress from "./components/returnExpress";
  311. import wantDeliver from "./components/want-deliver.vue";
  312. import { mapGetters } from "vuex";
  313. export default {
  314. name: "sellOutOrderDetail",
  315. mixins: [mixinPage, resToken],
  316. components: {
  317. addEditForm,
  318. addEditA,
  319. wantDeliver,
  320. returnExpress,
  321. },
  322. computed: {
  323. ...mapGetters(["private_field"]),
  324. powers() {
  325. let tran =
  326. this.$store.getters.btnList.find(
  327. (item) => item.menu_route == "sellOutOrderDetail"
  328. ) || {};
  329. if (tran && tran.action && tran.action.length > 0) {
  330. return tran.action;
  331. } else {
  332. return [];
  333. }
  334. },
  335. },
  336. data() {
  337. return {
  338. returnCode: "",
  339. returnCode_type: "",
  340. activeTabs: "1",
  341. activeNames: ["0", "1", "2", "3", "4"],
  342. status: "", //存储详情接口状态
  343. statusList: [],
  344. showColumns: showColumns,
  345. rshowColumns: sellshowColumns,
  346. returnShowColumns: [
  347. {
  348. prop: "is_th",
  349. label: "物流承担方",
  350. _slot_: "is_th",
  351. span: 6,
  352. },
  353. {
  354. prop: "addr",
  355. label: "收货地址",
  356. _slot_: "addr",
  357. span: 18,
  358. },
  359. ],
  360. returnShowResColumns: [
  361. {
  362. prop: "post_fee",
  363. label: "退货物流费用",
  364. span: 6,
  365. },
  366. {
  367. prop: "post_company",
  368. label: "退货物流公司",
  369. span: 6,
  370. },
  371. {
  372. prop: "post_code",
  373. label: "退货物流单号",
  374. span: 12,
  375. },
  376. ],
  377. sitem: null,
  378. resitem: null,
  379. newTime: "",
  380. showModel: false,
  381. loading: false,
  382. orderOptions: [
  383. { id: "1", label: "线上商品销售" },
  384. { id: "2", label: "项目线上商品销售" },
  385. { id: "3", label: "咨询单销售" },
  386. { id: "4", label: "项目咨询单销售" },
  387. { id: "5", label: "平台部订单销售" },
  388. ],
  389. statusOptions: [
  390. { value: "0", label: "待采购备货" },
  391. { value: "1", label: "待库管发货" },
  392. { value: "2", label: "已发货待收货" },
  393. { value: "3", label: "已收货" },
  394. { value: "4", label: "已全部退货" },
  395. ],
  396. // 收到货状态
  397. status1Options: [
  398. { id: "1", label: "待业务审核" },
  399. { id: "2", label: "待采购审核" },
  400. { id: "3", label: "待设置仓库" },
  401. { id: "4", label: "待客户退货" },
  402. { id: "5", label: "售后已完成" },
  403. { id: "6", label: "业务已驳回" },
  404. { id: "7", label: "采购已驳回" },
  405. { id: "8", label: "申请已取消" },
  406. ],
  407. // 未收到货状态
  408. status2Options: [
  409. { id: "1", label: "待业务审核" },
  410. { id: "2", label: "待采购审核" },
  411. { id: "3", label: "待同意退货" },
  412. { id: "5", label: "售后已完成" },
  413. { id: "6", label: "业务已驳回" },
  414. { id: "7", label: "采购已驳回" },
  415. { id: "8", label: "申请已取消" },
  416. ],
  417. expect_options: [],
  418. expect_options1: [
  419. {
  420. value: "1",
  421. label: "退货",
  422. },
  423. {
  424. value: "2",
  425. label: "换货",
  426. },
  427. ],
  428. expect_options0: [
  429. {
  430. value: "1",
  431. label: "退货",
  432. },
  433. {
  434. value: "2",
  435. label: "补发",
  436. },
  437. ],
  438. is_th_options: [
  439. {
  440. value: "1",
  441. label: "收货人承担",
  442. },
  443. {
  444. value: "2",
  445. label: "业务公司承担",
  446. },
  447. {
  448. value: "3",
  449. label: "供应商承担",
  450. },
  451. ],
  452. queryId: "",
  453. did: "", //详情页上的id
  454. };
  455. },
  456. mounted() {
  457. this.queryId = this.$route.query.id;
  458. this.initData();
  459. },
  460. methods: {
  461. async updateStatus(e) {
  462. await this.setstatus(e.status);
  463. },
  464. getNewTime() {
  465. this.newTime = new Date().valueOf();
  466. },
  467. async setstatus(status) {
  468. const model = {
  469. id: this.did,
  470. status: status,
  471. };
  472. let res = await asyncRequest.status(model);
  473. if (res && res.code === 0) {
  474. this.$notify.success({
  475. title: "修改成功!",
  476. message: "",
  477. });
  478. await this.initData();
  479. } else if (res && res.code >= 100 && res.code <= 104) {
  480. await this.logout();
  481. } else {
  482. this.$message.warning(res.message);
  483. }
  484. },
  485. async wentReceive() {
  486. await this.$confirm("确定要确认收货?", {
  487. confirmButtonText: "确定",
  488. cancelButtonText: "取消",
  489. type: "warning",
  490. })
  491. .then(async () => {
  492. const model = {
  493. outCode: this.sitem.outCode,
  494. };
  495. const res = await asyncRequest.saleoutreceipt(model);
  496. if (res && res.code === 0) {
  497. this.$notify.success({
  498. title: "确认收货",
  499. message: "",
  500. });
  501. await this.initData();
  502. } else if (res && res.code >= 100 && res.code <= 104) {
  503. await this.logout();
  504. } else {
  505. this.$message.warning(res.message);
  506. }
  507. })
  508. .catch(() => {
  509. console.log("取消");
  510. });
  511. },
  512. async initData(e) {
  513. this.returnCode = "";
  514. this.returnCode_type = "";
  515. let model = {
  516. outCode: this.queryId,
  517. };
  518. const res = await asyncRequest.detail(model);
  519. if (res && res.code === 0 && res.data) {
  520. this.sitem = res.data;
  521. const { status, can, id, order_return } = this.sitem;
  522. this.status = status;
  523. this.did = id;
  524. if (order_return) {
  525. this.returnCode = order_return.returnCode;
  526. this.returnCode_type = order_return.status;
  527. await this.receive_initData(this.returnCode);
  528. }
  529. this.getNewTime();
  530. } else if (res && res.code >= 100 && res.code <= 104) {
  531. await this.logout();
  532. } else {
  533. this.$message.warning(res.message);
  534. }
  535. },
  536. wellReturnCode() {
  537. console.log(this.returnCode_type);
  538. if (
  539. this.returnCode_type === "1" ||
  540. this.returnCode_type === "2" ||
  541. this.returnCode_type === "3"
  542. ) {
  543. this.$message.warning("当前售后申请单未完成审批!");
  544. return;
  545. }
  546. this.showModel = true;
  547. },
  548. async receive_initData(code) {
  549. let model = {
  550. returnCode: code,
  551. };
  552. const res = await asyncRequest.afterinfo(model);
  553. if (res && res.code === 0 && res.data) {
  554. this.resitem = res.data;
  555. this.resitem.error_img = this.resitem.error_img.split(",");
  556. this.expect_options = JSON.parse(
  557. JSON.stringify(
  558. this.resitem.is_receive === "1"
  559. ? this.expect_options1
  560. : this.expect_options0
  561. )
  562. );
  563. } else if (res && res.code >= 100 && res.code <= 104) {
  564. await this.logout();
  565. } else {
  566. this.$message.warning(res.message);
  567. }
  568. },
  569. async agree_return() {
  570. await this.$confirm("确定要同意退货?", {
  571. confirmButtonText: "确定",
  572. cancelButtonText: "取消",
  573. type: "warning",
  574. })
  575. .then(async () => {
  576. const model = {
  577. returnCode: this.returnCode,
  578. status: "5",
  579. remark: "",
  580. is_post: "",
  581. };
  582. const res = await asyncRequest.afterstatus(model);
  583. if (res && res.code === 0) {
  584. this.$notify.success({
  585. title: "退货成功",
  586. message: "",
  587. });
  588. await this.initData();
  589. } else if (res && res.code >= 100 && res.code <= 104) {
  590. await this.logout();
  591. } else {
  592. this.$message.warning(res.message);
  593. }
  594. })
  595. .catch(() => {
  596. console.log("取消");
  597. });
  598. },
  599. async close_return() {
  600. await this.$confirm("确定要取消申请?", {
  601. confirmButtonText: "确定",
  602. cancelButtonText: "取消",
  603. type: "warning",
  604. })
  605. .then(async () => {
  606. const model = {
  607. returnCode: this.returnCode,
  608. };
  609. const res = await asyncRequest.aftercancel(model);
  610. if (res && res.code === 0) {
  611. this.$notify.success({
  612. title: "取消成功",
  613. message: "",
  614. });
  615. await this.initData();
  616. } else if (res && res.code >= 100 && res.code <= 104) {
  617. await this.logout();
  618. } else {
  619. this.$message.warning(res.message);
  620. }
  621. })
  622. .catch(() => {
  623. console.log("取消");
  624. });
  625. },
  626. },
  627. };
  628. </script>