Orders.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. <template>
  2. <div class="order">
  3. <el-tabs v-model="form.orderStatus" class="demo-tabs" @tab-click="handleClick">
  4. <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="$t(tab.label)" :name="tab.name">
  5. <ul class="order-list">
  6. <li v-for="(item, index) in list" :key="index">
  7. <div class="order-list-top flex-center-between">
  8. <div class="order-list-top-l flex-align-center">
  9. <el-tag
  10. :type="item.orderStatus == 0 ? 'primary' : item.orderStatus == 1 ? 'success' : item.orderStatus == 2 ? 'info' : item.orderStatus == 5 ? 'danger' : ''">{{
  11. item.orderStatus == 0 ?
  12. $t('personalCenter.daifukuan') : item.orderStatus == 1 ? $t('personalCenter.yiwancheng') :
  13. item.orderStatus == 2 ?
  14. $t('personalCenter.yiquxiao') : item.orderStatus == 5 ? $t('personalCenter.shenhewtg') : ''
  15. }}</el-tag>
  16. <div class="">{{ $t('personalCenter.dingdanhao') }}: {{ item.orderNo }}</div>
  17. </div>
  18. <div class="order-list-top-r">{{ $t('common.orderTime') }}: {{ item.createTime }}</div>
  19. </div>
  20. <div class="order-list-main flex">
  21. <div class="order-list-main-l flex">
  22. <img class="image" :src="item.orderImage" alt="">
  23. <div class="">
  24. <div class="title">{{ item.orderTypeName }}</div>
  25. <div class="">{{ item.description }}
  26. <!-- <el-button type="primary" size="small" plain>技能标签</el-button>
  27. <el-button type="primary" size="small" plain>技能标签</el-button> -->
  28. </div>
  29. </div>
  30. </div>
  31. <div class="order-list-main-r flex">
  32. <div class="order-list-con flex-center-between flex_1">
  33. <div class="mi_price">
  34. <div class="">X{{ item.orderNum }}</div>
  35. <div class="">数量</div>
  36. </div>
  37. <div class="mi_price price">
  38. <div class="">{{ item.amount || 0 }}{{ item.amountUnit }}</div>
  39. <div class="">{{ item.payMethodName }}</div>
  40. </div>
  41. <div class="">
  42. <div v-if="item.invoiceStatus == 0 && item.orderStatus == 1" @click="applyInvoices(item, index)"
  43. class="blue btn">
  44. <img src="/src/assets/imgs/my/order3@2x.png" alt="">
  45. <div class="">{{ $t('common.applyInvoice') }}</div>
  46. </div>
  47. <div class="gradient btn" v-else-if="item.orderStatus == 0" @click="pay(item)">
  48. <img src="/src/assets/imgs/my/order1@2x.png" alt="">
  49. <div class="">{{ $t('personalCenter.lookVoucher') }}</div>
  50. </div>
  51. <div class="" v-else-if="item.orderStatus == 5">
  52. <el-text class="mx-1" type="danger" size="large">拒绝原因:{{ item.transferSug }}</el-text>
  53. </div>
  54. <div class="btn_kong" v-else></div>
  55. <template v-if="false">
  56. <template v-if="index == 0">
  57. <div class="gradient btn">
  58. <img src="/src/assets/imgs/my/order1@2x.png" alt="">
  59. <div class="">{{ $t('common.goPay') }}</div>
  60. </div>
  61. <div class="blue btn mt8">
  62. <img src="/src/assets/imgs/my/order2@2x.png" alt="">
  63. <div class="">{{ $t('common.cancelOrder') }}</div>
  64. </div>
  65. </template>
  66. <template v-else-if="index == 1">
  67. <div class="blue btn">
  68. <img src="/src/assets/imgs/my/order3@2x.png" alt="">
  69. <div class="">{{ $t('common.applyInvoice') }}</div>
  70. </div>
  71. <div class="red btn mt8">
  72. <img src="/src/assets/imgs/my/order4@2x.png" alt="">
  73. <div class="">{{ $t('common.applyRefund') }}</div>
  74. </div>
  75. </template>
  76. <template v-else-if="index == 2">
  77. <div class="btn gradient">
  78. <img src="/src/assets/imgs/my/order5@2x.png" alt="">
  79. <div class="">{{ $t('common.reorder') }}</div>
  80. </div>
  81. </template>
  82. </template>
  83. </div>
  84. </div>
  85. </div>
  86. </div>
  87. </li>
  88. </ul>
  89. </el-tab-pane>
  90. </el-tabs>
  91. <template v-if="list.length">
  92. <Pagination :total="form.total" :page-size="form.pageSize" :current-page="form.pageNum"
  93. @page-change="handlePageChange" />
  94. </template>
  95. <el-empty v-else :description="$t('common.empty')" />
  96. <el-dialog v-model="dialogVisible" title="申请开票" width="784">
  97. <div class="dialog_title">发票抬头信息</div>
  98. <el-form :model="invoiceData" class="demo-form-inline" label-position="top" :rules="rules" ref="ruleFormRef">
  99. <el-row :gutter="16">
  100. <el-col :span="12">
  101. <el-form-item label="抬头类型">
  102. <el-radio-group v-model="invoiceData.invoiceType">
  103. <el-radio value="0" size="large">个人</el-radio>
  104. <el-radio value="1" size="large">企业单位</el-radio>
  105. </el-radio-group>
  106. </el-form-item>
  107. </el-col>
  108. <el-col :span="12">
  109. <el-form-item label="购方名称" prop="invoiceTitle">
  110. <el-input v-model="invoiceData.invoiceTitle" placeholder="请输入" clearable />
  111. </el-form-item>
  112. </el-col>
  113. </el-row>
  114. <template v-if="invoiceData.invoiceType == 1">
  115. <el-row :gutter="16">
  116. <el-col :span="12">
  117. <el-form-item label="购方税号" prop="taxNumber">
  118. <el-input v-model="invoiceData.taxNumber" placeholder="请输入" clearable />
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="12">
  122. <el-form-item label="公司地址">
  123. <el-input v-model="invoiceData.otherInfo.address" placeholder="请输入" clearable />
  124. </el-form-item>
  125. </el-col>
  126. </el-row>
  127. </template>
  128. <template v-if="invoiceData.invoiceType == 1">
  129. <el-row :gutter="16">
  130. <el-col :span="12">
  131. <el-form-item label="公司电话">
  132. <el-input v-model="invoiceData.otherInfo.mobile" placeholder="请输入" clearable />
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="12">
  136. <el-form-item label="公司开户行">
  137. <el-input v-model="invoiceData.otherInfo.bank" placeholder="请输入" clearable />
  138. </el-form-item>
  139. </el-col>
  140. </el-row>
  141. <el-row :gutter="16">
  142. <el-col :span="12">
  143. <el-form-item label="开户行账号">
  144. <el-input v-model="invoiceData.otherInfo.account" placeholder="请输入" clearable />
  145. </el-form-item>
  146. </el-col>
  147. </el-row>
  148. </template>
  149. <el-row :gutter="16" v-if="false">
  150. <el-col :span="12">
  151. <el-form-item label="电子邮箱">
  152. <el-input v-model="invoiceData.user" placeholder="请输入" clearable />
  153. </el-form-item>
  154. </el-col>
  155. <el-col :span="12">
  156. <el-form-item label="联系电话">
  157. <el-input v-model="invoiceData.user" placeholder="请输入" clearable />
  158. </el-form-item>
  159. </el-col>
  160. </el-row>
  161. </el-form>
  162. <template #footer>
  163. <div class="dialog-footer flex-center">
  164. <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
  165. <el-button class="gradient" type="primary" @click="submitForm(ruleFormRef)">{{ $t('common.confirm')
  166. }}</el-button>
  167. </div>
  168. </template>
  169. </el-dialog>
  170. <el-image-viewer
  171. v-if="showPreview"
  172. :url-list="srcList"
  173. show-progress
  174. @close="showPreview = false"
  175. />
  176. </div>
  177. </template>
  178. <script lang="ts" setup>
  179. import { ref, onMounted, reactive } from 'vue'
  180. import type { TabsPaneContext } from 'element-plus'
  181. import { useRouter } from 'vue-router'
  182. import { useAppStore } from '@/pinia/appStore'
  183. import Pagination from '@/components/Pagination.vue'
  184. import { orderList, applyInvoice } from '@/api/my.js'
  185. import { confirmBuy } from '@/utils/util.js'
  186. import { useI18n } from 'vue-i18n'
  187. import DGTMessage from '@/utils/message'
  188. const { t } = useI18n()
  189. const appStore = useAppStore()
  190. const router = useRouter()
  191. const tabs = ref([
  192. { label: 'personalCenter.allOrders', name: '' },
  193. { label: 'personalCenter.daifukuan', name: 0 },
  194. { label: 'personalCenter.yiwancheng', name: 1 },
  195. { label: 'personalCenter.yiquxiao', name: 2 },
  196. ])
  197. const list = ref([]);
  198. import type { FormInstance, FormRules } from 'element-plus'
  199. interface RuleForm {
  200. invoiceTitle: string
  201. taxNumber: string
  202. }
  203. const form = ref({
  204. pageNum: 1,
  205. pageSize: 10,
  206. total: 0,
  207. orderStatus: '',
  208. orderByColumn: 'create_time',
  209. isAsc: 'desc'
  210. })
  211. const dialogVisible = ref(false)
  212. const ruleFormRef = ref<FormInstance>()
  213. const invoiceData = ref({
  214. invoiceType: '0',//发票类型(0-个人 1-企业)
  215. orderNo: '',//订单号
  216. orderId: null,
  217. invoiceTitle: '',//发票抬头
  218. taxNumber: '',//税号
  219. otherInfo: {
  220. address: '',
  221. mobile: '',//
  222. bank: '',//开户行
  223. account: '',//账号
  224. },
  225. remark: '',//备注
  226. })
  227. const rules = reactive<FormRules<RuleForm>>({
  228. invoiceTitle: [
  229. { required: true, message: '请输入购方名称', trigger: 'blur' }
  230. ],
  231. taxNumber: [
  232. { required: true, message: '请输入购方税号', trigger: 'blur' }
  233. ],
  234. })
  235. const submitForm = async (formEl: FormInstance | undefined) => {
  236. if (!formEl) return
  237. let valid = await formEl.validate();
  238. if (valid) {
  239. let { invoiceType,
  240. orderNo,
  241. orderId,
  242. invoiceTitle,
  243. taxNumber, remark } = invoiceData.value
  244. let res = await applyInvoice({
  245. invoiceType,
  246. orderNo,
  247. orderId,
  248. invoiceTitle,
  249. taxNumber,
  250. remark,
  251. otherInfo: JSON.stringify(invoiceData.value.otherInfo)
  252. });
  253. if (res.code === 200) {
  254. DGTMessage.success(`${t('common.success')}`)
  255. getList()
  256. }
  257. dialogVisible.value = false;
  258. }
  259. }
  260. const handleClick = (tab: TabsPaneContext) => {
  261. form.value.pageNum = 1;
  262. form.value.orderStatus = tab.props.name;
  263. getList()
  264. }
  265. const imageRef = ref()
  266. const showPreview = ref(false)
  267. const srcList = ref([])
  268. const pay = async (item, index) => {
  269. srcList.value = [item.orderImage]
  270. showPreview.value = true;
  271. // confirmBuy({
  272. // callback: getList,
  273. // appStore,
  274. // router,
  275. // type: 'baoMiBalance',
  276. // price: item.amount,
  277. // t,
  278. // productId: item.orderId,
  279. // orderType: item.orderType,
  280. // payMethod: item.payMethod
  281. // })
  282. }
  283. // 申请开票
  284. const applyInvoices = (item, index) => {
  285. // await invoiceApply();
  286. invoiceData.value.orderId = item.orderId;
  287. dialogVisible.value = true;
  288. }
  289. // 获取我的订单
  290. const getList = async () => {
  291. let res = await orderList(form.value);
  292. list.value = res.rows || [];
  293. form.value.total = res.total;
  294. }
  295. const handlePageChange = (page) => {
  296. form.value.pageNum = page;
  297. getList()
  298. }
  299. onMounted(() => {
  300. getList()
  301. })
  302. </script>
  303. <style scoped lang="scss">
  304. ul,
  305. li {
  306. margin: 0;
  307. padding: 0;
  308. }
  309. .order {
  310. padding-bottom: 16px;
  311. .order-list {
  312. li {
  313. background: #FFFFFF;
  314. border-radius: 16rpx;
  315. margin-bottom: 16px;
  316. &:last-child {
  317. margin-bottom: 0;
  318. }
  319. .order-list-top {
  320. height: 42px;
  321. padding: 0 16px;
  322. background: #F5F7FA;
  323. border-radius: 16px 16px 0px 0px;
  324. .order-list-top-l {
  325. div {
  326. margin-left: 8px;
  327. font-size: 16px;
  328. font-weight: bold;
  329. }
  330. }
  331. .order-list-top-r {
  332. font-size: 14px;
  333. }
  334. }
  335. .order-list-main {
  336. padding: 16px;
  337. border-radius: 0 0 16px 16px;
  338. border: 1px solid #EBEEF5;
  339. .order-list-main-l,
  340. .order-list-main-r {
  341. width: 50%;
  342. }
  343. .image {
  344. width: 160px;
  345. height: 90px;
  346. object-fit: cover;
  347. margin-right: 16px;
  348. border-radius: 8px;
  349. }
  350. .title {
  351. font-size: 16px;
  352. font-weight: bold;
  353. margin-bottom: 8px;
  354. line-height: 1;
  355. }
  356. .mi_price {
  357. div {
  358. font-size: 18px;
  359. text-align: center;
  360. &:last-child {
  361. font-size: 12px;
  362. color: #666666;
  363. }
  364. }
  365. }
  366. .price {
  367. text-align: center;
  368. div {
  369. &:first-child {
  370. color: #FD5F3C;
  371. }
  372. }
  373. }
  374. .mt8 {
  375. margin-top: 8px;
  376. }
  377. .btn {
  378. display: flex;
  379. align-items: center;
  380. justify-content: center;
  381. width: 106px;
  382. height: 32px;
  383. cursor: pointer;
  384. border-radius: 4px;
  385. img {
  386. width: 14px;
  387. height: 14px;
  388. margin-right: 4px;
  389. }
  390. div {
  391. font-size: 14px;
  392. color: #FFFFFF;
  393. }
  394. }
  395. .btn_kong {
  396. width: 106px;
  397. }
  398. .red {
  399. background: #FCEBEB;
  400. div {
  401. color: #E43434;
  402. }
  403. }
  404. .blue {
  405. background: #EAF0FF;
  406. div {
  407. color: #2D71FF;
  408. }
  409. }
  410. }
  411. }
  412. }
  413. }
  414. .dialog_title {
  415. color: #3D3D3D;
  416. font-weight: bold;
  417. font-size: 16px;
  418. margin-bottom: 16px;
  419. }
  420. </style>