index.vue 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never">
  4. <!-- 搜索表单 -->
  5. <el-form :model="table.where" label-width="77px" class="ele-form-search"
  6. @keyup.enter.native="$refs.table.reload()" @submit.native.prevent>
  7. <el-row :gutter="15">
  8. <el-col :md="6" :sm="12">
  9. <el-form-item label="订单号:">
  10. <el-input v-model="table.where.order_no" placeholder="请输入订单号" clearable/>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :md="4" :sm="12">
  14. <el-form-item label="订单状态:">
  15. <el-select v-model="table.where.status" placeholder="请选择" class="ele-fluid">
  16. <el-option label="全部" value="0"/>
  17. <el-option label="待付款" value="1"/>
  18. <el-option label="交易中" value="2"/>
  19. <el-option label="已付款" value="3"/>
  20. <el-option label="已完成" value="4"/>
  21. <el-option label="异常订单" value="5"/>
  22. <el-option label="退款订单" value="6"/>
  23. <el-option label="超时订单" value="7"/>
  24. <el-option label="已取消" value="8"/>
  25. </el-select>
  26. </el-form-item>
  27. </el-col>
  28. <el-col :md="4" :sm="12">
  29. <el-form-item label="异常状态:">
  30. <el-select v-model="table.where.exception_status" placeholder="请选择" class="ele-fluid">
  31. <el-option label="全部" value="0"/>
  32. <el-option label="处理中" value="1"/>
  33. <el-option label="已处理" value="2"/>
  34. </el-select>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :md="6" :sm="8">
  38. <el-form-item label="起止日期:" prop="date">
  39. <el-date-picker
  40. v-model="table.where.date"
  41. type="daterange"
  42. placeholder="选择起止日期"
  43. size="small"
  44. value-format="yyyy-MM-dd"
  45. format="yyyy-MM-dd">
  46. </el-date-picker>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :md="6" :sm="12">
  50. <div class="ele-form-actions">
  51. <el-button type="primary" @click="$refs.table.reload()" icon="el-icon-search"
  52. class="ele-btn-icon">查询
  53. </el-button>
  54. <el-button
  55. @click="(table.where={type: '2',status: '0', exception_status: '0'})&&$refs.table.reload()">
  56. 重置
  57. </el-button>
  58. <el-button @click="exportData" icon="el-icon-download" type="success" class="ele-btn-icon" v-if="permission.includes('sys:buyorder:export')">导出</el-button>
  59. </div>
  60. </el-col>
  61. </el-row>
  62. </el-form>
  63. <!-- 操作按钮 -->
  64. <div class="ele-table-tool ele-table-tool-default">
  65. <el-button @click="remove()" type="danger" icon="el-icon-delete" class="ele-btn-icon" size="small"
  66. v-if="permission.includes('sys:user:dall')">批量删除
  67. </el-button>
  68. </div>
  69. <!-- 数据表格 -->
  70. <ele-data-table ref="table" :config="table" :choose.sync="choose" height="calc(100vh - 315px)"
  71. highlight-current-row>
  72. <template slot-scope="{index}">
  73. <el-table-column type="selection" :index="index" width="45" align="center" fixed="left"/>
  74. <el-table-column prop="time_text" label="提交时间" width="60" align="center" fixed="left"
  75. show-overflow-tooltip/>
  76. <el-table-column prop="c_username" label="提交用户" fixed="left" show-overflow-tooltip width="110"/>
  77. <el-table-column prop="order_no" label="订单号" min-width="100" align="center" show-overflow-tooltip/>
  78. <el-table-column prop="num" label="交易数量(USDT)" min-width="130" align="center" show-overflow-tooltip>
  79. <template slot-scope="{row}">
  80. {{ row.num }}
  81. </template>
  82. </el-table-column>
  83. <el-table-column prop="price" label="单价(¥)" sortable="custom" show-overflow-tooltip min-width="90"/>
  84. <el-table-column prop="total" label="交易总额(¥)" sortable="custom" show-overflow-tooltip
  85. min-width="110"/>
  86. <el-table-column prop="payment" label="收款信息" sortable="custom" show-overflow-tooltip
  87. min-width="180">
  88. <template slot-scope="{row}">
  89. <div v-if="row.paymentData && row.paymentData.payment_id>0">
  90. <div v-if="row.paymentData.type==1">
  91. <div>收款人名称:{{ row.paymentData.real_name }}</div>
  92. <div>收款人账号:{{ row.paymentData.bank_card }}</div>
  93. <div>收款银行:{{ row.paymentData.bank_name }} {{ row.paymentData.branch_name }}</div>
  94. </div>
  95. <div v-else>
  96. <div>收款人名称:{{ row.paymentData.real_name }}</div>
  97. <div>收款人账号:{{ row.paymentData.account }}</div>
  98. <div>{{ (row.paymentData.type == 2 ? '微信' : '支付宝') }}收款码:
  99. <el-image
  100. style="width: 100px; height: 100px"
  101. :src="row.paymentData.qrcode"
  102. :preview-src-list="[row.paymentData.qrcode]">
  103. </el-image>
  104. </div>
  105. </div>
  106. </div>
  107. </template>
  108. </el-table-column>
  109. <el-table-column prop="status" label="状态" min-width="90px" sortable="custom">
  110. <template slot-scope="{row}">
  111. <span v-if="row.status ==1" class=" ele-text-info">待付款</span>
  112. <span v-else-if="row.status ==2" class=" ele-text-info">交易中</span>
  113. <span v-else-if="row.status ==3" class=" ele-text-primary" title="点击查看打款信息">您已打款<br><el-link
  114. type="success" :underline="true"
  115. @click="showPay(row,index)">({{ row.pay_name }})</el-link></span>
  116. <span v-else-if="row.status ==4" class=" ele-text-success">交易完成</span>
  117. <span v-else-if="row.status ==5" class=" ele-text-danger">异常订单</span>
  118. <span v-else-if="row.status ==6" class=" ele-text-warning">退款订单</span>
  119. <span v-else-if="row.status ==7" class=" ele-text-info">超时订单</span>
  120. <span v-else-if="row.status ==8" class=" ele-text-danger">
  121. {{ (row.exception_remark ? row.exception_remark : '已取消') }}
  122. </span>
  123. </template>
  124. </el-table-column>
  125. <el-table-column label="操作" min-width="220px" align="center" :resizable="false" fixed="right">
  126. <template slot-scope="{row}">
  127. <el-link @click="detail(row, index)" icon="el-icon-edit" type="primary" :underline="false"
  128. v-if="$store.state.user.user.user_type==1 && permission.includes('sys:buyorder:edit')">
  129. 详情
  130. </el-link>
  131. <el-link icon="el-icon-edit" type="success" @click="showPay(row, index)"
  132. :underline="false"
  133. v-if="$store.state.user.user.user_type==2 && (row.status<3 || row.status==7) && permission.includes('sys:buyorder:edit')">
  134. 确认打款
  135. </el-link>
  136. <el-link icon="el-icon-edit" type="success" @click="collection(row, index)"
  137. :underline="false"
  138. v-if="$store.state.user.user.user_type==1 && (row.status<4 || row.status==7) && permission.includes('sys:buyorder:edit')">
  139. 确认完成
  140. </el-link>
  141. <el-link @click="catchOrder(row, index)" icon="el-icon-edit" type="danger"
  142. :underline="false"
  143. v-if="(row.status >= 3 && row.status != 4 && row.status != 8) && permission.includes('sys:buyorder:edit')">
  144. 异常处理
  145. </el-link>
  146. <el-link @click="catchOrder(row, index)" icon="el-icon-edit" type="danger"
  147. :underline="false"
  148. v-if="row.status<=2 || row.status==7 && permission.includes('sys:buyorder:edit')">
  149. 取消订单
  150. </el-link>
  151. <el-link @click="showReassign(row, index)" icon="el-icon-edit" type="warning"
  152. :underline="false"
  153. v-if="$store.state.user.user.user_type==1 && (row.status<3 || row.status==7 || row.status == 5) && permission.includes('sys:buyorder:edit')">
  154. 重新派单
  155. </el-link>
  156. </template>
  157. </el-table-column>
  158. </template>
  159. </ele-data-table>
  160. </el-card>
  161. <!-- 详情 -->
  162. <el-dialog :title="'订单信息'" :visible.sync="showEdit" width="700px"
  163. @closed="editForm={}" :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
  164. <el-form :model="editForm" ref="editForm" label-width="100px">
  165. <el-row :gutter="15">
  166. <el-col :sm="12">
  167. <el-form-item label="客户:">
  168. <span>{{ editForm.c_username }}</span>
  169. </el-form-item>
  170. <el-form-item label="订单号:">
  171. <span>{{ editForm.order_no }}</span>
  172. </el-form-item>
  173. <el-form-item label="交易数量:">
  174. <span>{{ editForm.num }} <img class="usdt" src="../../../assets/usdt.png" alt=""></span>
  175. </el-form-item>
  176. <el-form-item label="交易金额:">
  177. <span>{{ editForm.total }}</span>
  178. </el-form-item>
  179. <template v-if="editForm.paymentData && editForm.paymentData.type == 1">
  180. <el-form-item label="收款人:">
  181. <span>{{ editForm.paymentData.real_name }}</span>
  182. </el-form-item>
  183. <el-form-item label="收款银行:">
  184. <span>{{ editForm.paymentData.bank_name }}</span>
  185. </el-form-item>
  186. <el-form-item label="银行卡号:">
  187. <span>{{ editForm.paymentData.bank_card }}</span>
  188. </el-form-item>
  189. </template>
  190. <template v-else-if="editForm.paymentData">
  191. <el-form-item label="收款人:">
  192. <span>{{ editForm.paymentData.real_name }}</span>
  193. </el-form-item>
  194. <el-form-item label="收款账号:">
  195. <span>{{
  196. editForm.paymentData.account
  197. }}({{ editForm.paymentData.type == 2 ? '微信' : '支付宝' }})</span>
  198. </el-form-item>
  199. </template>
  200. </el-col>
  201. <el-col :sm="12">
  202. <el-form-item label="打款方式:">
  203. <span>{{ editForm.pay_name }}</span>
  204. </el-form-item>
  205. <el-form-item label="打款凭证:">
  206. <el-image
  207. style="width: 100px; height: 100px"
  208. :src="editForm.pay_img"
  209. :preview-src-list="[editForm.pay_img]">
  210. </el-image>
  211. </el-form-item>
  212. <el-form-item label="打款备注:">
  213. <span>{{ editForm.pay_remark }}</span>
  214. </el-form-item>
  215. </el-col>
  216. </el-row>
  217. </el-form>
  218. <div slot="footer">
  219. <el-button @click="showEdit=false">取消</el-button>
  220. </div>
  221. </el-dialog>
  222. <!-- 详情 -->
  223. <el-dialog :title="'重新派单'" :visible.sync="showReassignEdit" width="700px"
  224. @closed="editForm={}" :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
  225. <el-form :model="editForm" ref="editForm" label-width="120px">
  226. <el-row :gutter="15">
  227. <el-col :sm="15">
  228. <el-form-item label="客户:">
  229. <span>{{ editForm.c_username }}</span>
  230. </el-form-item>
  231. <el-form-item label="订单号:">
  232. <span>{{ editForm.order_no }}</span>
  233. </el-form-item>
  234. <el-form-item label="交易数量:">
  235. <span>{{ editForm.num }} <img class="usdt" src="../../../assets/usdt.png" alt=""></span>
  236. </el-form-item>
  237. <el-form-item label="交易金额:">
  238. <span>{{ editForm.total }}</span>
  239. </el-form-item>
  240. <el-form-item label="当前派单用户:">
  241. <span>{{ editForm.username }}</span>
  242. </el-form-item>
  243. <el-col :sm="24">
  244. <el-form-item label="重新派单给:">
  245. <el-select v-model="editForm.new_business_id" filterable
  246. remote
  247. reserve-keyword
  248. placeholder="请输入关键词"
  249. :remote-method="getReassign"
  250. :loading="loading" class="ele-fluid reassign">
  251. <el-option v-for="(v,k) in reassigns" :key="k" :label="v.username" :value="v.id">
  252. <span class="label"
  253. :title="'ID:'+v.id+', USDT:'+v.usdt_num">{{ v.username }}</span>
  254. <span class="credit">信誉:{{ v.credit }}分</span>
  255. </el-option>
  256. </el-select>
  257. </el-form-item>
  258. </el-col>
  259. </el-col>
  260. </el-row>
  261. </el-form>
  262. <div slot="footer">
  263. <el-button @click="showReassignEdit=false">取消</el-button>
  264. <el-button type="success" @click="reassign(editForm,editForm.index)">确定重新派单</el-button>
  265. </div>
  266. </el-dialog>
  267. <!-- 收款信息 -->
  268. <el-dialog :title="'确认打款'" :visible.sync="showPayEdit" width="700px"
  269. @closed="editForm={}" :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
  270. <el-form :model="editForm" ref="editForm" label-width="100px">
  271. <el-row :gutter="15">
  272. <el-col :sm="12">
  273. <el-form-item label="客户:">
  274. <span>{{ editForm.c_username }}</span>
  275. </el-form-item>
  276. <el-form-item label="订单号:">
  277. <span>{{ editForm.order_no }}</span>
  278. </el-form-item>
  279. <el-form-item label="交易数量:">
  280. <span>{{ editForm.num }} <img class="usdt" src="../../../assets/usdt.png" alt=""></span>
  281. </el-form-item>
  282. <el-form-item label="交易金额:">
  283. <span>{{ editForm.total }}</span>
  284. </el-form-item>
  285. <template v-if="editForm.paymentData && editForm.paymentData.type == 1">
  286. <el-form-item label="收款人:">
  287. <span>{{ editForm.paymentData.real_name }}</span>
  288. </el-form-item>
  289. <el-form-item label="收款银行:">
  290. <span>{{ editForm.paymentData.bank_name }}</span>
  291. </el-form-item>
  292. <el-form-item label="银行卡号:">
  293. <span>{{ editForm.paymentData.bank_card }}</span>
  294. </el-form-item>
  295. </template>
  296. <template v-else-if="editForm.paymentData">
  297. <el-form-item label="收款人:">
  298. <span>{{ editForm.paymentData.real_name }}</span>
  299. </el-form-item>
  300. <el-form-item label="收款账号:">
  301. <span>{{
  302. editForm.paymentData.account
  303. }}({{ editForm.paymentData.type == 2 ? '微信' : '支付宝' }})</span>
  304. </el-form-item>
  305. </template>
  306. </el-col>
  307. <el-col :sm="12">
  308. <el-form-item label="打款方式:" class="is-required">
  309. <el-radio-group v-model="editForm.pay_type">
  310. <el-radio :label="1" style="margin-bottom: 20px">银行卡</el-radio>
  311. <el-radio :label="2" style="margin-bottom: 20px">微信</el-radio>
  312. <el-radio :label="3" style="margin-bottom: 20px">支付宝</el-radio>
  313. <el-radio :label="4" style="margin-bottom: 20px">其他</el-radio>
  314. </el-radio-group>
  315. </el-form-item>
  316. <el-form-item label="打款凭证:" class="is-required">
  317. <uploadImage :limit="1" v-model="editForm.pay_img"></uploadImage>
  318. </el-form-item>
  319. <el-form-item label="打款备注:" class="is-required">
  320. <el-input v-model="editForm.pay_remark" placeholder="请输入打款备注" clearable/>
  321. </el-form-item>
  322. <el-form-item label="交易密码:" class="is-required">
  323. <el-input type="password" v-model="editForm.trade_password" placeholder="请输入交易密码" clearable/>
  324. </el-form-item>
  325. </el-col>
  326. </el-row>
  327. </el-form>
  328. <div slot="footer">
  329. <el-button @click="showPayEdit=false">取消</el-button>
  330. <el-button type="success" v-if="editForm.status != 3 && editForm.status != 4 && editForm.status != 8" @click="pay()">确认打款</el-button>
  331. </div>
  332. </el-dialog>
  333. <!-- 打款信息 -->
  334. <el-dialog :title="'异常订单处理'" :visible.sync="showCatchEdit" width="700px"
  335. :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
  336. <el-form :model="editForm" ref="editForm" label-width="164px">
  337. <el-row :gutter="15">
  338. <el-col :sm="24">
  339. <el-form-item label="客户:">
  340. <span>{{ editForm.c_username }}</span>
  341. </el-form-item>
  342. <el-form-item label="订单号:">
  343. <span>{{ editForm.order_no }}</span>
  344. </el-form-item>
  345. <el-form-item label="交易数量:">
  346. <span>{{ editForm.num }} <img class="usdt" src="../../../assets/usdt.png" alt=""></span>
  347. </el-form-item>
  348. <el-form-item label="交易金额:">
  349. <span>{{ editForm.total }}</span>
  350. </el-form-item>
  351. <template
  352. v-if="editForm.type == 1 || (editForm.type == 2 && editForm.status>=3 && editForm.status<8)">
  353. <el-form-item label="请选择订单异常原因:" class="is-required">
  354. </el-form-item>
  355. <el-form-item label="" style="margin-left: -80px">
  356. <el-radio-group v-model="editForm.exception_type" @change="changeExceptionType">
  357. <el-radio :label="1" style="margin-bottom: 20px">异常订单<br><span
  358. class="ele-text-danger error">说明:未付款或银行已到账,但是由于延迟或金额不符取消订单,可选择此项</span>
  359. </el-radio>
  360. <el-radio :label="2">申请退款<br><span class="ele-text-danger error">说明:银行已到账,但是由于以下原因需退款,1.非本人付款 2.备注敏感词,可选择此项</span>
  361. </el-radio>
  362. </el-radio-group>
  363. </el-form-item>
  364. <el-col :sm="15">
  365. <el-form-item label="退款原因:" class="is-required" v-if="editForm.exception_type==2">
  366. <el-input v-model="editForm.exception_remark" placeholder="请输入退款原因" clearable/>
  367. </el-form-item>
  368. <el-form-item label="退款金额:" class="is-required" v-if="editForm.exception_type==2">
  369. <el-input v-model="editForm.refund_money" placeholder="请输入退款金额" clearable/>
  370. </el-form-item>
  371. </el-col>
  372. </template>
  373. <template v-else>
  374. <el-form-item label="请选择取消原因:" class="is-required">
  375. </el-form-item>
  376. <el-form-item label="" style="margin-left: -80px">
  377. <el-radio-group v-model="editForm.exception_type" @change="changeExceptionType">
  378. <el-radio :label="1" style="margin-bottom: 20px">账号不合法</el-radio>
  379. <el-radio :label="2" style="margin-bottom: 20px">信息不全</el-radio>
  380. <el-radio :label="3" style="margin-bottom: 20px">其他</el-radio>
  381. </el-radio-group>
  382. </el-form-item>
  383. <el-col :sm="24">
  384. <el-form-item label="取消原因:" v-if="editForm.exception_type==3">
  385. <el-input v-model="editForm.exception_remark" placeholder="请输入其他原因" clearable/>
  386. </el-form-item>
  387. </el-col>
  388. </template>
  389. </el-col>
  390. </el-row>
  391. </el-form>
  392. <div slot="footer" v-if="editForm.type == 1">
  393. <el-button @click="showCatchEdit=false">取消</el-button>
  394. <!-- 币商申请取消 -->
  395. <el-button type="success" v-if="editForm.status<3 && $store.state.user.user.user_type == 1"
  396. @click="exceptionCancel(5, 0)">确定取消
  397. </el-button>
  398. <!-- 平台取消 -->
  399. <el-button type="success"
  400. v-else-if="(editForm.status<3 || (editForm.status == 5 && editForm.exception_type == 1)) && $store.state.user.user.user_type == 2"
  401. @click="exceptionCancel(8, 0)">确定取消
  402. </el-button>
  403. <!-- 币商申请异常或平台异常处理 -->
  404. <el-button type="success"
  405. v-else-if="(editForm.status==3 || (editForm.exception_type == 2 && editForm.status != 8) || (editForm.status != 4 && $store.state.user.user.user_type== 1) || editForm.status==7) "
  406. @click="catchOrderNext()">下一步
  407. </el-button>
  408. </div>
  409. <div slot="footer" v-else>
  410. <el-button @click="showCatchEdit=false">取消</el-button>
  411. <!-- 币商或平台直接取消 -->
  412. <el-button type="success" v-if="editForm.status<3"
  413. @click="exceptionCancel(8, 0)">确定取消
  414. </el-button>
  415. <!-- 币商或平台异常处理 -->
  416. <el-button type="success"
  417. v-else-if="(editForm.status==3 || editForm.status == 5 || editForm.status==7) || (editForm.status == 8 && $store.state.user.user.user_type== 1)"
  418. @click="catchOrderNext()">下一步
  419. </el-button>
  420. </div>
  421. </el-dialog>
  422. <!-- 异常处理弹窗第二步 -->
  423. <el-dialog :title="'订单异常信息处理'" :visible.sync="showCatchNextEdit" width="700px"
  424. :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
  425. <el-form :model="editForm" ref="editForm" :rules="exceptionRules" label-width="120px">
  426. <el-row :gutter="15">
  427. <el-col :sm="24">
  428. <el-form-item label="客户:">
  429. <span>{{ editForm.c_username }}</span>
  430. </el-form-item>
  431. <el-form-item label="订单号:">
  432. <span>{{ editForm.order_no }}</span>
  433. </el-form-item>
  434. <el-form-item label="交易数量:">
  435. <span>{{ editForm.num }} <img class="usdt" src="../../../assets/usdt.png" alt=""></span>
  436. </el-form-item>
  437. <el-form-item label="交易金额:">
  438. <span>{{ editForm.total }}</span>
  439. </el-form-item>
  440. <template v-if="editForm.paymentData && editForm.paymentData.type == 1">
  441. <el-form-item label="收款人:">
  442. <span>{{ editForm.paymentData.real_name }}</span>
  443. </el-form-item>
  444. <el-form-item label="收款银行:">
  445. <span>{{ editForm.paymentData.bank_name }}</span>
  446. </el-form-item>
  447. <el-form-item label="银行卡号:">
  448. <span>{{ editForm.paymentData.bank_card }}</span>
  449. </el-form-item>
  450. </template>
  451. <template v-else-if="editForm.paymentData">
  452. <el-form-item label="收款人:">
  453. <span>{{ editForm.paymentData.real_name }}</span>
  454. </el-form-item>
  455. <el-form-item label="收款账号:">
  456. <span>{{
  457. editForm.paymentData.account
  458. }}({{ editForm.paymentData.type == 2 ? '微信' : '支付宝' }})</span>
  459. </el-form-item>
  460. </template>
  461. <el-form-item label="打款方式:">
  462. <span>{{ editForm.pay_name }}</span>
  463. </el-form-item>
  464. <el-form-item label="打款凭证:">
  465. <el-image
  466. style="width: 100px; height: 100px"
  467. :src="editForm.pay_img"
  468. :preview-src-list="[editForm.pay_img]">
  469. </el-image>
  470. </el-form-item>
  471. <el-form-item label="打款备注:">
  472. <span>{{ editForm.pay_remark }}</span>
  473. </el-form-item>
  474. <el-form-item label="异常处理类型:" class="is-required">
  475. <el-radio-group v-model="editForm.exception_sub_type">
  476. <el-radio :label="1" style="margin-bottom: 20px">延迟到账</el-radio>
  477. <el-radio :label="2" style="margin-bottom: 20px">金额不符</el-radio>
  478. <el-radio :label="3" style="margin-bottom: 20px">备注敏感词</el-radio>
  479. <el-radio :label="4" style="margin-bottom: 20px">未付款</el-radio>
  480. <el-radio :label="5" style="margin-bottom: 20px">非本人付款</el-radio>
  481. <el-radio :label="6" style="margin-bottom: 20px">其他</el-radio>
  482. </el-radio-group>
  483. </el-form-item>
  484. <el-form-item label="上传异常凭证:" class="is-required">
  485. <uploadImage v-if="$refs.table" :limit="1" v-model="editForm.exception_img"></uploadImage>
  486. </el-form-item>
  487. <el-col :sm="16">
  488. <el-form-item label="异常备注:" class="is-required">
  489. <el-input v-model="editForm.exception_remark" placeholder="请输入异常备注" clearable/>
  490. </el-form-item>
  491. <el-form-item label="交易密码:" v-if="$store.state.user.user.user_type == 2 && editForm.status != 4 && editForm.status != 5 && editForm.status != 8" class="is-required">
  492. <el-input type="password" v-model="editForm.trade_password" placeholder="请输入交易密码" clearable/>
  493. </el-form-item>
  494. </el-col>
  495. </el-col>
  496. </el-row>
  497. </el-form>
  498. <div slot="footer">
  499. <el-button @click="showCatchNextEdit=false;">取消</el-button>
  500. <el-button @click="lastStep()">上一步</el-button>
  501. <el-button type="danger" v-if="$store.state.user.user.user_type == 1 && editForm.status != 8"
  502. @click="exceptionCancel(8, 0)">取消订单
  503. </el-button>
  504. <el-button type="primary" v-if="$store.state.user.user.user_type == 1 && editForm.status != 6"
  505. @click="exceptionCancel(6, 1)">确定退款
  506. </el-button>
  507. <el-button type="success"
  508. v-if="$store.state.user.user.user_type == 1 && editForm.status != 4 && editForm.status != 8"
  509. @click="exceptionConfirm(4)">完成订单
  510. </el-button>
  511. <el-button type="primary"
  512. v-else-if="$store.state.user.user.user_type == 2 && editForm.status != 4 && editForm.status != 5"
  513. @click="exceptionConfirm(5)">确定提交
  514. </el-button>
  515. </div>
  516. </el-dialog>
  517. </div>
  518. </template>
  519. <script>
  520. import XLSX from 'xlsx'
  521. import uploadImage from '@/components/uploadImage'
  522. import {mapGetters} from "vuex";
  523. export default {
  524. name: "SysUser",
  525. data() {
  526. return {
  527. table: {url: '/tradeorder/index', where: {type: '2', status: '0', exception_status: '0'}}, // 表格配置
  528. choose: [], // 表格选中数据
  529. reassigns: [],
  530. loading: false,
  531. showEdit: false, // 是否显示表单弹窗
  532. showPayEdit: false, // 打款信息
  533. showCatchEdit: false, // 异常处理弹窗
  534. showReassignEdit: false, // 重新派单
  535. showCatchNextEdit: false, // 异常处理弹窗下一步
  536. editForm: {}, // 表单数据
  537. editRules: { // 表单验证规则
  538. exception_type: [
  539. {required: true, message: '请选择异常原因', trigger: 'blur'}
  540. ],
  541. exception_remark: [
  542. {required: true, message: '请输入用户姓名', trigger: 'blur'}
  543. ],
  544. refund_money: [
  545. {required: true, message: '退款金额', trigger: 'blur'}
  546. ],
  547. },
  548. exceptionRules: { // 表单验证规则
  549. exception_type: [
  550. {required: true, message: '请选择异常原因', trigger: 'blur'}
  551. ],
  552. exception_remark: [
  553. {required: true, message: '请输入用户姓名', trigger: 'blur'}
  554. ],
  555. refund_money: [
  556. {required: true, message: '退款金额', trigger: 'blur'}
  557. ],
  558. },
  559. }
  560. },
  561. computed: {
  562. ...mapGetters(["permission"]),
  563. },
  564. components: {uploadImage},
  565. created() {
  566. let order_no = typeof (this.$route.query.order_no) != 'undefined' ? this.$route.query.order_no : '';
  567. if (order_no) {
  568. this.table.where.order_no = order_no;
  569. }
  570. },
  571. methods: {
  572. // 异常类型
  573. changeExceptionType(type) {
  574. if (this.editForm.type == 1) {
  575. if (type == 1) {
  576. this.editForm.exception_remark = '异常订单'
  577. this.editForm.refund_status = 0
  578. this.editForm.exception_status = 1
  579. } else {
  580. this.editForm.exception_remark = '申请退款'
  581. this.editForm.refund_status = 1
  582. this.editForm.exception_status = 1
  583. this.editForm.refund_money = this.editForm.total
  584. }
  585. } else {
  586. if (type == 1) {
  587. this.editForm.exception_remark = '账号不合法'
  588. this.editForm.exception_status = 2
  589. } else if (type == 2) {
  590. this.editForm.exception_remark = '信息不全'
  591. this.editForm.exception_status = 2
  592. }
  593. }
  594. },
  595. /* 异常订单处理 */
  596. catchOrder(row, index) {
  597. this.editForm = Object.assign({}, row);
  598. this.editForm.exception_type = 1;
  599. this.editForm.refund_money = this.editForm.total
  600. this.editForm.index = index;
  601. this.showCatchEdit = true;
  602. },
  603. /* 异常订单处理下一步 */
  604. catchOrderNext() {
  605. this.editForm.exception_sub_type = this.editForm.exception_sub_type? this.editForm.exception_sub_type : 1
  606. this.showCatchEdit = false;
  607. this.showCatchNextEdit = true;
  608. },
  609. // 上一步
  610. lastStep() {
  611. this.showCatchEdit = true
  612. this.showCatchNextEdit = false
  613. },
  614. // 查看打款信息
  615. showPay(row, index) {
  616. this.editForm = Object.assign({}, row);
  617. this.editForm.index = index;
  618. this.showPayEdit = true;
  619. },
  620. // 详情
  621. detail(row, index) {
  622. this.editForm = Object.assign({}, row);
  623. this.editForm.index = index;
  624. this.showEdit = true;
  625. },
  626. // 派单窗口
  627. showReassign(row, index) {
  628. this.editForm = Object.assign({}, row);
  629. this.editForm.index = index;
  630. this.showReassignEdit = true;
  631. // 获取可派单用户
  632. this.getReassign();
  633. },
  634. // 打款
  635. pay(){
  636. let _this = this
  637. if (this.editForm.pay_type <= 0) {
  638. this.$message({type: 'danger', message: '请选择打款方式'});
  639. return false;
  640. }
  641. if (this.editForm.pay_img == '') {
  642. this.$message({type: 'danger', message: '请上传打款凭证'});
  643. return false;
  644. }
  645. if (this.editForm.pay_remark == '') {
  646. this.$message({type: 'danger', message: '请填写打款备注'});
  647. return false;
  648. }
  649. if (this.editForm.trade_password == '') {
  650. this.$message({type: 'danger', message: '请填写交易密码'});
  651. return false;
  652. }
  653. this.$confirm('确定已打款?', '提示', {type: 'success'}).then(() => {
  654. this.$message.closeAll();
  655. const loading = this.$loading({lock: true});
  656. this.$http.post('/tradeorder/pay', _this.editForm).then(res => {
  657. loading.close();
  658. if (res.data.success === true) {
  659. this.showPayEdit = false
  660. this.$message({type: 'success', message: res.data.msg});
  661. this.$refs.table.reload();
  662. } else {
  663. this.$message.error(res.data.msg);
  664. }
  665. }).catch(e => {
  666. loading.close();
  667. this.$message.error(e.message);
  668. });
  669. });
  670. },
  671. // 直接确认收款完成
  672. collection(data, index) {
  673. this.$confirm('确定已收款,并完成该订单?', '提示', {type: 'primary'}).then(() => {
  674. this.$message.closeAll();
  675. const loading = this.$loading({lock: true});
  676. this.$http.post('/tradeorder/collection', {id: data.id, status: 4}).then(res => {
  677. loading.close();
  678. if (res.data.success === true) {
  679. this.showPayEdit = false
  680. this.$message({type: 'success', message: res.data.msg});
  681. this.$refs.table.reload();
  682. } else {
  683. this.$message.error(res.data.msg);
  684. }
  685. }).catch(e => {
  686. loading.close();
  687. this.$message.error(e.message);
  688. });
  689. });
  690. },
  691. // 直接取消订单
  692. cancel(data, index) {
  693. this.$confirm('确定取消该订单,该操作不可逆谨慎操作?', '提示', {type: 'danger'}).then(() => {
  694. this.$message.closeAll();
  695. const loading = this.$loading({lock: true});
  696. this.$http.post('/tradeorder/cancel', {id: data.id, status: 8}).then(res => {
  697. loading.close();
  698. if (res.data.success === true) {
  699. this.$message({type: 'success', message: res.data.msg});
  700. this.$refs.table.reload();
  701. } else {
  702. this.$message.error(res.data.msg);
  703. }
  704. }).catch(e => {
  705. loading.close();
  706. this.$message.error(e.message);
  707. });
  708. });
  709. },
  710. // 异常取消
  711. exceptionCancel(status, refund_status) {
  712. if (this.showCatchNextEdit) {
  713. if (this.editForm.exception_sub_type <= 0) {
  714. this.$message({type: 'danger', message: '请选择异常处理类型'});
  715. return false;
  716. }
  717. if (this.editForm.exception_img == '') {
  718. this.$message({type: 'danger', message: '请上传异常凭证'});
  719. return false;
  720. }
  721. if (this.editForm.exception_remark == '') {
  722. this.$message({type: 'danger', message: '请填写异常备注'});
  723. return false;
  724. }
  725. }
  726. this.$confirm((status == 5 ? '确定申请' : '确定') + '异常处理该订单,该操作不可逆谨慎操作?', '提示', {type: 'danger'}).then(() => {
  727. this.$message.closeAll();
  728. const loading = this.$loading({lock: true});
  729. let tempStatus = this.editForm.status
  730. this.editForm.status = status;
  731. this.editForm.refund_status = refund_status;
  732. this.$http.post('/tradeorder/cancel', this.editForm).then(res => {
  733. loading.close();
  734. if (res.data.success === true) {
  735. this.showCatchEdit = false;
  736. this.showCatchNextEdit = false;
  737. this.$message({type: 'success', message: res.data.msg});
  738. this.$refs.table.reload();
  739. } else {
  740. this.editForm.status = tempStatus
  741. this.$message.error(res.data.msg);
  742. }
  743. }).catch(e => {
  744. loading.close();
  745. this.$message.error(e.message);
  746. });
  747. });
  748. },
  749. // 异常处理
  750. exceptionConfirm(status) {
  751. if (this.showCatchNextEdit) {
  752. if (this.editForm.exception_sub_type <= 0) {
  753. this.$message({type: 'danger', message: '请选择异常处理类型'});
  754. return false;
  755. }
  756. if (this.editForm.exception_img == '') {
  757. this.$message({type: 'danger', message: '请上传异常凭证'});
  758. return false;
  759. }
  760. if (this.editForm.exception_remark == '') {
  761. this.$message({type: 'danger', message: '请填写异常备注'});
  762. return false;
  763. }
  764. }
  765. this.$confirm((status == 5 ? '确定申请' : '确定') + '异常处理该订单,该操作不可逆谨慎操作?', '提示', {type: 'danger'}).then(() => {
  766. this.$message.closeAll();
  767. const loading = this.$loading({lock: true});
  768. let tempStatus = this.editForm.status
  769. this.editForm.status = status;
  770. this.$http.post('/tradeorder/collection', this.editForm).then(res => {
  771. loading.close();
  772. if (res.data.success === true) {
  773. this.showCatchNextEdit = false;
  774. this.$message({type: 'success', message: res.data.msg});
  775. this.$refs.table.reload();
  776. } else {
  777. this.editForm.status = tempStatus
  778. this.$message.error(res.data.msg);
  779. }
  780. }).catch(e => {
  781. loading.close();
  782. this.$message.error(e.message);
  783. });
  784. });
  785. },
  786. // 派单用户
  787. getReassign(keyword) {
  788. const loading = this.$loading({lock: true});
  789. this.$http.post('/tradeorder/reassignList', {
  790. keyword: keyword,
  791. userId: this.editForm.business_id,
  792. num: this.editForm.num,
  793. type: this.editForm.type
  794. }).then(res => {
  795. loading.close();
  796. if (res.data.success === true) {
  797. this.reassigns = res.data.data;
  798. } else {
  799. this.$message.error(res.data.msg);
  800. }
  801. }).catch(e => {
  802. loading.close();
  803. this.$message.error(e.message);
  804. });
  805. },
  806. // 重新派单
  807. reassign(data, index) {
  808. if (data.new_business_id <= 0) {
  809. this.$message({type: 'danger', message: '请选择重新派单的用户'});
  810. return false;
  811. }
  812. this.$confirm('确定重新派单给该用户?', '提示', {type: 'danger'}).then(() => {
  813. this.$message.closeAll();
  814. const loading = this.$loading({lock: true});
  815. this.$http.post('/tradeorder/reassign', {
  816. id: data.id,
  817. business_id: data.new_business_id,
  818. }).then(res => {
  819. loading.close();
  820. if (res.data.success === true) {
  821. this.showReassignEdit = false;
  822. this.$message({type: 'success', message: res.data.msg});
  823. this.$refs.table.reload();
  824. } else {
  825. this.$message.error(res.data.msg);
  826. }
  827. }).catch(e => {
  828. loading.close();
  829. this.$message.error(e.message);
  830. });
  831. });
  832. },
  833. /* 导出数据 */
  834. exportData() {
  835. let array = [['提交时间','提交用户', '订单号', '交易量', '单价(¥)', '交易总额(¥)', '收款人信息', '交易状态', '备注', '操作时间']];
  836. // 请求查询全部(不分页)的接口
  837. const loading = this.$loading({lock: true});
  838. let params = this.table.where;
  839. params.pageSize = 2000;
  840. this.$http.post('/tradeorder/index', params).then(res => {
  841. loading.close();
  842. if (res.data.code === 0) {
  843. let statusArr = ['未知','待付款','待付款','已打款','交易完成','异常订单','退款订单','超时订单','已取消'];
  844. res.data.data.forEach(d => {
  845. let payment = '';
  846. if(d.paymentData && d.paymentData.type == 1){
  847. payment += '收款方式:'+d.paymentData.real_name+' '+d.paymentData.bank_name+' '+d.paymentData.branch_name+' '+d.paymentData.bank_card;
  848. }else{
  849. payment += '收款方式:'+d.paymentData.real_name+' '+(d.paymentData.type==2?'微信':'支付宝')+' '+d.paymentData.account;
  850. }
  851. let status = typeof(statusArr[d.status]) != 'undefined'? statusArr[d.status] : '未知';
  852. array.push([
  853. d.create_time_text, d.c_username, d.order_no,
  854. d.num, d.price, d.total,payment, status,
  855. d.exception_remark, d.update_time_text
  856. ]);
  857. });
  858. let sheet = XLSX.utils.aoa_to_sheet(array);
  859. this.$util.exportSheet(XLSX, sheet, '客户卖单订单记录');
  860. } else {
  861. this.$message.error(res.data.msg);
  862. }
  863. }).catch(e => {
  864. loading.close();
  865. this.$message.error(e.message);
  866. });
  867. },
  868. }
  869. }
  870. </script>
  871. <style scoped>
  872. .ele-block >>> .el-upload, .ele-block >>> .el-upload-dragger {
  873. width: 100%;
  874. }
  875. /* 用户资料卡片 */
  876. .user-info-card {
  877. padding-top: 8px;
  878. text-align: center;
  879. }
  880. .user-info-card .user-info-avatar-group {
  881. position: relative;
  882. cursor: pointer;
  883. margin: 0 auto;
  884. width: 110px;
  885. height: 110px;
  886. border-radius: 50%;
  887. overflow: hidden;
  888. }
  889. .user-info-card .user-info-avatar {
  890. width: 110px;
  891. height: 110px;
  892. border-radius: 50%;
  893. object-fit: cover;
  894. }
  895. .user-info-card .user-info-avatar-group > i {
  896. position: absolute;
  897. top: 50%;
  898. left: 50%;
  899. transform: translate(-50%, -50%);
  900. color: #FFF;
  901. font-size: 30px;
  902. display: none;
  903. z-index: 2;
  904. }
  905. .user-info-card .user-info-avatar-group:hover > i {
  906. display: block;
  907. }
  908. .user-info-card .user-info-avatar-group:hover:after {
  909. content: "";
  910. position: absolute;
  911. top: 0;
  912. left: 0;
  913. width: 100%;
  914. height: 100%;
  915. background-color: rgba(0, 0, 0, .3);
  916. }
  917. .usdt {
  918. width: 12px;
  919. height: 12px;
  920. border-radius: 50%;
  921. vertical-align: middle;
  922. margin-left: 4px;
  923. }
  924. .el-form-item .error {
  925. margin-top: 10px;
  926. white-space: pre-wrap;
  927. display: inline-block;
  928. }
  929. .el-select-dropdown__item .credit {
  930. float: right;
  931. color: #fbb52c;
  932. }
  933. .el-date-editor--daterange.el-input__inner {
  934. width: auto;
  935. }
  936. </style>