Commit 09fe7d51 authored by 徐士卿's avatar 徐士卿

merge

parent 6aed4f98
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<link rel="dns-prefetch" href="//yun.duiba.com.cn" />
<link rel="preconnect" href="//embedlog.duiba.com.cn">
<title>天天领积分</title>
<script type="text/javascript">
if (localStorage && localStorage.isWebp) {
document
.getElementsByTagName('html')[0]
.setAttribute('duiba-webp', 'true');
}
</script>
<script src="//yun.duiba.com.cn/js-libs/rem/1.1.3/rem.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
var CFG = CFG || {};
CFG.projectId = location.pathname.split('/')[2] || '1';
function getUrlParam(name) { <head>
var search = window.location.search; <meta charset="UTF-8" />
var matched = search <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
.slice(1) <meta name="theme-color" content="#000000">
.match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')); <link rel="dns-prefetch" href="//yun.duiba.com.cn" />
return search.length ? matched && matched[2] : null; <link rel="preconnect" href="//embedlog.duiba.com.cn">
} <title>天天领积分</title>
<script type="text/javascript">
if (localStorage && localStorage.isWebp) {
document
.getElementsByTagName('html')[0]
.setAttribute('duiba-webp', 'true');
}
</script>
<script src="//yun.duiba.com.cn/js-libs/rem/1.1.3/rem.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
var CFG = CFG || {};
CFG.projectId = location.pathname.split('/')[2] || '1';
CFG.appID = '${APPID}'; function getUrlParam(name) {
if (!getUrlParam("appID")) { var search = window.location.search;
// alert("【警告】检测到活动url中没有appID参数\n缺少该参数会导致埋点、分享、app信息获取错误。") var matched = search
} .slice(1)
</script> .match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'));
</head> return search.length ? matched && matched[2] : null;
<body> }
<div id="root"></div>
<script type="module" src="/src/App.tsx"></script> CFG.appID = '${APPID}';
</body> // 新小程序会传version=hg 旧小程序不会传
</html> CFG.version = getUrlParam('version') || sessionStorage.getItem('version');
CFG.version && sessionStorage.setItem("version", CFG.version);
CFG.isNewMiniVersion = CFG.version == 'hg';
CFG.subUrl = (CFG.isNewMiniVersion ? `/packages/activityCenter/subscibe` : `/pagesNews/subscribeMiddlePage/subscribeNews`) +
"?source=duiba&subId=1922853657613651969&activeNo=" + CFG.projectId + "&activityUrl=" + encodeURI(location.href)
if (!getUrlParam("appID")) {
// alert("【警告】检测到活动url中没有appID参数\n缺少该参数会导致埋点、分享、app信息获取错误。")
}
</script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/App.tsx"></script>
</body>
</html>
\ No newline at end of file
...@@ -17,6 +17,8 @@ export default [ ...@@ -17,6 +17,8 @@ export default [
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png", "prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 666, "resignJf": 666,
"resignQg": 666, "resignQg": 666,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
}, },
{ {
"challengeId": "2", "challengeId": "2",
...@@ -25,6 +27,8 @@ export default [ ...@@ -25,6 +27,8 @@ export default [
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png", "prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 888, "resignJf": 888,
"resignQg": 888, "resignQg": 888,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
}, },
{ {
"challengeId": "3", "challengeId": "3",
...@@ -32,7 +36,9 @@ export default [ ...@@ -32,7 +36,9 @@ export default [
"prizeName": "90天的任务", "prizeName": "90天的任务",
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png", "prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 999, "resignJf": 999,
"resignQg": 999 "resignQg": 999,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
}, },
{ {
"challengeId": "4", "challengeId": "4",
...@@ -40,7 +46,9 @@ export default [ ...@@ -40,7 +46,9 @@ export default [
"prizeName": "120天的任务", "prizeName": "120天的任务",
"prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png", "prizeImg": "//yun.duiba.com.cn/polaris/045CCBB8-F6C7-43DB-9F81-45F52430A878.441c8f13daf61c48b85fe383e764d9089f1d4a66.png",
"resignJf": 999, "resignJf": 999,
"resignQg": 999 "resignQg": 999,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
} }
], ],
"hasChallengeDay": 5, "hasChallengeDay": 5,
...@@ -114,8 +122,6 @@ export default [ ...@@ -114,8 +122,6 @@ export default [
], ],
"boolNeedChallengeCompletePop": false, "boolNeedChallengeCompletePop": false,
"boolOpenChallenge": true, "boolOpenChallenge": true,
"challengeStartTime": 27404105.225178465,
"challengeEndTime": -87229323.37597737
} }
} }
}, },
...@@ -130,13 +136,39 @@ export default [ ...@@ -130,13 +136,39 @@ export default [
"success": true, "success": true,
"message": "incididunt ipsum aliquip sint dolore", "message": "incididunt ipsum aliquip sint dolore",
"data": { "data": {
"jfNum": 100, "jfNum": 3000,
"qgNum": 400, "qgNum": 4000,
} }
} }
}, },
}, },
{
url: "/challenge/chooseChallenge.do",
method: 'get',
response: ({ query }) => {
return {
"code": "proident ullamco quis",
"success": true,
"message": "labore",
"data": {},
}
},
},
{
url: "/challenge/taskComplate.do",
method: 'get',
response: ({ query }) => {
return {
"code": "proident ullamco quis",
"success": true,
"message": "labore",
"data": {},
}
},
},
{ {
url: "/challenge/resign.do", url: "/challenge/resign.do",
method: 'get', method: 'get',
......
export default [
{
url: '/credits/creditsCost.do',
method: 'post',
response: ({ query }) => {
return {
"code": null,
"data": "pca599ef9a7645cc9421c39e92ca9e28",
"message": null,
"success": true,
"timeStamp": 1742894067802
}
},
},
{
url: '/credits/queryStatus.do',
method: 'get',
response: ({ query }) => {
return {
"code": null, "data": 1, "message": null, "success": true, "timeStamp": 1742894067868
}
},
},
{
url: '/credits/creditsLogList.do',
method: 'post',
response: ({ query }) => {
return {
"success": true,
"code": "",
"message": "",
"data": {
"leftCredits": 123,
"list": [
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 111,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 11111
},
{
"id": 222,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注红球",
"gmtCreate": 22222
},
{
"id": 123123,
"cycle": "20250316",
"type": 1,
"delta": -10,
"desc": "投注蓝球",
"gmtCreate": 11111
}
],
"haveMore": false
}
}
},
},
]
\ No newline at end of file
This diff is collapsed.
...@@ -52,12 +52,28 @@ const API = generateAPI({ ...@@ -52,12 +52,28 @@ const API = generateAPI({
// 挑战-补签 // 挑战-补签
getChallengeResign: "challenge/resign.do", getChallengeResign: "challenge/resign.do",
// 挑战-任务完成接口
getChallenegeComplate: "challenge/taskComplate.do",
//挑战-获取邀请码 //挑战-获取邀请码
getChallengeInviteCode: "challenge/inviteCode.do", getChallengeInviteCode: "challenge/inviteCode.do",
// 挑战-助力 // 挑战-助力
getChallengeAssist: "challenge/assist.do", getChallengeAssist: "challenge/assist.do",
// 挑战-选择挑战
getChooseChallenge: "/challenge/chooseChallenge.do",
// 扣积分
queryStatus: "credits/queryStatus.do",
creditsCost: {
uri: "credits/creditsCost.do",
method: "post"
},
// 奖品
queryOrder: "customActivity/kouweiwang/prize/queryOrderNo",
index: "main/index.do", index: "main/index.do",
completeGuide: "main/completeGuide.do", completeGuide: "main/completeGuide.do",
sign: "main/sign.do", sign: "main/sign.do",
......
...@@ -9,6 +9,9 @@ import qs from "qs"; ...@@ -9,6 +9,9 @@ import qs from "qs";
import {getUrlParam} from "@/utils/utils.ts"; import {getUrlParam} from "@/utils/utils.ts";
interface IRes { interface IRes {
uid: any;
activityId: any;
orderNo: any;
success: boolean; success: boolean;
data: any; data: any;
msg?: string; msg?: string;
......
...@@ -8,6 +8,7 @@ import { PageCtrl } from "@/core/ctrls/PageCtrl"; ...@@ -8,6 +8,7 @@ import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl"; import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import store from "../../store/store.ts"; import store from "../../store/store.ts";
import { toJS } from "mobx"; import { toJS } from "mobx";
import API from "../../api/index.ts";
@observer @observer
class Choice_challenge extends React.Component { class Choice_challenge extends React.Component {
...@@ -22,9 +23,16 @@ class Choice_challenge extends React.Component { ...@@ -22,9 +23,16 @@ class Choice_challenge extends React.Component {
this.setState({ activeIndex: index }); this.setState({ activeIndex: index });
}; };
handlechallenge = () => { handlechallenge = async (id) => {
ModalCtrl.closeModal();
//todo //todo
const { success } = await API.getChooseChallenge({
challengeId: id,
});
console.log(id)
if (success) {
store.getTaskInfo();
ModalCtrl.closeModal();
}
}; };
// handleclose = () => { // handleclose = () => {
...@@ -34,7 +42,9 @@ class Choice_challenge extends React.Component { ...@@ -34,7 +42,9 @@ class Choice_challenge extends React.Component {
render() { render() {
const { activeIndex } = this.state; const { activeIndex } = this.state;
const { challengeConfigList = [] } = store?.taskInfo || {}; const { challengeConfigList = [] } = store?.taskInfo || {};
console.log(toJS(store?.taskInfo),111) // console.log(toJS(store?.taskInfo), 111);
const selectedItem = challengeConfigList[activeIndex];
return ( return (
<div className="choice_challenge modal_center"> <div className="choice_challenge modal_center">
...@@ -68,7 +78,7 @@ class Choice_challenge extends React.Component { ...@@ -68,7 +78,7 @@ class Choice_challenge extends React.Component {
<span className="tip"></span> <span className="tip"></span>
<Button <Button
className="challenge" className="challenge"
onClick={() => this.handlechallenge(activeIndex)} onClick={() => this.handlechallenge(selectedItem?.challengeId)}
/> />
<span className="ditu"></span> <span className="ditu"></span>
</div> </div>
......
...@@ -6,6 +6,10 @@ import "./consume_credits.less"; ...@@ -6,6 +6,10 @@ import "./consume_credits.less";
import { Button } from "@grace/ui"; import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl"; import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl"; import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import Finish_task from "../finish_task/finish_task";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
import { pre_reduce_score } from "../../store/credits.js";
@observer @observer
class Consume_credits extends React.Component { class Consume_credits extends React.Component {
...@@ -13,9 +17,26 @@ class Consume_credits extends React.Component { ...@@ -13,9 +17,26 @@ class Consume_credits extends React.Component {
super(props); super(props);
} }
handleclock = () => { handleclock = async (n, code, title) => {
ModalCtrl.closeModal(); await pre_reduce_score(
// todo 成功了弹 finish_task {
toPlaywayId: "challenge",
toActionId: "taskComplet",
desc: "taskComplete_credits_desc",
credits: n,
},
async () => {
const { success } = await API.getChallenegeComplate({
taskCode: code,
ticket: store.ticketNum,
});
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_task, { title });
}
}
);
store.getTaskInfo()
}; };
handleclose = () => { handleclose = () => {
...@@ -23,14 +44,18 @@ class Consume_credits extends React.Component { ...@@ -23,14 +44,18 @@ class Consume_credits extends React.Component {
}; };
render() { render() {
const { n = 0, code, title } = this.props;
return ( return (
<div className="consume_credits modal_center"> <div className="consume_credits modal_center">
<span className="bg"></span> <span className="bg"></span>
<span className="tile"></span> <span className="tile"></span>
<span className="tip1">消耗10000积分</span> <span className="tip1">消耗{n}积分</span>
<span className="tip2">完成打卡</span> <span className="tip2">完成打卡</span>
<Button className="close" onClick={this.handleclose} /> <Button className="close" onClick={this.handleclose} />
<Button className="clock" onClick={this.handleclock} /> <Button
className="clock"
onClick={() => this.handleclock(n, code, title)}
/>
<span className="icon"></span> <span className="icon"></span>
<span className="ditu"></span> <span className="ditu"></span>
</div> </div>
......
...@@ -6,6 +6,9 @@ import "./consume_qg.less"; ...@@ -6,6 +6,9 @@ import "./consume_qg.less";
import { Button } from "@grace/ui"; import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl"; import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl"; import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import Finish_task from "../finish_task/finish_task";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
@observer @observer
class Consume_qg extends React.Component { class Consume_qg extends React.Component {
...@@ -13,9 +16,13 @@ class Consume_qg extends React.Component { ...@@ -13,9 +16,13 @@ class Consume_qg extends React.Component {
super(props); super(props);
} }
handleclock = () => { handleclock = async (code, title) => {
ModalCtrl.closeModal(); const {success } = await API.getChallenegeComplate({ taskCode: code });
// todo 成功了弹 finish_task if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_task, {title});
}
store.getTaskInfo();
}; };
handleclose = () => { handleclose = () => {
...@@ -23,7 +30,7 @@ class Consume_qg extends React.Component { ...@@ -23,7 +30,7 @@ class Consume_qg extends React.Component {
}; };
render() { render() {
const { n = 0 } = this.props; const { n = 0, code, title } = this.props;
return ( return (
<div className="consume_qg modal_center"> <div className="consume_qg modal_center">
<span className="bg"></span> <span className="bg"></span>
...@@ -31,7 +38,7 @@ class Consume_qg extends React.Component { ...@@ -31,7 +38,7 @@ class Consume_qg extends React.Component {
<span className="tip1">消耗{n}青果</span> <span className="tip1">消耗{n}青果</span>
<span className="tip2">完成打卡</span> <span className="tip2">完成打卡</span>
<Button className="close" onClick={this.handleclose} /> <Button className="close" onClick={this.handleclose} />
<Button className="clock" onClick={this.handleclock} /> <Button className="clock" onClick={() => this.handleclock(code, title)} />
<span className="icon"></span> <span className="icon"></span>
<span className="ditu"></span> <span className="ditu"></span>
</div> </div>
......
'use strict';
import React from 'react';
import { observer } from 'mobx-react';
import './finish_resign.less';
import { Button } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
@observer
class Finish_resign extends React.Component {
constructor(props) {
super(props);
}
handleclose = () => {
ModalCtrl.closeModal();
}
handleknow = () => {
ModalCtrl.closeModal();
}
render() {
return (
<div className="finish_resign modal_center">
<span className="ditu"></span>
<span className="dongxiao"></span>
<span className="bg"></span>
<Button className="close" onClick={this.handleclose} />
<span className="title"></span>
<span className="tip">快去完成打卡任务吧!</span>
<Button className="know" onClick={this.handleknow} />
</div>
);
}
}
export default Finish_resign;
@import "../../res.less";
.finish_resign {
width: 750px;
height: 1624px;
left: 0px;
top: 0px;
position: absolute;
.ditu {
width: 684px;
height: 150px;
left: 33px;
top: 1300px;
position: absolute;
.sparkBg("finish_resign/ditu.png");
}
.dongxiao {
width: 750px;
height: 1589px;
left: 0px;
top: 0px;
position: absolute;
.sparkBg("finish_resign/dongxiao.png");
}
.bg {
width: 682px;
height: 428px;
left: 18px;
top: 563px;
position: absolute;
.sparkBg("finish_resign/bg.png");
}
.close {
width: 79px;
height: 79px;
left: 336px;
top: 1031px;
position: absolute;
.sparkBg("finish_resign/close.png");
}
.title {
width: 231px;
height: 62px;
left: 259px;
top: 672px;
position: absolute;
.sparkBg("finish_resign/title.png");
}
.tip {
width: 682px;
height: 35px;
left: 46px;
top: 781px;
text-align: center;
position: absolute;
font-size: 36px;
line-height: 35px;
color: rgba(32, 16, 3, 1);
}
.know {
width: 280px;
height: 69px;
left: 234px;
top: 869px;
position: absolute;
.sparkBg("finish_resign/know.png");
}
}
...@@ -17,18 +17,25 @@ class Finish_task extends React.Component { ...@@ -17,18 +17,25 @@ class Finish_task extends React.Component {
ModalCtrl.closeModal(); ModalCtrl.closeModal();
} }
handleclose = () => {
ModalCtrl.closeModal();
}
render() { render() {
const { title } = this.props;
return ( return (
<div className="finish_task modal_center"> <div className="finish_task modal_center">
<span className="dongxiao"></span> <span className="dongxiao"></span>
<span className="bg"></span> <span className="bg"></span>
<span className="line"></span> <span className="line"></span>
<span className="title">xxx任务完成</span> <span className="title">{title}任务完成</span>
<span className="tip1">打卡任务完成啦!</span> <span className="tip1">打卡任务完成啦!</span>
<span className="tip2">继续保持哦!</span> <span className="tip2">继续保持哦!</span>
<Button className="know" onClick={this.handleknow} /> <Button className="know" onClick={this.handleknow} />
<span className="ribbon"></span> <span className="ribbon"></span>
<span className="ditu"></span> <span className="ditu"></span>
<Button className="close" onClick={this.handleclose} />
</div> </div>
); );
} }
......
...@@ -111,4 +111,14 @@ ...@@ -111,4 +111,14 @@
position: absolute; position: absolute;
.sparkBg("finish_task/ditu.png"); .sparkBg("finish_task/ditu.png");
} }
.close {
width: 79px;
height: 79px;
left: 336px;
// top: 1205px;
top: 1040px;
position: absolute;
.sparkBg("consume_credits/close.png");
}
} }
\ No newline at end of file
...@@ -3,10 +3,13 @@ ...@@ -3,10 +3,13 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import "./renewmodule.less"; import "./renewmodule.less";
import { Button } from "@grace/ui"; import { Button, Toast } from "@grace/ui";
import { PageCtrl } from "@/core/ctrls/PageCtrl"; import { PageCtrl } from "@/core/ctrls/PageCtrl";
import { ModalCtrl } from "@/core/ctrls/ModalCtrl"; import { ModalCtrl } from "@/core/ctrls/ModalCtrl";
import API from "../../../src/api/index";
import store from "../../../src/store/store.ts";
import { pre_reduce_score } from "../../store/credits.js";
import Finish_resign from "../finish_resign/finish_resign.jsx";
@observer @observer
class Renewmodule extends React.Component { class Renewmodule extends React.Component {
constructor(props) { constructor(props) {
...@@ -20,48 +23,85 @@ class Renewmodule extends React.Component { ...@@ -20,48 +23,85 @@ class Renewmodule extends React.Component {
this.setState({ activeChoice: choice }); this.setState({ activeChoice: choice });
}; };
handleUse = (activeChoice) => { handleUse = async (activeChoice, inferQg, inferJf, resignJf) => {
if (activeChoice === "credits") { if (activeChoice === "credits") {
ModalCtrl.closeModal();
// 执行积分续签逻辑 todo // 执行积分续签逻辑 todo
} else {
ModalCtrl.closeModal(); ModalCtrl.closeModal();
if (!inferJf) return Toast.show("积分不足");
await pre_reduce_score(
{
toPlaywayId: "challenge",
toActionId: "resign",
desc: "tresign_credits_desc",
credits: resignJf,
},
async () => {
const { success } = await API.getChallengeResign({
costType: 2,
ticket: store.ticketNum,
});
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_resign);
}
}
);
} else {
// 执行青果续签逻辑 todo // 执行青果续签逻辑 todo
ModalCtrl.closeModal();
if (!inferQg) return Toast.show("青果不足");
const { success } = await API.getChallengeResign({ costType: 1 });
if (success) {
ModalCtrl.closeModal();
ModalCtrl.showModal(Finish_resign);
}
} }
store.getTaskInfo();
}; };
render() { render() {
const { activeChoice } = this.state; const { activeChoice } = this.state;
const { hasChallengeDay, resignJf, resignQg, jfNum, qgNum } = this.props;
// qg是否足够
const inferQg = qgNum >= resignQg;
// 积分是否足够
const inferJf = jfNum >= resignJf;
// bg1、bg3 是红色背景 bg2、bg4是白色背景 // bg1、bg3 是红色背景 bg2、bg4是白色背景
return ( return (
<div className="renewmodule modal_center"> <div className="renewmodule modal_center">
<span className="bg"></span> <span className="bg"></span>
<span className="headline"></span> <span className="headline"></span>
<Button className="use" onClick={() => this.handleUse(activeChoice)} /> <Button
className="use"
onClick={() =>
this.handleUse(activeChoice, inferQg, inferJf, resignJf)
}
/>
<div <div
className="choice_credits" className="choice_credits"
onClick={() => this.handleClick("credits")} onClick={() => this.handleClick("credits")}
> >
<span className={activeChoice === "credits" ? "bg1" : "bg2"}></span> <span className={activeChoice === "credits" ? "bg1" : "bg2"}></span>
<span className="tip1">消耗积分续签</span> <span className="tip1">消耗积分续签</span>
<span className="credits">当前积分:999999999</span> <span className="credits">当前积分:{jfNum}</span>
<span className="consume_credits"> <span className="consume_credits">
消耗<span className="count1">20000</span>积分进行续签 消耗<span className="count1">{resignJf}</span>积分进行续签
</span> </span>
</div> </div>
<div className="choice_qg" onClick={() => this.handleClick("qg")}> <div className="choice_qg" onClick={() => this.handleClick("qg")}>
<span className={activeChoice === "qg" ? "bg3" : "bg4"}></span> <span className={activeChoice === "qg" ? "bg3" : "bg4"}></span>
<span className="tip2">消耗青果续签</span> <span className="tip2">消耗青果续签</span>
<span className="qg">当前青果:999999999</span> <span className="qg">当前青果:{qgNum}</span>
<span className="consume_qg"> <span className="consume_qg">
消耗<span className="count2">1000</span>青果进行续签 消耗<span className="count2">{resignQg}</span>青果进行续签
</span> </span>
</div> </div>
<span className="title2"> <span className="title2">
4月20日 <span className="special">未打卡</span> {hasChallengeDay + 1} <span className="special">未打卡</span>
</span> </span>
<span className="title1">已累计打卡x</span> <span className="title1">已累计打卡{hasChallengeDay}</span>
</div> </div>
); );
} }
......
...@@ -259,7 +259,7 @@ ...@@ -259,7 +259,7 @@
margin-top: 60px; margin-top: 60px;
width: 675px; width: 675px;
height: auto; height: auto;
padding-bottom: 130px; padding-bottom: 130px;
.remind { .remind {
font-size: 26px; font-size: 26px;
...@@ -271,7 +271,15 @@ ...@@ -271,7 +271,15 @@
height: 46px; height: 46px;
} }
.list{ .subcribe {
position: absolute;
left: 600px;
width: 61px;
height: 27px;
.webpBg("HomePage/未订阅.png");
}
.list {
position: relative; position: relative;
top: 80px; top: 80px;
width: 675px; width: 675px;
...@@ -287,12 +295,46 @@ ...@@ -287,12 +295,46 @@
margin-left: 15px; margin-left: 15px;
margin-bottom: 30px; margin-bottom: 30px;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
text-align: center; text-align: center;
.webpBg("HomePage/sampleBg.png"); // .webpBg("HomePage/sampleBg.png");
.day-number {
font-size: 24px;
line-height: 1.2;
position: absolute;
}
.done {
position: absolute;
width: 67px;
height: 68px;
.webpBg("HomePage/sampleBg.png");
}
.renew {
position: absolute;
width: 67px;
height: 68px;
.webpBg("HomePage/renewBg.png");
}
}
.new-style {
position: relative;
width: 67px;
height: 67px;
margin-left: 15px;
margin-bottom: 30px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
.webpBg("HomePage/prizeBg.png");
} }
} }
} }
} }
\ No newline at end of file
...@@ -9,6 +9,7 @@ import { PageCtrl } from '@/core/ctrls/PageCtrl'; ...@@ -9,6 +9,7 @@ import { PageCtrl } from '@/core/ctrls/PageCtrl';
import { ModalCtrl } from '@/core/ctrls/ModalCtrl'; import { ModalCtrl } from '@/core/ctrls/ModalCtrl';
import Consume_qg from '../../../components/consume_qg/consume_qg'; import Consume_qg from '../../../components/consume_qg/consume_qg';
import Consume_credits from '../../../components/consume_credits/consume_credits'; import Consume_credits from '../../../components/consume_credits/consume_credits';
import Renewmodule from '../../../components/renewmodule/renewmodule';
@observer @observer
class Check extends React.Component<any, any> { class Check extends React.Component<any, any> {
...@@ -34,19 +35,17 @@ class Check extends React.Component<any, any> { ...@@ -34,19 +35,17 @@ class Check extends React.Component<any, any> {
} }
// 按钮 // 按钮
handlegofinish = (type, n) => { handlegofinish = (type, n, code, title) => {
console.log(this.state?.baseInfo)
const { jfNum = 0, qgNum = 0 } = this.state?.baseInfo || {}; const { jfNum = 0, qgNum = 0 } = this.state?.baseInfo || {};
if (type === "xhqg") { if (type === "xhqg") {
if (n <= qgNum) { if (n <= qgNum) {
ModalCtrl.showModal(Consume_qg, { n }); ModalCtrl.showModal(Consume_qg, { n, code, title });
} else { } else {
console.log("青果不足", qgNum);
Toast.show("很抱歉,您的青果不足"); Toast.show("很抱歉,您的青果不足");
} }
} else if (type === "xhjf") { } else if (type === "xhjf") {
if (n <= jfNum) { if (n <= jfNum) {
ModalCtrl.showModal(Consume_credits, { n }); ModalCtrl.showModal(Consume_credits, { n, code, title });
} else { } else {
Toast.show("很抱歉,您的积分不足"); Toast.show("很抱歉,您的积分不足");
} }
...@@ -57,20 +56,24 @@ class Check extends React.Component<any, any> { ...@@ -57,20 +56,24 @@ class Check extends React.Component<any, any> {
}; };
handlegosign = _asyncThrottle(() => { handlegosign = _asyncThrottle((hasChallengeDay, resignJf, resignQg, { jfNum = 0, qgNum = 0 } = this.state?.baseInfo || {}) => {
//todo ModalCtrl.showModal(Renewmodule, { hasChallengeDay, resignJf, resignQg, jfNum, qgNum });
}) });
handlefinish = _asyncThrottle(() => { handlefinish = _asyncThrottle(() => {
Toast.show("该任务已完成"); Toast.show("该任务已完成");
}) })
handlesubscribe = _asyncThrottle(() => {
// if (store?.homeInfo?.subscribe) return console.log('buxing');
// @ts-ignore
wx.miniProgram.reLaunch({ url: CFG.subUrl })
})
render() { render() {
const { boolOpenChallenge, const { boolOpenChallenge = 0,
challengeStartTime, choosedChallengeId = 0,
challengeEndTime, hasChallengeDay = 0,
choosedChallengeId,
hasChallengeDay,
boolNeedResign, boolNeedResign,
challengeConfigList = [], challengeConfigList = [],
taskInfoList = [], taskInfoList = [],
...@@ -82,11 +85,14 @@ class Check extends React.Component<any, any> { ...@@ -82,11 +85,14 @@ class Check extends React.Component<any, any> {
); );
// 当前挑战信息 // 当前挑战信息
const { challengeTotalDay, const {
prizeName, challengeTotalDay = 0,
prizeImg, challengeStartTime = 0,
resignJf, challengeEndTime = 0,
resignQg, prizeName = '',
prizeImg = '',
resignJf = 0,
resignQg = 0,
} = currentChallenge || {}; } = currentChallenge || {};
// 进度显示 // 进度显示
...@@ -110,7 +116,9 @@ class Check extends React.Component<any, any> { ...@@ -110,7 +116,9 @@ class Check extends React.Component<any, any> {
</div> </div>
<div className="check-color" /> <div className="check-color" />
<div className="actTime">活动时间{dateFormatter(challengeStartTime, "yyyy.MM.dd")}-{dateFormatter(challengeEndTime, "MM.dd")}</div> {challengeStartTime && challengeEndTime && (
<div className="actTime">活动时间{dateFormatter(challengeStartTime, "yyyy.MM.dd")}-{dateFormatter(challengeEndTime, "MM.dd")}</div>
)}
<div className="title-line"></div> <div className="title-line"></div>
<div className="check-title">累计打卡挑战{challengeTotalDay || 0}</div> <div className="check-title">累计打卡挑战{challengeTotalDay || 0}</div>
...@@ -139,60 +147,66 @@ class Check extends React.Component<any, any> { ...@@ -139,60 +147,66 @@ class Check extends React.Component<any, any> {
const renderActionButton = (code, completedSize, intervalLimitSize) => { const renderActionButton = (code, completedSize, intervalLimitSize) => {
// 先判断是否为续签状态 // 先判断是否为续签状态
if (boolNeedResign) { if (boolNeedResign) {
return <Button className="gosign" onClick={this.handlegosign} /> return <Button className="gosign" onClick={() => this.handlegosign(hasChallengeDay, resignJf, resignQg)} />
} else if (completedSize < intervalLimitSize) { } else if (completedSize < intervalLimitSize) {
switch (true) { switch (true) {
// 消耗青果
case code.startsWith("xhqg_"): { case code.startsWith("xhqg_"): {
const number = (code.split("_")[1]); const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10); const n = parseInt(number.replace(/[{}]/g, ''), 10);
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("xhqg", n)} onClick={() => this.handlegofinish("xhqg", n, code, title)}
/> />
); );
} }
// 消耗积分
case code.startsWith("xhjf_"): { case code.startsWith("xhjf_"): {
const number = (code.split("_")[1]); const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10); const n = parseInt(number.replace(/[{}]/g, ''), 10);
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("xhjf", n)} onClick={() => this.handlegofinish("xhjf", n, code, title)}
/> />
); );
} }
// 邀请用户助力
case code.startsWith("yqzl"): { case code.startsWith("yqzl"): {
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("yqzl", '')} onClick={() => this.handlegofinish("yqzl", '', code, title)}
/> />
) )
} }
// 邀请新用户
case code.startsWith("yqzl_new"): { case code.startsWith("yqzl_new"): {
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("yqzl_new", '')} onClick={() => this.handlegofinish("yqzl_new", '', code, title)}
/> />
) )
} }
// 扫码
case code.startsWith("scan_"): { case code.startsWith("scan_"): {
const number = (code.split("_")[1]); const number = (code.split("_")[1]);
const n = parseInt(number.replace(/[{}]/g, ''), 10); const n = parseInt(number.replace(/[{}]/g, ''), 10);
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("scan", n)} onClick={() => this.handlegofinish("scan", n, code, title)}
/> />
); );
} }
// 浏览
case code.startsWith("browse_"): { case code.startsWith("browse_"): {
return ( return (
<Button <Button
className="gofinish" className="gofinish"
onClick={() => this.handlegofinish("browse", '')} onClick={() => this.handlegofinish("browse", '', code, title)}
/> />
); );
} }
...@@ -225,16 +239,29 @@ class Check extends React.Component<any, any> { ...@@ -225,16 +239,29 @@ class Check extends React.Component<any, any> {
<div className="calendar"> <div className="calendar">
<span className="remind">提醒我签到 挑战失败重新开始</span> <span className="remind">提醒我签到 挑战失败重新开始</span>
<Button className="subcribe" onClick={this.handlesubscribe} />
<div className="list"> <div className="list">
{Array.from({ length: challengeTotalDay }).map((_, dayIndex) => ( {Array.from({ length: challengeTotalDay }).map((_, dayIndex) => (
<div className="sample" key={dayIndex}> <div
<span className="day-number">{dayIndex + 1}</span> className={`sample ${dayIndex === challengeTotalDay - 1 ? 'new-style' : ''}`}
key={dayIndex}
>
{dayIndex <= hasChallengeDay - 1 && (
<span className="done"></span>
)}
{boolNeedResign && dayIndex === hasChallengeDay && (
<Button className="renew" onClick={() => this.handlegosign(hasChallengeDay, resignJf, resignQg)} />
)}
{dayIndex !== challengeTotalDay - 1 && (
<span className="day-number">{dayIndex + 1}</span>
)}
</div> </div>
))} ))}
</div> </div>
</div> </div>
</div>; </div>;
} }
} }
......
...@@ -72,6 +72,39 @@ ...@@ -72,6 +72,39 @@
.webpBg("MyPrize/use.png"); .webpBg("MyPrize/use.png");
} }
.yifafang {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/已发放.png");
}
.bufa {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/补发红包.png");
}
.fafangzhong {
position: absolute;
width: 141px;
height: 44px;
left: 520px;
top: 53px;
text-align: center;
line-height: 44px;
.webpBg("MyPrize/发放中.png");
}
.prizeImg { .prizeImg {
position: absolute; position: absolute;
left: 30px; left: 30px;
......
import React from 'react'; import React from 'react';
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import './MyPrize.less'; import './MyPrize.less';
import { Button } from "@grace/ui"; import { Button, Toast } from "@grace/ui";
import { dateFormatter } from "@/utils/utils.ts"; import { dateFormatter, miniGoUrl } from "@/utils/utils.ts";
import API from "@/api"; import API from "@/api";
import { PageCtrl } from "@/core/ctrls/PageCtrl.tsx"; import { PageCtrl } from "@/core/ctrls/PageCtrl.tsx";
...@@ -31,14 +31,58 @@ class MyPrize extends React.Component<any, any> { ...@@ -31,14 +31,58 @@ class MyPrize extends React.Component<any, any> {
PageCtrl.backPage(); PageCtrl.backPage();
} }
clickItem = (item) => { clickItem = async (item) => {
if (item.url) { const { id, url } = item
location.href = item.url if (url) {
location.href = url
} else { } else {
location.href = `/aaw/projectx/takePrize?projectOrderNo=${item.id}` if (item.extra.refType === 'virtual') {
// 商家自冲奖品类型配置 {"prizeId":"奖品ID","type":"类型(1-专项特惠2-积分商城奖品3-积分奖品)"}
// 注意:旧的奖品没有type字段 需兼容
if (item?.extra.type == 1) {
return miniGoUrl(CFG.isNewMiniVersion ? "/packages/user/exclusiveOffer?source=duiba" : "/pagesNews/user/userRed")
} else if (item?.extra.type == 3) {
return miniGoUrl('/packages/user/points?source=duiba')
}
const res = await API.queryOrder({
recordId: item.id,
projectId: CFG.projectId
});
if (res?.orderNo) {
// 线上正式用这个
wx.miniProgram.reLaunch({
url:
(CFG.isNewMiniVersion ? "/pages/index?source=duiba&orderNo=" : "/pages/index/index?orderNo=")
+ id
+ "&activityId=" + (res?.activityId) + "&uid=" + (res?.uid) + "&activityUrl=" + encodeURIComponent(location.origin + "/projectx/" + CFG.projectId + '/index.html?jumpFlag=1') + '&uid=' + res?.uid
})
} else {
Toast.show('请稍后再试~')
}
} else {
location.href = `/aaw/projectx/takePrize?projectOrderNo=${id}`
}
} }
} }
handleyifafang = (item) => {
Toast.show("已发放")
}
handlebufa = async (item) => {
const { success } = await API.redpacket({
prizeRecordId: item.id,
});
if (success) {
this.initList();
}
}
handlefafangzhong = (item) => {
Toast.show("正在发放中,请耐心等待")
}
render() { render() {
const { list } = this.state; const { list } = this.state;
...@@ -49,15 +93,25 @@ class MyPrize extends React.Component<any, any> { ...@@ -49,15 +93,25 @@ class MyPrize extends React.Component<any, any> {
<div className="prizeList"> <div className="prizeList">
{ {
list.length > 0 ? list.map((item, index) => { list.length > 0 ? list.map((item, index) => {
return <div className="prizeItem" key={index}> return (
<img className="prizeImg" src={item.extra.icon} /> <div className="prizeItem" key={index}>
<div className="prizeName">{item.extra.name}</div> <img className="prizeImg" src={item.extra.icon} />
<div className="getTime">{dateFormatter(item.gmtCreate, "yyyy.MM.dd")}</div> <div className="prizeName">{item.extra.name}</div>
<Button className="use" onClick={this.clickItem.bind(this, item)} /> <div className="getTime">{dateFormatter(item.gmtCreate, "yyyy.MM.dd")}</div>
</div> {item.type === 4 ? (
<>
{item.moneyStatus === 1 && <Button className="yifafang" onClick={() => this.handleyifafang(item)} />}
{item.moneyStatus === 10 && <Button className="bufa" onClick={() => this.handlebufa(item)} />}
{item.moneyStatus === 11 && <Button className="fafangzhong" onClick={() => this.handlefafangzhong(item)} />}
</>
) : (
<Button className="use" onClick={() => this.clickItem(item)} />
)}
</div>
)
// }) : <div className="nothing"/> // }) : <div className="nothing"/>
}) : null }) : null
} }
</div> </div>
<Button className="MyPrizeBack" onClick={this.clickBack} /> <Button className="MyPrizeBack" onClick={this.clickBack} />
......
/**
* 预扣积分相关接口
*/
import { Toast } from "@grace/ui";
import API from '../api/index';
import { runInAction } from "mobx";
import store from "../store/store.ts";
/** 设置积分门票 */
export const setTicketNum = (ticketNum) => {
runInAction(() => {
store.ticketNum = ticketNum;
});
};
let pollNum = 0;
/** 清除次数 */
export const clearPollNum = () => {
pollNum = 0;
};
export const setPollNum = () => {
pollNum++;
};
/** 预扣积分 */
export const pre_reduce_score = async (params, sucCb, failCb) => {
// showLoading();
const { toPlaywayId, toActionId, desc, credits, scoreFrom, type } = params
// 预扣积分
const res = await API.creditsCost({
toPlaywayId,
toActionId,
desc,
credits: credits,
scoreFrom
});
if (res?.success) {
setTicketNum(res?.data);
// 轮询查积分状态
pollCheck_change(sucCb, failCb);
} else {
// hideLoading();
failCb?.();
}
};
/**
* 轮询查积分扣除状态
* 0:处理中
* 1:成功
* 2:失败
*/
export const pollCheck_change = async (sucCb, failCb) => {
// 查询扣积分状态
const res = await API.queryStatus({
ticketNum: store.ticketNum,
}).catch((e) => {
// hideLoading();
failCb?.();
});
// 处理中
if (res?.success && res?.data == 0) {
if (pollNum > 9) {
Toast.show("网络异常,扣积分失败~");
clearPollNum();
// hideLoading();
failCb?.();
return;
}
setPollNum();
// 延时1s递归
setTimeout(() => {
pollCheck_change(sucCb, failCb);
}, 1000);
}
// 成功
if (res?.success && res?.data == 1) {
sucCb?.();
clearPollNum();
// hideLoading();
}
// 失败
if (res?.success && res?.data == 2) {
Toast.show(res?.message || "网络异常,积分稍后退回");
// hideLoading();
failCb?.();
}
// 接口报错
if (!res?.success) {
// hideLoading();
failCb?.();
}
};
...@@ -21,13 +21,13 @@ class Store { ...@@ -21,13 +21,13 @@ class Store {
shareInfo: IWxShareInfo, shareInfo: IWxShareInfo,
ruleImg?: string, ruleImg?: string,
} = { } = {
shareInfo: { shareInfo: {
title: "", title: "",
desc: "", desc: "",
link: "", link: "",
imgUrl: "", imgUrl: "",
}, },
}; };
ruleInfo = ''; ruleInfo = '';
......
...@@ -23,6 +23,16 @@ config(); ...@@ -23,6 +23,16 @@ config();
=============================================== */ =============================================== */
declare namespace wx { declare namespace wx {
interface MiniProgram {
reLaunch(params: {
url: string;
success?: (...args: any[]) => void;
fail?: (...args: any[]) => void;
complete?: (...args: any[]) => void;
}): void;
}
const miniProgram: MiniProgram;
type ImageSizeType = "original" | "compressed"; type ImageSizeType = "original" | "compressed";
type ImageSourceType = "album" | "camera"; type ImageSourceType = "album" | "camera";
type VideoSourceType = "album" | "camera"; type VideoSourceType = "album" | "camera";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment