createOrder.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. <template>
  2. <ay-container :hideIcon="data.hideIcon">
  3. <ayb-station type="2" :stationInfo="data.stationInfo" />
  4. <div class="section">加气员</div>
  5. <div class="s-fz font-bold">
  6. {{ data.stationInfo.cashierName }} [ 工号:{{ data.stationInfo.no }} ] 为您服务
  7. </div>
  8. <div class="chunk" v-if="false">
  9. <div class="center justify-start">
  10. <image class="personal" :src="store.user.userInfo.head_url" mode="scaleToFill" />
  11. <div>
  12. <div class="p-fz">{{ store.user.userInfo.user_name }}</div>
  13. <div class="mt-spacd2 s-fz">{{ store.user.userInfo.mobileDes }}</div>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="station">
  18. <div class="section">加气量(公斤)</div>
  19. <uni-easyinput
  20. v-if="store.user.isLogined"
  21. v-model="data.gasQty"
  22. type="digit"
  23. :clearable="false"
  24. placeholder="请填写"
  25. focus
  26. @input="methods.input"
  27. @blur="methods.paysel"
  28. @confirm="methods.paysel"
  29. />
  30. <!-- @clear="methods.clear" -->
  31. <div v-else class="no-login-input s-fz" @click="ay.goLogin()">请填写</div>
  32. <div class="mt-spac">
  33. <ay-skeletons
  34. :rowList="data.rowList"
  35. :loading="data.fpayType === -1 && store.webapi.strategy.paysel.ing"
  36. >
  37. <ay-tabs :tabs="tabs" v-model="data.fpayType" v-show="data.fpayType !== -1">
  38. <template v-slot:tab0>
  39. <pay-type :type="0" :paysel-data="personPay" v-model:enjoyRebate="data.enjoyRebate" />
  40. </template>
  41. <template v-slot:tab1>
  42. <pay-type :type="1" :paysel-data="carrierPay" @re-data="methods.paysel" />
  43. </template>
  44. </ay-tabs>
  45. </ay-skeletons>
  46. </div>
  47. </div>
  48. <div class="btns">
  49. <button type="primary" @click="methods.confirm" :loading="createing" :disabled="noCanPay">
  50. {{ curPay?.buttonMsg }}
  51. </button>
  52. </div>
  53. </ay-container>
  54. </template>
  55. <script lang="ts" setup>
  56. import payType from './components/payType.vue'
  57. const data = ay.initData({
  58. input: '',
  59. rowList: [
  60. {
  61. align: 'left',
  62. colItems: [
  63. {
  64. style: {
  65. width: '30%',
  66. },
  67. },
  68. ],
  69. },
  70. ...Array(3).fill({
  71. align: 'left',
  72. colItems: 1,
  73. }),
  74. ],
  75. hideIcon: false,
  76. currentTab: 0,
  77. stationInfo: {} as GasstationCashierVO对象,
  78. gasQty: '',
  79. // 扫小程序码进来时,scene参数的值
  80. wxCodeScene: '',
  81. paysel: {} as 待支付订单_可选支付方式获取实体类,
  82. /** 页面选择支付类型:-1:未呈现 0:个人:1:物流 */
  83. fpayType: -1,
  84. /** 享受优惠 */
  85. enjoyRebate: true,
  86. /** 原生支付状态 */
  87. nativePayState: enums.ReqState.unasked,
  88. /** 加气量已清除 */
  89. cleared: false,
  90. })
  91. const cashierId = computed(
  92. () => data.wxCodeScene || pageConfig.value.params?.scene || pageConfig.value.params?.cashierId,
  93. )
  94. const gasQtyNum = computed(() => Number(data.gasQty))
  95. const user = computed(() => store.user.userInfo)
  96. const pageConfig = computed(() => store.curPage.pageConfig)
  97. const personPay = computed(() => data.paysel?.personPay)
  98. const carrierPay = computed(() => data.paysel?.carrierPay)
  99. /** 当前支付方式 */
  100. const curPay = computed<
  101. 待支付订单_可选支付方式物流支付实体类 & 待支付订单_可选支付方式个人支付实体类
  102. >(() => {
  103. let rv: 待支付订单_可选支付方式物流支付实体类 & 待支付订单_可选支付方式个人支付实体类 = {
  104. buttonMsg: '请填写本次加气量',
  105. buttonEnable: false,
  106. }
  107. if (data.fpayType === 0) {
  108. rv = {
  109. ...data.paysel?.personPay,
  110. amount: data.paysel.personPay.amount,
  111. }
  112. if (!data.enjoyRebate) {
  113. rv.buttonMsg = rv.buttonMsgNoRebate
  114. rv.amount = rv.allAmount
  115. }
  116. }
  117. if (data.fpayType === 1) {
  118. rv = data.paysel?.carrierPay
  119. }
  120. return rv
  121. })
  122. /** 订单创建中 */
  123. const createing = computed(
  124. () =>
  125. // 创建加气订单中
  126. store.webapi.pay.add_v2.ing ||
  127. // 订单支付接口请求中
  128. store.webapi.pay.order_pay.ing,
  129. )
  130. const noCanPay = computed(
  131. () =>
  132. // 按钮不可点击
  133. !curPay.value?.buttonEnable ||
  134. // 获取待支付订单的可选支付方式中
  135. store.webapi.strategy.paysel.ing ||
  136. createing.value ||
  137. // 订单支付接口请求成功 && 原生未支付失败
  138. (store.webapi.pay.order_pay.success && data.nativePayState !== enums.ReqState.fail),
  139. )
  140. const tabs = computed(() => {
  141. const tabs = []
  142. if (carrierPay.value) {
  143. tabs.push({ title: '所属物流支付', value: 1 })
  144. }
  145. if (personPay.value) {
  146. tabs.push({ title: '个人支付', value: 0 })
  147. }
  148. return tabs
  149. })
  150. const methods = {
  151. async checkNopayfordriver() {
  152. const nopayfordriver = await webapi.pay.find_unpayfordriver()
  153. if (nopayfordriver) {
  154. ay.goPage(config.pages.order_orderDetail, {
  155. params: { orderId: nopayfordriver.orderId },
  156. goPageType: enums.GoPageType.redirectTo,
  157. })
  158. return true
  159. }
  160. return false
  161. },
  162. /** 个人支付-有无优惠切换 */
  163. switchRebate(checked) {
  164. data.enjoyRebate = checked
  165. },
  166. checkLogin() {
  167. console.log('checkLogin')
  168. if (store.user.isLogined) return
  169. ay.goLogin()
  170. },
  171. input() {
  172. nextTick(() => {
  173. data.gasQty = data.gasQty.replace(/^\D*(\d*\.{0,1}\d{0,2}).*/, '$1')
  174. })
  175. },
  176. async clear() {
  177. data.fpayType = -1
  178. data.cleared = true
  179. await func.awaiter(100)
  180. data.cleared = false
  181. },
  182. async paysel() {
  183. // if (data.cleared) {
  184. // return
  185. // }
  186. if (gasQtyNum.value <= 0) {
  187. data.fpayType = -1
  188. data.enjoyRebate = true
  189. func.native.showToast('加气量需大于零')
  190. return false
  191. }
  192. webapi.strategy
  193. .paysel({
  194. cashierId: cashierId.value,
  195. driverId: user.value.user_id,
  196. gasQty: gasQtyNum.value,
  197. creater: user.value.user_id,
  198. createrName: user.value.user_name,
  199. })
  200. .then((res) => {
  201. data.paysel = res
  202. if (data.fpayType === -1) {
  203. if (carrierPay.value) {
  204. data.fpayType = 1
  205. } else if (personPay.value) {
  206. data.fpayType = 0
  207. }
  208. }
  209. })
  210. },
  211. async confirm() {
  212. if (store.webapi.strategy.paysel.ing) return
  213. if (gasQtyNum.value <= 0) {
  214. func.native.showToast('加气量需大于零')
  215. return false
  216. }
  217. if (gasQtyNum.value > store.common.data.preferWeight) {
  218. func.native.showToast('加气量不能超过' + store.common.data.preferWeight)
  219. return false
  220. }
  221. // 物流支付-仅创建订单
  222. if (data.fpayType === 1 && carrierPay.value?.createOnly) {
  223. methods.createOnly()
  224. } else {
  225. methods.pay()
  226. }
  227. },
  228. createOnly() {
  229. // {
  230. // cashierId: pageConfig.value.params.cashierId,
  231. // driverId: user.value.user_id,
  232. // gasQty: gasQtyNum.value,
  233. // gasstationId: pageConfig.value.params.gasstationId,
  234. // createRole: 'driver', // 1 平台管理员 2 平台运营人员 filler 加气站企业管理者 cashier 加气员 carrier 物流公司管理者 driver 司机
  235. // creater: user.value.user_id,
  236. // createrName: user.value.user_name,
  237. // }
  238. webapi.pay.add_v2(data.paysel.gasOrder).then((res) => {
  239. ay.goPage(config.pages.order_orderDetail, {
  240. params: data.paysel.gasOrder,
  241. goPageType: enums.GoPageType.redirectTo,
  242. })
  243. })
  244. },
  245. async pay() {
  246. const params: OrderPayParam = {
  247. // orderId: data.paysel.gasOrder.orderId,
  248. payType: curPay.value.payType,
  249. gasOrder: data.paysel.gasOrder,
  250. }
  251. // 需要微信支付
  252. if ([1, 2, 3].includes(curPay.value.payType)) {
  253. const li = await uni.login()
  254. params.jsCode = li.code
  255. params.wxAmount = curPay.value.wxAmount
  256. }
  257. // 个人支付
  258. if (data.fpayType === 0) {
  259. params.personRebate = data.enjoyRebate ? 0 : 1
  260. }
  261. // 物流支付
  262. if (data.fpayType === 1) {
  263. params.carNumber = carrierPay.value.carNumber
  264. params.carrierOrgId = carrierPay.value.carrierOrgId
  265. params.carrierOrgName = carrierPay.value.carrierOrgName
  266. params.linked = carrierPay.value.linked
  267. params.tradeType = carrierPay.value.tradeType
  268. params.truckId = carrierPay.value.truckId
  269. }
  270. webapi.pay
  271. .order_pay(params)
  272. .then((res) => {
  273. if ([1, 2, 3].includes(curPay.value.payType)) {
  274. data.nativePayState = enums.ReqState.ing
  275. uni.requestPayment({
  276. ...JSON.parse(res.payInfo),
  277. success() {
  278. data.nativePayState = enums.ReqState.success
  279. methods.paySuccess()
  280. },
  281. fail() {
  282. data.nativePayState = enums.ReqState.fail
  283. func.native.showToast({
  284. icon: 'error',
  285. title: '支付失败',
  286. })
  287. // 物流支付失败跳订单详情
  288. if (data.fpayType === 1) {
  289. ay.goPage(config.pages.order_orderDetail, {
  290. params: data.paysel.gasOrder,
  291. goPageType: enums.GoPageType.redirectTo,
  292. })
  293. }
  294. },
  295. })
  296. } else {
  297. methods.paySuccess()
  298. }
  299. })
  300. .catch((err) => {
  301. if ([3003, 3110].includes(err.res.code)) {
  302. // 物流支付失败跳订单详情
  303. if (data.fpayType === 1) {
  304. ay.goPage(config.pages.order_orderDetail, {
  305. params: data.paysel.gasOrder,
  306. goPageType: enums.GoPageType.redirectTo,
  307. })
  308. }
  309. }
  310. })
  311. },
  312. paySuccess() {
  313. func.native
  314. .showToast({
  315. icon: 'success',
  316. title: '支付成功',
  317. })
  318. .then(() => {
  319. ay.goPage(config.pages.order_orderDetail, {
  320. params: data.paysel.gasOrder,
  321. goPageType: enums.GoPageType.redirectTo,
  322. })
  323. })
  324. },
  325. }
  326. ay.entrance(
  327. async (args) => {
  328. if (store.user.isLogined) {
  329. const hasnp = await methods.checkNopayfordriver()
  330. if (hasnp) return
  331. }
  332. data.wxCodeScene = args?.query?.scene
  333. // 微信扫小程序码进来时,scene参数有值
  334. if (data.wxCodeScene) {
  335. // 未登录隐藏返回首页按钮
  336. data.hideIcon = !store.user.isLogined
  337. }
  338. // console.log('params', pageConfig.value.params)
  339. const location = await func.native.getLocation()
  340. data.stationInfo = await webapi.strategy.find_by_cashier({
  341. cashierId: cashierId.value, // '710613333157822464', // '600021999820734464',
  342. longitude: location.longitude.toString(),
  343. latitude: location.latitude.toString(),
  344. driverId: store.user.userInfo.user_id,
  345. })
  346. },
  347. {
  348. addLoadTypes: [enums.LoadType.onShow],
  349. },
  350. )
  351. onUnload(() => {
  352. store.webapi.strategy.paysel.set()
  353. store.webapi.pay.add_v2.set()
  354. store.webapi.pay.order_pay.set()
  355. })
  356. </script>
  357. <style lang="scss" scoped>
  358. .personal {
  359. width: 100rpx;
  360. height: 100rpx;
  361. margin-right: $p-spac;
  362. border-radius: $p-spac;
  363. }
  364. ::v-deep .is-input-border {
  365. border: none;
  366. border-bottom: 2rpx solid $p-color !important;
  367. border-radius: 0;
  368. }
  369. .no-login-input {
  370. padding: 20rpx;
  371. //font-size: 28rpx;
  372. color: $gray-color;
  373. border-bottom: 2rpx solid $p-color;
  374. }
  375. </style>