Commit 2f8d8b09 authored by Bill's avatar Bill

Merge branch 'dev' of 10.0.0.22:lingxi/lingxi-business-paltform into dev

parents 16592784 38f3cb90
......@@ -542,7 +542,22 @@ export enum PurchaseOrderOutWorkState {
/**
* 货品数量还没有全部发货重新发货
*/
PRODUCT_ACOUNT_NOT_SEND
PRODUCT_ACOUNT_NOT_SEND,
/**
* 待支付尾款
*/
NOT_PAYMENT_FINAL,
/**
* 待确认支付结果
*/
NOT_CONFIRM_PAYMENT_RESULT,
/**
* 确认未到账
*/
CONFIRM_WITHOUT_ARRIVED_ACCOUNT
}
// 采购订单内部工作流状态
......@@ -787,7 +802,10 @@ export const PurchaseOrderOutWorkStateTexts = {
14: '完成订单',
20: '不接受订单',
21: '确认没到账',
22: '货品未全部发货'
22: '货品未全部发货',
23: '待支付尾款',
24: '待确认支付结果',
25: '确认未到账',
}
// 采购订单内部
......
......@@ -15,17 +15,15 @@ const ExchangePrConfirmBackVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmAllReplaceGoodsReceipt({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
return (
......
......@@ -17,17 +17,15 @@ const ExchangePrDeliverVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmReplaceDeliveryGoods({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
const handleVisible = flag => {
......
......@@ -17,17 +17,15 @@ const ExchangePrReceivedVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmReturnReceiveGoods({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
const handleVisible = flag => {
......
......@@ -43,7 +43,7 @@ const ShoppingNews: React.FC = () => {
item.map((item, index) => (
<div className={styles.popular_buy_dynamic_list_item} key={`popular_buy_dynamic_list_item_${index}`}>
<div className={styles.popular_buy_dynamic_list_item_header}>
<Link to={`/memberCenter/tranactionAbility/enquirySubmit/viewEnquiryDetail?id=${item.id}`}>{item.details}</Link>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/enquirySearch/preview?id=${item.id}`}>{item.details}</Link>
<div className={cx(styles.status_tag, item.state === 1 ? styles.success : '')}>{item.state === 1 ? '已完成' : '比价中'}</div>
</div>
<div className={styles.popular_buy_dynamic_list_item_content}>
......
......@@ -178,7 +178,7 @@ const Recommand: React.FC<RecommandPropsType> = (props) => {
link = `${GlobalConfig.ichannelRootRoute}/commodity/detail?id=${item.id}&channelId=${btoa(JSON.stringify({ memberId }))}`
break
default:
link = `/shop/commodity/detail?id=${item.id}&shopId=${btoa(JSON.stringify({ memberId: item.memberId }))}`
link = `/shop/commodity/detail?id=${item.id}&shopId=${btoa(JSON.stringify({ shopId: item.storeId, memberId: item.memberId }))}`
break
}
return link
......
......@@ -157,7 +157,7 @@ const MallIndex: React.FC<MallIndexPropsType> = (props) => {
}
<FindMore />
<Information {...props} />
</div >
</div>
)
}
......
......@@ -57,12 +57,17 @@ const LXShopLayout: React.FC<LXMallLayoutPropsType> = (props) => {
useEffect(() => {
if (query.memberId) {
fetchShopInfo(query.memberId)
fetchShopInfo(query.memberId, query.roleId, query.shopId)
}
}, [query])
const fetchShopInfo = (memberId) => {
PublicApi.getTemplateShopFindShop({ memberId }).then(res => {
const fetchShopInfo = (memberId, roleId, storeId) => {
const param: any = {
memberId,
roleId,
storeId
}
PublicApi.getTemplateShopFindShop(param).then(res => {
if (res.code === 1000) {
setShopInfo(res.data)
}
......@@ -86,7 +91,7 @@ const LXShopLayout: React.FC<LXMallLayoutPropsType> = (props) => {
const menuData = basicInfo.menuData ? basicInfo.menuData.filter(item => !item.redirect) : []
const handleUpdate = () => {
fetchShopInfo(query.memberId)
fetchShopInfo(query.memberId, query.roleId, query.shopId)
}
return (
......
......@@ -332,7 +332,7 @@ const Order: React.FC<OrderPropsType> = (props) => {
if (selectPayWay.payType === 4) {
linkToUrl(`/pay/result?orderId=${data.orderId}`)
} else {
linkToUrl(`/pay?orderId=${data.orderId}&spam_id=${spam_id}`)
linkToUrl(`/pay?orderId=${btoa(JSON.stringify({orderId: data.orderId, memberId: orderInfo.supplyMembersId, memberRoleId: orderInfo.supplyMembersRoleId}))}`)
}
}
setConfirmLoading(false)
......
......@@ -15,7 +15,7 @@ import styles from './index.less'
interface BablancePayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -23,7 +23,7 @@ interface BablancePayWayPropsType {
}
const BablancePayWay: React.FC<BablancePayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, shopUrlParam, onChange } = props
const { payInfo, orderId, queryParam, layoutType, shopUrlParam, onChange } = props
const [balanceInfo, setBalanceInfo] = useState<GetPayAssetAccountGetUserBalanceResponse>(0)
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
const [payPassword, setPayPassword] = useState<string>('')
......@@ -36,17 +36,17 @@ const BablancePayWay: React.FC<BablancePayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo && payInfo) {
if (queryParam && payInfo) {
fetchBalanceInfo()
fetchSecurity()
}
}, [orderInfo, payInfo])
}, [queryParam, payInfo])
const fetchBalanceInfo = () => {
const param: any = {
payType: payInfo.ruleConfigurationId,
parentMemberId: orderInfo.supplyMembersId,
parentMemberRoleId: orderInfo.supplyMembersRoleId
parentMemberId: queryParam.memberId,
parentMemberRoleId: queryParam.memberRoleId
}
PublicApi.getPayAssetAccountGetUserBalance(param).then(res => {
......
......@@ -15,7 +15,7 @@ import { message, Button, Spin } from 'antd'
interface CreditPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -23,9 +23,8 @@ interface CreditPayWayPropsType {
}
const CreditPayWay: React.FC<CreditPayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, shopUrlParam } = props
const { payInfo, orderId, queryParam, layoutType, shopUrlParam } = props
const [payPassword, setPayPassword] = useState<string>('')
const [type, setType] = useState<string>('normal') // normal: 普通;member:会员
const [creditInfo, setCreditInfo] = useState<GetPayCreditGetCreditResponse>()
const [confirmLoading, setConfirmLoading] = useState<boolean>(false)
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
......@@ -37,16 +36,16 @@ const CreditPayWay: React.FC<CreditPayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo) {
if (queryParam) {
fetchCreditInfo()
fetchSecurity()
}
}, [orderInfo])
}, [queryParam])
const fetchCreditInfo = () => {
const param: any = {
parentMemberId: orderInfo.supplyMembersId,
parentMemberRoleId: orderInfo.supplyMembersRoleId
parentMemberId: queryParam.memberId,
parentMemberRoleId: queryParam.memberRoleId
}
PublicApi.getPayCreditGetCredit(param).then(res => {
if (res.code === 1000) {
......
......@@ -14,7 +14,7 @@ import styles from './index.less'
interface PointPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -22,7 +22,7 @@ interface PointPayWayPropsType {
}
const PointPayWay: React.FC<PointPayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, onChange, shopUrlParam } = props
const { payInfo, orderId, queryParam, layoutType, onChange, shopUrlParam } = props
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
const [payPassword, setPayPassword] = useState<string>('')
const [pointInfo, setPointInfo] = useState<GetMemberBusinessLrcRightPointGetResponse>()
......@@ -40,16 +40,16 @@ const PointPayWay: React.FC<PointPayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo) {
if (queryParam) {
fetchPointInfo()
fetchSecurity()
}
}, [orderInfo])
}, [queryParam])
const fetchPointInfo = () => {
const param: any = {
memberId: orderInfo.supplyMembersId,
roleId: orderInfo.supplyMembersRoleId
memberId: queryParam.memberId,
roleId: queryParam.memberRoleId
}
PublicApi.getMemberBusinessLrcRightPointGet(param).then(res => {
......
......@@ -12,7 +12,6 @@ import { useState } from 'react'
interface WechatPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -20,7 +19,7 @@ interface WechatPayWayPropsType {
}
const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
const { payInfo, orderId, onChange, orderInfo, layoutType, shopUrlParam } = props
const { payInfo, orderId, onChange, layoutType, shopUrlParam } = props
const [wechatPayUrl, setWechatPayUrl] = useState<any>('')
const [pageLoading, setPageLoading] = useState<boolean>(true)
let checkCount = 0
......@@ -64,7 +63,7 @@ const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
}
const checkPayState = () => {
if (checkCount < 20) {
if (checkCount < 24) {
let param = {
id: Number(orderId),
paymentInformationId: payInfo.paymentInformationId,
......@@ -82,7 +81,7 @@ const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
checkCount++
checkTimer = setTimeout(() => {
checkPayState()
}, 8000)
}, 5000)
}
} else {
message.error(res.message)
......
......@@ -51,32 +51,32 @@ const getPayTypeTitle = (type) => {
const PayPage: React.FC<PayPagePropsType> = (props) => {
const { shopInfo, mallInfo, layoutType } = props
const [payState, setPayState] = useState<boolean>(false)
const { orderId, spam_id } = props.location.query
const { orderId } = props.location.query
const [pageTitle, setPageTitle] = useState<string>()
const [loading, setLoading] = useState<boolean>(true)
const [payType] = useState<string | number>(PayWayType.bank)
const [payInfo, setPayInfo] = useState<GetOrderOrderPayDetailsResponse>()
const [errMsg, setErrMsg] = useState<string>('')
const OrderStore = useLocalStore(() => store.OrderStore)
const [orderInfo, setOrderInfo] = useState<any>({})
const { getOrderInfo } = OrderStore
const [query, setQuery] = useState<any>({})
useEffect(() => {
initOrderInfo()
if (orderId) {
fetchOrderInfo()
try {
let queryParam: any = orderId ? atob(orderId) : undefined
queryParam = queryParam ? JSON.parse(queryParam) : {}
setQuery(queryParam)
} catch (error) {
console.log(error)
setLoading(false)
}
}, [])
const initOrderInfo = async () => {
if (spam_id) {
const sessionOrderInfo: any = await getOrderInfo(spam_id)
setOrderInfo(sessionOrderInfo)
useEffect(() => {
if (query.orderId) {
fetchOrderInfo()
}
}
}, [query])
const fetchOrderInfo = () => {
PublicApi.getOrderOrderPayDetails({ id: orderId }).then(res => {
PublicApi.getOrderOrderPayDetails({ id: query.orderId }).then(res => {
message.destroy()
setLoading(false)
if (res.code === 1000) {
......@@ -91,7 +91,6 @@ const PayPage: React.FC<PayPagePropsType> = (props) => {
}
const handlePayChangge = (state, errMsg?) => {
console.log(state, "state")
setPayState(state)
errMsg && setErrMsg(errMsg)
}
......@@ -103,17 +102,17 @@ const PayPage: React.FC<PayPagePropsType> = (props) => {
switch (payInfo.paymentChannelsId) {
case PayWayType.point:
return <PointPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <PointPayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.balance:
return <BablancePayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <BablancePayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.credit:
return <CreditPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <CreditPayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.wechat:
return <WechatPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <WechatPayWay payInfo={payInfo} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.bank:
return <BankPayWay />
case PayWayType.transfer:
return <TransferPayWay payInfo={payInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <TransferPayWay payInfo={payInfo} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
default:
return null
}
......
......@@ -31,7 +31,7 @@ const PurchaseOnline: React.FC<PurchaseOnlinePropsType> = (props) => {
const [loading, setLoading] = useState<boolean>(true)
const [commodityList, setCommodityList] = useState<GetOrderRequisitionFormOnlineShoppingListResponseDetail[]>([])
const [current, setCurrent] = useState<number>(1)
const [pageSize] = useState<number>(20)
const [pageSize] = useState<number>(21)
const [totalCount, setTotalCount] = useState<number>(0)
const filterConfig = [FILTER_TYPE.category, FILTER_TYPE.useArea]
......
......@@ -31,7 +31,7 @@ const CommodityList: React.FC<CommodityListPropsType> = (props) => {
commodityList.map((item, index) => (
<div key={item.id} className={cx(styles.purchase_list_item, styles.row)}>
<div className={styles.purchase_list_item_title}>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/toAddSubmitList/rfq/preview?id=${item.id}`}>{item.details}</Link>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/enquirySearch/preview?id=${item.id}`}>{item.details}</Link>
</div>
<div className={styles.purchase_list_item_info_box}>
<div className={styles.purchase_list_item_info_line}>
......
......@@ -169,9 +169,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
defaultCheckedList: item.orderList.map(item => item.id)
})
})
console.log(result)
setOrderList(result)
// !initChecked && setCheckedList(result.map(item => item.id))
}
const onCheckAllChange = (e: any) => {
......@@ -240,7 +238,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
* @param id
*/
const handleCountChange = (count: number, id: number, type: string) => {
handleChangeFinishCount(count, id)
handleChangeFinishCount(count, id)
if(type === 'click' || type === 'blur') {
if (countState) {
countState = false
......@@ -271,14 +269,13 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
})
}
}
}
const handleBlur = (count: number, id: number) => {
console.log(countState, count, "handleBlur")
}
/**
* 修改商品购买数量
* @param count
* @param id
*/
const handleChangeFinishCount = (count, id) => {
const result = orderList.map(item => {
item.orderList = item.orderList.map(childItem => {
......@@ -456,6 +453,10 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
})
}
/**
* 获取支付方式
* @param memberId
*/
const getPayWayListByMemberId = (memberId: number) => {
return new Promise((resolve) => {
if (!memberId) {
......@@ -530,13 +531,19 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
const buyOrderlist = []
const selectOrderList = selectItem.orderList.filter(item => selectItem.checkedList.includes(item.id))
let commonLogistics = {}
let hasLogistics = false
let logisticsInfo = {}
setConfirmLoading(true)
const purchaseIds = []
for (const item of selectOrderList) {
purchaseIds.push(item.id)
productIds.push(item.commodityUnitPrice.id)
commonLogistics = item.commodityUnitPrice.commodity.logistics
if(item.commodityUnitPrice.commodity.logistics.deliveryType === 1) {
hasLogistics = true
logisticsInfo = item.commodityUnitPrice.commodity.logistics
}
const buyCommodityInfo: any = {
id: item.commodityUnitPrice.id,
purchaseId: item.id,
......@@ -553,6 +560,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
attribute: item.commodityUnitPrice.attributeAndValueList,
stockCount: item.stockCount || 0
}
if (item.commodityUnitPrice.commodity.isMemberPrice) {
buyCommodityInfo.memberDiscount = await getMemberCredit(item.commodityUnitPrice.commodity.memberId, item.commodityUnitPrice.commodity.memberRoleId)
}
......@@ -564,7 +572,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
purchaseOrder: true, // 是否进货单下单
idList: purchaseIds,
productType: (layoutType === LAYOUT_TYPE.channel || layoutType === LAYOUT_TYPE.ichannel) ? 2 : 1,
logistics: commonLogistics,
logistics: hasLogistics ? logisticsInfo : commonLogistics,
supplyMembersName: selectItem.shopname,
supplyMembersId: selectItem.memberId,
supplyMembersRoleId: selectItem.memberRoleId,
......
......@@ -52,7 +52,7 @@ const CommodityList: React.FC<CommodityListPropsType> = (props) => {
<div className={styles.shop_list_info_box}>
<div className={styles.shop_list_info_name}>
<Link to={`/shop?shopId=${btoa(JSON.stringify({ shopId: item.id, memberId: item.memberId }))}`}>{item.memberName}</Link>
<span className={styles.shop_list_info_city}>{item.memberShopAreas}</span>
<span className={styles.shop_list_info_city}>{item.areas}</span>
</div>
<div className={styles.shop_list_info_about}>
<div className={styles.shop_list_info_about_item}>
......
......@@ -11,6 +11,7 @@ import {
import {
QuestionCircleOutlined,
} from '@ant-design/icons';
import { isJSONStr } from '@/utils';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import { Pie } from '@/components/Charts';
......@@ -116,17 +117,17 @@ export interface ComplaintProps {
interface SincerityInfoProps {
basicInfo?: BasicInfo;
salesEstimateSum?: EstimateSum;
/*
/**
交易评论历史记录
*/
fetchSalesList?: (params: FetchParams) => Promise<{ data: SalesProps[] , totalCount: number }>;
afterEstimateSum?: EstimateSum;
/*
/**
售后评论历史记录
*/
fetchAfterList?: (params: FetchParams) => Promise<{ data: SalesProps[] , totalCount: number }>;
complaintSum?: ComplaintSum;
/*
/**
投诉历史记录
*/
fetchComplaintList?: (params: FetchParams) => Promise<{ data: ComplaintProps[] , totalCount: number }>;
......@@ -277,11 +278,17 @@ const SincerityInfo: React.FC<SincerityInfoProps> = ({
title: '评价内容',
dataIndex: 'comment',
align: 'center',
ellipsis: true,
},
{
title: '交易商品',
dataIndex: 'product',
align: 'center',
align: 'center',
ellipsis: true,
render: text => {
const product = isJSONStr(text) || {};
return product.productName || '';
},
},
{
title: '评价方',
......
......@@ -21,8 +21,16 @@ const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
}}
>
<AuditProcess
outerVerifyCurrent={memberMaintainInfo?.currentOuterStep}
innerVerifyCurrent={memberMaintainInfo?.currentInnerStep}
outerVerifyCurrent={
memberMaintainInfo && memberMaintainInfo.currentOuterStep > 0 ?
memberMaintainInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberMaintainInfo && memberMaintainInfo.currentInnerStep > 0 ?
memberMaintainInfo.currentInnerStep -1 :
0
}
outerVerifySteps={memberMaintainInfo?.outerVerifySteps}
innerVerifySteps={memberMaintainInfo?.innerVerifySteps}
/>
......
......@@ -198,6 +198,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -199,6 +199,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -214,6 +214,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -285,6 +285,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -22,7 +22,15 @@ const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
marginBottom: 24,
}}
>
<Steps style={{ marginTop: 30 }} progressDot current={memberMaintainInfo?.currentOuterStep}>
<Steps
style={{ marginTop: 30 }}
progressDot
current={
memberMaintainInfo && memberMaintainInfo.currentOuterStep > 0 ?
memberMaintainInfo.currentOuterStep - 1 :
0
}
>
{memberMaintainInfo.outerVerifySteps ? memberMaintainInfo.outerVerifySteps.map((item, index) => (
<Steps.Step key={index} title={item.roleName} description={item.stepName} />
)) : null}
......
......@@ -231,7 +231,6 @@ const ShopInfo: React.FC<ShopInfoPropsType> = (props) => {
const getMallItemAndSetUrl = (mallId) => {
let result = ""
console.log(mallId, allMallList, "mallId")
const mallItem = allMallList.filter(item => item.id === mallId)[0]
if (!mallItem) {
return ""
......@@ -244,10 +243,10 @@ const ShopInfo: React.FC<ShopInfoPropsType> = (props) => {
switch (mallItem.type) {
case 1:
result = `${newSiteUrl}/shop?shopId=${btoa(JSON.stringify({ shopId: shopInfo.id, memberId: shopInfo.memberId }))}`
result = `${newSiteUrl}/shop?shopId=${btoa(JSON.stringify({ shopId: shopInfo.id, memberId: shopInfo.memberId, roleId: shopInfo.roleId }))}`
break
case 2:
result = `${newSiteUrl}/shop/pointsMall?shopId=${btoa(JSON.stringify({ shopId: shopInfo.id, memberId: shopInfo.memberId }))}`
result = `${newSiteUrl}/shop/pointsMall?shopId=${btoa(JSON.stringify({ shopId: shopInfo.id, memberId: shopInfo.memberId, roleId: shopInfo.roleId }))}`
break
default:
result = ""
......
......@@ -32,7 +32,7 @@ const OrderElectronModal:React.FC<OrderElectronModalProps> = (props) => {
params.contractName = data.electronicContractName
params.contractUrl = data.electronicContractUrl
} else {
params.id = parseInt(data.signatureLogId)
params.id = parseInt(data.id)
}
const res = await run(params)
if (res.code === 1000) {
......
......@@ -99,4 +99,30 @@
}
}
}
// 扫码
.qrCodeImage {
text-align: center;
width: 224px;
height: 224px;
margin: 20px auto 42px;
&>img {
display: block;
width: 100%;
height: 100%;
}
}
.scanTips {
display: flex;
justify-content: center;
align-items: center;
color: #6b778c;
margin-bottom: 18px;
.scanIcon {
font-size: 30px;
margin-right: @margin-sm;
}
}
\ No newline at end of file
......@@ -3,13 +3,14 @@ import { Modal, Steps, Row, Col, Spin, message, Upload, Button, Input } from 'an
import style from './index.less'
import { OrderDetailContext } from '../../_public/order/context'
import cx from 'classnames'
import { UploadOutlined } from '@ant-design/icons'
import { ScanOutlined, UploadOutlined } from '@ant-design/icons'
import { UPLOAD_TYPE } from '@/constants'
import { usePageStatus } from '@/hooks/usePageStatus'
import { PublicApi } from '@/services/api'
import { history } from 'umi'
import { useHttpRequest } from '@/hooks/useHttpRequest'
import { encryptedByAES } from '@/utils/cryptoAes'
import QRCode from 'qrcode'
export interface OrderPayModalProps {
currentRef: any,
......@@ -79,7 +80,9 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
const [checked, setChecked] = useState<any>({})
const [current, setCurrent] = useState(0) // 0选择方式 1线下支付方式 2授信支付 3余额支付 4微信支付 5货到付款 1000清除
const [payStep, setPayStep] = useState(0) // 支付模态框的步骤 0选方式 1下一步的具体操作 2输入支付密码
const mobilePayFlag = useRef(0) // 用于判断移动支付类型 4微信
const [code, setCode] = useState('')
const [qrCodeInfo, setQrCodeInfo] = useState({ generateCharacter: '', qrUrl: '' })
const [number, setNumber] = useState([0,1,2,3,4,5])
const { currentRef, confirm } = props
const [isSpin, setIsSpin] = useState<boolean>(false)
......@@ -103,6 +106,24 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
}
}, [visible])
useEffect(() => {
if(qrCodeInfo.generateCharacter){
generateQrCode()
}
}, [qrCodeInfo.generateCharacter])
const generateQrCode = () => {
// 生成二维码
QRCode.toDataURL(qrCodeInfo.generateCharacter).then((url:any) => {
setQrCodeInfo({...qrCodeInfo, qrUrl: url})
// 轮询支付结果
// setOpenTimer(1)
})
.catch((err:any) => {
console.error(err)
})
}
const handleConfirm = () => {
console.log(data,'data')
if (current === 0) {
......@@ -147,13 +168,15 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
console.log('选择了货到付款')
setCurrent(5)
setPayStep(1)
}
// else if(checked.id === 2) {
// console.log('选择了微信支付')
// setCurrent(4)
// setPayStep(1)
// handleSubmitPay()
// }
} else if(checked.id === 2) {
console.log('选择了微信支付')
// 跳转扫码支付
history.push(`/pay?orderId=${btoa(JSON.stringify({ orderId: id, memberId: data.supplyMembersId, memberRoleId: data.supplyMembersRoleId }))}`)
// mobilePayFlag.current = 4
// setCurrent(4)
// setPayStep(1)
// handleSubmitPay()
}
else {
message.error('暂只支持线下支付、授信额度支付、余额支付方式、货到付款')
}
......@@ -232,12 +255,15 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
params.payOrderUrls = payOrderUrls.join(',')
}
console.log(current, payStep,'666',mobilePayFlag)
const res = await run(params)
if (res.code === 1000) {
if(current != 4) {
if(mobilePayFlag.current !== 4) {
history.goBack()
} else {
console.log(res, '二维码信息')
setQrCodeInfo({ ...qrCodeInfo, generateCharacter: res.data })
}
}
}
......@@ -433,9 +459,12 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
{
current === 4 &&
<div>
<p>微信扫码支付</p>
<div>
<div className={style.qrCodeImage}>
<img src={qrCodeInfo.qrUrl} alt=""/>
<div className={style.scanTips}>
<ScanOutlined className={style.scanIcon} />
<span>打开 {mobilePayFlag.current === 4 ? '微信' : '支付宝'}App<br />扫码完成支付</span>
</div>
</div>
</div>
}
......
......@@ -34,6 +34,7 @@ const BasicInfo: React.FC<queryProps> = (props) => {
const [visibleChannelMember, setVisibleChannelMember] = useState(false);
const [memberName, setmemberName] = useState<any>();
const [memberId, setmemberId] = useState<any>();
const [roleId, setroleId] = useState<any>();
const [memberRowSelection, memberRowCtl] = useRowSelectionTable({ customKey: 'memberId', type: 'radio' });
const handleOkAddMember = () => {
setVisibleChannelMember(false)
......@@ -42,6 +43,7 @@ const BasicInfo: React.FC<queryProps> = (props) => {
memberId: memberRowCtl.selectRow[0].memberId
}
setmemberId(memberRowCtl.selectRow[0].memberId)
setroleId(memberRowCtl.selectRow[0].roleId)
setmemberName(memberRowCtl.selectRow[0].name);
getMemberList(memberInfo); // 回传给父级
}
......@@ -141,6 +143,7 @@ const BasicInfo: React.FC<queryProps> = (props) => {
})
setmemberName(editData.memberName)
setmemberId(editData.memberId)
setroleId(editData.roleId)
}
}, [editData])
......@@ -157,7 +160,7 @@ const BasicInfo: React.FC<queryProps> = (props) => {
</Form.Item>
<Form.Item label='被询价会员' name='memberId' rules={[{ required: true, message: '请选择被询价会员' }]}>
<Search disabled={type === 3} value={memberName ? memberName : undefined} readOnly enterButton={<><LinkOutlined /> 选择</>} onSearch={()=>setVisibleChannelMember(true)} />
{memberName && <Button type='link' onClick={() => window.open(`/shop?shopId=${btoa(JSON.stringify({memberId}))}`)}>查看会员详情</Button>}
{memberName && <Button type='link' onClick={() => window.open(`/shop?shopId=${btoa(JSON.stringify({memberId, roleId}))}`)}>查看会员详情</Button>}
</Form.Item>
<Form.Item label='询价单号' name='orderNumber'>
<span>{(Object.keys(editData).length > 0 && editData.inquiryListNo) ? editData.inquiryListNo : '-'}</span>
......
......@@ -8,6 +8,7 @@ import { useUpdate } from '@umijs/hooks';
import { PublicApi } from '@/services/api';
import { filterProductDataById } from '../components/productModalTable'
import { getUnitPriceTotal } from '../model/useProductTable';
import { toPercent } from '@/utils/type';
// 异步填充表格字段
const asyncPadDataForProduct = async (ctx: ISchemaFormActions | ISchemaFormAsyncActions, productValue: any) => {
......@@ -124,13 +125,14 @@ export const useOrderFormInitEffect = (ctx: ISchemaFormActions | ISchemaFormAsyn
state.props.enum = state.props.enum.map(v => {
const assign: any = Object.assign({}, v)
// 过滤服务提供者
if (auth.memberRoleType === 2) {
if (auth.memberRoleType === 2) { // 采购商
// 企业+个人
if ((auth.memberType === 1 || auth.memberType === 2) && assign.value > 9) {
// if ((auth.memberType === 1 || auth.memberType === 2) && (assign.value > 9 && assign.value !== 24)) {
if ((auth.memberType === 1 || auth.memberType === 2) && assign.value > 9) {
assign.disabled = true
}
// 渠道(企业+个人)
if ((auth.memberType === 3 || auth.memberType === 4) && assign.value < 10) {
if ((auth.memberType === 3 || auth.memberType === 4) && assign.value < 10) {
assign.disabled = true
}
// 商城下单
......@@ -176,6 +178,8 @@ export const useOrderFormInitEffect = (ctx: ISchemaFormActions | ISchemaFormAsyn
money: v.count * v.unitPrice,
productId: v.id,
memberId: initValue.supplyMembersId, // 添加 memberId 字段
commodityId: v.id, // 添加commodityId用于判断是商品价格是使用price字段还是unitPrice字段(也可判断是报价订单还是其他)
memberPrice: v.memberDiscount !== 1 ? toPercent(v.memberDiscount) : 1, // 添加会员折扣
}
})))
}
......
......@@ -7,14 +7,26 @@ import { useModalTable } from './useModalTable';
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { toPoint } from '@/utils/type';
// 对象按key排序(运用于商城传过来的阶梯价格排序)
export const sortByKey = (params) => {
let keys = Object.keys(params).sort((x,y)=> parseInt(x) - parseInt(y));
let newParams = {};
keys.forEach((key) => {
newParams[key] = params[key];
});
return newParams;
}
export const getUnitPriceTotal = (record) => {
const purchaseCount = Number(record['purchaseCount']) || 0
console.log(record,purchaseCount,'rrr')
// fix 当没有传递unitPrice字段时 自动容错, 单价显示为0
record.unitPrice = record.unitPrice || record.price || 0
if (typeof record.unitPrice === 'number') {
return record.unitPrice * purchaseCount
}
if(record.unitPrice) {
record.unitPrice = sortByKey(record.unitPrice)
}
let unitPrice = 0
Object.entries(record.unitPrice).forEach(([key, value]) => {
const [min, max] = key.split('-').map(v => Number(v))
......@@ -29,7 +41,6 @@ export const getUnitPriceTotal = (record) => {
}
})
// 考虑会员折扣
console.log('算价格', record.memberPrice)
let memberPrice = record.memberPrice !== 1 ? toPoint(record.memberPrice) : 1
return unitPrice * purchaseCount * memberPrice
}
......
......@@ -153,7 +153,12 @@ export const useSelfTable = (props) => {
render: (text, record) => <>
{
record.currentPayments !== record.sum &&
(record.externalState === PurchaseOrderOutWorkState.PAY_ORDER || record.externalState === PurchaseOrderOutWorkState.CONFIRM_NOT_ARRIVED_ACCOUNT) &&
(
record.externalState === PurchaseOrderOutWorkState.PAY_ORDER ||
record.externalState === PurchaseOrderOutWorkState.CONFIRM_NOT_ARRIVED_ACCOUNT ||
record.externalState === PurchaseOrderOutWorkState.NOT_PAYMENT_FINAL ||
record.externalState === PurchaseOrderOutWorkState.CONFIRM_WITHOUT_ARRIVED_ACCOUNT
) &&
<Link to={`/memberCenter/tranactionAbility/purchaseOrder/readyPayOrder/detail?id=${record.id}`}>去支付</Link>
}
{
......
......@@ -33,17 +33,17 @@ const ReadyConfirmOrderDetail: React.FC = () => {
// 提交表单
const handleSubmit = useCallback(() => {
const handleSubmit = () => {
approvedRef.current.actions.submit().then(async (v) => {
const params = {
id: Number(id),
state: v.values.state,
cause: v.values.cause,
}
if(v.values.state) { // 通过
if(formContext.data.usingElectronicContracts && v.values.state) { // 使用合同 并且通过
approvedRef.current.setVisible(false)
electronRef.current.setVisible(true)
} else { // 不通过
} else {
const result = await run(params)
if (result.code === 1000) {
......@@ -51,10 +51,8 @@ const ReadyConfirmOrderDetail: React.FC = () => {
history.goBack()
}
}
console.log(params, v, 'v', approvedRef.current, electronRef.current)
})
}, [])
}
return (
<div>
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-16 15:16:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-11-25 17:25:55
* @LastEditTime: 2020-11-26 11:10:39
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
......@@ -598,8 +598,7 @@ export const useBusinessEffects = (context, actions) => {
onFieldInputChange$('invoicesDetailsRequests.*.product').subscribe(fieldState => {
const { name, originAsyncData, value } = fieldState;
const current = originAsyncData.find(item => item.productId === value);
console.log('current', current)
const invoicesTypeIdVal = getFieldValue('invoicesTypeId');
// 取消选择
if (!value) {
......@@ -679,14 +678,6 @@ export const useBusinessEffects = (context, actions) => {
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.purchaseCount;
}
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.amount`
}),
state => {
......@@ -694,6 +685,57 @@ export const useBusinessEffects = (context, actions) => {
}
);
switch (invoicesTypeIdVal) {
// 采购入库单、销售发货单
case DOC_TYPE_PURCHASE_RECEIPT:
case DOC_TYPE_SALES_INVOICE: {
// 设置单据数量,取采购数量
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.purchaseCount;
}
);
break;
}
// 加工入库单、加工发货单
case DOC_TYPE_PROCESS_RECEIPT:
case DOC_TYPE_PROCESS_INVOICE: {
// 设置单据数量,取加工数量
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.processNum;
}
);
break;
}
// 退货发货单、退货入库单
case DOC_TYPE_RETURN_INVOICE:
case DOC_TYPE_RETURN_RECEIPT: {
break;
}
// 换货发货单、换货入库单
case DOC_TYPE_EXCHANGE_INVOICE:
case DOC_TYPE_EXCHANGE_RECEIPT: {
break;
}
default: {
break;
}
}
// 额外的数据
setFieldState(
FormPath.transform(name, /\d/, $1 => {
......@@ -750,6 +792,7 @@ export const useBusinessEffects = (context, actions) => {
// 关联明细 商品数量 联动计算商品金额
onFieldInputChange$('invoicesDetailsRequests.*.productCount').subscribe(fieldState => {
const { name, value } = fieldState;
const invoicesTypeIdVal = getFieldValue('invoicesTypeId');
const originAsyncData = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.product`
......@@ -764,18 +807,61 @@ export const useBusinessEffects = (context, actions) => {
);
const current = originAsyncData ? originAsyncData.find(item => item.productId === goodId) : null;
console.log('current', current)
if (!current) {
return;
}
if (+value > current.purchaseCount) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过商品数量',
okText: '确认',
cancelText: '取消',
});
switch (invoicesTypeIdVal) {
// 采购入库单、销售发货单
case DOC_TYPE_PURCHASE_RECEIPT:
case DOC_TYPE_SALES_INVOICE: {
if (+value > current.purchaseCount) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过商品数量',
okText: '确认',
cancelText: '取消',
});
}
break;
}
// 加工入库单、加工发货单
case DOC_TYPE_PROCESS_RECEIPT:
case DOC_TYPE_PROCESS_INVOICE: {
if (+value > current.processNum) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过加工数量',
okText: '确认',
cancelText: '取消',
});
}
break;
}
// 退货发货单、退货入库单
case DOC_TYPE_RETURN_INVOICE:
case DOC_TYPE_RETURN_RECEIPT: {
break;
}
// 换货发货单、换货入库单
case DOC_TYPE_EXCHANGE_INVOICE:
case DOC_TYPE_EXCHANGE_RECEIPT: {
break;
}
default: {
break;
}
}
setFieldState(
......
......@@ -10,11 +10,13 @@ import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
import { PublicApi } from '@/services/api';
import { useLinkageUtils } from '@/utils/formEffectUtils';
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import ModalTable from '@/components/ModalTable';
import Search from '@/components/NiceForm/components/Search';
import Submit from '@/components/NiceForm/components/Submit';
import SearchSelect from '@/components/NiceForm/components/SearchSelect';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
......@@ -42,6 +44,7 @@ import { createEffects } from './effects';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
onFormInit$,
} = FormEffectHooks;
interface BillsFormProps {
......@@ -97,6 +100,28 @@ const BillsForm: React.FC<BillsFormProps> = ({
},
]
// 获取品牌
const fetchBrand = async (name = '') => {
const res = await PublicApi.getProductSelectGetSelectBrand({
name,
});
if (res.code === 1000) {
return res.data;
}
return [];
}
// 获取会员品类
const fetchCustomerCategory = async (name = '') => {
const res = await PublicApi.getProductSelectGetSelectCustomerCategory({
name,
});
if (res.code === 1000) {
return res.data;
}
return [];
}
// 获取单据详情
const getBillInfo = () => {
if (!id) {
......@@ -874,14 +899,46 @@ const BillsForm: React.FC<BillsFormProps> = ({
components: {
Search,
Submit,
SearchSelect,
},
effects: ($, actions) => {
const linkage = useLinkageUtils();
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncSelect('brandId', fetchBrand, ['name', 'id']);
useAsyncSelect('customerCategoryId', fetchCustomerCategory, ['name', 'id']);
onFormInit$().subscribe(() => {
// 初始化远程检索逻辑
linkage.componentProps('customerCategoryId', {
onSearch: async value => {
linkage.loading('customerCategoryId');
const dataSource = await fetchCustomerCategory(value);
linkage.enum('customerCategoryId', dataSource.map(item => ({
label: item.name,
value: item.id,
})));
linkage.loaded('customerCategoryId');
},
});
// 初始化远程检索逻辑
linkage.componentProps('brandId', {
onSearch: async value => {
linkage.loading('brandId');
const dataSource = await fetchCustomerCategory(value);
linkage.enum('brandId', dataSource.map(item => ({
label: item.name,
value: item.id,
})));
linkage.loaded('brandId');
},
});
});
},
inline: false,
}
......
......@@ -779,24 +779,24 @@ export const goodsSearchSchema: ISchema = {
},
customerCategoryId: {
type: 'string',
'x-component': 'SearchSelect',
enum: [],
'x-component-props': {
placeholder: '品类',
fetchSearch: PublicApi.getProductSelectGetSelectCustomerCategory,
style: {
width: '100%',
}
placeholder: '品类',
showSearch: true,
defaultActiveFirstOption: false,
showArrow: true,
filterOption: false,
},
},
brandId: {
type: 'string',
'x-component': 'SearchSelect',
enum: [],
'x-component-props': {
placeholder: '品牌',
fetchSearch: PublicApi.getProductSelectGetSelectBrand,
style: {
width: '100%',
}
placeholder: '品牌',
showSearch: true,
defaultActiveFirstOption: false,
showArrow: true,
filterOption: false,
},
},
submit: {
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-23 17:00:24
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-27 16:59:38
* @LastEditTime: 2020-11-26 14:52:22
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -64,7 +64,7 @@ export const evaluateSchema: ISchema = {
},
},
picture: {
type: 'string',
type: 'array',
title: '图片',
'x-component': 'Upload',
'x-component-props': {
......
......@@ -443,7 +443,9 @@ export interface FileData {
url: string;
};
// 初始化 Upload 数据
/**
* 初始化 Upload 数据
*/
export function normalizeFiledata(url: string): FileData
export function normalizeFiledata(url: any): any {
if (!url) {
......
......@@ -11,7 +11,8 @@ export const toPoint = (percent: string) => {
// 小数转分数
export const toPercent = (point: number) => {
let str = Number(point * 100).toFixed(1);
// let str = Number(point * 100).toFixed(1);
let str = Number(point * 100);
str += "%";
return str;
}
\ No newline at end of file
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