Confirm.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <template>
  2. <el-dialog
  3. :close-on-click-modal="false"
  4. :close-on-press-escape="false"
  5. :visible="visible"
  6. :before-close="handleClose"
  7. title="出票确认"
  8. width="80%">
  9. <el-form
  10. v-loading="submitDisable"
  11. element-loading-text="正在处理付款请求,请稍候"
  12. class="info-wrap"
  13. label-width="100px"
  14. :inline="true">
  15. <div style="margin-bottom: 20px;">
  16. 付款方式:
  17. <el-radio-group
  18. :disabled="createOrderStatus===1"
  19. size="medium"
  20. fill="#ff6934"
  21. v-model="currentPayChannel">
  22. <el-radio-button
  23. v-for="val in payChannelOptions"
  24. :key="val"
  25. :label="val"></el-radio-button>
  26. </el-radio-group>
  27. </div>
  28. <el-table
  29. border
  30. :data="orderInfo"
  31. style="margin-bottom:30px">
  32. <el-table-column
  33. prop="ticketName"
  34. label="票种名称">
  35. </el-table-column>
  36. <el-table-column
  37. label="游玩日期">
  38. <template slot-scope="">
  39. {{ playDate }}
  40. </template>
  41. </el-table-column>
  42. <el-table-column
  43. prop="count"
  44. label="数量">
  45. </el-table-column>
  46. <el-table-column
  47. prop="total"
  48. label="小计">
  49. <template slot-scope="scope">
  50. <span v-if="scope.row.distinctPrice">
  51. {{ scope.row.total - scope.row.distinctPrice * scope.row.tickets.length }} <s style="color: #f56c6c;">{{ scope.row.total }}</s>
  52. </span>
  53. <span v-else>
  54. {{ scope.row.total }}
  55. </span>
  56. </template>
  57. </el-table-column>
  58. </el-table>
  59. <el-form-item
  60. label="检票方式"
  61. class="warning">
  62. <span class="strong">
  63. {{ getCheckWayName(formData?formData.checkWay:'') }}
  64. </span>
  65. </el-form-item>
  66. <el-form-item
  67. label="总数"
  68. class="warning">
  69. <span class="strong">
  70. {{ totalCount }}
  71. </span>
  72. </el-form-item>
  73. <el-form-item
  74. label="总金额"
  75. class="warning">
  76. <span class="strong">
  77. {{ orderPrice }}
  78. </span> 元
  79. </el-form-item>
  80. <el-form-item
  81. label="付款方式"
  82. class="warning">
  83. <span class="strong">
  84. {{ currentPayChannel }}
  85. </span>
  86. </el-form-item>
  87. <br>
  88. <el-form-item
  89. label="备注">
  90. {{ remark }}
  91. </el-form-item>
  92. </el-form>
  93. <div
  94. class="table-box"
  95. style="padding-top:0">
  96. <Collapse title="游客详情信息">
  97. <el-table
  98. stripe
  99. :data="tickets">
  100. <el-table-column
  101. type="index"
  102. width="50"
  103. >
  104. </el-table-column>
  105. <el-table-column
  106. prop="guestName"
  107. label="游客姓名"
  108. >
  109. </el-table-column>
  110. <el-table-column
  111. prop="guestPhone"
  112. label="游客电话"
  113. >
  114. </el-table-column>
  115. <el-table-column
  116. prop="guestIdentify"
  117. label="身份证"
  118. min-width="130"
  119. >
  120. </el-table-column>
  121. <el-table-column
  122. v-if="formData.checkWay===5"
  123. prop="ticketNo"
  124. label="票号"
  125. min-width="130"
  126. >
  127. </el-table-column>
  128. </el-table>
  129. </Collapse>
  130. </div>
  131. <div class="dialog-btn-wrap">
  132. 打印小票
  133. <el-switch
  134. style="margin:0 50px 0 10px"
  135. v-model="isPrintSmallTicket">
  136. </el-switch>
  137. 自动打印
  138. <el-switch
  139. style="margin:0 50px 0 10px"
  140. v-model="isPrint">
  141. </el-switch>
  142. <el-button @click="handleClose">
  143. 取消
  144. </el-button>
  145. <el-button
  146. type="warning"
  147. v-if="showRefresh"
  148. :disabled="isRefresh"
  149. @click="payRefresh">
  150. 刷新支付状态<span v-if="isRefresh">({{ countNum }})</span>
  151. </el-button>
  152. <el-button
  153. type="danger"
  154. v-if="scenicName==='狼山景区'||scenicName==='军山景区'"
  155. @click="$refs.queryPos.show()">
  156. 查询POS机交易
  157. </el-button>
  158. <el-button
  159. type="primary"
  160. :disabled="submitDisable"
  161. @click="submit()"
  162. >
  163. {{ submitDisable?'正在处理':'确认出票' }}
  164. </el-button>
  165. </div>
  166. <ReadValueCard
  167. ref="readValueCard"
  168. @getInfo="handleValueCardPay"
  169. @close="submitDisable=false"></ReadValueCard>
  170. <QueryPos
  171. ref="queryPos"
  172. @confirm="handleQueryPos"></QueryPos>
  173. <!-- GlobalComponents 全局组件 -->
  174. <PosQrCodeReader
  175. ref="posQrCodeReader"
  176. @getQrcode="submit"></PosQrCodeReader>
  177. <XSCQrCodeReader
  178. ref="XSCQrCodeReader"
  179. @getQrcode="submit"></XSCQrCodeReader>
  180. <ValueCardInput
  181. ref="ValueCardInput"
  182. @getMemberSystemId="submit"></ValueCardInput>
  183. </el-dialog>
  184. </template>
  185. <script>
  186. import mixin from './mixin'
  187. import posMixin from '@/pages/common/posMixin'
  188. import confirmMixin from '../common/confirmMixin'
  189. import moment from 'moment'
  190. export default {
  191. mixins: [mixin, posMixin, confirmMixin],
  192. data () {
  193. return {
  194. pageName: '散客售票'
  195. }
  196. },
  197. methods: {
  198. setParams () {
  199. let tickets = JSON.parse(JSON.stringify(this.tickets))
  200. let params = Object.assign({}, this.formData)
  201. params.playDateBegin = moment(this.formData.playDateBegin).format('YYYY-MM-DD')
  202. params.playDateEnd = moment(this.formData.playDateEnd).format('YYYY-MM-DD')
  203. // 一码多人,根据单张门票最大限额进行拆分
  204. if (params.checkWay - 0 === 2) {
  205. let allTickets = []
  206. this.orderInfo.forEach((item, index) => {
  207. let count = item.count
  208. let ticketOrderTravellers = item.tickets.map(i => {
  209. return {
  210. name: i.guestName,
  211. idType: i.guestIdentifyType,
  212. idNum: i.guestIdentify,
  213. mobile: i.guestPhone
  214. }
  215. })
  216. let obj = JSON.parse(JSON.stringify(item.tickets[0]))
  217. obj.ticketOrderTravellers = ticketOrderTravellers
  218. let originItem = JSON.stringify(obj)
  219. if (!this.maxNum) {
  220. let item = JSON.parse(originItem)
  221. item.checkNum = count
  222. item.price = this.$NP.times(item.checkNum, item.price)
  223. allTickets.push(item)
  224. return
  225. }
  226. if (count > this.maxNum) {
  227. let num = Math.ceil(count / this.maxNum)
  228. for (let i = 0; i < num - 1; i++) {
  229. let newItem = JSON.parse(originItem)
  230. newItem.checkNum = this.maxNum
  231. newItem.price = this.$NP.times(this.maxNum, item.price)
  232. allTickets.push(newItem)
  233. }
  234. let lastItem = JSON.parse(originItem)
  235. if (count % this.maxNum === 0) {
  236. lastItem.checkNum = this.maxNum
  237. } else {
  238. lastItem.checkNum = count % this.maxNum
  239. }
  240. lastItem.price = this.$NP.times(lastItem.checkNum, item.price)
  241. allTickets.push(lastItem)
  242. } else {
  243. let item = JSON.parse(originItem)
  244. item.checkNum = count
  245. item.price = this.$NP.times(item.checkNum, item.price)
  246. allTickets.push(item)
  247. }
  248. })
  249. console.log('allTickets', allTickets)
  250. params.tickets = allTickets
  251. } else {
  252. params.tickets = tickets.map((item, idx) => {
  253. const orderItem = this.orderInfo[idx]
  254. item.distinctPrice = orderItem ? orderItem.distinctPrice : 0
  255. return item
  256. })
  257. }
  258. // params.count = this.totalCount
  259. params.payChannel = this.currentPayChannel
  260. params.price = this.orderPrice
  261. params.sellDevice = this.sellerDevice && this.sellerDevice.ip4
  262. this.params = params
  263. }
  264. }
  265. }
  266. </script>
  267. <style lang="scss" scoped>
  268. .btn-wrap {
  269. padding-top: 20px; text-align: center;
  270. }
  271. .info-wrap {
  272. padding: 20px 20px;
  273. ::v-deep .el-form-item__label{
  274. font-size: 16px;
  275. }
  276. ::v-deep .el-form-item{
  277. display: inline-block;
  278. }
  279. .strong {
  280. font-size: 1.8em; font-weight: bold;
  281. }
  282. }
  283. </style>
  284. <style lang="scss">
  285. </style>