index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. <template>
  2. <div class="app-container">
  3. <el-page-header @back="goBack" content="订单详情"></el-page-header>
  4. <div class="order-refund-main">
  5. <el-row style="padding: 15px 15px 10px">
  6. <el-col :span="24">
  7. <div class="order-refund-main-title">
  8. <span>订单编号:{{ orderDetail.orderId }}</span>
  9. <span>申请退款时间:{{ orderDetail.createTime }}</span>
  10. <span>商户:{{ orderDetail.companyWechatName || '无' }}</span>
  11. <div class="fr">
  12. <el-link type="primary" :underline="false" @click="showRemark('remark')">修改订单备注</el-link>
  13. </div>
  14. </div>
  15. </el-col>
  16. </el-row>
  17. <div style="width: 100%; padding: 10px 15px 15px 15px">
  18. <el-row>
  19. <el-col :span="8" style="border-right: 1px solid #e8e8e8;">
  20. <div class="order-refund-main-status">
  21. <span>{{ orderDetail.orderStatus | ORDER_REFUND_CURRENT_STATUS_FILTER }}</span>
  22. </div>
  23. <div class="order-refund-main-opt-btn">
  24. <template v-if="orderDetail.orderStatus === 'DSJCL'">
  25. <el-button v-if="orderDetail.refundType == 'REFUND_GOODS'" @click="changeExamineStatus('OK',orderDetail.refundType)" slot="reference" size="small" type="primary">同意</el-button>
  26. <el-popconfirm v-else title="确定同意吗?" @confirm="changeExamineStatus('OK')">
  27. <el-button slot="reference" size="small" type="primary">同意</el-button>
  28. </el-popconfirm>
  29. <el-popconfirm title="确定拒绝吗?" @confirm="changeExamineStatus('FAIL')" style="margin-left: 10px;">
  30. <el-button slot="reference" size="small" type="warning">拒绝</el-button>
  31. </el-popconfirm>
  32. </template>
  33. <template v-if="orderDetail.orderStatus === 'DSJSH'">
  34. <el-popconfirm title="确定要收货吗?" @confirm="receiveProd()">
  35. <el-button slot="reference" size="small" type="primary">确认收货</el-button>
  36. </el-popconfirm>
  37. <el-button type="success" size="small" @click="queryLogistics(orderDetail.logisticsNo)" v-if="orderDetail.logisticsNo" style="margin-left: 10px;">查看物流</el-button>
  38. </template>
  39. </div>
  40. </el-col>
  41. <el-col :span="16" style="padding: 0 15px;">订单备注:{{ orderDetail.remark }}</el-col>
  42. </el-row>
  43. </div>
  44. </div>
  45. <div class="order-refund-receive-info">
  46. <el-row :gutter="30">
  47. <el-col :xs="24" :sm="12" :lg="12">
  48. <div class="main-detail">
  49. <div class="title">订单信息</div>
  50. <div class="item">
  51. <div class="label">收货人信息:</div>
  52. <div class="value">{{orderDetail.receUserName}} ({{orderDetail.recePhone}})</div>
  53. </div>
  54. <div class="item">
  55. <div class="label">收货人地址:</div>
  56. <div class="value">{{orderDetail.province + orderDetail.city + orderDetail.area + orderDetail.street + orderDetail.receAddress}}</div>
  57. </div>
  58. <div class="item">
  59. <div class="label">销售员信息:</div>
  60. <div class="value">{{orderDetail.workerName}} ({{orderDetail.workerPhone}})</div>
  61. </div>
  62. <div class="item">
  63. <div class="label">下单渠道:</div>
  64. <div class="value">{{orderDetail.source}}</div>
  65. </div>
  66. <div class="item">
  67. <div class="label">支付方式:</div>
  68. <div class="value">{{orderDetail.payType}}</div>
  69. </div>
  70. <div class="item">
  71. <div class="label">是否开票:</div>
  72. <div class="value">{{orderDetail.tax ? '是':'否'}}</div>
  73. </div>
  74. </div>
  75. </el-col>
  76. <el-col :xs="24" :sm="12" :lg="12">
  77. <div class="main-detail">
  78. <div class="title">维权信息</div>
  79. <div class="item">
  80. <div class="label">退款方式:</div>
  81. <div class="value">{{orderDetail.refundType | REFUND_CURRENT_TYPE_FILTER}}</div>
  82. </div>
  83. <div class="item">
  84. <div class="label">退款原因:</div>
  85. <div class="value">{{orderDetail.refundReason}}</div>
  86. </div>
  87. <div class="item">
  88. <div class="label">退款说明:</div>
  89. <div class="value">{{orderDetail.refundExplain}}</div>
  90. </div>
  91. <div class="item">
  92. <div class="label">退款凭证:</div>
  93. <div class="value" style="display: flex;">
  94. <div v-for="(item, index) in orderDetail.tkFiles" :key="index" style="margin-right: 10px">
  95. <el-image :src="item.url" style="width: 50px; height: 50px;" :preview-src-list="[item.url]"></el-image>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. </el-col>
  101. </el-row>
  102. </div>
  103. <div class="order-refund-detail">
  104. <el-table :data="orderDetail.orderDetails" style="width: 100%" border >
  105. <el-table-column label="商品信息" min-width="200">
  106. <template slot-scope="scope">
  107. <el-row>
  108. <el-col :span="6">
  109. <el-image style="width: 40px; height: 40px" :src="scope.row.imgUrl">
  110. <div slot="error" class="image-slot">
  111. <i class="el-icon-picture-outline"></i>
  112. </div>
  113. </el-image>
  114. </el-col>
  115. <el-col :span="18">
  116. <div>{{ scope.row.goodsName }}</div>
  117. </el-col>
  118. </el-row>
  119. </template>
  120. </el-table-column>
  121. <el-table-column prop="goodsSpecName" label="规格" align="center"></el-table-column>
  122. <el-table-column prop="price" label="单价" align="center"></el-table-column>
  123. <el-table-column prop="num" label="数量" align="center"></el-table-column>
  124. <el-table-column prop="shareAmount" label="分销金额" align="center"></el-table-column>
  125. <el-table-column prop="profitAmount" label="预计盈利" align="center"></el-table-column>
  126. <el-table-column prop="totalPrice" label="商品总金额" align="center" min-width="100"></el-table-column>
  127. <el-table-column prop="userRefundNum" label="用户维权数量" align="center"></el-table-column>
  128. <el-table-column prop="userRefundAmount" label="用户维权金额" align="center"></el-table-column>
  129. <el-table-column prop="refundAmount" label="退款金额" align="center"></el-table-column>
  130. <el-table-column prop="refundNum" label="退款数量" align="center"></el-table-column>
  131. <el-table-column prop="refundBy" label="退款人" align="center"></el-table-column>
  132. <el-table-column prop="refundTime" label="退款时间" align="center" min-width="160"></el-table-column>
  133. <!-- <el-table-column label="退款时间" align="center" min-width="160">
  134. <template>
  135. {{ orderDetail.examineTime || '' }}
  136. </template>
  137. </el-table-column> -->
  138. </el-table>
  139. <div class="order-amount-info">
  140. <el-row>
  141. <el-col :span="19"><div style="width: 1px;height: 1px;"></div></el-col>
  142. <el-col :span="5">
  143. <div style="padding-bottom: 10px;">商品总价:¥ {{ totalAmountCompute }}</div>
  144. <div style="padding-bottom: 10px;">运费:¥ {{ orderDetail.freight }}</div>
  145. <div style="padding-bottom: 10px;">优惠:¥ {{ orderDetail.discountAmount }}</div>
  146. <div style="font-size: 14px;">
  147. <span style="padding-right: 15px;">实际收款</span><span style="color: red;font-size: 18px;">¥ {{ orderDetail.payAmount }}</span>
  148. </div>
  149. </el-col>
  150. </el-row>
  151. </div>
  152. </div>
  153. <el-dialog :title="'订单备注'" :visible.sync="remarkVisible" :show-close="false" width="50%" :close-on-click-modal="false">
  154. <el-input
  155. type="textarea"
  156. :autosize="{ minRows: 8, maxRows: 16}"
  157. placeholder="请输入备注内容"
  158. v-model="orderDetail.remark"
  159. maxlength="100"
  160. show-word-limit>
  161. </el-input>
  162. <div slot="footer" class="dialog-footer">
  163. <el-button type="primary" @click="saveRemark">保 存</el-button>
  164. <el-button @click="cancelRemark">取 消</el-button>
  165. </div>
  166. </el-dialog>
  167. <el-dialog :title="'物流信息'" :visible.sync="logisticsVisible" :show-close="false" width="80%" :close-on-click-modal="false">
  168. <el-table
  169. :data="logistics"
  170. style="width: 100%"
  171. size="mini">
  172. <el-table-column prop="logisticsNo" label="快递单号" align="center"></el-table-column>
  173. <el-table-column prop="comName" label="物流公司" align="center"></el-table-column>
  174. <el-table-column prop="time" label="物流时间" align="center"></el-table-column>
  175. <el-table-column prop="state" label="物流状态" align="center">
  176. <template slot-scope="scope">
  177. {{ scope.row.state | EXPRESS_CURRENT_STATE_FILTER }}
  178. </template>
  179. </el-table-column>
  180. <el-table-column prop="context" label="物流详情" align="center"></el-table-column>
  181. </el-table>
  182. <div slot="footer" class="dialog-footer">
  183. <el-button @click="logisticsVisible = false">关 闭</el-button>
  184. </div>
  185. </el-dialog>
  186. <!-- 退货确认 -->
  187. <el-dialog :title="'退货确认'" :visible.sync="returnGoodsVisible" :show-close="false" width="80%" :close-on-click-modal="false">
  188. <el-form :model="returnGoodsForm" :rules="returnGoodsFormRules" ref="returnGoodsForm" label-width="80px" label-position="left">
  189. <el-row :gutter="20">
  190. <el-col :span="24">
  191. <el-form-item label="卖家留言" prop="refundMessage">
  192. <el-input type="textarea" :rows="5" v-model="returnGoodsForm.refundMessage" placeholder="请输入卖家留言"></el-input>
  193. </el-form-item>
  194. </el-col>
  195. <el-col :span="24">
  196. <el-card class="box-card">
  197. <el-tabs v-model="typeIndex" @tab-click="changeType">
  198. <el-tab-pane label="发货数量" name="1"></el-tab-pane>
  199. <el-tab-pane v-if="joinCode" label="退货条码" name="2"></el-tab-pane>
  200. </el-tabs>
  201. <br/>
  202. <el-button size="small" v-show="typeIndex == 2 && joinCode" type="primary" @click="addCode()">新增</el-button>
  203. <el-button size="small" v-show="typeIndex == 1 && joinCode" type="primary" @click="handleDownload('导入条码模板')">导入条码模板下载</el-button>
  204. <div class="table">
  205. <!-- 发货数量 -->
  206. <el-form v-show="typeIndex == 1" ref="formData1" :model="formData1" label-width="0" size="small" label-position="left">
  207. <el-table :data="formData1.list" element-loading-text="Loading" border fit highlight-current-row stripe>
  208. <el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
  209. <el-table-column prop="mainName" align="center" label="大类"></el-table-column>
  210. <el-table-column prop="smallName" align="center" label="小类"></el-table-column>
  211. <el-table-column prop="goodsName" align="center" label="商品名称"></el-table-column>
  212. <el-table-column prop="goodsMaterialName" align="center" label="物料名称"></el-table-column>
  213. <el-table-column prop="goodsMaterialSpecsName" align="center" label="规格型号"></el-table-column>
  214. <el-table-column prop="goodsMaterialUnit" align="center" label="单位">
  215. <template slot-scope="scope">
  216. {{scope.row.goodsMaterialUnit == 'C'?'整套':scope.row.goodsMaterialUnit == 'I'?"单个":''}}
  217. </template>
  218. </el-table-column>
  219. <el-table-column prop="num" align="center" label="数量"></el-table-column>
  220. <el-table-column prop="insideNum" align="center" label="内机数量"></el-table-column>
  221. <el-table-column prop="outNum" align="center" label="外机数量"></el-table-column>
  222. <el-table-column prop="partNum" align="center" label="配件数量"></el-table-column>
  223. <el-table-column prop="refundInsideCodeQty" align="center" label="导入内机条码数量" width="140"></el-table-column>
  224. <el-table-column prop="refundOutCodeQty" align="center" label="导入外机条码数量" width="140"></el-table-column>
  225. <el-table-column prop="refundPartsCodeQty" align="center" label="导入配件条码数量" width="140"></el-table-column>
  226. <el-table-column label="操作" align="center" width="140" fixed="right">
  227. <template slot-scope="scope" v-if="joinCode">
  228. <el-upload
  229. action='_'
  230. :show-file-list='false'
  231. :http-request="importCode"
  232. >
  233. <el-button @click="orderDetailId = scope.row.orderDetailId" size="mini" type="text">导入条码</el-button>
  234. </el-upload>
  235. </template>
  236. </el-table-column>
  237. </el-table>
  238. </el-form>
  239. <!-- 发货条码 -->
  240. <el-form ref="formData2" :model="formData2">
  241. <el-table v-show="typeIndex == 2" :data="formData2.list" element-loading-text="Loading" border fit highlight-current-row stripe>
  242. <el-table-column label="品牌" align="center">
  243. <template slot-scope="scope">
  244. <el-form-item>
  245. <el-input type="text" v-model="scope.row.brandName" :disabled="true" placeholder="请输入"></el-input>
  246. </el-form-item>
  247. </template>
  248. </el-table-column>
  249. <el-table-column label="商品大类" align="center">
  250. <template slot-scope="scope">
  251. <el-form-item>
  252. <el-input type="text" v-model="scope.row.mainName" :disabled="true" placeholder="请输入"></el-input>
  253. </el-form-item>
  254. </template>
  255. </el-table-column>
  256. <el-table-column label="商品小类" align="center">
  257. <template slot-scope="scope">
  258. <el-form-item>
  259. <el-input type="text" v-model="scope.row.smallName" :disabled="true" placeholder="请输入"></el-input>
  260. </el-form-item>
  261. </template>
  262. </el-table-column>
  263. <el-table-column prop="" align="center" label="商品名称">
  264. <template slot-scope="scope">
  265. <el-form-item>
  266. <el-input type="text" v-model="scope.row.goodsMaterialName" :disabled="true" placeholder="请输入"></el-input>
  267. </el-form-item>
  268. </template>
  269. </el-table-column>
  270. <el-table-column label="规格型号" align="center">
  271. <template slot-scope="scope">
  272. <el-form-item :prop="'list.' + scope.$index + '.specs'" :rules="[{ required: true, message: `请选择规格型号`, trigger: 'blur' }]">
  273. <el-select v-model="scope.row.specs" @change="(e)=>{changeSpecs(e,scope.row)}" value-key="orderDetailId" :disabled="isEdit2 != scope.$index" placeholder="请选择" style="width: 100%;">
  274. <el-option
  275. v-for="(item,ind) in formData1.list"
  276. :key="ind"
  277. :label="item.goodsMaterialSpecsName"
  278. :value="item">
  279. </el-option>
  280. </el-select>
  281. </el-form-item>
  282. </template>
  283. </el-table-column>
  284. <el-table-column label="物料类型" align="center">
  285. <template slot-scope="scope">
  286. <el-form-item :prop="'list.' + scope.$index + '.goodsMaterialItemType'" :rules="[{ required: true, message: `请选择物料类型`, trigger: 'blur' }]">
  287. <el-select v-model="scope.row.goodsMaterialItemType" @change="(e)=>{changeMaterial(e,scope.row)}"
  288. :disabled="isEdit2 != scope.$index" placeholder="请选择" style="width: 100%;">
  289. <el-option
  290. v-for="(item,ind) in [{name: '内机',id: 'INSIDE'},{name: '外机',id: 'OUT'},{name: '配件',id: 'PARTS'}]"
  291. :key="ind"
  292. :label="item.name"
  293. :value="item.id">
  294. </el-option>
  295. </el-select>
  296. </el-form-item>
  297. </template>
  298. </el-table-column>
  299. <el-table-column label="物料名称" align="center">
  300. <template slot-scope="scope">
  301. <el-form-item :prop="'list.' + scope.$index + '.material'" :rules="[{ required: true, message: `请选择物料名称`, trigger: 'blur' }]">
  302. <el-select v-model="scope.row.material" @focus="(e)=>{
  303. if(!scope.row.goodsMaterialItemType){
  304. return $message.warning('请先选择物料类型!');
  305. }
  306. }" @change="(e)=>{
  307. scope.row.materialName = e.name
  308. scope.row.stockQty = (e.uniqueCode=='YES'?1:null)
  309. scope.row.uniqueCode = e.uniqueCode
  310. scope.row.goodsMaterialItemId = e.itemId
  311. }" value-key="name" :disabled="isEdit2 != scope.$index" placeholder="请选择" style="width: 100%;">
  312. <el-option
  313. v-for="(item,ind) in scope.row.materialList"
  314. :key="ind"
  315. :label="item.name"
  316. :value="item">
  317. </el-option>
  318. </el-select>
  319. </el-form-item>
  320. </template>
  321. </el-table-column>
  322. <el-table-column prop="" align="center" label="是否一物一码" >
  323. <template slot-scope="scope">
  324. <el-form-item>
  325. {{scope.row.uniqueCode=='YES'?'是':scope.row.uniqueCode=='NO'?'否':''}}
  326. </el-form-item>
  327. </template>
  328. </el-table-column>
  329. <el-table-column prop="" align="center" label="条码" >
  330. <template slot-scope="scope">
  331. <el-form-item :prop="'list.' + scope.$index + '.materialCode'" :rules="[{ required: true, message: `请输入条码`, trigger: 'blur' }]">
  332. <el-input type="text" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index" placeholder="请输入"></el-input>
  333. </el-form-item>
  334. </template>
  335. </el-table-column>
  336. <el-table-column prop="" align="center" label="数量">
  337. <template slot-scope="scope">
  338. <el-form-item :prop="'list.' + scope.$index + '.stockQty'" :rules="[{ required: true, message: `请输入数量`, trigger: 'blur' }]">
  339. <el-input type="number" v-model="scope.row.stockQty" :disabled="isEdit2 != scope.$index || scope.row.uniqueCode=='YES'" placeholder="请输入"></el-input>
  340. </el-form-item>
  341. </template>
  342. </el-table-column>
  343. <el-table-column label="操作" align="right" width="140" fixed="right">
  344. <template slot-scope="scope">
  345. <el-button size="mini" type="primary" v-if="scope.$index == isEdit2" @click="saveCode(scope.row)">保存</el-button>
  346. <el-button size="mini" type="primary" v-if="scope.$index != isEdit2" @click="isEdit2 = scope.$index">编辑</el-button>
  347. <el-popconfirm title="确定删除吗?" @confirm="delCode(scope.row.orderDetailCodeId,scope.$index)">
  348. <el-button slot="reference" size="mini" type="danger">删除</el-button>
  349. </el-popconfirm>
  350. </template>
  351. </el-table-column>
  352. </el-table>
  353. </el-form>
  354. </div>
  355. </el-card>
  356. </el-col>
  357. </el-row>
  358. </el-form>
  359. <div slot="footer" class="dialog-footer">
  360. <el-button @click="returnGoodsVisible = false;">关 闭</el-button>
  361. <el-button type="primary" @click="saveReturnGoods()">确 定</el-button>
  362. </div>
  363. </el-dialog>
  364. </div>
  365. </template>
  366. <script>
  367. import {changeExamineStatus, getOrderRefundDetail, receiveProd, saveRefundRemark, getOrderDetail, getCodeDetail2, getMaterialList, listImport2, saveCode2,delCode2} from "@/api/order";
  368. import {getExpress} from "@/api/common";
  369. export default {
  370. name: "orderRefundDetail",
  371. data() {
  372. return {
  373. orderRefundId: '',
  374. orderDetail: {},
  375. remarkVisible: false,
  376. logisticsVisible: false,
  377. logistics: [],
  378. returnGoodsVisible: false,
  379. typeIndex: '1',
  380. formData1: {
  381. list: [],
  382. },
  383. formData2: {
  384. list: [],
  385. },
  386. isEdit1: 0,
  387. isEdit2: 0,
  388. joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode === "CODE",
  389. orderDetailId: '',
  390. returnGoodsFormRules: {
  391. // refundMessage: [{ required: true, message: '请填写卖家留言', trigger: 'blur' }],
  392. },
  393. returnGoodsForm: {
  394. refundMessage: ''
  395. },
  396. }
  397. },
  398. created() {
  399. this.orderRefundId = this.$route.query.orderRefundId || this.$route.query.orderId
  400. this.getDetail()
  401. },
  402. methods: {
  403. getDetail() {
  404. getOrderRefundDetail({ orderRefundId: this.orderRefundId }).then((res) => {
  405. this.orderDetail = res.data
  406. this.orderDetail.workerName = this.orderDetail.workerName ? this.orderDetail.workerName : '暂无'
  407. this.orderDetail.workerPhone = this.orderDetail.workerPhone ? this.orderDetail.workerPhone : ''
  408. })
  409. },
  410. goBack() {
  411. // this.$router.go(-1);
  412. this.$router.push({
  413. name:"order_pr",
  414. params: {}
  415. })
  416. },
  417. showRemark() {
  418. this.remarkVisible = true
  419. },
  420. cancelRemark() {
  421. this.remarkVisible = false
  422. },
  423. saveRemark() {
  424. const params = {
  425. orderRefundId: this.orderRefundId,
  426. remark: this.orderDetail.remark
  427. }
  428. saveRefundRemark(params).then(() => {
  429. this.cancelRemark();
  430. this.getDetail();
  431. this.$successMsg('保存成功');
  432. })
  433. },
  434. // 变更维权处理状态
  435. changeExamineStatus(examineStatus,refundType) {
  436. console.log(refundType);
  437. const orderRefundId = this.orderRefundId
  438. if(refundType == 'REFUND_GOODS'){
  439. this.getOrderDetail()
  440. this.getCodeDetail2()
  441. this.returnGoodsVisible = true
  442. }else{
  443. changeExamineStatus({orderRefundId, examineStatus}).then(() => {
  444. this.getDetail();
  445. this.$successMsg('操作成功');
  446. })
  447. }
  448. },
  449. saveReturnGoods(){
  450. changeExamineStatus({
  451. orderRefundId: this.orderRefundId,
  452. examineStatus: 'OK',
  453. refundMessage: this.returnGoodsForm.refundMessage
  454. }).then(() => {
  455. this.getDetail();
  456. this.$successMsg('操作成功');
  457. })
  458. },
  459. // 确认收货
  460. receiveProd() {
  461. const orderRefundId = this.orderRefundId
  462. receiveProd({orderRefundId}).then(() => {
  463. this.getDetail();
  464. this.$successMsg('确认收货成功');
  465. })
  466. },
  467. // 查看物流
  468. queryLogistics(logisticsNo) {
  469. this.logisticsVisible = true
  470. getExpress({ logisticsNo }).then(res => {
  471. this.logistics = res.data
  472. })
  473. },
  474. getOrderDetail(){
  475. getOrderDetail({orderId: this.orderDetail.orderId}).then(res => {
  476. let arr = []
  477. res.data.orderDetails.forEach(item=>{
  478. if(item.goodsMaterialId){
  479. arr.push(item)
  480. }
  481. })
  482. this.formData1.list = arr
  483. })
  484. },
  485. changeType(){
  486. this.getOrderDetail()
  487. this.getCodeDetail2()
  488. },
  489. async getCodeDetail2(){
  490. getCodeDetail2({orderId: this.orderRefundId}).then(async res => {
  491. for(var item of res.data){
  492. item.specs = {goodsMaterialSpecsName: item.specsName,orderDetailId: item.orderDetailId}
  493. item.material = {name: item.materialName}
  494. item.materialList = await this.getMaterialList(item.specsName,item.goodsMaterialItemType)
  495. }
  496. this.formData2.list = res.data
  497. })
  498. },
  499. async getMaterialList(specsName,type){
  500. return new Promise((resolve, reject) => {
  501. getMaterialList({
  502. pageNum: 1,
  503. pageSize: -1,
  504. specsName,
  505. type
  506. }).then(async res => {
  507. resolve(res.data.records)
  508. })
  509. })
  510. },
  511. async changeSpecs(e,row){
  512. row.brandName = e.brandName
  513. row.brandId = e.brandId
  514. row.mainName = e.mainName
  515. row.mainId = e.mainNumber
  516. row.smallName = e.smallName
  517. row.smallId = e.smallNumber
  518. row.specsName = e.goodsMaterialSpecsName
  519. row.goodsMaterialName = e.goodsName
  520. row.goodsMaterialId = e.goodsMaterialId
  521. row.material = null
  522. row.materialName = ''
  523. row.stockQty = ''
  524. row.uniqueCode = ''
  525. row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
  526. row.orderDetailId = e.orderDetailId
  527. },
  528. async changeMaterial(e,row){
  529. if(!row.specs){
  530. return this.$message.warning('请先选择规格型号!');
  531. }
  532. row.material = null
  533. row.materialName = ''
  534. row.stockQty = ''
  535. row.uniqueCode = ''
  536. row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
  537. },
  538. //发货新增条码
  539. addCode(){
  540. this.$refs.formData2.validate((valid) => {
  541. if (valid) {
  542. this.isEdit2 = 0
  543. this.formData2.list.unshift({
  544. brandId: '',
  545. brandName: '',
  546. mainId: '',
  547. mainName: '',
  548. stockQty: '',
  549. smallId: '',
  550. smallName: '',
  551. goodsMaterialItemType: '',
  552. goodsMaterialName: '',
  553. goodsMaterialId: '',
  554. materialCode: '',
  555. uniqueCode: '',
  556. specs: null,
  557. specsName: '',
  558. materialName: '',
  559. material: null,
  560. materialList: [],
  561. orderDetailId: '',
  562. goodsMaterialItemId: ''
  563. })
  564. }
  565. });
  566. },
  567. delCode(orderDetailCodeId,index){
  568. if(orderDetailCodeId){
  569. delCode2({
  570. orderDetailCodeId
  571. }).then(res => {
  572. if (res.code == 200) {
  573. this.$message({ type: 'success', message: '删除成功!' })
  574. this.getOrderDetail()
  575. this.getCodeDetail2()
  576. } else {
  577. this.$message.error(res.msg);
  578. }
  579. })
  580. }else{
  581. this.formData2.list.splice(index,1)
  582. }
  583. },
  584. saveCode(orderDetailCodes){
  585. const that = this
  586. let params = [{
  587. ...orderDetailCodes,
  588. orderId: this.orderRefundId,
  589. }]
  590. delete params[0].material;
  591. delete params[0].specs;
  592. this.$refs.formData2.validate((valid, invalidFields, errLabels) => {
  593. if (valid) {
  594. saveCode2(params).then(res=>{
  595. if(res.code == 200){
  596. that.$message.success('保存成功!')
  597. this.getOrderDetail()
  598. this.getCodeDetail2()
  599. }
  600. })
  601. }
  602. })
  603. },
  604. importCode(data){
  605. const loading = this.$loading({
  606. lock: true,
  607. text: '正在导入',
  608. spinner: 'el-icon-loading',
  609. background: 'rgba(0, 0, 0, 0.7)'
  610. })
  611. var formdata = new FormData()
  612. formdata.append('file', data.file)
  613. let params = {
  614. orderDetailId: this.orderDetailId
  615. }
  616. if (!!params) {
  617. for (const key in params) {
  618. if (Object.hasOwnProperty.call(params, key)) {
  619. formdata.append(key, params[key])
  620. }
  621. }
  622. }
  623. listImport2({ formdata })
  624. .then(res => {
  625. this.getOrderDetail()
  626. this.getCodeDetail2()
  627. loading.close()
  628. this.$message({
  629. type: 'success',
  630. message: '导入成功!'
  631. })
  632. })
  633. .catch(err => {
  634. loading.close()
  635. this.$message({
  636. type: 'error',
  637. message: err.message || '导入失败'
  638. })
  639. })
  640. },
  641. // 下载导入模版
  642. handleDownload(title) {
  643. commonTemplateDownload({ name: '导入条码.xlsx' }, title).then(res => {
  644. this.$message({
  645. message: '下载成功',
  646. type: 'success'
  647. })
  648. }).catch(err => {
  649. this.$message.error('下载失败')
  650. })
  651. },
  652. },
  653. computed: {
  654. totalAmountCompute() {
  655. if(!this.orderDetail.totalAmount) {
  656. return 0
  657. }
  658. const totalAmount = parseFloat(this.orderDetail.totalAmount)
  659. const freight = parseFloat(this.orderDetail.freight)
  660. return (totalAmount - freight).toFixed(2)
  661. }
  662. }
  663. }
  664. </script>
  665. <style scoped lang="scss">
  666. .order-refund-main {
  667. margin-top: 15px;
  668. border: 1px solid #e5e5e5;
  669. .order-refund-main-title {
  670. font-size: 14px;
  671. }
  672. .order-refund-main-title span {
  673. margin-right: 15px;
  674. }
  675. .order-refund-main-status {
  676. color: #409EFF;
  677. padding: 15px 0;
  678. font-size: 24px;
  679. }
  680. .order-refund-main-opt-btn {
  681. padding: 15px 0;
  682. }
  683. }
  684. .order-refund-receive-info {
  685. margin: 15px 0;
  686. padding: 15px;
  687. background: #f5f7fa;
  688. :first-child div span {
  689. padding-right: 15px;
  690. }
  691. .el-row{
  692. padding-top: 15px;
  693. }
  694. }
  695. .order-refund-detail {
  696. background: #f5f7fa;
  697. .order-amount-info {
  698. padding: 15px 0;
  699. font-size: 12px;
  700. font-weight: bold;
  701. }
  702. }
  703. .main-detail {
  704. .title {
  705. font-size: 16px;
  706. font-weight: 700;
  707. margin-bottom: 20px;
  708. }
  709. .item {
  710. display: flex;
  711. font-size: 14px;
  712. color: #666;
  713. padding-bottom: 12px;
  714. .label {
  715. white-space: nowrap;
  716. }
  717. }
  718. }
  719. </style>
  720. <style lang="scss">
  721. .order-refund-detail {
  722. .el-table tr,.el-table th {
  723. background-color: #f5f7fa;
  724. }
  725. }
  726. </style>