index.ts 9.9 KB

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