detail.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <template>
  2. <div class="app-container">
  3. <div class="app-header-top" style="width: 100%;float: right;margin-bottom: 10px;">
  4. <div class="app-title">订单详情</div>
  5. <el-button type="primary" icon="el-icon-back" style="float: right;" @click="backToList">返回</el-button>
  6. </div>
  7. <el-card v-if="listLoading" class="box-card">
  8. <div class="refund-item">
  9. <el-row :gutter="24" class="box-row">
  10. <el-col :span="6"><b>下单时间:</b> {{ order.orderTime }}</el-col>
  11. <el-col :span="6"><b>订单编号(ID):</b> {{ order.orderNo + '(' + order.orderId + ')' }}</el-col>
  12. <el-col :span="6"><b>订单状态:</b>
  13. <template v-if="['11','12','13','21','22','23','31','32','33'].indexOf(order.status)>=0">
  14. <el-tag type="success" size="small">交易中</el-tag>
  15. </template>
  16. <template v-else>
  17. <el-tag :type="order.status*1===6?'info':''" size="small">{{ order.status | orderStatusFilter }}</el-tag>
  18. </template>
  19. </el-col>
  20. <el-col :span="6">
  21. <el-dropdown class="dropdown">
  22. <el-button type="primary" size="mini">
  23. 功能<i class="el-icon-arrow-down el-icon--right" />
  24. </el-button>
  25. <el-dropdown-menu slot="dropdown">
  26. <el-dropdown-item v-if="order.checkFlag === 1">
  27. <div @click="handeleDialogFormVisible"> 确认收款金额</div>
  28. </el-dropdown-item>
  29. <el-dropdown-item v-if="['11','12','21','22','31','32'].indexOf(order.status) !== -1">
  30. <div @click="handeleDropdown(1,order.orderId)">发货</div>
  31. </el-dropdown-item>
  32. <el-dropdown-item v-if="['4','5','12','13', '22', '23', '32', '33'].indexOf(order.status) !== -1">
  33. <div @click="handeleDropdown(2,order.orderId)">发货记录</div>
  34. </el-dropdown-item>
  35. <el-dropdown-item>
  36. <div @click="handeleDropdown(3,order.orderId)">收付款记录</div>
  37. </el-dropdown-item>
  38. <el-dropdown-item>
  39. <div @click="handeleDropdown(4,order.orderId)">退款(退货)记录</div>
  40. </el-dropdown-item>
  41. <el-dropdown-item>
  42. <div @click="handeleDropdown(5,order.orderId)">订单备注</div>
  43. </el-dropdown-item>
  44. </el-dropdown-menu>
  45. </el-dropdown>
  46. </el-col>
  47. </el-row>
  48. <el-row :gutter="24" class="box-row">
  49. <el-col :span="6"><b>收款状态:</b>
  50. <el-tag v-if="order.receiptStatus*1===1" type="danger" size="small">待收款</el-tag>
  51. <el-tag v-if="order.receiptStatus*1===2" type="warning" size="small">部分收款</el-tag>
  52. <el-tag v-if="order.receiptStatus*1===3" type="success" size="small">已收款</el-tag>
  53. </el-col>
  54. <el-col :span="6"><b>发货状态:</b>
  55. <el-tag v-if="order.sendOutStatus*1===1" type="danger" size="small">待发货</el-tag>
  56. <el-tag v-if="order.sendOutStatus*1===2" type="warning" size="small">部分发货</el-tag>
  57. <el-tag v-if="order.sendOutStatus*1===3" type="success" size="small">已发货</el-tag>
  58. </el-col>
  59. <el-col :span="6"><b>付款状态:</b>
  60. <el-tag v-if="order.payStatus*1===1" type="danger" size="small">待付款</el-tag>
  61. <el-tag v-if="order.payStatus*1===2" type="warning" size="small">部分付款</el-tag>
  62. <el-tag v-if="order.payStatus*1===3" type="success" size="small">已付款</el-tag>
  63. </el-col>
  64. <el-col :span="6"><b>退款状态:</b>
  65. <el-tag v-if="order.refundType*1===1" type="warning" size="small">部分退款</el-tag>
  66. <el-tag v-else-if="order.refundType*1===2" type="danger" size="small">已退款</el-tag>
  67. <el-tag v-else type="info" size="small">无退款</el-tag>
  68. </el-col>
  69. </el-row>
  70. </div>
  71. <div class="refund-item">
  72. <el-row v-if="order.bpOrderUserinfo" :gutter="24" class="box-row">
  73. <el-col v-if="order.bpOrderUserinfo" :span="6"><b>机构:</b> {{ order.clubName }}</el-col>
  74. </el-row>
  75. <el-row v-if="order.bpOrderUserinfo" :gutter="24" class="box-row">
  76. <el-col :span="6"><b>收货人:</b> {{ order.bpOrderUserinfo.shouHuoRen }}</el-col>
  77. <el-col :span="6"><b>手机:</b> {{ order.bpOrderUserinfo.mobile }}</el-col>
  78. <el-col :span="12"><b>地址:</b> {{ order.bpOrderUserinfo.province +' '+ order.bpOrderUserinfo.city +' '+ order.bpOrderUserinfo.town +' '+ order.bpOrderUserinfo.address }}</el-col>
  79. </el-row>
  80. <el-row :gutter="24" class="box-row">
  81. <el-col :span="6"><b>订单金额:</b> ¥{{ order.payTotalFee | toThousandFloatFilter }}</el-col>
  82. <el-col :span="6"><b>应收金额:</b>
  83. ¥{{ order.payTotalFee | toThousandFloatFilter }}
  84. </el-col>
  85. <el-col :span="12"><b>已收金额:</b>
  86. <template v-if="order.receiptStatus*1===1">¥0.00</template>
  87. <template v-else>¥{{ receiptAmount | toThousandFloatFilter }}</template>
  88. </el-col>
  89. </el-row>
  90. <el-row :gutter="24" class="box-row">
  91. <el-col :span="6"><b>退款金额(已完成):</b> ¥{{ returnValue | toThousandFloatFilter }}
  92. </el-col>
  93. <el-col :span="6"><b>运费:</b>
  94. <span>{{ order.postageInfo }}</span>
  95. </el-col>
  96. </el-row>
  97. </div>
  98. <div class="refund-item">
  99. <div v-for="shopOrder in order.newShopOrders" :key="shopOrder.shopOrderId" class="order-item">
  100. <el-row :gutter="22" class="box-row">
  101. <el-col :span="6"><b>下单时间:</b> {{ shopOrder.orderTime }}</el-col>
  102. <el-col :span="6"><b>子订单号(ID):</b> {{ shopOrder.shopOrderNo + '(' + shopOrder.shopOrderId + ')' }}</el-col>
  103. <el-col :span="6"><b>子订单金额:</b> ¥{{ shopOrder.needPayAmount | toThousandFloatFilter }}</el-col>
  104. </el-row>
  105. <el-row :gutter="22" class="box-row">
  106. <el-col :span="6"><b>商品总额:</b> ¥{{ shopOrder.productAmount | toThousandFloatFilter }}</el-col>
  107. <el-col :span="6"><b>应付金额:</b> ¥{{ shopOrder.shouldPayShopAmount | toThousandFloatFilter }}</el-col>
  108. <el-col :span="6"><b>已付金额:</b> ¥{{ shopOrder.payedShopAmount | toThousandFloatFilter }}</el-col>
  109. </el-row>
  110. <el-row :gutter="22" class="box-row">
  111. <el-col :span="6"><b>付款状态:</b>
  112. <el-tag v-if="shopOrder.payStatus*1===1" type="danger" size="small">待付款</el-tag>
  113. <el-tag v-if="shopOrder.payStatus*1===2" type="warning" size="small">部分付款</el-tag>
  114. <el-tag v-if="shopOrder.payStatus*1===3" type="success" size="small">已付款</el-tag>
  115. </el-col>
  116. <el-col :span="6"><b>发货状态:</b>
  117. <el-tag v-if="shopOrder.sendOutStatus*1===1" type="danger" size="small">待发货</el-tag>
  118. <el-tag v-if="shopOrder.sendOutStatus*1===2" type="warning" size="small">部分发货</el-tag>
  119. <el-tag v-if="shopOrder.sendOutStatus*1===3" type="success" size="small">已发货</el-tag>
  120. </el-col>
  121. <el-col :span="6"><b>待付金额:</b> ¥{{ shopOrder.waitPayShop | toThousandFloatFilter }}</el-col>
  122. </el-row>
  123. <el-row :gutter="22" class="box-row">
  124. <el-col :span="22"><b>留言:</b> {{ shopOrder.note ? shopOrder.note : '无' }}</el-col>
  125. </el-row>
  126. <el-row :gutter="22" class="box-row">
  127. <el-col :span="22"><b>供应商:</b> {{ shopOrder.shopName ? shopOrder.shopName : '无' }}</el-col>
  128. </el-row>
  129. <el-row :gutter="22">
  130. <el-table :data="shopOrder.newOrderProducts" border>
  131. <el-table-column label="商品图片" align="center" prop="productImage">
  132. <template slot-scope="{row}">
  133. <el-popover
  134. placement="top-start"
  135. title=""
  136. width="120"
  137. trigger="hover"
  138. >
  139. <img :src="row.productImage" alt="" style="width:100px;height:100px;">
  140. <img slot="reference" :src="row.productImage" alt="" style="width:50px;height:50px;">
  141. </el-popover>
  142. </template>
  143. </el-table-column>
  144. <el-table-column label="商品名" align="center" prop="name" />
  145. <el-table-column label="规格" align="center" prop="unit" />
  146. <el-table-column label="数量" align="center" prop="num" width="60" />
  147. <el-table-column label="单价" align="center" prop="price">
  148. <template slot-scope="{row}">
  149. <span>¥{{ row.price | amountfilters }}</span>
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="总价" align="center" prop="totalFee">
  153. <template slot-scope="{row}">
  154. <span>¥{{ row.totalFee | amountfilters }}</span>
  155. </template>
  156. </el-table-column>
  157. <el-table-column label="已发/已收" align="center" prop="returnedPurchaseProductNum">
  158. <template slot-scope="{row}">
  159. <span>{{ `${row.sendOutNum ? row.sendOutNum : 0}/${row.receivedNum ? row.receivedNum : 0}` }}</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="退款(退货)中/已完成" align="center" prop="returnedPurchaseProductNum">
  163. <template slot-scope="{row}">
  164. <span>{{ row.returningNum ? row.returningNum : 0 }} / {{ row.returnedNum ? row.returnedNum : 0 }}</span>
  165. </template>
  166. </el-table-column>
  167. </el-table>
  168. </el-row>
  169. </div>
  170. </div>
  171. <div class="refund-item">
  172. <template v-if="order.invoiceFlag === '0'">
  173. <el-row :gutter="24" class="box-row">
  174. <el-col :span="6"><b>发票信息:</b>不需要发票</el-col>
  175. </el-row>
  176. </template>
  177. <template v-else>
  178. <el-row :gutter="24" class="box-row">
  179. <el-col :span="6"><b>发票信息:</b> {{ orderInvoice.type | invoiceFilters }}</el-col>
  180. </el-row>
  181. <el-row :gutter="24" class="box-row">
  182. <el-col :span="6"><b>单位名称:</b> {{ orderInvoice.invoiceTitle }}</el-col>
  183. <el-col :span="6"><b>纳税人识别号:</b> {{ orderInvoice.corporationTaxNum }}</el-col>
  184. <el-col :span="8"><b>注册地址:</b> {{ orderInvoice.registeredAddress }}</el-col>
  185. </el-row>
  186. <el-row :gutter="24" class="box-row">
  187. <el-col :span="6"><b>注册电话:</b> {{ orderInvoice.registeredPhone }}</el-col>
  188. <el-col :span="6"><b>开户银行:</b> {{ orderInvoice.openBank }}</el-col>
  189. <el-col :span="8"><b>银行账号:</b> {{ orderInvoice.bankAccountNo }}</el-col>
  190. </el-row>
  191. </template>
  192. </div>
  193. <div v-if="voucher.length>0" class="refund-item">
  194. <h1 style="font-size: 14px;color: #409EFF;">线下支付凭证:</h1>
  195. <el-row v-for="(vouch,index) in voucher" :key="index" style="padding:5px 0">
  196. <p class="refund-item-p">{{ vouch.addTime }}</p>
  197. <div class="refund-item-imgs">
  198. <div v-for="(imgage,imgIndex) in vouch.images" :key="imgIndex" class="item-image">
  199. <img :src="imgage" alt="">
  200. </div>
  201. </div>
  202. <p class="refund-item-p">备注:{{ vouch.remarks }}</p>
  203. </el-row>
  204. </div>
  205. <el-dialog title="更改收款状态" :visible.sync="dialogFormVisible" width="600px">
  206. <el-form ref="dataForm" :rules="rules" :model="chengeOrder" label-position="right" label-width="150px">
  207. <el-row :gutter="24" class="box-row" style="margin-bottom: 40px;">
  208. <el-col :span="8"><b>应收金额:</b> ¥{{ order.payTotalFee | amountfilters }}</el-col>
  209. <el-col :span="8"><b>已收金额:</b>¥{{ receiptAmount | amountfilters }}</el-col>
  210. <el-col :span="8"><b>未收金额:</b> ¥{{ (order.payTotalFee - receiptAmount) | amountfilters }}</el-col>
  211. </el-row>
  212. <el-form-item label="订单本次收款金额:" prop="amount" :rules="rules.amount">
  213. <el-input v-model="chengeOrder.amount" style="width: 200px">
  214. <template slot="prepend">¥</template>
  215. </el-input>
  216. </el-form-item>
  217. </el-form>
  218. <div slot="footer" class="dialog-footer">
  219. <el-button @click="dialogFormVisible = false">取消</el-button>
  220. <el-button type="primary" :disabled="disabled" @click="handleChangOrder">确定</el-button>
  221. </div>
  222. </el-dialog>
  223. <Remarks dialog-title="订单备注信息" :is-visible.sync="dialogRemarksVisible" :order-id="dialogRemarksorderId" :remark-list="dialogRemarkList" />
  224. </el-card>
  225. </div>
  226. </template>
  227. <script>
  228. import { getDetail, getRemarks, orderCheckReceipt } from '@/api/order'
  229. import Remarks from './components/remarks'
  230. export default {
  231. components: { Remarks },
  232. filters: {
  233. invoiceFilters(value) {
  234. const map = {
  235. 0: '不开发票',
  236. 1: '普通发票',
  237. 2: '增值税发票'
  238. }
  239. return map[value]
  240. }
  241. },
  242. data() {
  243. const picValidator = (rule, value, callback) => {
  244. if (!this.chengeOrder.amount) {
  245. callback(new Error('请输入本次收款金额'))
  246. } else if (this.chengeOrder.amount > this.SubtrAount(this.order.payTotalFee, this.receiptAmount) * 1) {
  247. callback(new Error('本次收款金额不能大于未收金额'))
  248. } else {
  249. callback()
  250. }
  251. }
  252. return {
  253. activeIndex: '2',
  254. order: null,
  255. receiptAmount: 0,
  256. returnValue: 0,
  257. returnedPurchaseFee: 0,
  258. bpClauses: null,
  259. dialogRemarkList: [],
  260. dialogRemarksVisible: false,
  261. dialogRemarksorderId: 0,
  262. dialogFormVisible: false,
  263. chengeOrder: {
  264. orderId: this.$route.query.id * 1,
  265. amount: null
  266. },
  267. orderInvoice: {},
  268. voucher: [],
  269. rules: {
  270. amount: [{ required: true, validator: picValidator, trigger: 'blur' }]
  271. },
  272. listLoading: false
  273. }
  274. },
  275. computed: {
  276. orderId: function() {
  277. return this.$route.query.id * 1
  278. },
  279. disabled() {
  280. return !(this.chengeOrder.amount > 0)
  281. }
  282. },
  283. created() {
  284. this.fetchData()
  285. },
  286. methods: {
  287. fetchData() {
  288. getDetail({ id: this.orderId }).then(response => {
  289. this.order = response.data.order
  290. this.bpClauses = response.data.bpClauses
  291. this.receiptAmount = response.data.receiptAmount
  292. this.returnValue = response.data.returnValue
  293. this.returnedPurchaseFee = response.data.returnedPurchaseFee
  294. this.orderInvoice = this.order.orderInvoice
  295. this.voucher = response.data.voucher
  296. this.listLoading = true
  297. }).catch(() => {
  298. this.listLoading = true
  299. })
  300. },
  301. RemarksOrder: function(id) {
  302. getRemarks(id).then(response => {
  303. this.dialogRemarkList = response.data
  304. })
  305. this.dialogRemarksorderId = id
  306. this.dialogRemarksVisible = true
  307. },
  308. handeleDialogFormVisible() {
  309. this.dialogFormVisible = true
  310. },
  311. handeleDropdown(type, orderId) {
  312. switch (type) {
  313. case 1:// 发货
  314. this.$router.push({ path: '/order/deliver', query: { orderId: orderId }})
  315. break
  316. case 2:// 发货记录
  317. this.$router.push({ path: '/order/deliver-record', query: { orderId: orderId }})
  318. break
  319. case 3:// 收付款记录
  320. this.$router.push({ path: '/finance/remit-record', query: { orderId: orderId }})
  321. break
  322. case 4:// 退款(退货)记录
  323. this.$router.push({ path: '/finance/refund-record', query: { orderId: orderId }})
  324. break
  325. case 5:// 订单备注
  326. this.$router.push({ path: '/order/order-remarks', query: { orderId: orderId }})
  327. break
  328. }
  329. },
  330. async handleChangOrder() {
  331. // 确认本次收款金额
  332. this.$refs['dataForm'].validate(valid => {
  333. if (valid) {
  334. this.orderCheckReceipt()
  335. } else {
  336. return false
  337. }
  338. })
  339. },
  340. async orderCheckReceipt() {
  341. try {
  342. await orderCheckReceipt(this.chengeOrder)
  343. this.$message.success('操作成功')
  344. this.dialogFormVisible = false
  345. this.fetchData()
  346. } catch (error) {
  347. console.log('error', error)
  348. }
  349. },
  350. SubtrAount(arg1, arg2) {
  351. var r1, r2, m, n
  352. try {
  353. r1 = arg1.toString().split('.')[1].length
  354. } catch (e) {
  355. r1 = 0
  356. }
  357. try {
  358. r2 = arg2.toString().split('.')[1].length
  359. } catch (e) {
  360. r2 = 0
  361. }
  362. m = Math.pow(10, Math.max(r1, r2))
  363. n = (r1 >= r2) ? r1 : r2
  364. return ((arg1 * m - arg2 * m) / m).toFixed(n)
  365. },
  366. backToList() {
  367. this.$store.dispatch('tagsView/delView', this.$route).then(() => {
  368. this.$nextTick(() => {
  369. this.$router.replace({
  370. path: '/order/list'
  371. })
  372. })
  373. })
  374. }
  375. }
  376. }
  377. </script>
  378. <style scoped>
  379. .app-title{
  380. float: left;
  381. line-height: 36px;
  382. font-size: 18px;
  383. font-weight: bold;
  384. color: #999999;
  385. }
  386. .box-card{
  387. margin-top: 20px;
  388. font-size: 14px;
  389. }
  390. .box-row{
  391. padding: 10px 0;
  392. }
  393. .box-row .dropdown{
  394. margin-top: -10px;
  395. }
  396. .refund-item{
  397. padding: 10px 0;
  398. border-bottom:1px dashed #E4E7ED;
  399. }
  400. .refund-item-p{
  401. width: 100%;
  402. line-height: 18px;
  403. font-size: 14px;
  404. color: #666666;
  405. float: left;
  406. }
  407. .refund-item-imgs{
  408. width: 100%;
  409. height: auto;
  410. margin: 5px 0;
  411. }
  412. .refund-item-imgs .item-image{
  413. width: 148px;
  414. height: 148px;
  415. margin-right: 10px;
  416. border: 1px dashed #E1E1E1;
  417. float: left;
  418. }
  419. .refund-item-imgs .item-image img{
  420. width: 148px;
  421. height: 148px;
  422. display: block;
  423. }
  424. .order-item{
  425. background:#F7F7F7;
  426. padding:10px 20px;
  427. box-sizing: border-box;
  428. border-radius: 5px;
  429. margin-bottom: 10px;
  430. }
  431. .product-row{
  432. padding: 10px 0;
  433. background: #EBEEF5;
  434. border-top: 1px dashed #DCDFE6;
  435. }
  436. .op-item{
  437. padding: 5px 0;
  438. }
  439. </style>