user.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. import { defineStore } from 'pinia'
  2. import { dayjs } from 'wot-design-uni'
  3. import { StaticUrl } from '@/config'
  4. import router from '@/router'
  5. import type { wxpay } from '@/api/globals'
  6. interface userStroe {
  7. token: string
  8. /**
  9. * 重定向路由名称
  10. */
  11. redirectName: string
  12. /**
  13. * 用户登录信息
  14. */
  15. userInfo: Api.userInfo
  16. /**
  17. * 用户收货地址
  18. */
  19. addresses: Api.addressList[]
  20. /**
  21. * 星闪爆用户选择的收货地址
  22. *
  23. */
  24. selectedAddress: Api.addressList | null
  25. /**
  26. * 市民请集合购物车用户选中的收货地址
  27. */
  28. smqjhSelectedAddress: Api.addressList | null
  29. }
  30. export const useUserStore = defineStore('user', {
  31. state: (): userStroe => ({
  32. token: '',
  33. redirectName: '',
  34. userInfo: {
  35. id: 0,
  36. channelId: 0,
  37. channelName: '',
  38. },
  39. addresses: [],
  40. selectedAddress: null,
  41. smqjhSelectedAddress: null,
  42. }),
  43. getters: {
  44. getUserAvatar(): string {
  45. if (this.userInfo.avatarUrl) {
  46. return this.userInfo.avatarUrl
  47. }
  48. return `${StaticUrl}/avator.png`
  49. },
  50. },
  51. actions: {
  52. async getUserInfo() {
  53. if (this.token) {
  54. const { data } = await api.sys.userInfo({})
  55. this.userInfo = data
  56. await this.getuserAddresslist()
  57. this.getSelectedAddress()
  58. await useSmqjhCartStore().getCartList('XSB')
  59. }
  60. },
  61. async updataUserInfo(data: Api.userInfo) {
  62. uni.showLoading({ mask: true })
  63. await Apis.sys.updateUserInfo({ pathParams: { memberId: data.id }, data })
  64. uni.hideLoading()
  65. useGlobalToast().show({ msg: '修改成功' })
  66. this.getUserInfo()
  67. },
  68. /**
  69. * 获取用户收货地址列表
  70. */
  71. async getuserAddresslist() {
  72. return new Promise((resolve, reject) => {
  73. uni.showLoading({ mask: true })
  74. Apis.sys.addresses({}).then((res) => {
  75. this.addresses = res.data || []
  76. resolve(res)
  77. }).catch(err => reject(err)).finally(() => uni.hideLoading())
  78. })
  79. },
  80. /**
  81. *
  82. * 更新用户选择的收货地址
  83. */
  84. updateSelectedAddress(address: Api.addressList) {
  85. this.selectedAddress = address
  86. },
  87. /**
  88. * 获取用户收货地址
  89. * @description 默认选择默认地址,如无默认地址则不选择
  90. */
  91. getSelectedAddress() {
  92. this.selectedAddress = this.addresses.find(it => it.defaulted === 1) ?? null
  93. },
  94. /**
  95. * 获取市民请集合购物车用户选择的收货地址
  96. * @description 默认选择默认地址,如无默认地址则不选择
  97. */
  98. getSmqjhSelectedAddress() {
  99. this.smqjhSelectedAddress = this.addresses.find(it => it.defaulted === 1) ?? null
  100. },
  101. /**
  102. * 更新市民请集合购物车用户选择的收货地址
  103. */
  104. updateSmqjhSelectedAddress(address: Api.addressList) {
  105. this.smqjhSelectedAddress = address
  106. },
  107. /**
  108. * 检测当前用户是否登录,如果没有登录弹窗提示未登录
  109. */
  110. checkLogin() {
  111. return new Promise((resolve, reject) => {
  112. if (!this.token) {
  113. useGlobalMessage().confirm({
  114. title: '提示',
  115. msg: '检测到当前状态未登录,是否登录',
  116. confirmButtonText: '登录',
  117. cancelButtonText: '取消',
  118. zIndex: 99999999999,
  119. success() {
  120. router.replace({ name: 'smqjh-login' })
  121. setTimeout(() => { // 延迟1秒后抛错,防止立马抛错之后用户立即点击按钮会重复跳转登录页面
  122. reject(new Error('未登录'))
  123. }, 1000)
  124. },
  125. fail() {
  126. reject(new Error('未登录'))
  127. },
  128. })
  129. }
  130. else {
  131. resolve(1)
  132. }
  133. })
  134. },
  135. /**
  136. * 通用支付逻辑
  137. * @param orderNumber
  138. * @returns
  139. */
  140. handleCommonPayMent(orderNumber: string): Promise<wxpay> {
  141. return new Promise((resolve, reject) => {
  142. if (!orderNumber) {
  143. useGlobalToast().show({ msg: '订单号为空!请联系管理员' })
  144. reject(new Error('订单号为空!请联系管理员'))
  145. return
  146. }
  147. uni.showLoading({ mask: true })
  148. Apis.common.hybridPayment({ data: { orderNumber } }).then((res) => {
  149. resolve(res.data)
  150. uni.hideLoading()
  151. }).catch((err) => {
  152. uni.hideLoading()
  153. reject(err)
  154. })
  155. })
  156. }, /**
  157. *
  158. * @param freightFee
  159. * @param businessType
  160. * @param dvyType 配送类型 1:快递 2:自提 3:及时配送
  161. * @param shopId
  162. * @param orderItemList
  163. * @param remarks
  164. * @param allowanceId
  165. * @returns 下单获取待支付订单号
  166. */
  167. getOrderPayMent(freightFee: number, businessType: string, dvyType: number, shopId: number, orderItemList: {
  168. prodCount?: number
  169. skuId?: number
  170. }[], remarks?: string, allowanceId?: string): Promise<string> {
  171. uni.showLoading({ mask: true })
  172. return new Promise((resolve, reject) => {
  173. if (!this.selectedAddress) {
  174. reject(new Error('请选择收货地址'))
  175. return
  176. }
  177. Apis.common.addOrder({
  178. data: {
  179. channelId: Number(this.userInfo.channelId),
  180. businessType,
  181. addressId: this.selectedAddress.id,
  182. dvyType,
  183. freightAmount: freightFee,
  184. shopId,
  185. orderItemList,
  186. remarks,
  187. allowanceIds: allowanceId ? [allowanceId] : [],
  188. },
  189. }).then((res) => {
  190. resolve(res.data)
  191. uni.hideLoading()
  192. }).catch((err) => {
  193. uni.hideLoading()
  194. reject(err)
  195. })
  196. })
  197. },
  198. /**
  199. *
  200. * @param orderInfo
  201. * @returns 统一拉起微信支付
  202. * @param type 0是下单,1是列表下单
  203. */
  204. getWxCommonPayment(orderPay: wxpay) {
  205. uni.showLoading({ mask: true })
  206. return new Promise((resolve, reject) => {
  207. const orderInfo = {
  208. appid: orderPay.appId,
  209. timeStamp: orderPay.timeStamp,
  210. nonceStr: orderPay.nonceStr,
  211. package: orderPay.package,
  212. signType: orderPay.signType,
  213. paySign: orderPay.paySign,
  214. }
  215. uni.requestPayment({
  216. provider: 'wxpay',
  217. orderInfo,
  218. ...orderInfo,
  219. success: (res) => {
  220. resolve(res)
  221. },
  222. fail: (e) => {
  223. reject(e)
  224. },
  225. complete() {
  226. uni.hideLoading()
  227. },
  228. })
  229. })
  230. },
  231. /**
  232. *
  233. * 支付成功统一跳转
  234. * @param name 订单列表
  235. * @param idxPath 首页路径
  236. *
  237. */
  238. paySuccess(name: string, idxPath: string) {
  239. return new Promise((resolve) => {
  240. useSysStore().setPaySuccessPath(name, idxPath)
  241. router.replace({ name: 'common-paySuccess' })
  242. setTimeout(() => {
  243. resolve(1)
  244. }, 2000)
  245. })
  246. },
  247. /**
  248. *
  249. * 支付失败统一跳转
  250. * @param name 订单列表
  251. * @param idxPath 首页路径
  252. */
  253. payError(name: string, idxPath: string) {
  254. return new Promise((resolve) => {
  255. useSysStore().setPaySuccessPath(name, idxPath)
  256. router.replace({ name: 'common-payError' })
  257. setTimeout(() => {
  258. resolve(1)
  259. }, 2000)
  260. })
  261. }, /**
  262. * 支付成功清空购买的商品的购物车
  263. */
  264. clearCart(skuList: Api.CartSkuVo[]) {
  265. uni.showLoading({ mask: true })
  266. return new Promise((resolve) => {
  267. const skuids = skuList.map(item => item.id).join(',')
  268. if (skuids.length) {
  269. Apis.common.deleteShoppingCart({
  270. pathParams: {
  271. ids: skuids,
  272. },
  273. }).then(async (res) => {
  274. resolve(res)
  275. await useSmqjhCartStore().getCartList('XSB')
  276. uni.hideLoading()
  277. }).finally(() => resolve(1))
  278. }
  279. else {
  280. resolve(1)
  281. uni.hideLoading()
  282. }
  283. })
  284. },
  285. /**
  286. * 统一确认收货
  287. * @param order
  288. * @returns
  289. */
  290. handleCommonOrderReceive(order: Api.xsbOrderList) {
  291. return new Promise((resolve, reject) => {
  292. useGlobalMessage().confirm({
  293. title: '确认收货',
  294. msg: '确定要确认收货吗?',
  295. zIndex: 99999999999999,
  296. success: async () => {
  297. uni.showLoading({ mask: true })
  298. await Apis.xsb.confirmReceipt({
  299. data: {
  300. orderNumber: String(order.orderNumber),
  301. },
  302. })
  303. resolve(1)
  304. },
  305. fail: err => reject(err),
  306. })
  307. })
  308. },
  309. /**
  310. * 统一删除订单
  311. * @param order
  312. * @returns
  313. */
  314. handleCommonDeleteOrder(order: Api.xsbOrderList) {
  315. return new Promise((resolve, reject) => {
  316. useGlobalMessage().confirm({
  317. title: '删除订单',
  318. msg: '确定要删除该订单吗?',
  319. zIndex: 99999999999999,
  320. success: async () => {
  321. uni.showLoading({ mask: true })
  322. Apis.xsb.deleteOrder({
  323. pathParams: {
  324. ids: String(order.orderId),
  325. },
  326. }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
  327. },
  328. fail: async (err) => {
  329. reject(err)
  330. },
  331. })
  332. })
  333. },
  334. /**
  335. * 统一取消订单
  336. * @param order
  337. * @returns
  338. */
  339. handleCommonCancelOrder(order: Api.xsbOrderList) {
  340. return new Promise((resolve, reject) => {
  341. useGlobalMessage().confirm({
  342. title: '取消订单',
  343. msg: '确定要取消订单吗?',
  344. zIndex: 99999999999999,
  345. success: async () => {
  346. uni.showLoading({ mask: true })
  347. Apis.xsb.cancelOrder({
  348. data: {
  349. orderNo: String(order.orderNumber),
  350. },
  351. }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
  352. },
  353. fail: async (err) => {
  354. reject(err)
  355. },
  356. })
  357. })
  358. },
  359. handleXSBCommonOrderStatusText(order: Api.xsbOrderList): any {
  360. if (order.hbOrderStatus === OrderStatus.PaddingPay) {
  361. const endTime = dayjs(order.createTime).add(16, 'minutes')
  362. const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
  363. return Math.max(0, remaining) // 确保不会返回负数
  364. }
  365. if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
  366. return '订单已接单'
  367. }
  368. if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
  369. return '订单待配送'
  370. }
  371. if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
  372. return '订单配送中'
  373. }
  374. if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
  375. return '订单取消审核'
  376. }
  377. if (order.hbOrderStatus === OrderStatus.OrderCancel) {
  378. return '订单取消'
  379. }
  380. if (order.hbOrderStatus === OrderStatus.OrderArrived) {
  381. return '订单已送达'
  382. }
  383. if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
  384. return '订单完成'
  385. }
  386. return '未知订单状态'
  387. },
  388. handleFilmCommonOrderStatusText(order: Api.xsbOrderList): any {
  389. if (order.hbOrderStatus === OrderStatus.PaddingPay) {
  390. const endTime = dayjs(order.createTime).add(16, 'minutes')
  391. const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
  392. return Math.max(0, remaining) // 确保不会返回负数
  393. }
  394. if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
  395. return '待出票'
  396. }
  397. if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
  398. return '订单待配送'
  399. }
  400. if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
  401. return '出票中'
  402. }
  403. if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
  404. return '订单取消审核'
  405. }
  406. if (order.hbOrderStatus === OrderStatus.OrderCancel) {
  407. return '订单取消'
  408. }
  409. if (order.hbOrderStatus === OrderStatus.OrderArrived) {
  410. return '订单完成'
  411. }
  412. if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
  413. return '订单完成'
  414. }
  415. return '未知订单状态'
  416. },
  417. handleDjkCommonOrderStatusText(order: Api.xsbOrderList) {
  418. const textMap = {
  419. [OrderStatus.OrderAccepted]: '待使用',
  420. [OrderStatus.OrderCompleted]: '已完成',
  421. [OrderStatus.OrderCancel]: '已取消',
  422. [OrderStatus.OrderRefund]: '已退款',
  423. [OrderStatus.OrderExpired]: '已过期',
  424. }
  425. return textMap[order.hbOrderStatus as keyof typeof textMap] || '未知订单状态'
  426. },
  427. async getOrderNode(orderNumber: string) {
  428. uni.showLoading({
  429. mask: true,
  430. })
  431. return new Promise((resolve, reject) => {
  432. Apis.xsb.deliveryNode({
  433. data: {
  434. orderNumber,
  435. },
  436. }).then((res) => {
  437. // NodeList.value = res.data
  438. resolve(res.data)
  439. }).catch((err) => {
  440. reject(err)
  441. }).finally(() => uni.hideLoading())
  442. })
  443. },
  444. },
  445. })