spellGroupDetails.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // pages/spellGroupDetails/spellGroupDetails.js
  2. const app = getApp()
  3. var http = require('../../utils/http.js');
  4. var config = require('../../utils/config.js');
  5. var util = require('../../utils/util.js');
  6. Page({
  7. /**
  8. * 页面的初始数据
  9. */
  10. data: {
  11. hideModal: true,
  12. groupTempInfo: {},
  13. groupUserList: [],
  14. countDownObj: {},
  15. nowTime: new Date().getTime(),
  16. skuShow: false,
  17. prodNum: 1,
  18. skuList: [],
  19. skuGroup: {},
  20. findSku: true,
  21. defaultSku: undefined,
  22. detaultGroupSku: undefined,
  23. selectedProp: [],
  24. selectedPropObj: {},
  25. selectedProperties: "",
  26. propKeys: [],
  27. allProperties: [],
  28. groupTeamId: '',
  29. groupSkuId: 0,
  30. orderNumber: 0,
  31. isAuthInfo: true,
  32. countDownObjTimer:''
  33. },
  34. /**
  35. * 生命周期函数--监听页面加载
  36. */
  37. onLoad: function(options) {
  38. // let groupTeamId = options.groupTeamId || ''
  39. // let orderNumber = options.orderNumber || ''
  40. // this.getGroupTeamInfo(groupTeamId, orderNumber)
  41. // this.setData({
  42. // orderNumber: options.orderNumber
  43. // })
  44. },
  45. /**
  46. * 获取用户信息
  47. */
  48. onGotUserInfo: function(e) {
  49. if (e.detail.errMsg != "getUserInfo:fail auth deny") {
  50. this.setData({
  51. isAuthInfo: true
  52. });
  53. http.updateUserInfo();
  54. }
  55. },
  56. //根据sku的属性 分组
  57. groupSkuProp: function(skuList) {
  58. // var skuList = this.data.skuList;
  59. if (skuList.length == 1 && skuList[0].properties == "") {
  60. this.setData({
  61. defaultSku: skuList[0]
  62. });
  63. return;
  64. }
  65. var skuGroup = {};
  66. var allProperties = [];
  67. var propKeys = [];
  68. this.setData({
  69. selectedPropObj: {}
  70. });
  71. for (var i = 0; i < skuList.length; i++) {
  72. var defaultSku = this.data.defaultSku;
  73. var isDefault = false;
  74. if (!defaultSku && skuList[i].actPrice == this.data.groupTempInfo.groupProd.actPrice) { //找到和商品价格一样的那个SKU,作为默认选中的SKU
  75. defaultSku = skuList[i];
  76. isDefault = true;
  77. this.setData({
  78. defaultSku: defaultSku
  79. });
  80. }
  81. var properties = skuList[i].properties; //版本:公开版;颜色:金色;内存:64GB
  82. allProperties.push(properties);
  83. var propList = properties.split(";"); // ["版本:公开版","颜色:金色","内存:64GB"]
  84. var selectedPropObj = this.data.selectedPropObj;
  85. for (var j = 0; j < propList.length; j++) {
  86. var propval = propList[j].split(":"); //["版本","公开版"]
  87. var props = skuGroup[propval[0]]; //先取出 版本对应的值数组
  88. //如果当前是默认选中的sku,把对应的属性值 组装到selectedProp
  89. if (isDefault) {
  90. propKeys.push(propval[0]);
  91. selectedPropObj[propval[0]] = propval[1];
  92. }
  93. if (props == undefined) {
  94. props = []; //假设还没有版本,新建个新的空数组
  95. props.push(propval[1]); //把 "公开版" 放进空数组
  96. } else {
  97. if (!this.array_contain(props, propval[1])) { //如果数组里面没有"公开版"
  98. props.push(propval[1]); //把 "公开版" 放进数组
  99. }
  100. }
  101. skuGroup[propval[0]] = props; //最后把数据 放回版本对应的值
  102. }
  103. this.setData({
  104. selectedPropObj: selectedPropObj,
  105. propKeys: propKeys
  106. });
  107. }
  108. this.parseSelectedObjToVals();
  109. this.setData({
  110. skuGroup: skuGroup,
  111. allProperties: allProperties
  112. });
  113. },
  114. //将已选的 {key:val,key2:val2}转换成 [val,val2]
  115. parseSelectedObjToVals: function() {
  116. var selectedPropObj = this.data.selectedPropObj;
  117. var selectedProperties = "";
  118. var selectedProp = [];
  119. for (var key in selectedPropObj) {
  120. selectedProp.push(selectedPropObj[key]);
  121. selectedProperties += key + ":" + selectedPropObj[key] + ";";
  122. }
  123. selectedProperties = selectedProperties.substring(0, selectedProperties.length - 1);
  124. this.setData({
  125. selectedProp: selectedProp,
  126. selectedProperties: selectedProperties
  127. });
  128. var findSku = false;
  129. for (var i = 0; i < this.data.skuList.length; i++) {
  130. if (this.data.skuList[i].properties == selectedProperties) {
  131. findSku = true;
  132. this.setData({
  133. defaultSku: this.data.skuList[i]
  134. });
  135. break;
  136. }
  137. }
  138. this.setData({
  139. findSku: findSku
  140. });
  141. },
  142. //点击选择规格
  143. toChooseItem: function(e) {
  144. var ok = e.currentTarget.dataset.ok;
  145. if (ok == 0) {
  146. return;
  147. }
  148. var val = e.currentTarget.dataset.val;
  149. var key = e.currentTarget.dataset.key;
  150. var selectedPropObj = this.data.selectedPropObj;
  151. selectedPropObj[key] = val;
  152. this.setData({
  153. selectedPropObj: selectedPropObj
  154. });
  155. console.log(this.data.selectedPropObj)
  156. this.parseSelectedObjToVals();
  157. },
  158. //判断数组是否包含某对象
  159. array_contain: function(array, obj) {
  160. for (var i = 0; i < array.length; i++) {
  161. if (array[i] == obj) //如果要求数据类型也一致,这里可使用恒等号===
  162. return true;
  163. }
  164. return false;
  165. },
  166. /**
  167. * 减数量
  168. */
  169. onCountMinus: function() {
  170. var prodNum = this.data.prodNum;
  171. if (prodNum > 1) {
  172. this.setData({
  173. prodNum: prodNum - 1
  174. });
  175. }
  176. },
  177. /**
  178. * 加数量
  179. */
  180. onCountPlus: function() {
  181. var prodNum = this.data.prodNum;
  182. if (prodNum < 1000) {
  183. this.setData({
  184. prodNum: prodNum + 1
  185. });
  186. }
  187. },
  188. /**
  189. * 参团
  190. */
  191. groupConfirmOrder: function() {
  192. if (!this.data.findSku) {
  193. return;
  194. }
  195. wx.setStorageSync("groupOrderItem", JSON.stringify({
  196. groupSkuId: this.data.defaultSku.groupSkuId,
  197. groupTeamId: this.data.groupTeamId,
  198. prodCount: this.data.prodNum
  199. }));
  200. wx.navigateTo({
  201. url: '/pages/groupConfirmOrder/groupConfirmOrder',
  202. })
  203. },
  204. // 提交订单
  205. commitOrder() {
  206. wx.showLoading()
  207. var orderShopParam = {
  208. remarks: "",
  209. }
  210. http.request({
  211. url: `/p/group/order/submit`,
  212. method: 'POST',
  213. data: orderShopParam,
  214. callBack: (res) => {
  215. this.calWeixinPay(res.orderNumbers)
  216. }
  217. })
  218. },
  219. /**
  220. * 唤起微信支付
  221. */
  222. calWeixinPay: function(orderNumbers) {
  223. wx.showLoading({
  224. mask: true
  225. });
  226. var params = {
  227. url: "/p/order/pay",
  228. method: "POST",
  229. data: {
  230. payType: 1,
  231. orderType: 1,
  232. orderNumbers: orderNumbers
  233. },
  234. callBack: (res) => {
  235. wx.hideLoading();
  236. wx.requestPayment({
  237. timeStamp: res.timeStamp,
  238. nonceStr: res.nonceStr,
  239. package: res.packageValue,
  240. signType: res.signType,
  241. paySign: res.paySign,
  242. success: e => {
  243. // console.log("支付成功");
  244. wx.showModal({
  245. title: '支付成功',
  246. content: '',
  247. showCancel: false,
  248. success: () => {
  249. wx.navigateTo({
  250. url: '/pages/spellGroupDetails/spellGroupDetails?orderNumber=' + orderNumbers,
  251. })
  252. }
  253. })
  254. },
  255. fail: err => {
  256. wx.navigateTo({
  257. url: '/pages/pay-result/pay-result?sts=0&orderNumbers=' + orderNumbers + "&orderType=" + this.data.orderType,
  258. })
  259. }
  260. })
  261. }
  262. };
  263. http.request(params);
  264. },
  265. /**
  266. * 去地址页面
  267. */
  268. toAddrListPage: function() {
  269. wx.navigateTo({
  270. url: '/pages/delivery-address/delivery-address?order=0',
  271. })
  272. },
  273. /**
  274. * 生命周期函数--监听页面初次渲染完成
  275. */
  276. onReady: function() {
  277. },
  278. /**
  279. * 生命周期函数--监听页面显示
  280. */
  281. onShow: function() {
  282. // 获取当前小程序的页面栈
  283. let pages = getCurrentPages();
  284. let currentPage = pages[pages.length-1];
  285. let groupTeamId = currentPage.options.groupTeamId || ''
  286. let orderNumber = currentPage.options.orderNumber || ''
  287. this.getGroupTeamInfo(groupTeamId, orderNumber)
  288. this.setData({
  289. orderNumber: currentPage.options.orderNumber
  290. })
  291. },
  292. /**
  293. * 生命周期函数--监听页面隐藏
  294. */
  295. onHide: function() {
  296. this.setData({
  297. skuShow: false
  298. })
  299. },
  300. /**
  301. * 生命周期函数--监听页面卸载
  302. */
  303. onUnload: function() {
  304. clearTimeout(this.data.countDownObjTimer)
  305. },
  306. /**
  307. * 页面相关事件处理函数--监听用户下拉动作
  308. */
  309. onPullDownRefresh: function() {
  310. },
  311. /**
  312. * 页面上拉触底事件的处理函数
  313. */
  314. onReachBottom: function() {
  315. },
  316. showSku: function() {
  317. var ths = this
  318. // 查看是否授权
  319. util.checkAuthInfo(ths._showSku)
  320. },
  321. _showSku :function(){
  322. this.setData({
  323. skuShow: true
  324. });
  325. },
  326. closePopup: function() {
  327. this.setData({
  328. skuShow: false
  329. });
  330. },
  331. /**
  332. * 加载拼团团队详情
  333. */
  334. getGroupTeamInfo: function(groupTempId, orderNumber) {
  335. let _this = this
  336. http.request({
  337. url: "/p/groupTeam/info",
  338. method: "GET",
  339. data: {
  340. groupTeamId: groupTempId,
  341. orderNumber: orderNumber
  342. },
  343. callBack: (res) => {
  344. console.log(res)
  345. _this.setData({
  346. skuList: res.groupSkuList,
  347. groupTempInfo: res,
  348. groupUserList: res.apiGroupUserList,
  349. nowTime: util.dateToTimestamp(res.groupTeam.nowTime),
  350. joinNum: res.groupTeam.groupNumber - 1,
  351. groupTeamId: res.groupTeam.groupTeamId
  352. })
  353. let groupUserCount = _this.data.groupUserList.length
  354. let groupNumber = _this.data.groupTempInfo.groupTeam.groupNumber
  355. let unGroupNumber = groupNumber - groupUserCount
  356. let groupUserList = _this.data.groupUserList
  357. if (unGroupNumber > 0) {
  358. for (let i = 0; i < unGroupNumber; i++) {
  359. groupUserList = groupUserList.concat({})
  360. }
  361. }
  362. _this.setData({
  363. groupUserList: groupUserList
  364. })
  365. _this.countdown();
  366. _this.groupSkuProp(res.groupSkuList);
  367. }
  368. })
  369. },
  370. // 倒计时
  371. countdown() {
  372. // 获取当前时间,同时得到活动结束时间数组
  373. let nowTime = this.data.nowTime;
  374. let endTime = util.dateToTimestamp(this.data.groupTempInfo.groupTeam.endTime);
  375. let countDownObj = {};
  376. // 对结束时间进行处理渲染到页
  377. if (endTime - nowTime > 0) {
  378. // 如果活动未结束,对时间进行处理
  379. let time = (endTime - nowTime) / 1000;
  380. // 获取天、时、分、秒
  381. let day = parseInt(time / (60 * 60 * 24));
  382. let hou = parseInt(time % (60 * 60 * 24) / 3600);
  383. let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
  384. let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);
  385. countDownObj = {
  386. day: `${this.timeFormat(day)}`,
  387. hou: `${this.timeFormat(hou)}`,
  388. min: `${this.timeFormat(min)}`,
  389. sec: `${this.timeFormat(sec)}`,
  390. }
  391. } else {
  392. countDownObj = {
  393. day: '00',
  394. hou: '00',
  395. min: '00',
  396. sec: '00'
  397. }
  398. }
  399. // 渲染,然后每隔一秒执行一次倒计时函数
  400. this.setData({
  401. nowTime: nowTime + 1000,
  402. countDownObj: countDownObj,
  403. countDownObjTimer: setTimeout(this.countdown, 1000)
  404. })
  405. },
  406. // 小于10的格式化函数
  407. timeFormat(times) {
  408. return times < 10 ? '0' + times : times;
  409. },
  410. /**
  411. * 查看订单详情
  412. */
  413. toOrderDetailPage: function(e) {
  414. wx.navigateTo({
  415. url: '/pages/order-detail/order-detail?orderNum=' + e.currentTarget.dataset.ordernum,
  416. })
  417. },
  418. /**
  419. * 查看拼团团队
  420. */
  421. toGroupTempInfoPage: function(e) {
  422. // 查看是否授权
  423. var ths = this
  424. ths.setData({
  425. groupTeamId: e.currentTarget.dataset.groupteamid
  426. })
  427. util.checkAuthInfo(ths._toGroupTempInfoPage)
  428. },
  429. // _toGroupTempInfoPage
  430. _toGroupTempInfoPage() {
  431. wx.navigateTo({
  432. url: '/pages/spellMembersDetails/spellMembersDetails?groupTeamId=' + this.data.groupTeamId,
  433. })
  434. },
  435. /**
  436. * 用户点击转发
  437. */
  438. onShareAppMessage: function(res) {
  439. return {
  440. title: this.data.groupTempInfo.groupProd.prodName,
  441. path: '/pages/spellGroupDetails/spellGroupDetails?orderNumber=' + this.data.orderNumber + '&groupTeamId=' + this.data.groupTeamId,
  442. imageUrl: this.data.groupTempInfo.groupProd.pic
  443. }
  444. }
  445. })