index.ts 11 KB

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