index.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. <template>
  2. <div class="app-container">
  3. <el-page-header @back="goBack" content="订单详情"></el-page-header>
  4. <div class="order-main">
  5. <el-row style="padding: 15px 15px 10px">
  6. <el-col :span="24">
  7. <div class="order-main-title">
  8. <span>订单编号:{{ orderDetail.orderId }}</span>
  9. <span>下单时间:{{ orderDetail.createTime }}</span>
  10. <span>商户:{{ orderDetail.companyWechatName || '无' }}</span>
  11. <span>网点:{{ orderDetail.websitName || '无' }}</span>
  12. <div class="fr">
  13. <el-link type="primary" :underline="false" @click="showDialog('remark')">订单备注</el-link>
  14. </div>
  15. </div>
  16. </el-col>
  17. </el-row>
  18. <div style="width: 100%; padding: 10px 15px 15px 15px">
  19. <el-row>
  20. <el-col :span="8" style="border-right: 1px solid #e8e8e8;">
  21. <div class="order-main-status">
  22. <span>{{ orderDetail.orderStatus | ORDER_CURRENT_STATUS_FILTER }}</span>
  23. </div>
  24. <div class="order-main-opt-btn">
  25. <template v-if="orderDetail.orderStatus === 'NOPAY'">
  26. <el-popconfirm title="确定收款吗?" @confirm="confirmOrder">
  27. <el-button slot="reference" size="small">确认收款</el-button>
  28. </el-popconfirm>
  29. <el-button size="small" @click="showDialog('price')" style="margin-left: 10px;">修改价格</el-button>
  30. <el-popconfirm title="确定取消订单吗?" @confirm="cancelOrder" style="margin-left: 10px;">
  31. <el-button slot="reference" size="small" type="danger">取消订单</el-button>
  32. </el-popconfirm>
  33. </template>
  34. <template v-if="orderDetail.orderStatus === 'DFH'">
  35. <el-button size="small" type="primary" @click="showDialog('send')">发货</el-button>
  36. <el-popconfirm title="确定取消订单吗?" @confirm="cancelOrder" style="margin-left: 10px;">
  37. <el-button slot="reference" size="small" type="danger">取消订单</el-button>
  38. </el-popconfirm>
  39. </template>
  40. <template v-if="orderDetail.orderStatus === 'YFH' || orderDetail.orderStatus === 'OVER'">
  41. <el-button size="small" @click="showDialog('query')">查看物流</el-button>
  42. </template>
  43. </div>
  44. </el-col>
  45. <el-col :span="16" style="padding-top: 10px;">
  46. <el-steps :active="orderDetail.orderStatus != 'CLOSE' ? curOrderStatus : -1" align-center>
  47. <el-step title="买家下单" :description="orderDetail.createTime"></el-step>
  48. <el-step title="买家付款" :description="orderDetail.payTime ? orderDetail.payTime : ''"></el-step>
  49. <el-step title="商家发货" :description="orderDetail.deliverTime ? orderDetail.deliverTime : ''"></el-step>
  50. <el-step title="交易成功" :description="orderDetail.overTime ? orderDetail.overTime : ''"></el-step>
  51. </el-steps>
  52. </el-col>
  53. </el-row>
  54. </div>
  55. </div>
  56. <div class="order-receive-info" style="padding-bottom: 15px;">
  57. <el-row :gutter="30">
  58. <el-col :xs="24" :sm="12" :lg="12">
  59. <div class="main-detail">
  60. <div class="title">订单信息</div>
  61. <div class="item">
  62. <div class="label">收货人信息:</div>
  63. <div class="value">{{orderDetail.receUserName}} ({{orderDetail.recePhone}})</div>
  64. </div>
  65. <div class="item">
  66. <div class="label">收货人地址:</div>
  67. <div class="value">{{orderDetail.province + orderDetail.city + orderDetail.area + orderDetail.street + orderDetail.receAddress + orderDetail.houseNo}}</div>
  68. </div>
  69. <div class="item">
  70. <div class="label">销售员信息:</div>
  71. <div class="value">{{orderDetail.workerName}} ({{orderDetail.workerPhone}})</div>
  72. </div>
  73. <div class="item">
  74. <div class="label">团长信息:</div>
  75. <div class="value">{{orderDetail.promotionGroupUserName}} ({{orderDetail.promotionGroupMobile}})</div>
  76. </div>
  77. <div class="item">
  78. <div class="label">下单渠道:</div>
  79. <div class="value">{{orderDetail.source}}</div>
  80. </div>
  81. <div class="item">
  82. <div class="label">支付方式:</div>
  83. <div class="value">{{orderDetail.payType}}</div>
  84. </div>
  85. <div class="item">
  86. <div class="label">是否开票:</div>
  87. <div class="value">{{orderDetail.tax ? '是':'否'}}</div>
  88. </div>
  89. <div class="item" v-if="orderDetail.dispatchType">
  90. <div class="label">工单派单方式:</div>
  91. <div class="value">{{orderDetail.dispatchType}}</div>
  92. </div>
  93. </div>
  94. </el-col>
  95. <el-col :xs="24" :sm="12" :lg="12" v-if="orderDetail.orderStatus === 'YFH' || orderDetail.orderStatus === 'OVER'">
  96. <div class="main-detail">
  97. <div class="title">物流信息</div>
  98. <div class="item">
  99. <div class="label">快递单号:</div>
  100. <div class="value">{{orderDetail.logisticsNo}}</div>
  101. </div>
  102. <div class="item">
  103. <div class="label">快递公司:</div>
  104. <div class="value">{{orderDetail.companyName}}</div>
  105. </div>
  106. <div class="item">
  107. <div class="label">货件仓储:</div>
  108. <div class="value">{{orderDetail.storageName}}</div>
  109. </div>
  110. </div>
  111. </el-col>
  112. </el-row>
  113. </div>
  114. <div class="order-detail" v-if="compensateList.length > 0" style="margin-bottom: 20px;">
  115. <!-- 理赔表格 -->
  116. <el-table :data="compensateList" style="width: 100%;" size="small" border>
  117. <el-table-column prop="goodsName" label="理赔商品" align="center"></el-table-column>
  118. <el-table-column prop="num" label="理赔数量" align="center"></el-table-column>
  119. <el-table-column prop="createTime" label="理赔时间" align="center"></el-table-column>
  120. <el-table-column prop="refundAmount" label="理赔金额" align="center"></el-table-column>
  121. <el-table-column prop="operatorUser" label="操作人" align="center"></el-table-column>
  122. <el-table-column prop="remark" label="备注" align="center"></el-table-column>
  123. </el-table>
  124. </div>
  125. <div class="order-detail">
  126. <!-- 订单表格 -->
  127. <el-table :data="orderDetail.orderDetails" style="width: 100%" border>
  128. <el-table-column label="商品信息" min-width="200">
  129. <template slot-scope="scope">
  130. <el-row>
  131. <el-col :span="6">
  132. <el-image style="width: 40px; height: 40px" :src="scope.row.imgUrl">
  133. <div slot="error" class="image-slot">
  134. <i class="el-icon-picture-outline"></i>
  135. </div>
  136. </el-image>
  137. </el-col>
  138. <el-col :span="18">
  139. <div>{{ scope.row.goodsName }}</div>
  140. </el-col>
  141. </el-row>
  142. </template>
  143. </el-table-column>
  144. <el-table-column prop="goodsSpecName" label="规格" align="center"></el-table-column>
  145. <el-table-column prop="price" label="单价" align="center"></el-table-column>
  146. <el-table-column prop="num" label="数量" align="center"></el-table-column>
  147. <el-table-column prop="shareAmount" label="分销金额" align="center">
  148. <template slot-scope="scope">
  149. {{ orderDetail.workerId || orderDetail.promotionGroupUserId ? scope.row.shareAmount : '0' }}
  150. </template>
  151. </el-table-column>
  152. <el-table-column prop="discountAmount" label="优惠金额" align="center"></el-table-column>
  153. <!-- <el-table-column prop="zkAmount" label="折扣优惠" align="center"></el-table-column> -->
  154. <el-table-column prop="applyAmount" label="优惠价格申请" align="center" min-width="110"></el-table-column>
  155. <el-table-column prop="profitAmount" label="预计盈利" align="center">
  156. <template slot-scope="scope">
  157. {{ orderDetail.workerId || orderDetail.promotionGroupUserId ? scope.row.profitAmount : scope.row.payAmount }}
  158. </template>
  159. </el-table-column>
  160. <el-table-column prop="payAmount" label="商品总金额" align="center" min-width="100"></el-table-column>
  161. <el-table-column prop="freight" label="运费" align="center"></el-table-column>
  162. <el-table-column prop="refundNum" label="退款数量" align="center"></el-table-column>
  163. <el-table-column prop="refundAmount" label="退款金额" align="center"></el-table-column>
  164. <el-table-column label="操作" align="center" width="160" v-if="orderDetail.orderStatus != 'CLOSE'">
  165. <template slot-scope="scope">
  166. <el-button size="mini" type="primary" @click="handleRefund(scope.row)" :disabled="!orderDetail.refundAble || scope.row.refundNum >= scope.row.num">退款</el-button>
  167. <el-button size="mini" @click="handleCompensate(scope.row)">理赔</el-button>
  168. </template>
  169. </el-table-column>
  170. </el-table>
  171. <div class="order-amount-info">
  172. <el-row>
  173. <el-col :span="19"><div style="width: 1px;height: 1px;"></div></el-col>
  174. <el-col :span="5">
  175. <div style="padding-bottom: 10px;">商品总价:¥ {{ orderDetail.totalAmount }}</div>
  176. <div style="padding-bottom: 10px;">运费:¥ {{ orderDetail.freight }}</div>
  177. <div style="padding-bottom: 10px;" v-if="orderDetail.discountAmount">
  178. 优惠:¥ {{ orderDetail.discountAmount }}
  179. <span v-if="orderDetail.exchangeCode">(优惠码:{{ orderDetail.exchangeCode }})</span>
  180. <span v-if="orderDetail.promotionDiscountRate">({{orderDetail.promotionDiscountRate * 10}}折)</span>
  181. </div>
  182. <div style="font-size: 14px;">
  183. <span style="padding-right: 15px;">实际收款</span><span style="color: red;font-size: 18px;">¥ {{ orderDetail.payAmount }}</span>
  184. </div>
  185. </el-col>
  186. </el-row>
  187. </div>
  188. </div>
  189. <div class="order-evaluate-info" v-if="evaluateDetail">
  190. <div class="title">
  191. <div class="left">评价信息<span>{{evaluateDetail.createTime}}</span></div>
  192. <div class="right">
  193. <span>是否客户端展示</span>
  194. <el-switch v-model="evaluateDetail.isShow" @change="changeShow"></el-switch>
  195. </div>
  196. </div>
  197. <div class="main">
  198. <div class="rate-list">
  199. <div style="display: flex; align-items: center; margin-bottom: 5px;">商品质量:<el-rate :value="evaluateDetail.commentGoods" disabled disabled-void-color="#DDDDDD"></el-rate></div>
  200. <div style="display: flex; align-items: center; margin-bottom: 5px;">服务质量:<el-rate :value="evaluateDetail.commentService" disabled disabled-void-color="#DDDDDD"></el-rate></div>
  201. <div style="display: flex; align-items: center;">配送质量:<el-rate :value="evaluateDetail.commentExpress" disabled disabled-void-color="#DDDDDD"></el-rate></div>
  202. </div>
  203. <div class="tag-list" v-if="orderDetail.orderCommentTags && orderDetail.orderCommentTags.length > 0">
  204. <el-tag v-for="(item, index) in orderDetail.orderCommentTags" :key="index">{{item}}</el-tag>
  205. </div>
  206. </div>
  207. <div class="content">{{evaluateDetail.content}}</div>
  208. <div class="img-list" v-if="orderDetail.orderCommentImgs && orderDetail.orderCommentImgs.length > 0">
  209. <el-image v-for="(item, index) in orderDetail.orderCommentImgs" :key="index" :src="item" :preview-src-list="orderDetail.orderCommentImgs" fit="cover"></el-image>
  210. </div>
  211. </div>
  212. <el-dialog :title="dialogTitle" :visible.sync="remarkVisible" :show-close="false" :width="dialogWidth" :close-on-click-modal="false">
  213. <el-form :model="orderForm" :rules="orderFormRules" ref="orderForm" v-if="curOpenDialogType !== 'query'" label-width="90px" label-position="left">
  214. <el-form-item prop="remark" v-if="curOpenDialogType === 'remark'">
  215. <el-input
  216. type="textarea"
  217. :autosize="{ minRows: 8, maxRows: 16}"
  218. placeholder="请输入备注内容"
  219. v-model="remark"
  220. maxlength="100"
  221. show-word-limit>
  222. </el-input>
  223. </el-form-item>
  224. <el-form-item prop="payAmount" v-if="curOpenDialogType === 'price'">
  225. <el-input v-model="orderForm.payAmount" autocomplete="off" placeholder="请输入价格"></el-input>
  226. </el-form-item>
  227. <el-form-item label="收货人" prop="receUserName" v-if="curOpenDialogType === 'info'">
  228. <el-input v-model="orderForm.receUserName" autocomplete="off" placeholder="请输入收货人"></el-input>
  229. </el-form-item>
  230. <el-form-item label="收货电话" prop="recePhone" v-if="curOpenDialogType === 'info'">
  231. <el-input v-model="orderForm.recePhone" autocomplete="off" placeholder="请输入收货电话"></el-input>
  232. </el-form-item>
  233. <el-form-item label="收货地址" prop="receAddress" v-if="curOpenDialogType === 'info'">
  234. <el-input v-model="orderForm.receAddress" autocomplete="off" placeholder="请输入收货地址"></el-input>
  235. </el-form-item>
  236. <el-form-item label="快递单号" prop="logisticsNo" v-if="curOpenDialogType === 'send'">
  237. <el-input v-model="orderForm.logisticsNo" autocomplete="off" placeholder="请输入快递单号"></el-input>
  238. </el-form-item>
  239. <el-form-item label="物流公司" prop="companyCode" v-if="curOpenDialogType === 'send'">
  240. <el-select v-model="orderForm.companyCode" placeholder="请选择物流公司" style="width: 100%;">
  241. <el-option :label="item.name" :value="item.code" v-for="(item, index) in companyList" :key="index"></el-option>
  242. </el-select>
  243. </el-form-item>
  244. <el-form-item label="仓储" prop="storageId" v-if="curOpenDialogType === 'send'">
  245. <el-select v-model="orderForm.storageId" placeholder="请选择仓储" style="width: 100%;">
  246. <el-option :label="item.storageName" :value="item.storageId" v-for="(item, index) in storageList" :key="index"></el-option>
  247. </el-select>
  248. </el-form-item>
  249. <el-form-item label="是否派单" prop="workOrder" v-if="curOpenDialogType === 'send'">
  250. <el-radio-group v-model="orderForm.workOrder">
  251. <el-radio :label="true">是</el-radio>
  252. <el-radio :label="false">否</el-radio>
  253. </el-radio-group>
  254. </el-form-item>
  255. </el-form>
  256. <el-table v-loading="logisticsLoading" :data="logistics" style="width: 100%" size="mini" v-if="curOpenDialogType === 'query'">
  257. <el-table-column prop="comName" label="物流公司" align="center"></el-table-column>
  258. <el-table-column prop="areaName" label="地区名称" align="center"></el-table-column>
  259. <el-table-column prop="time" label="物流时间" align="center"></el-table-column>
  260. <el-table-column prop="state" label="物流状态" align="center">
  261. <template slot-scope="scope">
  262. {{ scope.row.state | EXPRESS_CURRENT_STATE_FILTER }}
  263. </template>
  264. </el-table-column>
  265. <el-table-column prop="context" label="物流详情" align="center"></el-table-column>
  266. </el-table>
  267. <div slot="footer" class="dialog-footer">
  268. <el-button type="primary" @click="saveForm" v-if="curOpenDialogType !== 'query'">保 存</el-button>
  269. <el-button @click="cancelForm">{{ curOpenDialogType === 'query' ? '关 闭' : '取 消' }}</el-button>
  270. </div>
  271. </el-dialog>
  272. <el-dialog title="理赔" :visible.sync="compensateFormVisible" width="30%" :close-on-click-modal="false">
  273. <el-form ref="compensateForm" :model="compensateForm" :rules="compensateFormRules" label-position="left">
  274. <el-form-item label="理赔数量" prop="num">
  275. <el-input v-model="compensateForm.num" autocomplete="off"></el-input>
  276. </el-form-item>
  277. <el-form-item label="理赔金额" prop="amount">
  278. <el-input v-model="compensateForm.amount" autocomplete="off"></el-input>
  279. </el-form-item>
  280. <el-form-item label="备注" prop="remark">
  281. <el-input v-model="compensateForm.remark" autocomplete="off" type="textarea" :rows="3"></el-input>
  282. </el-form-item>
  283. </el-form>
  284. <div slot="footer" class="dialog-footer">
  285. <el-button @click="cancelCompensateForm">取 消</el-button>
  286. <el-button type="primary" @click="submitCompensateForm">确 定</el-button>
  287. </div>
  288. </el-dialog>
  289. </div>
  290. </template>
  291. <script>
  292. import {
  293. cancelOrder,
  294. changePrice,
  295. changeReceiveInfo,
  296. confirmOrder,
  297. getOrderDetail, goodsDeliver,
  298. saveRemark, orderRefund, orderCompensate, getCompensateList,
  299. changeShow
  300. } from "@/api/order";
  301. import {getExpress, getCompanyList} from "@/api/common";
  302. import * as Storage from "@/api/storage";
  303. import { mapGetters } from 'vuex'
  304. export default {
  305. name: "detail",
  306. data() {
  307. return {
  308. orderId: '',
  309. orderDetail: {},
  310. evaluateDetail: null,
  311. dialogTitle: '',
  312. remarkVisible: false,
  313. remark: '',
  314. price: 0,
  315. orderForm: {
  316. orderId: '',
  317. payAmount: '',
  318. receAddress: '',
  319. receUserName: '',
  320. recePhone: '',
  321. logisticsNo: '',
  322. companyCode: '',
  323. workOrder: true,
  324. },
  325. orderFormRules: {
  326. payAmount: [
  327. { validator: (rule, value, callback) => {
  328. if(this.curOpenDialogType !== 'price') {
  329. callback()
  330. } else {
  331. if (!value) {
  332. callback(new Error('请输入价格'))
  333. } else {
  334. if (!this.isNumber(value)) {
  335. callback(new Error('请输入数字值'))
  336. } else {
  337. callback()
  338. }
  339. }
  340. }
  341. }, trigger: 'blur' }
  342. ],
  343. receUserName: [
  344. { require: true, message: '请输入收货人', trigger:'blur' }
  345. ],
  346. recePhone: [
  347. { require: true, message: '请输入收货电话', trigger:'blur' }
  348. ],
  349. receAddress: [
  350. { require: true, message: '请输入收货地址', trigger:'blur' }
  351. ],
  352. logisticsNo: [
  353. { validator: (rule, value, callback) => {
  354. if(this.curOpenDialogType !== 'send') {
  355. callback()
  356. } else {
  357. if (!value) {
  358. callback(new Error('请输入快递单号'))
  359. } else {
  360. callback()
  361. }
  362. }
  363. }, trigger: 'blur' }
  364. ],
  365. storageId: [
  366. { validator: (rule, value, callback) => {
  367. if(this.curOpenDialogType !== 'send') {
  368. callback()
  369. } else {
  370. if (!value) {
  371. callback(new Error('请选择仓储'))
  372. } else {
  373. callback()
  374. }
  375. }
  376. }, trigger: 'change' }
  377. ],
  378. companyCode: [
  379. { validator: (rule, value, callback) => {
  380. if(this.curOpenDialogType !== 'send') {
  381. callback()
  382. } else {
  383. if (!value) {
  384. callback(new Error('请选择快递公司'))
  385. } else {
  386. callback()
  387. }
  388. }
  389. }, trigger: 'change' }
  390. ]
  391. },
  392. curOpenDialogType: 'order',
  393. logistics: [],
  394. storageList: [],
  395. dialogWidth: '50%',
  396. logisticsLoading: false,
  397. companyList: [],
  398. compensateFormVisible: false,
  399. compensateForm: {
  400. id: null,
  401. num: '',
  402. amount: '',
  403. remark: '',
  404. },
  405. compensateFormRules: {
  406. num: [
  407. { required: true, message: '请输入理赔数量', trigger: 'blur' },
  408. { validator: (rule, value, callback) => {
  409. if(value > (this.compensateItem.num - this.compensateItem.refundNum)) {
  410. callback(new Error('最多还可以理赔' + (this.compensateItem.num - this.compensateItem.refundNum) + '件商品'));
  411. } else {
  412. callback();
  413. }
  414. }, trigger: 'blur' }
  415. ],
  416. amount: [
  417. { required: true, message: '请输入理赔金额', trigger: 'blur' },
  418. ]
  419. },
  420. compensateItem: {
  421. num: '',
  422. refundNum: '',
  423. },
  424. compensateList: [],
  425. }
  426. },
  427. created() {
  428. this.orderId = this.$route.query.orderId
  429. this.getDetail();
  430. this.getStorageList();
  431. this.getCompanyList();
  432. this.getCompensateList();
  433. },
  434. methods: {
  435. getDetail() {
  436. getOrderDetail({ orderId: this.orderId }).then((res) => {
  437. this.orderDetail = res.data
  438. this.orderDetail.workerName = this.orderDetail.workerName ? this.orderDetail.workerName : '暂无'
  439. this.orderDetail.workerPhone = this.orderDetail.workerPhone ? this.orderDetail.workerPhone : ''
  440. this.evaluateDetail = res.data.orderComment;
  441. })
  442. },
  443. showDialog(type) {
  444. this.dialogWidth = type === 'query' ? '80%' : '50%'
  445. this.remarkVisible = true
  446. this.curOpenDialogType = type
  447. if (type === 'remark') {
  448. this.dialogTitle = '订单备注'
  449. this.remark = this.orderDetail.remark
  450. } else if (type === 'price') {
  451. this.dialogTitle = '修改价格'
  452. this.orderForm.payAmount = this.orderDetail.payAmount
  453. } else if (type === 'info') {
  454. this.dialogTitle = '收货人信息'
  455. this.orderForm.receUserName = this.orderDetail.receUserName
  456. this.orderForm.recePhone = this.orderDetail.recePhone
  457. this.orderForm.receAddress = this.orderDetail.receAddress
  458. } else if (type === 'send') {
  459. this.dialogTitle = '发货信息'
  460. } else if (type === 'query') {
  461. this.logisticsLoading = true
  462. this.dialogTitle = '物流信息'
  463. getExpress({
  464. logisticsNo: this.orderDetail.logisticsNo,
  465. companyCode: this.orderDetail.companyCode
  466. }).then(res => {
  467. this.logistics = res.data
  468. this.logisticsLoading = false
  469. })
  470. }
  471. },
  472. cancelForm() {
  473. this.remarkVisible = false
  474. if (this.curOpenDialogType === 'query') {
  475. return
  476. }
  477. this.$refs.orderForm.resetFields()
  478. if (this.curOpenDialogType === 'remark') {
  479. this.remark = ''
  480. } else if (this.curOpenDialogType === 'price') {
  481. this.price = ''
  482. }
  483. },
  484. saveForm() {
  485. const params = {
  486. orderId: this.orderId
  487. }
  488. if (this.curOpenDialogType === 'remark') {
  489. params.remark = this.remark
  490. saveRemark(params).then(() => {
  491. this.cancelForm();
  492. this.getDetail();
  493. this.$successMsg('保存成功');
  494. })
  495. } else if (this.curOpenDialogType === 'price') {
  496. params.price = this.orderForm.payAmount
  497. this.$refs.orderForm.validate((valid) => {
  498. if (valid) {
  499. changePrice(params).then(() => {
  500. this.cancelForm();
  501. this.getDetail();
  502. this.$successMsg('保存成功');
  503. })
  504. }
  505. })
  506. } else if (this.curOpenDialogType === 'info') {
  507. params.receUserName = this.orderForm.receUserName
  508. params.recePhone = this.orderForm.recePhone
  509. params.receAddress = this.orderForm.receAddress
  510. params.orderStatus = this.orderDetail.orderStatus
  511. this.$refs.orderForm.validate((valid) => {
  512. if (valid) {
  513. changeReceiveInfo(params).then(() => {
  514. this.cancelForm();
  515. this.getDetail();
  516. this.$successMsg('保存成功');
  517. })
  518. }
  519. })
  520. } else if (this.curOpenDialogType === 'send') {
  521. params.logisticsNo = this.orderForm.logisticsNo
  522. params.storageId = this.orderForm.storageId
  523. params.companyCode = this.orderForm.companyCode
  524. params.workOrder = this.orderForm.workOrder
  525. this.$refs.orderForm.validate((valid) => {
  526. if (valid) {
  527. goodsDeliver(params).then(() => {
  528. this.cancelForm();
  529. this.getDetail();
  530. this.$successMsg('保存成功');
  531. })
  532. }
  533. })
  534. }
  535. },
  536. cancelOrder() {
  537. cancelOrder({ orderId: this.orderId }).then(() => {
  538. this.getDetail();
  539. this.$successMsg('取消成功');
  540. })
  541. },
  542. confirmOrder() {
  543. confirmOrder({ orderId: this.orderId }).then(() => {
  544. this.getDetail();
  545. this.$successMsg('确认收款成功');
  546. })
  547. },
  548. goBack() {
  549. this.$router.go(-1);
  550. },
  551. isNumber(val) {
  552. const regPos = /^\d+(\.\d+)?$/
  553. const regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/
  554. if (regPos.test(val) || regNeg.test(val)) {
  555. return true
  556. } else {
  557. return false
  558. }
  559. },
  560. getStorageList() {
  561. Storage.getList({ pageNum: 1, pageSize: 100 }).then(res => {
  562. this.storageList = res.data.records
  563. })
  564. },
  565. // 获取物流公司列表
  566. getCompanyList() {
  567. getCompanyList().then(res => {
  568. this.companyList = res.data;
  569. })
  570. },
  571. // 退款
  572. handleRefund(row) {
  573. console.log(row);
  574. if(row.num == 1) {
  575. this.$confirm('此操作将退款此商品, 是否继续?', '退款', {
  576. confirmButtonText: '确定',
  577. cancelButtonText: '取消',
  578. type: 'warning'
  579. }).then(() => {
  580. this.orderRefund(1, row.orderDetailId);
  581. }).catch(() => {});
  582. }
  583. else {
  584. this.$prompt('请输入退款数量', '退款', {
  585. confirmButtonText: '确定',
  586. cancelButtonText: '取消',
  587. inputValidator: function(value) {
  588. if(!value) return '请输入退款数量';
  589. if(value == 0) return '退款数量不能小于1';
  590. if(value > (row.num - row.refundNum)) {
  591. return '最多还可以退款' + (row.num - row.refundNum) + '件商品'
  592. }
  593. },
  594. }).then(({ value }) => {
  595. this.orderRefund(value, row.orderDetailId);
  596. }).catch(() => {});
  597. }
  598. },
  599. // 退款
  600. orderRefund(num, id) {
  601. orderRefund({
  602. num: num,
  603. orderDetailId: id,
  604. }).then(res => {
  605. this.getDetail();
  606. this.$successMsg('退款成功');
  607. })
  608. },
  609. // 理赔
  610. handleCompensate(row) {
  611. this.compensateFormVisible = true;
  612. this.compensateForm.id = row.orderDetailId;
  613. this.compensateItem.num = row.num;
  614. this.compensateItem.refundNum = row.refundNum;
  615. },
  616. // 取消 理赔
  617. cancelCompensateForm(){
  618. this.compensateFormVisible = false;
  619. this.compensateForm = {
  620. id: null,
  621. num: '',
  622. amount: '',
  623. remark: '',
  624. }
  625. },
  626. // 提交 理赔
  627. submitCompensateForm() {
  628. this.$refs.compensateForm.validate((valid) => {
  629. if (valid) {
  630. let params = {
  631. adminUserId: this.userid,
  632. orderDetailId: this.compensateForm.id,
  633. num: this.compensateForm.num,
  634. refundAmount: this.compensateForm.amount,
  635. remark: this.compensateForm.remark,
  636. }
  637. orderCompensate(params).then(res => {
  638. this.cancelCompensateForm();
  639. this.getDetail();
  640. this.getCompensateList();
  641. this.$successMsg('理赔成功');
  642. })
  643. }
  644. });
  645. },
  646. // 获取理赔列表
  647. getCompensateList() {
  648. getCompensateList({orderId: this.orderId}).then(res => {
  649. this.compensateList = res.data;
  650. })
  651. },
  652. // 切换评价信息是否显示
  653. changeShow() {
  654. changeShow({
  655. isShow: this.evaluateDetail.isShow,
  656. orderId: this.orderId,
  657. }).then(res => {
  658. this.getDetail();
  659. this.$successMsg();
  660. })
  661. }
  662. },
  663. computed: {
  664. ...mapGetters([
  665. 'userid',
  666. 'name'
  667. ]),
  668. curOrderStatus() {
  669. switch (this.orderDetail.orderStatus) {
  670. case 'NOPAY':
  671. return 1
  672. break;
  673. case 'DFH':
  674. return 2
  675. break;
  676. case 'YFH':
  677. return 3
  678. break;
  679. case 'OVER':
  680. return 4
  681. break;
  682. default:
  683. return 1
  684. }
  685. },
  686. totalAmountCompute() {
  687. if(!this.orderDetail.totalAmount) {
  688. return 0
  689. }
  690. const totalAmount = parseFloat(this.orderDetail.totalAmount)
  691. const freight = parseFloat(this.orderDetail.freight)
  692. return (totalAmount - freight).toFixed(2)
  693. }
  694. }
  695. }
  696. </script>
  697. <style scoped lang="scss">
  698. .order-main {
  699. margin-top: 15px;
  700. border: 1px solid #e5e5e5;
  701. .order-main-title {
  702. font-size: 14px;
  703. }
  704. .order-main-title span {
  705. margin-right: 15px;
  706. }
  707. .order-main-status {
  708. padding: 15px 0;
  709. font-size: 24px;
  710. color: #409EFF;
  711. }
  712. .order-main-opt-btn {
  713. padding: 15px 0;
  714. }
  715. }
  716. .order-receive-info {
  717. margin: 15px 0;
  718. padding: 15px;
  719. background: #f5f7fa;
  720. :first-child div span {
  721. padding-right: 15px;
  722. }
  723. .el-row{
  724. padding-top: 15px;
  725. }
  726. }
  727. .order-detail {
  728. background: #f5f7fa;
  729. .order-amount-info {
  730. padding: 15px 0;
  731. font-size: 12px;
  732. font-weight: bold;
  733. }
  734. ::v-deep .el-table tr, ::v-deep .el-table th {
  735. background-color: #f5f7fa;
  736. }
  737. }
  738. .main-detail {
  739. .title {
  740. font-size: 16px;
  741. font-weight: 700;
  742. margin-bottom: 20px;
  743. }
  744. .item {
  745. display: flex;
  746. font-size: 14px;
  747. color: #666;
  748. padding-bottom: 12px;
  749. .label {
  750. white-space: nowrap;
  751. }
  752. }
  753. }
  754. .order-evaluate-info {
  755. margin: 15px 0;
  756. padding: 30px 15px;
  757. background: #f5f7fa;
  758. .title {
  759. display: flex;
  760. justify-content: space-between;
  761. align-items: center;
  762. .left {
  763. font-size: 16px;
  764. font-weight: 700;
  765. span {
  766. font-weight: normal;
  767. margin-left: 20px;
  768. font-size: 14px;
  769. color: #666;
  770. }
  771. }
  772. .right {
  773. display: flex;
  774. align-items: center;
  775. font-size: 14px;
  776. span {
  777. margin-right: 10px;
  778. }
  779. }
  780. }
  781. .main {
  782. margin-top: 20px;
  783. display: flex;
  784. .rate-list {
  785. font-size: 14px;
  786. flex-shrink: 0;
  787. }
  788. .tag-list {
  789. margin-left: 30px;
  790. ::v-deep .el-tag {
  791. margin-right: 10px;
  792. margin-bottom: 10px;
  793. }
  794. }
  795. }
  796. .content {
  797. width: 400px;
  798. line-height: 20px;
  799. font-size: 14px;
  800. color: #333;
  801. margin-top: 10px;
  802. }
  803. .img-list {
  804. display: flex;
  805. flex-wrap: wrap;
  806. margin-top: 10px;
  807. width: 400px;
  808. ::v-deep .el-image {
  809. width: 100px;
  810. height: 100px;
  811. margin-right: 10px;
  812. margin-bottom: 10px;
  813. border: 1px solid #eaeaea;
  814. }
  815. }
  816. }
  817. </style>