Commit f0fe2832 authored by GuanHua's avatar GuanHua

feat:商品收藏修改和资讯搜索修改

parent 96675f1e
...@@ -6,11 +6,12 @@ interface SignModalPropsType { ...@@ -6,11 +6,12 @@ interface SignModalPropsType {
visible: boolean, visible: boolean,
onOk?: Function, onOk?: Function,
onCancel?: Function, onCancel?: Function,
contractUrl?: string contractUrl?: string,
loading: boolean;
} }
const SignModal: React.FC<SignModalPropsType> = (props) => { const SignModal: React.FC<SignModalPropsType> = (props) => {
const { visible, onOk, onCancel, contractUrl } = props const { visible, onOk, onCancel, contractUrl, loading } = props
const iframeRef = useRef<HTMLIFrameElement>(null) const iframeRef = useRef<HTMLIFrameElement>(null)
// const iframeScrollBottom = () => { // const iframeScrollBottom = () => {
...@@ -31,6 +32,8 @@ const SignModal: React.FC<SignModalPropsType> = (props) => { ...@@ -31,6 +32,8 @@ const SignModal: React.FC<SignModalPropsType> = (props) => {
className={styles.sign_modal} className={styles.sign_modal}
title="签署电子合同" title="签署电子合同"
width={1000} width={1000}
maskClosable={false}
confirmLoading={loading}
visible={visible} visible={visible}
centered centered
okText="签署合同并提交" okText="签署合同并提交"
......
...@@ -6,19 +6,24 @@ import { getAuth } from '@/utils/auth' ...@@ -6,19 +6,24 @@ import { getAuth } from '@/utils/auth'
import { PublicApi } from '@/services/api' import { PublicApi } from '@/services/api'
import styles from './index.less' import styles from './index.less'
import { message } from 'antd' import { message } from 'antd'
import { LAYOUT_TYPE, COMMODITY_TYPE } from '@/constants'
interface imgItemType { interface imgItemType {
id: number; id: number;
commodityPic: string; commodityPic: string;
} }
interface ExhibitionPropsType { interface ExhibitionPropsType {
imgList: imgItemType[]; imgList: imgItemType[];
commodityDetail: GetSearchShopStoreGetCommodityDetailResponse commodityDetail: GetSearchShopStoreGetCommodityDetailResponse;
layoutType: LAYOUT_TYPE;
priceType: number;
shopInfo: any
} }
const Exhibition: React.FC<ExhibitionPropsType> = (props) => { const Exhibition: React.FC<ExhibitionPropsType> = (props) => {
const { imgList = [], commodityDetail } = props const { imgList = [], commodityDetail, layoutType, priceType, shopInfo } = props
const [previewImg, setPreviewImg] = useState<any>() const [previewImg, setPreviewImg] = useState<any>()
const [offSetLeft, setOffSetLeft] = useState<number>(0) const [offSetLeft, setOffSetLeft] = useState<number>(0)
const [collectState, setCollectState] = useState<boolean>(false) const [collectState, setCollectState] = useState<boolean>(false)
...@@ -26,6 +31,7 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => { ...@@ -26,6 +31,7 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => {
let collectFlg = true let collectFlg = true
useEffect(() => { useEffect(() => {
if (commodityDetail) { if (commodityDetail) {
console.log(shopInfo)
getCollectState() getCollectState()
} }
}, [commodityDetail]) }, [commodityDetail])
...@@ -51,13 +57,44 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => { ...@@ -51,13 +57,44 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => {
} }
} }
const getLayoutType = () => {
switch (layoutType) {
case LAYOUT_TYPE.mall:
return 1
case LAYOUT_TYPE.shop:
if (priceType === COMMODITY_TYPE.integral) {
return 2
} else {
return 1
}
case LAYOUT_TYPE.channel:
if (priceType === COMMODITY_TYPE.integral) {
return 5
} else {
return 3
}
case LAYOUT_TYPE.ichannel:
if (priceType === COMMODITY_TYPE.integral) {
return 5
} else {
return 4
}
default:
return 1
}
}
/** /**
* 获取收藏状态 * 获取收藏状态
*/ */
const getCollectState = () => { const getCollectState = () => {
if (getAuth()) { if (getAuth()) {
let param: any = {
commodityId: commodityDetail.id,
type: getLayoutType()
}
//@ts-ignore //@ts-ignore
PublicApi.getSearchShopCommodityCollectGetCommodityCollect({ commodityId: commodityDetail.id }).then(res => { PublicApi.getSearchShopCommodityCollectGetCommodityCollect(param).then(res => {
if (res.code === 1000) { if (res.code === 1000) {
setCollectState(res.data.isCollect) setCollectState(res.data.isCollect)
setCollectCount(res.data.count) setCollectCount(res.data.count)
...@@ -84,7 +121,13 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => { ...@@ -84,7 +121,13 @@ const Exhibition: React.FC<ExhibitionPropsType> = (props) => {
collectFlg = false collectFlg = false
let postFn; let postFn;
let param: any = { let param: any = {
commodityId: commodityDetail.id commodityId: commodityDetail.id,
type: getLayoutType()
}
console.log([3, 4, 5].includes(getLayoutType()))
if ([3, 4, 5].includes(getLayoutType())) {
console.log(shopInfo.memberId, " shopInfo.memberId")
param.channelMemberId = shopInfo.memberId
} }
if (collectState) { if (collectState) {
postFn = PublicApi.postSearchShopCommodityCollectDeleteCommodityCollect postFn = PublicApi.postSearchShopCommodityCollectDeleteCommodityCollect
......
...@@ -650,7 +650,7 @@ const CommodityDetail = (props) => { ...@@ -650,7 +650,7 @@ const CommodityDetail = (props) => {
<div className={styles.commodity_detail}> <div className={styles.commodity_detail}>
<div className={styles.commodity_detail_container}> <div className={styles.commodity_detail_container}>
<div className={styles.commodity_detail_info}> <div className={styles.commodity_detail_info}>
<Exhibition imgList={commodityImgList} commodityDetail={commodityDetail} /> <Exhibition layoutType={layoutType} shopInfo={shopInfo} priceType={commodityDetail?.priceType} imgList={commodityImgList} commodityDetail={commodityDetail} />
<div className={styles.product_info_container}> <div className={styles.product_info_container}>
<div className={styles.product_info}> <div className={styles.product_info}>
<div className={styles.product_info_name}> <div className={styles.product_info_name}>
......
...@@ -146,7 +146,7 @@ const InformationSearch: React.FC<InformationPropsType> = (props) => { ...@@ -146,7 +146,7 @@ const InformationSearch: React.FC<InformationPropsType> = (props) => {
param.title = keyword param.title = keyword
} }
if (labelName && labelId) { if (labelName && labelId) {
param.columnId = labelId param.labelId = labelId
} }
//@ts-ignore //@ts-ignore
......
@import '../common.less'; @import '../common.less';
.contract {} .checkbox_contract_text {
\ No newline at end of file &:hover {
color: var(--mall_main_color);
}
}
\ No newline at end of file
import React from 'react' import React, { useEffect } from 'react'
import { Tooltip, Checkbox } from 'antd' import { Tooltip, Checkbox } from 'antd'
import { QuestionCircleOutlined } from '@ant-design/icons' import { QuestionCircleOutlined } from '@ant-design/icons'
import styles from './index.less' import styles from './index.less'
...@@ -6,11 +6,13 @@ import styles from './index.less' ...@@ -6,11 +6,13 @@ import styles from './index.less'
interface ContractPropsType { interface ContractPropsType {
state: boolean; state: boolean;
onChange: Function; onChange: Function;
contractInfo: any
} }
const Contract: React.FC<ContractPropsType> = (props) => { const Contract: React.FC<ContractPropsType> = (props) => {
const { state, onChange } = props const { state, onChange, contractInfo } = props
return ( return (
<div className={styles.contract}> <div className={styles.contract}>
<div className={styles.common_title}> <div className={styles.common_title}>
...@@ -23,7 +25,9 @@ const Contract: React.FC<ContractPropsType> = (props) => { ...@@ -23,7 +25,9 @@ const Contract: React.FC<ContractPropsType> = (props) => {
<Checkbox checked={state} onChange={(e) => onChange(e.target.checked)}> <Checkbox checked={state} onChange={(e) => onChange(e.target.checked)}>
<span>我同意签订:</span> <span>我同意签订:</span>
</Checkbox> </Checkbox>
<span className={styles.checkbox_contract_text}> 《广州白马皮具交易中心商品购销合同.pdf》</span> {
contractInfo && <a href={contractInfo?.contractUrl} download target="_blank" className={styles.checkbox_contract_text}>{contractInfo?.contractName}</a>
}
</div> </div>
</div> </div>
) )
......
...@@ -16,6 +16,7 @@ import { PublicApi } from '@/services/api' ...@@ -16,6 +16,7 @@ import { PublicApi } from '@/services/api'
import { GetLogisticsReceiverAddressGetResponse } from '@/services/LogisticsApi' import { GetLogisticsReceiverAddressGetResponse } from '@/services/LogisticsApi'
import SignModal from '@/components/SignModal' import SignModal from '@/components/SignModal'
import { isEmpty } from 'lodash' import { isEmpty } from 'lodash'
import { getAuth } from '@/utils/auth'
import { LAYOUT_TYPE, OrderModalType, COMMODITY_TYPE } from '@/constants' import { LAYOUT_TYPE, OrderModalType, COMMODITY_TYPE } from '@/constants'
interface OrderPropsType { interface OrderPropsType {
...@@ -26,6 +27,7 @@ interface OrderPropsType { ...@@ -26,6 +27,7 @@ interface OrderPropsType {
} }
const Order: React.FC<OrderPropsType> = (props) => { const Order: React.FC<OrderPropsType> = (props) => {
const userInfo = getAuth()
const { shopInfo, mallInfo, layoutType, } = props const { shopInfo, mallInfo, layoutType, } = props
const { query: { type = COMMODITY_TYPE.prompt } } = props.location const { query: { type = COMMODITY_TYPE.prompt } } = props.location
const [signModalVisible, setSignModalVisible] = useState<boolean>(false) const [signModalVisible, setSignModalVisible] = useState<boolean>(false)
...@@ -43,17 +45,28 @@ const Order: React.FC<OrderPropsType> = (props) => { ...@@ -43,17 +45,28 @@ const Order: React.FC<OrderPropsType> = (props) => {
const [selectInvoiceInfo, setSelectInvoiceInfo] = useState<any>() const [selectInvoiceInfo, setSelectInvoiceInfo] = useState<any>()
const [logisticsFee, setLogisticsFee] = useState<number>(0) const [logisticsFee, setLogisticsFee] = useState<number>(0)
const [isElectronicContract, setIsElectronicContract] = useState<boolean>(false) // 是否选用电子合同 const [isElectronicContract, setIsElectronicContract] = useState<boolean>(false) // 是否选用电子合同
const [contractInfo, setContractInfo] = useState() const [contractInfo, setContractInfo] = useState<any>()
const [electronicContractId, setElectronicContractId] = useState<number>()
const [agreeSingLoading, setAgreeSignLoading] = useState<boolean>(false)
useEffect(() => { useEffect(() => {
if (!userInfo) {
message.error("登录已过期,请重新登录")
setTimeout(() => {
window.location.href = `/user/login?redirect=${btoa(encodeURIComponent(String(window.location)))}`
}, 1000);
return
}
if (!spam_id) { if (!spam_id) {
message.error("订单不存在") message.error("订单不存在")
history.goBack() history.goBack()
} }
initOrderInfo() initOrderInfo()
// return () => { return () => {
// clearOrderInfo() if (sessionStorage.getItem("contractInfo")) {
// } sessionStorage.removeItem("contractInfo")
}
}
}, []) }, [])
const initOrderInfo = async () => { const initOrderInfo = async () => {
...@@ -79,20 +92,40 @@ const Order: React.FC<OrderPropsType> = (props) => { ...@@ -79,20 +92,40 @@ const Order: React.FC<OrderPropsType> = (props) => {
} }
const productId = sessionOrderInfo?.orderList[0]?.orderList[0].id const productId = sessionOrderInfo?.orderList[0]?.orderList[0].id
// 根据商品ID获取工作流信息,判断是否需要签署合同 // 根据商品ID获取工作流信息,判断是否需要签署合同
// if (productId) { if (productId) {
// try { try {
// const rulesRes = await PublicApi.getOrderTradingRulesByProductId({ productId }) const rulesRes = await PublicApi.getOrderTradingRulesByProductId({ productId })
// const { data } = rulesRes const { data } = rulesRes
// if (data) { if (data) {
// // 是否选用电子合同 // 是否选用电子合同
// if (data.isElectronicContract) { if (data.isElectronicContract) {
// setIsElectronicContract(true) setElectronicContractId(data.electronicContractId)
// } if (!!sessionStorage.getItem("contractInfo")) {
// } setContractInfo(JSON.parse(sessionStorage.getItem("contractInfo")))
// } catch (error) { setIsElectronicContract(true)
// console.log("获取交易规则失败") } else {
// } // 根据电子合同模板id获取生成电子合同
// } let param = {
contractTemplateId: data.electronicContractId,
signMemberId: userInfo?.memberId,
orderNo: new Date().getTime()
}
//@ts-ignore
const signRes = await PublicApi.postOrderSignatureSignContractCreate(param)
message.destroy()
const signData: any = signRes.data
if (signRes.code === 1000) {
setContractInfo(signData)
sessionStorage.setItem("contractInfo", JSON.stringify(signData))
setIsElectronicContract(true)
}
}
}
}
} catch (error) {
console.log("获取交易规则失败")
}
}
setOrderList(result) setOrderList(result)
setOrderInfo(sessionOrderInfo) setOrderInfo(sessionOrderInfo)
setSpinningState(false) setSpinningState(false)
...@@ -303,17 +336,54 @@ const Order: React.FC<OrderPropsType> = (props) => { ...@@ -303,17 +336,54 @@ const Order: React.FC<OrderPropsType> = (props) => {
} }
const handleSignModalConfirm = () => { const handleSignModalConfirm = () => {
let param = {
contractTemplateId: electronicContractId,
orderId: new Date().getTime(),
contractName: contractInfo.contractName,
contractUrl: contractInfo.contractUrl,
}
setAgreeSignLoading(true)
// @ts-ignore
PublicApi.postOrderSignatureOrderSettleSign(param).then((res: any) => {
if (res.code === 1000) {
pollingCheckStatus(res.data.signatureLogId)
} else {
setAgreeSignLoading(false)
}
}).catch(() => {
setAgreeSignLoading(false)
})
}
// submitOrder() const pollingCheckStatus = (signatureLogId) => {
let param = {
signatureLogId
}
PublicApi.postOrderSignatureOrderSettleSignDetail(param).then(res => {
let timer = null
if (res.code === 1000) {
if (res.data.state === 4) {
clearTimeout(timer)
setAgreeSignLoading(false)
submitOrder()
} else {
timer = setTimeout(() => {
pollingCheckStatus(signatureLogId)
}, 1500);
}
}
})
} }
return orderInfo && ( return (
<Spin spinning={spinningState}> <Spin spinning={spinningState}>
<div className={styles.order}> <div className={styles.order}>
<CommonHeader <CommonHeader
logoUrl={(layoutType === LAYOUT_TYPE.channel || layoutType === LAYOUT_TYPE.ichannel) ? shopInfo?.logo : mallInfo.logoUrl} logoUrl={(layoutType === LAYOUT_TYPE.channel || layoutType === LAYOUT_TYPE.ichannel) ? shopInfo?.logo : mallInfo.logoUrl}
title="订单结算" title="订单结算"
/> />
{
orderInfo ? (
<div className={styles.order_container}> <div className={styles.order_container}>
{ {
orderInfo.logistics.deliveryType === 1 && ( orderInfo.logistics.deliveryType === 1 && (
...@@ -326,7 +396,7 @@ const Order: React.FC<OrderPropsType> = (props) => { ...@@ -326,7 +396,7 @@ const Order: React.FC<OrderPropsType> = (props) => {
{/* <Delivery /> */} {/* <Delivery /> */}
<Invoice state={needTheInvoice} onChange={(val) => setNeedTheInvoice(val)} onSelect={(val) => setSelectInvoiceInfo(val)} /> <Invoice state={needTheInvoice} onChange={(val) => setNeedTheInvoice(val)} onSelect={(val) => setSelectInvoiceInfo(val)} />
{ {
isElectronicContract && <Contract state={needTheContract} onChange={(val) => setneedTheContract(val)} /> isElectronicContract && <Contract contractInfo={contractInfo} state={needTheContract} onChange={(val) => setneedTheContract(val)} />
} }
<div className={styles.common_title}> <div className={styles.common_title}>
<span>订单信息</span> <span>订单信息</span>
...@@ -411,12 +481,16 @@ const Order: React.FC<OrderPropsType> = (props) => { ...@@ -411,12 +481,16 @@ const Order: React.FC<OrderPropsType> = (props) => {
</div> </div>
</div> </div>
</div> </div>
) : null
}
</div > </div >
<SignModal <SignModal
visible={signModalVisible} visible={signModalVisible}
loading={agreeSingLoading}
onCancel={() => setSignModalVisible(false)} onCancel={() => setSignModalVisible(false)}
onOk={() => handleSignModalConfirm()} onOk={() => handleSignModalConfirm()}
contractUrl="https://shushangyun01.oss-cn-shenzhen.aliyuncs.com/40907bcbf5174713b64df540a7238b4a1600322828098.pdf" contractUrl={contractInfo?.contractUrl}
/> />
</Spin> </Spin>
) )
......
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