2023-02-24 10:15:51 +08:00

242 lines
9.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Text, View } from '@tarojs/components'
import Taro from '@tarojs/taro'
import classnames from 'classnames'
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'
import styles from './index.module.scss'
import { GetAddressListApi } from '@/api/addressList'
import { addressListApi } from '@/api/addressManager'
import { EditSaleOrderAddressApi, EditSaleOrderShipmentModeApi } from '@/api/order'
import { alert, goLink } from '@/common/common'
import { ORDER_STATUS } from '@/common/enum'
import { debounce, throttle } from '@/common/util'
import AddressList from '@/components/AddressList'
import Popup from '@/components/popup'
interface Param {
onSelect?: (val: any) => void // 选择地址
disabled?: false | true // true禁用后只用于展示
onChangeShipmentMode?: (val: number) => void // 返回收货方式
onLogistics?: () => void // 查看物流
status?: 1 | 2 // 1确认订单时使用 2订单流程
orderInfo?: {
id?: number // 订单id
shipment_mode?: 1 | 2 // 1自提 2物流
status?: number // 订单状态
province_name: string
city_name: string
district_name: string
address_detail: string
take_goods_address: string
take_goods_phone: string
target_user_name: string
target_user_phone: string
}
}
// 订单状态
const {
SaleorderstatusWaitingPrePayment,
SaleOrderStatusBooking,
SaleOrderStatusArranging,
SaleOrderStatusArranged,
SaleOrderStatusWaitingPayment,
SaleOrderStatusWaitingReceipt,
SaleOrderStatusAlreadyReceipt,
SaleOrderStatusComplete,
SaleOrderStatusRefund,
SaleOrderStatusCancel,
} = ORDER_STATUS
const AddressInfoDetail = ({ onSelect, onChangeShipmentMode, orderInfo, status = 2, disabled = false, onLogistics }: Param, ref) => {
const [addressInfo, setAddressInfo] = useState<any>()
const { fetchData: addressFetchData } = EditSaleOrderAddressApi()
// 打开地址列表
const [showAddressList, setShowAddressList] = useState(false)
// 收货方法,1:自提2物流
const [receivingStatus, setReceivingStatus] = useState(2)
// 当没有地址时获取地址列表中的第一个数据
const { fetchData: addressListFetchData } = addressListApi()
const getAddressListOne = async() => {
if (orderInfo?.address_detail) { return true }
const res = await addressListFetchData()
if (res.data.list && res.data.list?.length > 0) {
const info = res.data.list[0]
await addressFetchData({ id: orderInfo?.id, address_id: info.id })
setAddressInfo(e => ({ ...e, ...info, target_user_name: info.name, target_user_phone: info.phone }))
return true
}
else {
Taro.showModal({
content: '您还没有地址,请前去新增地址',
success(res) {
if (res.confirm) {
goLink('/pages/addressManager/index')
}
else if (res.cancel) {
console.log('用户点击取消')
}
},
})
return false
}
}
const { fetchData: shipmentModeFetchData } = EditSaleOrderShipmentModeApi()
const changeReceivingStatus = debounce(async(value) => {
if (!orderInfo || value == receivingStatus) { return false }
if (status == 1) {
onChangeShipmentMode?.(value)
setReceivingStatus(value)
return false
}
if (value == 2) {
const res = await getAddressListOne()
if (!res) { return false }
}
alert.loading('正在修改')
const res = await shipmentModeFetchData({ id: orderInfo.id, shipment_mode: value })
if (res.success) {
alert.success('收货方式修改成功')
onChangeShipmentMode?.(value)
setReceivingStatus(() => value)
}
else {
alert.none(res.msg)
}
}, 300)
// 修改地址
const [addressId, setAddressId] = useState(0)
const getAddress = async(value) => {
if (!orderInfo) { return false }
if (status == 1) {
setShowAddressList(() => false)
setAddressId(value.id)
setAddressInfo(e => ({ ...e, ...value, target_user_name: value.name, target_user_phone: value.phone }))
onSelect?.(value)
return false
}
alert.loading('正在修改')
const res = await addressFetchData({ id: orderInfo.id, address_id: value.id })
if (res.success) {
alert.success('地址修改成功')
onSelect?.(value)
setShowAddressList(() => false)
setAddressId(value.id)
setAddressInfo(e => ({ ...e, ...value, target_user_name: value.name, target_user_phone: value.phone }))
}
else {
alert.none(res.msg)
}
}
// 根据订单状态判断是否可修改
const limitEdit = () => {
const res = [
SaleorderstatusWaitingPrePayment.value,
SaleOrderStatusBooking.value,
SaleOrderStatusArranging.value,
SaleOrderStatusArranged.value,
SaleOrderStatusWaitingPayment.value,
].includes(orderInfo?.status as number)
if (!res && status != 1) { alert.none('该订单状态不能修改地址!') }
return status == 1 ? true : res
}
const onReceivingStatus = async(value, e) => {
e.stopPropagation()
if (limitEdit()) { changeReceivingStatus(value) }
}
// 根据订单状态判断是否显示物流
const logisticsShowList = [
SaleOrderStatusWaitingReceipt.value,
SaleOrderStatusAlreadyReceipt.value,
SaleOrderStatusComplete.value,
SaleOrderStatusRefund.value,
]
const logisticsShow = useMemo(() => {
return logisticsShowList.includes(orderInfo?.status as number)
}, [orderInfo])
const changeShow = () => {
if (receivingStatus == 2 && !logisticsShow && limitEdit()) { setShowAddressList(() => true) }
}
// 地址格式
const formatAddress = useMemo(() => {
if (receivingStatus == 2) {
return addressInfo?.address_detail ? addressInfo.province_name + addressInfo.city_name + addressInfo.district_name + addressInfo.address_detail : ''
}
else {
return addressInfo?.take_goods_address
}
}, [receivingStatus, addressInfo])
useEffect(() => {
if (orderInfo) {
setReceivingStatus(() => orderInfo.shipment_mode || 2)
setAddressInfo(() => orderInfo)
}
}, [orderInfo])
// 把内部方法提供给外部
useImperativeHandle(ref, () => ({
changeShow,
}))
return (
<View>
<View className={styles.order_address} onClick={() => changeShow()}>
<View className={classnames(styles.order_address_icon, 'iconfont', receivingStatus == 2 ? 'icon-daohang' : 'icon-fahuo')}></View>
<View className={styles.order_address_text_con}>
<View className={styles.order_address_text_title}>
<Text className={classnames(styles.address_text, styles.address_text_no)}>{formatAddress || '请选择收货地址及信息'}</Text>
{receivingStatus == 2 && !logisticsShow && <Text className={classnames(styles.moreIconfont, 'iconfont icon-a-moreback')}></Text>}
</View>
<View className={styles.order_address_text_name}>
<Text>{receivingStatus == 1 ? '谭先生' : addressInfo?.target_user_name}</Text>
<Text>{receivingStatus == 1 ? addressInfo?.take_goods_phone : addressInfo?.target_user_phone}</Text>
</View>
</View>
{(!logisticsShow && (
<View className={styles.updateBtn}>
<View
className={classnames(styles.updateBtn_item, styles.updateBtn_item_select_update)}
onClick={e => onReceivingStatus(2, e)}
>
</View>
{/* <View className={styles.updateBtn_list}>
<View
className={classnames(styles.updateBtn_item, receivingStatus == 1 && styles.updateBtn_item_select)}
onClick={e => onReceivingStatus(1, e)}
>
自提
</View>
<View
className={classnames(styles.updateBtn_item, receivingStatus == 2 && styles.updateBtn_item_select)}
onClick={e => onReceivingStatus(2, e)}
>
物流
</View>
</View> */}
{/* <View style={{ transform: receivingStatus == 1 ? 'translateX(0)' : 'translateX(100%)' }} className={classnames(styles.updateBtn_select)}></View> */}
</View>
))
|| (orderInfo?.status != SaleOrderStatusRefund.value && (
<View className={styles.logisticsBtn} onClick={onLogistics}>
</View>
))}
</View>
<Popup show={showAddressList} showTitle={false} onClose={() => setShowAddressList(false)}>
<View className={styles.order_address_list}>
<View className={styles.order_address_title}></View>
<View className={styles.addressList_con}>
<AddressList onSelect={getAddress} id={addressId} />
</View>
</View>
</Popup>
</View>
)
}
export default memo(
forwardRef(AddressInfoDetail),
)