250 lines
9.1 KiB
TypeScript

import AddressList from "@/components/AddressList"
import { Button, Canvas, Navigator, ScrollView, Text, View } from "@tarojs/components"
import Taro, { useReady } from "@tarojs/taro"
import { useEffect, useState } from "react"
import {creditInfoApi} from "@/api/creditLine"
import "./index.scss"
import { useSelector } from "@/reducers/hooks";
import { formatDateTime, formatPriceDiv } from "@/common/fotmat"
import Message from "@/components/Message"
export default ()=>{
const userInfo = useSelector(state => state.userInfo);
useEffect(()=>{
getData()
}, [])
const {fetchData, state} = creditInfoApi();
const [data, setData] = useState({
credit_quota_used_line: [0,"00"],
credit_quota_line: [0,"00"],
credit_quota_available_line: [0,"00"],
progress: 0,
create_time: "",
quota_status_name: "",
quota_status: "",
credit_quota_start_time: "",
credit_quota_end_time: ""
});
const [style, setStyle]= useState({
type: {},
cir: {
color: "",
background: {start: [], end: []}
},
available: {},
bottomTitle: {}
});
// 获取数据
const getData = async ()=>{
const result = await fetchData();
const credit_quota_used_line = convertPrice(formatPriceDiv(result.data.credit_quota_used_line));
const credit_quota_line = convertPrice(formatPriceDiv(result.data.credit_quota_line));
const credit_quota_available_line = convertPrice(formatPriceDiv(result.data.credit_quota_available_line));
const progress = credit_quota_available_line[0]==0&&credit_quota_line[0]==0?100:((credit_quota_available_line[0]??0) / (credit_quota_line[0]??0) * 100).toFixed(0);
switch(Number(result.data.quota_status)){
case 0://暂未开通
setStyle({
type: {background: "#e4e4ff",color: "#1818B4" },
cir: {
color: "#707070",
background: {start: ["#727272", "#CDCDCD"] as any, end: ["#CDCDCD", "#EEEEEE"] as any}
},
available: {color: "#707070", textDecoration: "line-through"},
bottomTitle: {color: "#cccccc"}
})
break;
case 1://申请中
setStyle({
type: {background: "#cde5ff",color: "#007AFF" },
cir: {
color: "#707070",
background: {start: ["#727272", "#CDCDCD"] as any, end: ["#CDCDCD", "#EEEEEE"] as any}
},
available: {color: "#707070", textDecoration: "line-through"},
bottomTitle: {color: "#cccccc"}
})
break;
case 2://生效中
setStyle({
type: {background: "#cde5ff",color: "#007AFF" },
cir: {
color: "#007aff",
background: {start: ["#047CFF", "#51A4FF"] as any, end: ["#87C0FF", "#57A8FF"] as any}
},
available: {color: "#007aff"},
bottomTitle: {color: "#007AFF"}
})
break;
case 3://已失效
setStyle({
type: {background: "#f6f6f6",color: "#ABABAB" },
cir: {
color: "#707070",
background: {start: ["#727272", "#CDCDCD"] as any, end: ["#CDCDCD", "#EEEEEE"] as any}
},
available: {color: "#707070", textDecoration: "line-through"},
bottomTitle: {color: "#cccccc"}
})
break;
case 4://失效待还款
setStyle({
type: {background: "#FFE6CE",color: "#EE7500" },
cir: {
color: "#707070",
background: {start: ["#EF7907", "#FAC897"] as any, end: ["#FAC897", "#FFE6CE"] as any}
},
available: {color: "#EE7500"},
bottomTitle: {color: "#007AFF"}
})
break;
}
setData({
...result.data,
progress,
credit_quota_used_line,
credit_quota_line,
credit_quota_available_line,
credit_quota_start_time: formatDateTime(result.data?.credit_quota_start_time, "YYYY-MM-DD"),
credit_quota_end_time: formatDateTime(result.data?.credit_quota_end_time, "YYYY-MM-DD"),
})
}
const convertPrice = (data)=>{
var t = data.toString().split(".");
t[1] = t[1]?t[1].padEnd(2,0):"00";
return t;
}
return (
<View className="credit-line">
<Message text="暂不支持线上申请授权,请联系平台客服。"/>
<View className="credit-line-card">
<View className="credit-line-card-top">
<View><Progress progress={data.progress} style={style} /></View>
<View className="credit-line-card-top-info">
<View className="credit-line-card-top-info-title"></View>
<View className="credit-line-card-top-info-price" style={style.available}><Text>¥</Text>{Number(data.credit_quota_available_line[0])?.toLocaleString()}<Text>.{data.credit_quota_available_line[1]}</Text></View>
<View className="credit-line-card-top-info-date">: {data?.credit_quota_start_time} {data?.credit_quota_end_time}</View>
</View>
<View className="credit-line-card-top-status" style={style.type}>{data.quota_status_name}</View>
</View>
<View className="credit-line-card-bottom">
<View className="credit-line-card-bottom-item">
<View className="credit-line-card-bottom-item-title">
<Text style={style.bottomTitle} className="iconfont icon-yucunkuan"></Text>
<View></View>
</View>
<View className="credit-line-card-bottom-item-price"><Text>¥</Text>{Number(data.credit_quota_line[0])?.toLocaleString()}<Text>.{data.credit_quota_line[1]}</Text></View>
</View>
<Navigator hoverClass="none" url="/pages/creditUsed/index" className="credit-line-card-bottom-item">
<View className="credit-line-card-bottom-item-title">
<Text style={style.bottomTitle} className="iconfont icon-tick-pressed"></Text>
<View></View>
</View>
<View className="credit-line-card-bottom-item-price"><Text>¥</Text>{Number(data?.credit_quota_used_line[0])?.toLocaleString()}<Text>.{data.credit_quota_used_line[1]}</Text></View>
</Navigator>
</View>
</View>
</View>
)
}
const Progress = (props)=>{
useEffect(()=>{
if(props.progress!=0){
getCanvas();
}
},[props.progress])
const getCanvas = ()=>{
// const percentage = props.progress??0;
const percentage = props.progress||0;
const query = Taro.createSelectorQuery();
query.select("#myCanvas").fields({ node: true, size: true }).exec((res) => {
const canvas = res[0]?.node;
if(canvas){
const ctx = canvas.getContext('2d');
const { windowHeight, windowWidth } = Taro.getSystemInfoSync();
const dpr = 750 / windowWidth;
canvas.width = res[0].width * dpr;
canvas.height = res[0].height * dpr;
const r = canvas.width / 2;
ctx.translate(r,r);
// 白色大圆
ctx.beginPath();
ctx.fillStyle = "white";
ctx.shadowBlur = 20;
ctx.shadowColor = "#cde5ff";
ctx.arc(0,0,100,0,2*Math.PI, false);
ctx.fill();
// 刻度
const my_minute = Math.PI*2/60;
const my_second = Math.PI*2/60;
ctx.strokeStyle="#F59F5D";
ctx.lineWidth=2;
ctx.beginPath();
for(let i=0;i<15;i++){
ctx.save();
ctx.rotate(i*4*my_minute);
ctx.moveTo(r-45,0);
ctx.lineTo(r-40,0);
ctx.stroke();
ctx.restore();
}
// 白色小圆
ctx.beginPath();
ctx.fillStyle = "white";
ctx.shadowBlur = 20;
ctx.shadowColor = "rgba(204,204,204,0.50)";
ctx.arc(0,0,74,0,2*Math.PI, false);
ctx.fill();
// 文字
ctx.beginPath();
ctx.restore();
ctx.fillStyle = props.style?.cir?.color// "#007aff";
ctx.font="42px Cambria, Cambria-Bold";
ctx.textAlign="center";
ctx.textBaseline="middle";
ctx.fillText(percentage+"%", 0,0);
// 蓝色的圆
if(percentage>0){
ctx.beginPath();
ctx.lineWidth = 25;
ctx.lineCap = "round";
const gad = ctx.createLinearGradient(100,0,0,100);
gad.addColorStop(0, props.style?.cir?.background?.start[0]);
gad.addColorStop(1, props.style?.cir?.background?.start[1]);
ctx.strokeStyle = gad;
ctx.arc(0,0,104,-Math.PI*0.5,2*Math.PI/100*((percentage<50?percentage:50)-25), false);
ctx.stroke();
}
if(percentage>50){
ctx.beginPath();
const gad2 = ctx.createLinearGradient(0,-100,0,0);
gad2.addColorStop(0, props.style?.cir?.background?.end[0]);
gad2.addColorStop(1, props.style?.cir?.background?.start[1]);
ctx.strokeStyle = gad2;
ctx.arc(0,0,104,Math.PI*0.4,2*Math.PI/100*(percentage-25), false);
ctx.stroke();
}
}else{
getCanvas();
}
});
}
useReady(()=>{
getCanvas();
})
return <Canvas type="2d" id="myCanvas"/>
}