index.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. // index.ts
  2. import { api_shopProduct, api_shopInstruments, api_getUserBeneficiaryPage } from "../../api/login";
  3. import { debounce } from '../../utils/util'
  4. // 获取应用实例
  5. const app = getApp<IAppOption>()
  6. // pages/orders/orders.ts
  7. Page({
  8. /**
  9. * 页面的初始数据
  10. */
  11. data: {
  12. maxTop: 0,
  13. top: 0, // 初始的上偏移
  14. startY: 0, // 触摸起始点 Y 坐标
  15. windowHeight: 0, // 屏幕高度
  16. elementHeight: 180, // 元素高度
  17. goodsImgList: [
  18. "https://oss.dayaedu.com/ktyq/1739518565519.png",
  19. "https://oss.dayaedu.com/ktyq/1739518602666.png",
  20. "https://oss.dayaedu.com/ktyq/1739518623253.png",
  21. "https://oss.dayaedu.com/ktyq/1739518638007.png"
  22. ],
  23. serviceShow: true,
  24. popupShow: false,
  25. list: [] as any,
  26. instrumentsList: [] as any[],
  27. isOverSaled: false, // 是否所有商品都没有库存
  28. selected: {} as any,
  29. selectedInstruments: {} as any,
  30. memberInfo: {} as any, // 会员信息
  31. isShowMemberInfoTip: false, // 会员信息提示
  32. isFromPreviewImage: false,
  33. isShowOperation: false, // 是否显示操作按钮
  34. },
  35. /**
  36. * 生命周期函数--监听页面加载
  37. */
  38. onLoad() {
  39. // this.onInit()
  40. },
  41. /**
  42. * 获取基础信息
  43. */
  44. async onInit() {
  45. try {
  46. const [{ data }, { data: instrumentsData }] = await Promise.all([api_shopProduct({ appId: app.globalData.appId }), api_shopInstruments({ appId: app.globalData.appId })])
  47. // 商品
  48. const list = data.data || []
  49. let selected: any = {}
  50. let isOverSaled = true // 是否销售完
  51. list.forEach((item: any) => {
  52. item.typeName = this.formatPeriod(item.num, item.period);
  53. if (item.stockNum > 0) {
  54. isOverSaled = false
  55. if (!selected.id) {
  56. selected = item
  57. }
  58. }
  59. });
  60. if (isOverSaled) {
  61. // 没有可购买商品则默认选中第一个商品
  62. selected = list[0]
  63. }
  64. // 乐器
  65. const instrumentsList = instrumentsData.data
  66. this.setData({
  67. list,
  68. isOverSaled,
  69. selected,
  70. instrumentsList,
  71. selectedInstruments: {}
  72. })
  73. } catch (e) {
  74. console.log(e, 'e')
  75. }
  76. },
  77. // 格式化类型
  78. formatPeriod(num: number, type: string) {
  79. const template: any = {
  80. DAY: "天卡",
  81. MONTH: "月卡",
  82. YEAR: "年卡"
  83. }
  84. if (type === "YEAR" && num >= 99) {
  85. return '永久卡'
  86. }
  87. return num + template[type]
  88. },
  89. // 选择
  90. onSelectGoods(e: any) {
  91. const { dataset } = e.currentTarget
  92. const item = this.data.list.find((item: any) => item.id === dataset.id)
  93. // 判断是否有库存
  94. if (item.stockNum <= 0) {
  95. return
  96. }
  97. this.setData({
  98. selected: item || {}
  99. })
  100. },
  101. onSelectInstrumentsGoods(e: any) {
  102. const { dataset } = e.currentTarget
  103. let item = this.data.instrumentsList[dataset.index]
  104. if (item?.id === this.data.selectedInstruments?.id) {
  105. item = {}
  106. }
  107. this.setData({
  108. selectedInstruments: item || {}
  109. })
  110. },
  111. isLogin() {
  112. // 判断是否登录
  113. if (!app.globalData.isLogin) {
  114. wx.navigateTo({
  115. url: '../login/login',
  116. })
  117. return false
  118. }
  119. return true
  120. },
  121. /** 我的订单 */
  122. onOrder() {
  123. // 判断是否登录
  124. if (!this.isLogin()) {
  125. return
  126. }
  127. wx.navigateTo({
  128. url: '../orders/orders',
  129. })
  130. },
  131. onBuyShop() {
  132. // 判断是否登录
  133. if (!this.isLogin()) {
  134. return
  135. }
  136. this.setData({
  137. popupShow: true
  138. })
  139. },
  140. onClose() {
  141. this.setData({
  142. popupShow: false
  143. })
  144. },
  145. async onMemberInfo() {
  146. this.setData({
  147. isShowMemberInfoTip: false
  148. })
  149. try {
  150. const resData = await api_getUserBeneficiaryPage()
  151. const pageRows = resData?.data?.data?.rows || []
  152. // 当有权益人的时候跳转到权益人选择列表页面,当没有权益人的时候到添加权益人页面
  153. if (pageRows.length) {
  154. wx.navigateTo({
  155. url: `/pages/member/memberList?id=${this.data.memberInfo.id}`
  156. });
  157. } else {
  158. // 当redirectUrl等于index的时候证明是首次添加,需要给上一个页面
  159. wx.navigateTo({
  160. url: `/pages/member/addMember?redirectUrl=index`
  161. });
  162. }
  163. } catch (e) {
  164. console.log(e, 'e')
  165. }
  166. },
  167. onSubmit() {
  168. // 判断是否登录
  169. const that = this
  170. debounce(function () {
  171. if (!that.isLogin()) {
  172. return
  173. }
  174. if (!that.data.memberInfo.id) {
  175. wx.showToast({
  176. title: "请填写会员信息",
  177. icon: 'none'
  178. })
  179. that.setData({
  180. isShowMemberInfoTip: true
  181. })
  182. return
  183. }
  184. let info = JSON.stringify({
  185. ...that.data.selected
  186. });
  187. let instrumentsInfo = JSON.stringify({
  188. ...that.data.selectedInstruments
  189. })
  190. let memberInfo = JSON.stringify({
  191. ...that.data.memberInfo
  192. })
  193. info = encodeURIComponent(info);
  194. instrumentsInfo = encodeURIComponent(instrumentsInfo);
  195. memberInfo = encodeURIComponent(memberInfo);
  196. wx.navigateTo({
  197. url: `../orders/order-detail?orderInfo=${info}&instrumentsInfo=${instrumentsInfo}&memberInfo=${memberInfo}`,
  198. success: () => {
  199. }
  200. })
  201. }, 300)()
  202. },
  203. onPreivewGoodsImg(e: { currentTarget: { dataset: any } }) {
  204. wx.previewImage({
  205. current: e.currentTarget.dataset.src,
  206. urls: this.data.goodsImgList,
  207. success: () => {
  208. this.setData({
  209. isFromPreviewImage: true
  210. })
  211. }
  212. })
  213. },
  214. onPreivewGoods(e: { currentTarget: { dataset: any } }) {
  215. wx.previewImage({
  216. current: e.currentTarget.dataset.src,
  217. urls: [e.currentTarget.dataset.src],
  218. success: () => {
  219. this.setData({
  220. isFromPreviewImage: true
  221. })
  222. }
  223. })
  224. },
  225. /**
  226. * 生命周期函数--监听页面显示
  227. */
  228. onShow() {
  229. this.initPosInfo()
  230. if (!this.data.isFromPreviewImage && !this.data.popupShow) {
  231. this.onInit()
  232. this.setData({
  233. memberInfo: {}
  234. })
  235. } else {
  236. this.setData({
  237. isFromPreviewImage: false
  238. })
  239. }
  240. this.setData({
  241. serviceShow: true
  242. })
  243. },
  244. onHide() {
  245. this.setData({
  246. serviceShow: false
  247. })
  248. },
  249. // 初始化位置信息
  250. initPosInfo() {
  251. // 获取屏幕宽高
  252. const systemInfo = wx.getWindowInfo();
  253. const isAndroid = systemInfo.platform === 'android'
  254. // const isDevtools = systemInfo.platform === 'devtools'
  255. const barHeight = !isAndroid ? 44 : 48;
  256. const globalTop = app.globalData.sectionBoxTop
  257. this.setData({
  258. maxTop: barHeight + systemInfo.safeArea.top,
  259. windowHeight: systemInfo.windowHeight,
  260. top: globalTop
  261. });
  262. },
  263. onTouchStart(e: any) {
  264. // 记录触摸起始点的 Y 坐标
  265. this.setData({
  266. startY: e.touches[0].clientY
  267. });
  268. },
  269. onTouchMove(e: any) {
  270. // 计算上下方向的偏移量
  271. const deltaY = e.touches[0].clientY - this.data.startY;
  272. // 更新元素的垂直位置
  273. app.globalData.sectionBoxTop = this.data.top + deltaY
  274. this.setData({
  275. top: this.data.top + deltaY,
  276. startY: e.touches[0].clientY
  277. });
  278. },
  279. onTouchEnd() {
  280. const { top, windowHeight, elementHeight } = this.data;
  281. // 计算与顶部和底部边界的距离
  282. const distanceTop = top;
  283. const moveHeight = top + elementHeight
  284. // 判断元素与顶部和底部的距离,选择最近的边界
  285. if (distanceTop < this.data.maxTop) {
  286. this.setData({ top: this.data.maxTop }, () => {
  287. app.globalData.sectionBoxTop = this.data.maxTop
  288. }); // 吸附到顶部
  289. } else if (moveHeight >= windowHeight) {
  290. this.setData({ top: windowHeight - elementHeight }, () => {
  291. app.globalData.sectionBoxTop = windowHeight - elementHeight
  292. })
  293. } else {
  294. this.setData({ top }, () => {
  295. app.globalData.sectionBoxTop = top
  296. })
  297. }
  298. },
  299. onScroll(e: { detail: any }) {
  300. // console.log(e, 'any')
  301. const scrollTop = e.detail.scrollTop || 0
  302. if (scrollTop > 40) {
  303. this.setData({
  304. isShowOperation: true
  305. })
  306. } else {
  307. this.setData({
  308. isShowOperation: false
  309. })
  310. }
  311. },
  312. onShareAppMessage() {
  313. return {
  314. title: '音乐数字AI器乐工具',
  315. path: '/pages/index/index',
  316. imageUrl: 'https://oss.dayaedu.com/ktyq/1733311074676.png'
  317. }
  318. },
  319. onShareTimeline() {
  320. return {
  321. title: '音乐数字AI器乐工具',
  322. path: '/pages/index/index',
  323. imageUrl: 'https://oss.dayaedu.com/ktyq/1733311074676.png'
  324. }
  325. }
  326. })