user.ts 14 KB

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