商城测试版v8_1

This commit is contained in:
2022-07-30 17:11:42 +08:00
parent e2b0b0c52b
commit 09e34ecabe
39 changed files with 3360 additions and 3274 deletions
@@ -1,220 +1,219 @@
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";
import { Text, View } from "@tarojs/components"
import classnames from "classnames";
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
import Taro from "@tarojs/taro";
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'
import { Text, View } from '@tarojs/components'
import classnames from 'classnames'
import { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'
import Taro from '@tarojs/taro'
import styles from './index.module.scss'
type 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
}
type 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,
SaleorderstatusWaitingPrePayment,
SaleOrderStatusBooking,
SaleOrderStatusArranging,
SaleOrderStatusArranged,
SaleOrderStatusWaitingPayment,
SaleOrderStatusWaitingReceipt,
SaleOrderStatusAlreadyReceipt,
SaleOrderStatusComplete,
SaleOrderStatusRefund,
SaleOrderStatusCancel,
} = ORDER_STATUS
export default memo(forwardRef(({onSelect, onChangeShipmentMode, orderInfo, status = 2, disabled = false, onLogistics}: Param, ref) => {
export default memo(
forwardRef(({ onSelect, onChangeShipmentMode, orderInfo, status = 2, disabled = false, onLogistics }: Param, ref) => {
const [addressInfo, setAddressInfo] = useState<any>()
useEffect(() => {
if(orderInfo) {
setReceivingStatus(() => orderInfo.shipment_mode||2)
setAddressInfo(() => orderInfo)
}
if (orderInfo) {
setReceivingStatus(() => orderInfo.shipment_mode || 2)
setAddressInfo(() => orderInfo)
}
}, [orderInfo])
//打开地址列表
const [showAddressList, setShowAddressList] = useState(false)
const changeShow = () => {
if(receivingStatus == 2 && !logisticsShow && limitEdit())
setShowAddressList(() => true)
if (receivingStatus == 2 && !logisticsShow && limitEdit()) setShowAddressList(() => true)
}
//把内部方法提供给外部
useImperativeHandle(ref, () => ({
changeShow
changeShow,
}))
//收货方法,1:自提,2物流
const [receivingStatus, setReceivingStatus] = useState(2)
const {fetchData: shipmentModeFetchData} = EditSaleOrderShipmentModeApi()
const { fetchData: shipmentModeFetchData } = EditSaleOrderShipmentModeApi()
const onReceivingStatus = async (value, e) => {
e.stopPropagation()
if(limitEdit()) changeReceivingStatus(value)
e.stopPropagation()
if (limitEdit()) changeReceivingStatus(value)
}
//当没有地址时获取地址列表中的第一个数据
const {fetchData: addressListFetchData} = addressListApi()
const { fetchData: addressListFetchData } = addressListApi()
const getAddressListOne = async () => {
if(orderInfo?.address_detail) return true
let res = await addressListFetchData()
if( res.data.list && res.data.list?.length > 0 ) {
let 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: function (res) {
if (res.confirm) {
goLink('/pages/addressManager/index')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
return false
}
if (orderInfo?.address_detail) return true
let res = await addressListFetchData()
if (res.data.list && res.data.list?.length > 0) {
let 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: function (res) {
if (res.confirm) {
goLink('/pages/addressManager/index')
} else if (res.cancel) {
console.log('用户点击取消')
}
},
})
return false
}
}
const changeReceivingStatus = debounce(async (value) => {
if(!orderInfo || value == receivingStatus) return false
if(status == 1) {
onChangeShipmentMode?.(value)
setReceivingStatus(value)
return false
}
if(value == 2) {
let 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)
}
if (!orderInfo || value == receivingStatus) return false
if (status == 1) {
onChangeShipmentMode?.(value)
setReceivingStatus(value)
return false
}
if (value == 2) {
let 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 {fetchData: addressFetchData} = EditSaleOrderAddressApi()
const { fetchData: addressFetchData } = EditSaleOrderAddressApi()
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)
}
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 = () => {
let 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
let 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 logisticsShowList = [SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value]
const logisticsShow = useMemo(() => {
return logisticsShowList.includes(orderInfo?.status as number)
return logisticsShowList.includes(orderInfo?.status as number)
}, [orderInfo])
//地址格式
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
}
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])
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={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>
<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>
<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 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={styles.updateBtn_list}>
<View className={classnames(styles.updateBtn_item, receivingStatus == 1 && styles.updateBtn_item_select)} onClick={(e) => onReceivingStatus(1, e)}>
自提
</View>
</Popup>
<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>
)
}))
}),
)
@@ -1,66 +1,67 @@
.apply_after_sales_con{
padding: 20px;
.returnSaleInput_item{
display: flex;
align-items: center;
padding-bottom: 50px;
flex-wrap: wrap;
.title{
font-size: $font_size;
font-weight: 700;
width: 119px;
}
.select{
flex:1;
height: 60px;
border: 2px solid #e6e6e6;
border-radius: 10px;
margin-left: 20px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
font-size: 26px;
color: $color_font_two;
.miconfont{
font-size: 30px;
}
}
.upload_image{
flex:1;
}
.apply_after_sales_con {
padding: 20px;
.returnSaleInput_item {
display: flex;
align-items: center;
padding-bottom: 50px;
flex-wrap: wrap;
.title {
font-size: $font_size;
font-weight: 700;
width: 119px;
}
.btns_con{
width: 100%;
bottom:0;
box-sizing: border-box;
margin-top: 50px;
.btns_two{
display: flex;
height: 82px;
// border: 1PX solid #007aff;
font-size: $font_size_big;
border-radius: 40px;
margin-bottom: 20px;
.rest_btn{
flex:1;
border: 1PX solid #007aff;
border-radius: 40px 0 0 40px;
text-align: center;
line-height: 82px;
color: $color_main;
background-color: #fff;
}
.verify_btn{
flex:1;
border-radius: 0 40px 40px 0;
background: #007aff;
text-align: center;
line-height: 82px;
color: #fff;
}
}
.select {
flex: 1;
height: 60px;
border: 2px solid #e6e6e6;
border-radius: 10px;
margin-left: 20px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
font-size: 26px;
color: $color_font_two;
.miconfont {
font-size: 30px;
}
.selected {
color: #000;
}
}
}
.upload_image {
flex: 1;
}
}
.btns_con {
width: 100%;
bottom: 0;
box-sizing: border-box;
margin-top: 50px;
.btns_two {
display: flex;
height: 82px;
// border: 1PX solid #007aff;
font-size: $font_size_big;
border-radius: 40px;
margin-bottom: 20px;
.rest_btn {
flex: 1;
border: 1px solid #007aff;
border-radius: 40px 0 0 40px;
text-align: center;
line-height: 82px;
color: $color_main;
background-color: #fff;
}
.verify_btn {
flex: 1;
border-radius: 0 40px 40px 0;
background: #007aff;
text-align: center;
line-height: 82px;
color: #fff;
}
}
}
}
+104 -103
View File
@@ -1,111 +1,112 @@
import Popup from "@/components/popup";
import TextareaEnhance from "@/components/textareaEnhance";
import { ScrollView, Text, View } from "@tarojs/components";
import { memo, useCallback, useEffect, useRef, useState } from "react";
import ReasonPopup from "../reasonPopup";
import styles from './index.module.scss'
import classnames from "classnames";
import { ApplyRefundApi, RefundExplainApi } from "@/api/salesAfterOrder";
import { alert } from "@/common/common";
import Popup from '@/components/popup'
import TextareaEnhance from '@/components/textareaEnhance'
import { ScrollView, Text, View } from '@tarojs/components'
import { memo, useCallback, useEffect, useRef, useState } from 'react'
import ReasonPopup from '../reasonPopup'
import styles from './index.module.scss'
import classnames from 'classnames'
import { ApplyRefundApi, RefundExplainApi } from '@/api/salesAfterOrder'
import { alert } from '@/common/common'
type Param = {
show?: true|false,
onClose?: () => void,
orderId?: number
show?: true | false
onClose?: () => void
orderId?: number
onSuccess?: () => void
}
export default memo(({show, onClose, orderId}:Param) => {
export default memo(({ show, onClose, orderId, onSuccess }: Param) => {
//提交的数据
const submitData = useRef({
return_explain: 0,
sale_order_id: 0,
reason_describe: '',
})
//提交的数据
const submitData = useRef({
useEffect(() => {
if (show && orderId) {
submitData.current.sale_order_id = orderId
refundExplain()
}
}, [orderId, show])
//申请退款
const { fetchData } = ApplyRefundApi()
const getApplyRefund = async () => {
if (!submitData.current.return_explain) return alert.error('请选择说明原因')
let res = await fetchData(submitData.current)
if (res.success) {
alert.success('申请成功')
onSuccess?.()
} else {
alert.error('申请失败')
}
onClose?.()
}
//获取说明数据
const [list, setList] = useState<any[]>([])
const { fetchData: refundExplainFetchdata } = RefundExplainApi()
const refundExplain = async () => {
let res = await refundExplainFetchdata()
setList(() => res.data.list)
}
const [reason, setReason] = useState({ id: 0, name: '' })
const reasonSelect = useCallback((e) => {
setReason({ ...reason, name: e.name, id: e.id })
submitData.current.return_explain = e.id
closeReason()
}, [])
//备注
const getOtherReason = useCallback((val) => {
submitData.current.reason_describe = val
}, [])
//显示说明
const [showReason, setShowReason] = useState(false)
const closeReason = useCallback(() => {
setShowReason(false)
}, [])
//提交
const onSubmit = (val) => {
if (val == 2) {
getApplyRefund()
} else {
onClose?.()
submitData.current = {
return_explain: 0,
sale_order_id: 0,
reason_describe: ''
})
useEffect(() => {
console.log('show&&orderId::', show)
if(show&&orderId) {
submitData.current.sale_order_id = orderId
refundExplain()
}
}, [orderId, show])
//申请退款
const {fetchData} = ApplyRefundApi()
const getApplyRefund = async () => {
if(!submitData.current.return_explain) return alert.error('请选择说明原因')
let res = await fetchData(submitData.current)
if(res.success) {
alert.error('申请成功')
} else {
alert.error('申请失败')
}
onClose?.()
reason_describe: '',
}
}
}
//获取说明数据
const [list, setList] = useState<any[]>([])
const {fetchData: refundExplainFetchdata} = RefundExplainApi()
const refundExplain = async () => {
let res = await refundExplainFetchdata()
setList(() => res.data.list)
}
const [reason, setReason] = useState({id:0, name:''})
const reasonSelect = useCallback((e) => {
setReason({...reason, name:e.name, id:e.id})
submitData.current.return_explain = e.id
closeReason()
}, [])
//备注
const getOtherReason = useCallback((val) => {
submitData.current.reason_describe = val
}, [])
//显示说明
const [showReason, setShowReason] = useState(false)
const closeReason = useCallback(() => {
setShowReason(false)
}, [])
//提交
const onSubmit = (val) => {
if(val == 2) {
getApplyRefund()
} else {
onClose?.()
submitData.current = {
return_explain: 0,
sale_order_id: 0,
reason_describe: ''
}
}
}
return (
<>
<Popup show={show} title="申请退款" onClose={onClose} >
<View className={styles.apply_after_sales_con}>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}>退款说明</View>
<View className={styles.select} onClick={() => setShowReason(true)}>
<Text>{reason.name||'请选择'}</Text>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></Text>
</View>
</View>
<TextareaEnhance onChange={getOtherReason} title='备注' placeholder="请输入退款备注"/>
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onSubmit(1)}>取消</View>
<View className={styles.verify_btn } onClick={() => onSubmit(2)}>确认</View>
</View >
</View>
</View>
</Popup>
<ReasonPopup defaultValue={reason.id} show={showReason} onClose={closeReason} list={list} title="退款说明" onSelect={reasonSelect}/>
</>
)
})
return (
<>
<Popup show={show} title='申请退款' onClose={onClose}>
<View className={styles.apply_after_sales_con}>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}>退款说明</View>
<View className={styles.select} onClick={() => setShowReason(true)}>
<Text className={reason.name ? styles.selected : ''}>{reason.name || '请选择'}</Text>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></Text>
</View>
</View>
<TextareaEnhance onChange={getOtherReason} title='备注' placeholder='请输入退款备注' />
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onSubmit(1)}>
取消
</View>
<View className={styles.verify_btn} onClick={() => onSubmit(2)}>
确认
</View>
</View>
</View>
</View>
</Popup>
<ReasonPopup defaultValue={reason.id} show={showReason} onClose={closeReason} list={list} title='退款说明' onSelect={reasonSelect} />
</>
)
})
+7 -14
View File
@@ -221,6 +221,9 @@ export default () => {
const applyRefundClose = useCallback(() => {
setRefundShow(false)
}, [])
const applyRefundSuccess = useCallback(() => {
getSaleOrderPreView()
}, [])
//查看物流
const getLogistics = useCallback(() => {
@@ -281,17 +284,9 @@ export default () => {
return (
<View className={styles.order_main}>
{(orderDetail?.status != SaleorderstatusWaitingPrePayment.value && <OrderState orderInfo={orderDetail} />) || (
<AdvanceOrderState orderInfo={orderDetail} onRefresh={refresh} />
)}
{(orderDetail?.status != SaleorderstatusWaitingPrePayment.value && <OrderState orderInfo={orderDetail} />) || <AdvanceOrderState orderInfo={orderDetail} onRefresh={refresh} />}
<View>
<AddressInfoDetail
orderInfo={defaultAddress}
onLogistics={getLogistics}
onSelect={getAddress}
onChangeShipmentMode={getShipmentMode}
ref={addressRef}
/>
<AddressInfoDetail orderInfo={defaultAddress} onLogistics={getLogistics} onSelect={getAddress} onChangeShipmentMode={getShipmentMode} ref={addressRef} />
</View>
<KindList order={formatPreViewOrderMemo} />
<View className={styles.order_info}>
@@ -315,9 +310,7 @@ export default () => {
</View>
<View className={styles.order_desc} onClick={descOpen}>
<View className={styles.order_desc_con}>订单备注</View>
{(orderRemark && <View className={styles.order_desc_text}>{orderDetail?.remark}</View>) || (
<View className={styles.order_desc_text_hint}>填写备注</View>
)}
{(orderRemark && <View className={styles.order_desc_text}>{orderDetail?.remark}</View>) || <View className={styles.order_desc_text_hint}>填写备注</View>}
<View className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></View>
</View>
{orderDetail?.status != SaleOrderStatusCancel.value && (
@@ -331,7 +324,7 @@ export default () => {
</Popup>
<Payment onSubmitSuccess={onPaySuccess} show={payMentShow} onClose={closePayShow} orderInfo={orderDetail} />
<ScanPayCheck show={showScanPayCheck} onClose={() => setShowScanPayCheck(false)} orderInfo={orderDetail} />
<ApplyRefund show={refundShow} onClose={applyRefundClose} orderId={orderDetail?.id} />
<ApplyRefund show={refundShow} onSuccess={applyRefundSuccess} onClose={applyRefundClose} orderId={orderDetail?.id} />
<ShopCart intoStatus='again' show={showCart} onClose={() => setShowCart(false)} />
<ReturnRecord show={returnRecordShow} onClose={closeReturnRecord} id={orderDetail?.id} />
<View className='common_safe_area_y'></View>
@@ -1,146 +1,163 @@
import { goLink } from "@/common/common";
import { ORDER_STATUS } from "@/common/enum";
import { formatHashTag, formatImgUrl, formatPriceDiv } from "@/common/fotmat";
import LabAndImg from "@/components/LabAndImg";
import OrderBtns from "@/components/orderBtns";
import Payment from "@/pages/order/components/payment";
import { useSelector } from "@/reducers/hooks";
import { Image, Text, View } from "@tarojs/components"
import { useRouter } from "@tarojs/taro";
import classnames from "classnames";
import { memo, useCallback, useMemo, useRef, useState } from "react";
import styles from './index.module.scss'
import { goLink } from '@/common/common'
import { ORDER_STATUS } from '@/common/enum'
import { formatHashTag, formatImgUrl, formatPriceDiv } from '@/common/fotmat'
import LabAndImg from '@/components/LabAndImg'
import OrderBtns from '@/components/orderBtns'
import Payment from '@/pages/order/components/payment'
import { useSelector } from '@/reducers/hooks'
import { Image, Text, View } from '@tarojs/components'
import { useRouter } from '@tarojs/taro'
import classnames from 'classnames'
import { memo, useCallback, useMemo, useRef, useState } from 'react'
import styles from './index.module.scss'
type Param = {
value: {
order_no: string,
sale_mode: number,
sale_mode_name: string,
status_name: string,
shipment_mode: number,
shipment_mode_name: string,
product_list: any[],
total_fabrics: number,
total_colors: number,
total_number: number,
status: 0,
id: number,
lab: any,
rgb: any,
texture_url: string,
payment_method: number, //支付方式
actual_amount: number, //实付金额
wait_pay_amount: number, //待付金额
should_collect_order_id: number, //应付单id
av_return_roll: number,
total_sale_price: number,
estimate_amount: number,
is_return: true|false
},
onClickBtn?: (val:{status:number, orderInfo:Param['value']}) => void
value: {
order_no: string
sale_mode: number
sale_mode_name: string
status_name: string
shipment_mode: number
shipment_mode_name: string
product_list: any[]
total_fabrics: number
total_colors: number
total_number: number
status: 0
id: number
lab: any
rgb: any
texture_url: string
payment_method: number //支付方式
actual_amount: number //实付金额
wait_pay_amount: number //待付金额
should_collect_order_id: number //应付单id
av_return_roll: number
total_sale_price: number
estimate_amount: number
is_return: true | false
}
onClickBtn?: (val: { status: number; orderInfo: Param['value'] }) => void
}
export default memo(({value, onClickBtn}: Param) => {
export default memo(({ value, onClickBtn }: Param) => {
const userInfo = useSelector((state) => state.userInfo)
//对应数量
const formatCount = useCallback(
(item, sale_mode) => {
return sale_mode == 0 ? item.roll : Number(item.length / 100)
},
[value],
)
//对应单价
const standardPrice = useCallback(
(price, sale_mode) => {
return '¥' + formatPriceDiv(price).toLocaleString() + '/' + (sale_mode == 1 ? 'm' : 'kg')
},
[value],
)
const userInfo = useSelector(state => state.userInfo)
//对应数量
const formatCount = useCallback((item, sale_mode) => {
return sale_mode == 0? item.roll : Number(item.length / 100)
}, [value])
//对应单价
const standardPrice = useCallback((price, sale_mode) => {
return '¥' + formatPriceDiv(price).toLocaleString() + '/' + (sale_mode == 1?'m':'kg')
}, [value])
//点击订单按钮
const orderBtnsClick = useCallback(
(status) => {
onClickBtn?.({ status, orderInfo: value })
},
[value],
)
//点击订单按钮
const orderBtnsClick = useCallback((status) => {
onClickBtn?.({status, orderInfo:value})
}, [value])
let { SaleOrderStatusTaking, SaleOrderStatusWaitingReceipt } = ORDER_STATUS
let {SaleOrderStatusTaking, SaleOrderStatusWaitingReceipt} = ORDER_STATUS
//订单状态
// const orderStatus = useCallback((item) => {
// return item.status == SaleOrderStatusTaking.value?'装车中':item.status_name
// }, [value])
//订单状态
// const orderStatus = useCallback((item) => {
// return item.status == SaleOrderStatusTaking.value?'装车中':item.status_name
// }, [value])
//按钮所需数据
const orderInfo = useMemo(() => {
return {
orderId: value?.id,
...value,
}
}, [value])
//按钮所需数据
const orderInfo = useMemo(() => {
return {
orderId: value?.id,
...value
}
}, [value])
//总条数
const numText = useMemo(() => {
let total_number_new = value?.sale_mode == 0 ? value?.total_number : value?.total_number / 100
return `${value?.total_fabrics} 种面料,${value?.total_colors} 种颜色,共 ${total_number_new}${value?.sale_mode == 0 ? ' 条' : ' 米'}`
}, [value])
//总条数
const numText = useMemo(() => {
let total_number_new = value?.sale_mode == 0? value?.total_number:(value?.total_number/100)
return `${value?.total_fabrics} 种面料,${value?.total_colors} 种颜色,共 ${total_number_new}${value?.sale_mode == 0? ' 条':' 米'}`
}, [value])
//订单状态
const orderStatus = useMemo(() => {
if (value.status == SaleOrderStatusWaitingReceipt.value && value.shipment_mode == 1) {
return '待提货'
} else {
return value?.status_name
}
}, [value])
//订单状态
const orderStatus = useMemo(() => {
if(value.status == SaleOrderStatusWaitingReceipt.value && value.shipment_mode == 1) {
return '待提货'
} else {
return value?.status_name
}
}, [value])
return (
<View className={styles.order_item}>
<View className={styles.header} onClick={() => goLink('/pages/order/index', {id: value?.id})}>
<View className={styles.user}>
<Image src={`${userInfo?.adminUserInfo?.avatar_url}`}/>
</View>
<View className={styles.order_con}>
<Text className={styles.name}>{userInfo?.adminUserInfo?.user_name}</Text>
<View className={styles.order_num}>
<View className={styles.order_num_con}>
<Text className={styles.order_no}>订单号:{value?.order_no}</Text>
<Text className={classnames(styles.miconfont, 'iconfont, icon-a-moreback')}></Text>
</View>
<View className={styles.product_status}>{orderStatus}</View>
</View>
</View>
</View>
<View className={styles.product_con} onClick={() => goLink('/pages/order/index', {id: value?.id})}>
<View className={styles.product_title}>
<View className={styles.product_tag}>{value?.sale_mode_name}</View>
<View className={styles.product_name}>{formatHashTag(value?.product_list?.[0].code, value?.product_list?.[0].name)}</View>
<View className={styles.tag}>{value?.shipment_mode_name}</View>
</View>
<View className={styles.product_list}>
<View className={styles.image}>
<LabAndImg value={{lab:value.lab,rgb:value.rgb,texture_url:value.texture_url}}/>
<View className={styles.color_num}>{value?.product_list?.[0].product_colors?.[0].code}</View>
</View>
<View className={styles.color_list}>
{value?.product_list?.[0].product_colors.map((itemColor, index) => {
return (
(index <= 1)&&<View className={styles.color_item}>
<View className={styles.color_title}>{formatHashTag(itemColor.code, itemColor.name)}</View>
<View className={styles.color_price}>{standardPrice(itemColor.sale_price, value.sale_mode)}</View>
<View className={styles.color_num}>×{formatCount(itemColor, value.sale_mode) + (value.sale_mode == 0?' 条':' 米')}</View>
</View>
)
})
}
{value?.product_list?.[0].length > 2 && <View className={styles.color_item}>
<View className={styles.color_more}>……</View>
<View className={styles.color_more}>……</View>
<View className={styles.color_more}>……</View>
</View>}
</View>
</View>
<View className={styles.color_count_num}>
<Text>{numText}</Text>
<Text className={styles.price}><Text>¥</Text>{value.total_sale_price?formatPriceDiv(value.total_sale_price, 100, true):formatPriceDiv(value.estimate_amount, 100, true)}</Text>
</View>
</View>
<OrderBtns orderInfo={orderInfo} onClick={orderBtnsClick} showStatus='list'/>
return (
<View className={styles.order_item}>
<View className={styles.header} onClick={() => goLink('/pages/order/index', { id: value?.id })}>
<View className={styles.user}>
<Image src={`${userInfo?.adminUserInfo?.avatar_url}`} />
</View>
)
<View className={styles.order_con}>
<Text className={styles.name}>{userInfo?.adminUserInfo?.user_name}</Text>
<View className={styles.order_num}>
<View className={styles.order_num_con}>
<Text className={styles.order_no}>订单号:{value?.order_no}</Text>
<Text className={classnames(styles.miconfont, 'iconfont, icon-a-moreback')}></Text>
</View>
<View className={styles.product_status}>{orderStatus}</View>
</View>
</View>
</View>
<View className={styles.product_con} onClick={() => goLink('/pages/order/index', { id: value?.id })}>
<View className={styles.product_title}>
<View className={styles.product_tag}>{value?.sale_mode_name}</View>
<View className={styles.product_name}>{formatHashTag(value?.product_list?.[0].code, value?.product_list?.[0].name)}</View>
<View className={styles.tag}>{value?.shipment_mode_name}</View>
</View>
<View className={styles.product_list}>
<View className={styles.image}>
<LabAndImg
value={{
lab: value?.product_list?.[0].product_colors?.[0].lab,
rgb: value?.product_list?.[0].product_colors?.[0].rgb,
texture_url: value?.product_list?.[0].product_colors?.[0].texture_url,
}}
/>
<View className={styles.color_num}>{value?.product_list?.[0].product_colors?.[0].code}</View>
</View>
<View className={styles.color_list}>
{value?.product_list?.[0].product_colors.map((itemColor, index) => {
return (
index <= 1 && (
<View className={styles.color_item}>
<View className={styles.color_title}>{formatHashTag(itemColor.code, itemColor.name)}</View>
<View className={styles.color_price}>{standardPrice(itemColor.sale_price, value.sale_mode)}</View>
<View className={styles.color_num}>×{formatCount(itemColor, value.sale_mode) + (value.sale_mode == 0 ? ' 条' : ' 米')}</View>
</View>
)
)
})}
{value?.product_list?.[0].length > 2 && (
<View className={styles.color_item}>
<View className={styles.color_more}>……</View>
<View className={styles.color_more}>……</View>
<View className={styles.color_more}>……</View>
</View>
)}
</View>
</View>
<View className={styles.color_count_num}>
<Text>{numText}</Text>
<Text className={styles.price}>
<Text>¥</Text>
{value.total_sale_price ? formatPriceDiv(value.total_sale_price, 100, true) : formatPriceDiv(value.estimate_amount, 100, true)}
</Text>
</View>
</View>
<OrderBtns orderInfo={orderInfo} onClick={orderBtnsClick} showStatus='list' />
</View>
)
})
+4 -2
View File
@@ -181,6 +181,9 @@ export default () => {
const applyRefundClose = useCallback(() => {
setRefundShow(false)
}, [])
const applyRefundSuccess = useCallback(() => {
getOrderList()
}, [])
//显示售后记录
const [returnRecordShow, setReturnRecordShow] = useState(false)
@@ -210,14 +213,13 @@ export default () => {
{orderData?.list?.map((item) => {
return (
<View key={item.id} className={styles.order_item_con}>
{' '}
<Order value={item} onClickBtn={clickOrderBtn} />
</View>
)
})}
</InfiniteScroll>
</View>
<ApplyRefund show={refundShow} onClose={applyRefundClose} orderId={callBackOrderInfo?.id} />
<ApplyRefund show={refundShow} onClose={applyRefundClose} onSuccess={applyRefundSuccess} orderId={callBackOrderInfo?.id} />
<ShopCart intoStatus='again' show={showCart} onClose={() => setShowCart(false)} default_sale_mode={callBackOrderInfo?.sale_mode} />
<ReturnRecord show={returnRecordShow} onClose={closeReturnRecord} id={callBackOrderInfo?.id} />
<Payment onSubmitSuccess={onPaySuccess} show={payMentShow} onClose={closePayShow} orderInfo={callBackOrderInfo} />
@@ -1,84 +1,81 @@
import { AFTER_ORDER_STATUS, REFUND_STATUS_ORDER } from "@/common/enum";
import { Text, View } from "@tarojs/components"
import classnames from "classnames";
import {memo, useMemo} from "react";
import styles from './index.module.scss'
import { AFTER_ORDER_STATUS, REFUND_STATUS_ORDER } from '@/common/enum'
import { Text, View } from '@tarojs/components'
import classnames from 'classnames'
import { memo, useMemo } from 'react'
import styles from './index.module.scss'
type Param = {
onLogistics?: (val: 1|2) => void, //1 上传物流 2 查看物流
orderInfo: {
return_user_name?:string,
return_user_phone?: string,
stage?: number,
sale_mode?: 0|1|2, //0 大货 1剪板 2散剪
type?: number, //申请单退款状态
}
onLogistics?: (val: 1 | 2) => void //1 上传物流 2 查看物流
orderInfo: {
return_user_name?: string
return_user_phone?: string
stage?: number
sale_mode?: 0 | 1 | 2 //0 大货 1剪板 2散剪
type?: number //申请单退款状态
return_address?: string
}
}
export default memo(({orderInfo, onLogistics}:Param) => {
const {
ReturnStageApplying,
ReturnStageWaitCheck,
ReturnStageChecked,
ReturnStageReturned,
ReturnStageCancel,
ReturnStageQualityCheckPendingRefund,
ReturnStageServiceOrderPendingRefund,
ReturnStageRejected
} = AFTER_ORDER_STATUS
export default memo(({ orderInfo, onLogistics }: Param) => {
const {
ReturnStageApplying,
ReturnStageWaitCheck,
ReturnStageChecked,
ReturnStageReturned,
ReturnStageCancel,
ReturnStageQualityCheckPendingRefund,
ReturnStageServiceOrderPendingRefund,
ReturnStageRejected,
} = AFTER_ORDER_STATUS
const {
ReturnApplyOrderTypeAdvanceReceiptRefund, // 预收退款
ReturnApplyOrderTypeReturnForRefund, // 退货退款
ReturnApplyOrderTypeSalesRefund, // 销售退款
} = REFUND_STATUS_ORDER
const {
ReturnApplyOrderTypeAdvanceReceiptRefund, // 预收退款
ReturnApplyOrderTypeReturnForRefund, // 退货退款
ReturnApplyOrderTypeSalesRefund, // 销售退款
} = REFUND_STATUS_ORDER
//是否显示地址
const showAddress = useMemo(() => {
let after_list = [
ReturnStageApplying.value,
ReturnStageCancel.value,
ReturnStageRejected.value
]
let refurn_list = [
ReturnApplyOrderTypeSalesRefund.value,
ReturnApplyOrderTypeAdvanceReceiptRefund.value
]
return (!after_list.includes(orderInfo?.stage!)) && (orderInfo?.sale_mode != 1) && (!refurn_list.includes(orderInfo?.type!))
}, [orderInfo])
//是否显示地址
const showAddress = useMemo(() => {
let after_list = [ReturnStageApplying.value, ReturnStageCancel.value, ReturnStageRejected.value]
let refurn_list = [ReturnApplyOrderTypeSalesRefund.value, ReturnApplyOrderTypeAdvanceReceiptRefund.value]
return !after_list.includes(orderInfo?.stage!) && orderInfo?.sale_mode != 1 && !refurn_list.includes(orderInfo?.type!)
}, [orderInfo])
//上传物流
const upLogistics = useMemo(() => {
return orderInfo?.stage == ReturnStageWaitCheck.value
}, [orderInfo])
//上传物流
const upLogistics = useMemo(() => {
return orderInfo?.stage == ReturnStageWaitCheck.value
}, [orderInfo])
return (
<>
{showAddress&&<View className={styles.address_main}>
<View className={styles.address_title_tag}>
<Text className={classnames(styles.miconfont, 'iconfont icon-zhuyi')}></Text>
请按以下退货地址寄回货物并提供退货物流信息
</View>
<View className={styles.order_address} >
<View className={classnames(styles.order_address_icon, 'iconfont','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)}>{orderInfo?.return_user_name}</Text>
</View>
<View className={styles.order_address_text_name}>
<Text>管理员</Text>
<Text>{orderInfo?.return_user_phone}</Text>
{upLogistics&&<View className={styles.updateBtn} onClick={() => onLogistics?.(1)}>
上传物流
</View>
||<View className={styles.updateBtn} onClick={() => onLogistics?.(2)}>
查看物流
</View>}
</View>
</View>
</View>
</View>}
</>
)
})
return (
<>
{showAddress && (
<View className={styles.address_main}>
<View className={styles.address_title_tag}>
<Text className={classnames(styles.miconfont, 'iconfont icon-zhuyi')}></Text>
请按以下退货地址寄回货物并提供退货物流信息
</View>
<View className={styles.order_address}>
<View className={classnames(styles.order_address_icon, 'iconfont', '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)}>{orderInfo?.return_address}</Text>
</View>
<View className={styles.order_address_text_name}>
<Text>谭先生</Text>
<Text>{orderInfo?.return_user_phone}</Text>
{(upLogistics && (
<View className={styles.updateBtn} onClick={() => onLogistics?.(1)}>
上传物流
</View>
)) || (
<View className={styles.updateBtn} onClick={() => onLogistics?.(2)}>
查看物流
</View>
)}
</View>
</View>
</View>
</View>
)}
</>
)
})
@@ -1,136 +1,148 @@
import { SaleOrderOrderDetailApi } from "@/api/salesAfterOrder";
import { formatHashTag, formatPriceDiv, formatWeightDiv } from "@/common/fotmat";
import LabAndImg from "@/components/LabAndImg";
import Popup from "@/components/popup";
import { ScrollView, Text, View } from "@tarojs/components";
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import Taro from "@tarojs/taro";
import styles from './index.module.scss'
import { SaleOrderOrderDetailApi } from '@/api/salesAfterOrder'
import { formatHashTag, formatPriceDiv, formatWeightDiv } from '@/common/fotmat'
import LabAndImg from '@/components/LabAndImg'
import Popup from '@/components/popup'
import { ScrollView, Text, View } from '@tarojs/components'
import { memo, useCallback, useEffect, useMemo, useState } from 'react'
import Taro from '@tarojs/taro'
import styles from './index.module.scss'
type Param = {
show?: true|false,
onClose?: () => void,
onSubmit?: () => void,
id?: number
show?: true | false
onClose?: () => void
onSubmit?: () => void
id?: number
}
export default memo(({show, onClose, onSubmit, id}:Param) => {
useEffect(() => {
if(show && id) getSaleOrderPreView()
if(!show) setFormatDetailOrder(() => null)
}, [show, id])
export default memo(({ show, onClose, onSubmit, id }: Param) => {
useEffect(() => {
if (show && id) getSaleOrderPreView()
if (!show) setFormatDetailOrder(() => null)
}, [show, id])
//获取订单详情
const [orderDetail, setOrderDetail] = useState<any>(null) //获取到的原始数据
const {fetchData: saleOrderOrderDetailData} = SaleOrderOrderDetailApi()
const getSaleOrderPreView = async () => {
if(id) {
let res = await saleOrderOrderDetailData({id: id})
setOrderDetail(res.data)
}
Taro.stopPullDownRefresh()
//获取订单详情
const [orderDetail, setOrderDetail] = useState<any>(null) //获取到的原始数据
const { fetchData: saleOrderOrderDetailData } = SaleOrderOrderDetailApi()
const getSaleOrderPreView = async () => {
if (id) {
let res = await saleOrderOrderDetailData({ id: id })
setOrderDetail(res.data)
}
//格式化数据格式
const [formatDetailOrder, setFormatDetailOrder] = useState<any>() //格式化后的数据
const formatData = () => {
setFormatDetailOrder({
estimate_amount: orderDetail.estimate_amount, //预估金额
sale_mode: orderDetail.sale_mode,
sale_mode_name: orderDetail.sale_mode_name,
total_colors: orderDetail.total_colors, //总颜色数量
total_number: orderDetail.total_number, //总数量
total_fabrics: orderDetail.total_fabrics, //面料数量
unit: orderDetail.sale_mode == 0?'条':'m', //单位
list: orderDetail.product_list,
stage: orderDetail.stage, //订单状态
type: orderDetail.type, //退货or退款
total_sale_price: orderDetail.total_sale_price, //销售金额
total_should_collect_money: orderDetail.total_should_collect_money, //应收金额
total_weight_error_discount: orderDetail.total_weight_error_discount, //空差优惠
actual_amount: orderDetail.actual_amount, //实付金额
the_previous_status: orderDetail.the_previous_status, //取消订单时的订单状态
})
Taro.stopPullDownRefresh()
}
//格式化数据格式
const [formatDetailOrder, setFormatDetailOrder] = useState<any>() //格式化后的数据
const formatData = () => {
setFormatDetailOrder({
estimate_amount: orderDetail.estimate_amount, //预估金额
sale_mode: orderDetail.sale_mode,
sale_mode_name: orderDetail.sale_mode_name,
total_colors: orderDetail.total_colors, //总颜色数量
total_number: orderDetail.total_number, //总数量
total_fabrics: orderDetail.total_fabrics, //面料数量
unit: orderDetail.sale_mode == 0 ? '条' : 'm', //单位
list: orderDetail.product_list,
stage: orderDetail.stage, //订单状态
type: orderDetail.type, //退货or退款
total_sale_price: orderDetail.total_sale_price, //销售金额
total_should_collect_money: orderDetail.total_should_collect_money, //应收金额
total_weight_error_discount: orderDetail.total_weight_error_discount, //空差优惠
actual_amount: orderDetail.actual_amount, //实付金额
the_previous_status: orderDetail.the_previous_status, //取消订单时的订单状态
})
}
//监听获取到的数据
useEffect(() => {
if (orderDetail) formatData()
}, [orderDetail])
//对应数量
const formatCount = useCallback(
(item) => {
return formatDetailOrder?.sale_mode == 0 ? item.roll : Number(item.length / 100)
},
[formatDetailOrder],
)
//对应单价
const standardPrice = useCallback(
(price) => {
return formatPriceDiv(price).toLocaleString() + '/' + (formatDetailOrder?.sale_mode == 1 ? 'm' : 'kg')
},
[formatDetailOrder],
)
//数量格式
const numText = useMemo(() => {
if (formatDetailOrder) {
let tatal_number = formatDetailOrder?.sale_mode == 0 ? formatDetailOrder?.total_number : formatDetailOrder?.total_number / 100
return `${formatDetailOrder?.total_fabrics} 种面料,${formatDetailOrder?.total_colors} 种颜色,共 ${tatal_number} ${formatDetailOrder?.unit}`
}
}, [formatDetailOrder])
//监听获取到的数据
useEffect(() => {
if(orderDetail)
formatData()
}, [orderDetail])
//整理颜色
const labAndRgbAndUrl = useCallback((item) => {
return { lab: { ...item?.lab }, rgb: { ...item?.rgb }, texturl_url: item?.texturl_url }
}, [])
//对应数量
const formatCount = useCallback((item) => {
return formatDetailOrder?.sale_mode == 0? item.roll : Number(item.length / 100)
}, [formatDetailOrder])
//对应单价
const standardPrice = useCallback(price => {
return formatPriceDiv(price).toLocaleString() + '/' + (formatDetailOrder?.sale_mode == 1?'m':'kg')
}, [formatDetailOrder])
//数量格式
const numText = useMemo(() => {
if(formatDetailOrder) {
let tatal_number = formatDetailOrder?.sale_mode == 0?formatDetailOrder?.total_number:formatDetailOrder?.total_number/100
return `${formatDetailOrder?.total_fabrics} 种面料,${formatDetailOrder?.total_colors} 种颜色,共 ${tatal_number}${formatDetailOrder?.unit}`
}
}, [formatDetailOrder])
//整理颜色
const labAndRgbAndUrl = useCallback((item) => {
return {lab:{...item?.lab}, rgb:{...item?.rgb}, texturl_url: item?.texturl_url}
}, [])
return (
<>
<Popup show={show} title="申请记录" onClose={onClose}>
<View className={styles.apply_record_main}>
{formatDetailOrder&&<>
<View className={styles.kind_number}><Text>{numText}</Text></View>
<ScrollView scrollY className={styles.apply_record_scroll}>
<View className={styles.orders_list_con}>
{
formatDetailOrder?.list?.map(item => {
return <View key={item.product_code} className={styles.order_list}>
<View className={styles.order_list_title}>
<View className={styles.tag}>{formatDetailOrder.sale_mode_name}</View>
<View className={styles.title}>{formatHashTag(item.code, item.name)}</View>
<View className={styles.num}>共{item?.product_colors.length}种</View>
</View>
<View className={styles.order_list_scroll}>
{item?.product_colors?.map(colorItem => {
return <View key={colorItem.id} className={styles.order_list_item}>
<View className={styles.order_list_item_img}>
<LabAndImg value={labAndRgbAndUrl(colorItem)}/>
</View>
<View className={styles.order_list_item_con}>
<View className={styles.order_list_item_des}>
<View className={styles.order_list_item_title}>{colorItem.code + ' ' + colorItem.name}</View>
<View className={styles.order_list_item_price}>
<Text>¥{standardPrice(colorItem.sale_price)}</Text>
<Text>总重{formatWeightDiv(colorItem.estimate_weight)}kg</Text>
</View>
</View>
<View className={styles.order_list_item_count}>
<View className={styles.count_num}>×{formatCount(colorItem)}<text>{formatDetailOrder.unit}</text></View>
<View className={styles.count_price}><text>¥</text>{formatPriceDiv(colorItem.estimate_amount, 100, true)}</View>
</View>
</View>
</View>
})}
</View>
</View>
})
}
{/* <View className={styles.order_total}>
<Text>申请数量</Text>
<Text>×{orderDetail?.total_number}</Text>
</View> */}
</View>
</ScrollView>
</>}
return (
<>
<Popup show={show} title='申请记录' onClose={onClose}>
<View className={styles.apply_record_main}>
{formatDetailOrder && (
<>
<View className={styles.kind_number}>
<Text>{numText}</Text>
</View>
<ScrollView scrollY className={styles.apply_record_scroll}>
<View className={styles.orders_list_con}>
{formatDetailOrder?.list?.map((item) => {
return (
<View key={item.product_code} className={styles.order_list}>
<View className={styles.order_list_title}>
<View className={styles.tag}>{formatDetailOrder.sale_mode_name}</View>
<View className={styles.title}>{formatHashTag(item.code, item.name)}</View>
<View className={styles.num}>共{item?.product_colors.length}种</View>
</View>
<View className={styles.order_list_scroll}>
{item?.product_colors?.map((colorItem) => {
return (
<View key={colorItem.id} className={styles.order_list_item}>
<View className={styles.order_list_item_img}>
<LabAndImg value={labAndRgbAndUrl(colorItem)} />
</View>
<View className={styles.order_list_item_con}>
<View className={styles.order_list_item_des}>
<View className={styles.order_list_item_title}>{colorItem.code + ' ' + colorItem.name}</View>
<View className={styles.order_list_item_price}>
<Text>¥{standardPrice(colorItem.sale_price)}</Text>
<Text>总重{formatWeightDiv(colorItem.estimate_weight)}kg</Text>
</View>
</View>
<View className={styles.order_list_item_count}>
<View className={styles.count_num}>
×{formatCount(colorItem)}
<text>{formatDetailOrder.unit}</text>
</View>
<View className={styles.count_price}>
<text>¥</text>
{formatPriceDiv(colorItem.estimate_amount, 100, true)}
</View>
</View>
</View>
</View>
)
})}
</View>
</View>
)
})}
</View>
</Popup>
</>
)
})
</ScrollView>
</>
)}
</View>
</Popup>
</>
)
})
@@ -1,74 +1,78 @@
import Popup from "@/components/popup";
import { Text, View } from "@tarojs/components";
import { memo, useCallback, useEffect, useRef, useState } from "react";
import UploadImage from "@/components/uploadImage"
import styles from './index.module.scss'
import TextareaEnhance from "@/components/textareaEnhance";
import { ReturnApplyLogisticsApi } from "@/api/salesAfterOrder";
import { alert } from "@/common/common";
import Popup from '@/components/popup'
import { Text, View } from '@tarojs/components'
import { memo, useCallback, useEffect, useRef, useState } from 'react'
import UploadImage from '@/components/uploadImage'
import styles from './index.module.scss'
import TextareaEnhance from '@/components/textareaEnhance'
import { ReturnApplyLogisticsApi } from '@/api/salesAfterOrder'
import { alert } from '@/common/common'
type Param = {
show?: true|false,
onClose?: () => void,
onSubmit?: () => void,
id?: number, //订单id
images: string[], //图片列表
descValue?: string, //描述
onlyRead?: false|true //true 只读
show?: true | false
onClose?: () => void
onSubmit?: () => void
id?: number //订单id
images: string[] //图片列表
descValue?: string //描述
onlyRead?: false | true //true 只读
}
export default memo(({show = false, onClose, onSubmit, id = 0, images = [], descValue = '', onlyRead = false}: Param) => {
//需要提交的数据
const submitData = useRef({
accessory_url: [],
remark: '',
id: 0
})
useEffect(() => {
if(id) submitData.current.id = id
}, [id])
export default memo(({ show = false, onClose, onSubmit, id = 0, images = [], descValue = '', onlyRead = false }: Param) => {
//需要提交的数据
const submitData = useRef({
accessory_url: [],
remark: '',
id: 0,
})
useEffect(() => {
if (id) submitData.current.id = id
}, [id])
//获取图片列表
const getImageList = useCallback((list) => {
submitData.current.accessory_url = list
}, [])
//获取图片列表
const getImageList = useCallback((list) => {
submitData.current.accessory_url = list
}, [])
//备注
const getOtherReason = useCallback((val) => {
submitData.current.remark = val
}, [])
//备注
const getOtherReason = useCallback((val) => {
submitData.current.remark = val
}, [])
//确定
const {fetchData} = ReturnApplyLogisticsApi()
const onSubmitEven = async () => {
if(!id) return alert.error('参数有误')
if(submitData.current.accessory_url.length <= 0) return alert.error('请上传附件')
let res = await fetchData(submitData.current)
if(res.success) {
alert.success('上传成功')
} else {
alert.error('上传失败')
}
onSubmit?.()
//确定
const { fetchData } = ReturnApplyLogisticsApi()
const onSubmitEven = async () => {
if (!id) return alert.error('参数有误')
if (submitData.current.accessory_url.length <= 0) return alert.error('请上传附件')
let res = await fetchData(submitData.current)
if (res.success) {
alert.success('上传成功')
} else {
alert.error('上传失败')
}
onSubmit?.()
}
return (
<>
<Popup show={show} title={onlyRead?'查看物流':"上传物流"} onClose={onClose}>
<View className={styles.logistics_main}>
<View className={styles.logistics_image}>
<Text className={styles.title_desc}>上传附件:</Text>
<View className={styles.upload_image}>
<UploadImage onChange={getImageList} defaultList={images} onlyRead={onlyRead}/>
</View>
</View>
<View className={styles.logistics_desc}>
<TextareaEnhance defaultValue={descValue} onChange={getOtherReason} title="备注:" onlyRead={onlyRead} placeholder="请输入备注信息"/>
</View>
{!onlyRead&&<View className={styles.btns_two}>
<View className={styles.verify_btn } onClick={() => onSubmitEven()}>保存</View>
</View >}
</View>
</Popup>
</>
)
})
return (
<>
<Popup show={show} title={onlyRead ? '查看物流' : '上传物流'} onClose={onClose}>
<View className={styles.logistics_main}>
<View className={styles.logistics_image}>
<Text className={styles.title_desc}>上传附件:</Text>
<View className={styles.upload_image}>
<UploadImage onChange={getImageList} defaultList={images} onlyRead={onlyRead} />
</View>
</View>
<View className={styles.logistics_desc}>
<TextareaEnhance defaultValue={descValue} onChange={getOtherReason} title='备注:' onlyRead={onlyRead} placeholder='请输入备注信息' />
</View>
{!onlyRead && (
<View className={styles.btns_two}>
<View className={styles.verify_btn} onClick={() => onSubmitEven()}>
保存
</View>
</View>
)}
</View>
</Popup>
</>
)
})
+195 -184
View File
@@ -1,193 +1,204 @@
import { SaleOrderOrderDetailApi } from '@/api/salesAfterOrder'
import { AFTER_ORDER_STATUS, ORDER_STATUS } from '@/common/enum'
import { formatDateTime, formatImgUrl, formatPriceDiv } from '@/common/fotmat'
import AfterOrderBtns from '@/components/afterOrderBtns'
import SearchInput from '@/components/searchInput'
import useLogin from '@/use/useLogin'
import { Image, Text, Textarea, View } from '@tarojs/components'
import Taro, { useDidShow, usePullDownRefresh, useRouter } from '@tarojs/taro'
import classnames from 'classnames'
import { useCallback, useEffect, useMemo, useRef, useState, memo } from 'react'
import AddressInfoDetail from './components/addressInfoDetail'
import ApplyRecord from './components/applyRecord'
import ContentBox from './components/contentBox'
import KindList from './components/kindList'
import OrderState from './components/orderState'
import ReturnLogistics from './components/returnLogistics'
import styles from './index.module.scss'
import { SaleOrderOrderDetailApi } from "@/api/salesAfterOrder";
import { AFTER_ORDER_STATUS, ORDER_STATUS } from "@/common/enum";
import { formatDateTime, formatImgUrl, formatPriceDiv } from "@/common/fotmat";
import AfterOrderBtns from "@/components/afterOrderBtns";
import SearchInput from "@/components/searchInput";
import useLogin from "@/use/useLogin";
import { Image, Text, Textarea, View } from "@tarojs/components"
import Taro, {useDidShow, usePullDownRefresh, useRouter } from "@tarojs/taro";
import classnames from "classnames";
import { useCallback, useEffect, useMemo, useRef, useState, memo } from "react";
import AddressInfoDetail from "./components/addressInfoDetail";
import ApplyRecord from "./components/applyRecord";
import ContentBox from "./components/contentBox";
import KindList from "./components/kindList";
import OrderState from "./components/orderState";
import ReturnLogistics from "./components/returnLogistics";
import styles from './index.module.scss'
export default () => {
useLogin()
const router = useRouter()
const orderId = useRef<number>(Number(router.params.id))
useDidShow(() => {
getSaleOrderPreView()
export default () => {
useLogin()
const router = useRouter()
const orderId = useRef<number>(Number(router.params.id))
useDidShow(() => {
getSaleOrderPreView()
})
//获取订单详情
const [orderDetail, setOrderDetail] = useState<any>() //获取到的原始数据
const { fetchData: saleOrderOrderDetailData } = SaleOrderOrderDetailApi()
const getSaleOrderPreView = async () => {
if (orderId.current) {
let res = await saleOrderOrderDetailData({ id: orderId.current })
setOrderDetail(res.data)
}
Taro.stopPullDownRefresh()
}
//监听获取到的数据
useEffect(() => {
if (orderDetail) formatData()
}, [orderDetail])
//格式化数据格式
const [formatDetailOrder, setFormatDetailOrder] = useState<any>() //格式化后的数据
const formatData = () => {
setFormatDetailOrder({
...orderDetail,
unit: orderDetail.sale_mode == 0 ? '条' : 'm', //单位
})
}
const formatPreViewOrderMemo = useMemo(() => {
return formatDetailOrder
}, [formatDetailOrder])
//获取订单详情
const [orderDetail, setOrderDetail] = useState<any>() //获取到的原始数据
const {fetchData: saleOrderOrderDetailData} = SaleOrderOrderDetailApi()
const getSaleOrderPreView = async () => {
if(orderId.current) {
let res = await saleOrderOrderDetailData({id: orderId.current})
setOrderDetail(res.data)
}
Taro.stopPullDownRefresh()
}
//监听获取到的数据
useEffect(() => {
if(orderDetail)
formatData()
}, [orderDetail])
//格式化数据格式
const [formatDetailOrder, setFormatDetailOrder] = useState<any>() //格式化后的数据
const formatData = () => {
setFormatDetailOrder({
...orderDetail,
unit: orderDetail.sale_mode == 0?'条':'m', //单位
})
}
const formatPreViewOrderMemo = useMemo(() => {
return formatDetailOrder
}, [formatDetailOrder])
//获取底部按钮点击, 获取按钮状态
const orderStateClick = useCallback((val) => {
if(val == 1 || val == 6) {
getSaleOrderPreView()
} else if(val == 8) {
//申请记录
setApplyRecord(true)
} else if (val == 5) {
onShowLogistics(1)
}
}, [orderDetail])
//页面下拉刷新
usePullDownRefresh(() => {
//获取底部按钮点击, 获取按钮状态
const orderStateClick = useCallback(
(val) => {
if (val == 1 || val == 6) {
getSaleOrderPreView()
} else if (val == 8) {
//申请记录
setApplyRecord(true)
} else if (val == 5) {
onShowLogistics(1)
}
},
[orderDetail],
)
//页面下拉刷新
usePullDownRefresh(() => {
getSaleOrderPreView()
})
//按钮所需数据
const orderInfo = useMemo(() => {
return {
...orderDetail,
}
}, [orderDetail])
//售后订单状态枚举
const {} = AFTER_ORDER_STATUS
//物流显示
const [logisticsShow, setLogisticsShow] = useState(false)
const [logistics, setLogistics] = useState(false)
const onShowLogistics = useCallback((val) => {
setLogisticsShow(true)
if (val != 1) setLogistics(true)
}, [])
const onCloseLogistics = useCallback(() => {
setLogisticsShow(false)
}, [])
//物流成功上传
const logisticsSuccess = useCallback(() => {
setLogisticsShow(false)
getSaleOrderPreView()
}, [])
//显示记录
const [applyRecord, setApplyRecord] = useState(false)
return (
<View className={styles.order_main}>
<OrderState orderInfo={orderDetail} />
<AddressInfoDetail orderInfo={orderDetail} onLogistics={onShowLogistics} />
<KindList order={formatPreViewOrderMemo} />
<OrderDes orderInfo={orderDetail} />
<AfterOrderBtns orderInfo={orderInfo} onClick={orderStateClick} />
<AfterSalePricture urls={orderDetail?.fabric_piece_accessory_url} />
<ReturnLogistics
onlyRead={logistics}
images={orderDetail?.accessory_url}
descValue={orderDetail?.take_goods_remark}
show={logisticsShow}
id={orderDetail?.return_apply_order_id}
onClose={onCloseLogistics}
onSubmit={logisticsSuccess}
/>
<ApplyRecord show={applyRecord} id={orderDetail?.id} onClose={() => setApplyRecord(false)} />
<View className='common_safe_area_y'></View>
</View>
)
}
const OrderDes = memo(({ orderInfo }: { orderInfo?: any }) => {
//复制功能
const clipboardData = (val) => {
Taro.setClipboardData({
data: val,
success: function (res) {
Taro.showToast({
icon: 'none',
title: '复制成功',
})
},
})
//按钮所需数据
const orderInfo = useMemo(() => {
return {
...orderDetail
}
}, [orderDetail])
//售后订单状态枚举
const {
} = AFTER_ORDER_STATUS
//物流显示
const [logisticsShow, setLogisticsShow] = useState(false)
const [logistics, setLogistics] = useState(false)
const onShowLogistics = useCallback((val) => {
setLogisticsShow(true)
if(val != 1) setLogistics(true)
}, [])
const onCloseLogistics = useCallback(() => {
setLogisticsShow(false)
}, [])
//物流成功上传
const logisticsSuccess = useCallback(() => {
setLogisticsShow(false)
getSaleOrderPreView()
}, [])
//显示记录
const [applyRecord, setApplyRecord] = useState(false)
return (
<View className={styles.order_main}>
<OrderState orderInfo={orderDetail}/>
<AddressInfoDetail orderInfo={orderDetail} onLogistics={onShowLogistics}/>
<KindList order={formatPreViewOrderMemo}/>
<OrderDes orderInfo={orderDetail}/>
<AfterOrderBtns orderInfo={orderInfo} onClick={orderStateClick}/>
<AfterSalePricture urls={orderDetail?.fabric_piece_accessory_url}/>
<ReturnLogistics onlyRead={logistics} images={orderDetail?.accessory_url} descValue={orderDetail?.take_goods_remark} show={logisticsShow} id={orderDetail?.return_apply_order_id} onClose={onCloseLogistics} onSubmit={logisticsSuccess}/>
<ApplyRecord show={applyRecord} id={orderDetail?.id} onClose={() => setApplyRecord(false)}/>
<View className="common_safe_area_y"></View>
}
return (
<View className={styles.order_info}>
<View className={styles.order_info_title}>订单信息</View>
<SearchInput showBorder={false} title='售后单号' height='50rpx'>
<View className={styles.order_num}>
<Text>{orderInfo?.return_order_no}</Text>
<View className={styles.order_num_btn} onClick={() => clipboardData(orderInfo?.return_order_no)}>
复制
</View>
</View>
)
}
const OrderDes = memo(({orderInfo}:{orderInfo?:any}) => {
//复制功能
const clipboardData = (val) => {
Taro.setClipboardData({
data: val,
success: function (res) {
Taro.showToast({
icon: 'none',
title: '复制成功'
})
}
})
}
return (
<View className={styles.order_info} >
<View className={styles.order_info_title}>订单信息</View>
<SearchInput showBorder={false} title='售后单号' height='50rpx'>
<View className={styles.order_num}>
<Text>{orderInfo?.return_order_no}</Text>
<View className={styles.order_num_btn} onClick={() => clipboardData(orderInfo?.return_order_no)}>复制</View>
</View>
</SearchInput>
<SearchInput showBorder={false} title='订单号' height='50rpx'>
<View className={styles.order_num}>
<Text>{orderInfo?.order_no}</Text>
<View className={styles.order_num_btn} onClick={() => clipboardData(orderInfo?.order_no)}>复制</View>
</View>
</SearchInput>
<SearchInput showBorder={false} title='退货原因' height='50rpx'>
<Text>{orderInfo?.return_reason_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='退货说明' height='50rpx'>
<Text>{orderInfo?.return_explain_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='货物状况' height='50rpx'>
<Text>{orderInfo?.goods_status_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='申请时间' height='50rpx'>
<Text>{formatDateTime(orderInfo?.apply_time)}</Text>
</SearchInput>
<SearchInput showBorder={false} title='其它说明' height='auto'>
<Text>{orderInfo?.reason_describe}</Text>
</SearchInput>
</SearchInput>
<SearchInput showBorder={false} title='订单号' height='50rpx'>
<View className={styles.order_num}>
<Text>{orderInfo?.order_no}</Text>
<View className={styles.order_num_btn} onClick={() => clipboardData(orderInfo?.order_no)}>
复制
</View>
</View>
)
})
</SearchInput>
<SearchInput showBorder={false} title='退货原因' height='50rpx'>
<Text>{orderInfo?.return_reason_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='退货说明' height='50rpx'>
<Text>{orderInfo?.return_explain_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='货物状况' height='50rpx'>
<Text>{orderInfo?.goods_status_name}</Text>
</SearchInput>
<SearchInput showBorder={false} title='申请时间' height='50rpx'>
<Text>{formatDateTime(orderInfo?.apply_time)}</Text>
</SearchInput>
<SearchInput showBorder={false} title='其它说明' height='auto'>
<Text>{orderInfo?.reason_describe}</Text>
</SearchInput>
</View>
)
})
const AfterSalePricture = memo(({urls = []}:{urls: string[]}) => {
const AfterSalePricture = memo(({ urls = [] }: { urls: string[] }) => {
const showList = useMemo(() => {
let res = urls.map((item) => {
return formatImgUrl(item, '!w800')
})
return res
}, [urls])
const showList = useMemo(() => {
let res = urls.map(item => {
return formatImgUrl(item, "!w800")
})
return res
}, [urls])
//预览图片
const showImage = () => {
Taro.previewImage({
current: showList[0], // 当前显示
urls: showList // 需要预览的图片http链接列表
})
}
return (
<ContentBox title="售后图片">
<View className={styles.after_sale_picture_list}>
{urls?.map(item=> <View className={styles.after_sale_picture_item} onClick={showImage}>
<Image src={formatImgUrl(item)} />
</View>)}
</View>
</ContentBox>
)
})
//预览图片
const showImage = () => {
Taro.previewImage({
current: showList[0], // 当前显示
urls: showList, // 需要预览的图片http链接列表
})
}
return (
<ContentBox title='售后图片'>
<View className={styles.after_sale_picture_list}>
{urls?.map((item) => (
<View className={styles.after_sale_picture_item} onClick={showImage}>
<Image src={formatImgUrl(item)} />
</View>
))}
</View>
</ContentBox>
)
})
+83 -66
View File
@@ -1,110 +1,111 @@
import Search from "@/components/search"
import useLogin from "@/use/useLogin"
import {View } from "@tarojs/components"
import Taro, { useDidShow} from "@tarojs/taro"
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
import styles from './index.module.scss'
import classnames from "classnames";
import Order from "./components/order"
import InfiniteScroll from "@/components/infiniteScroll"
import { dataLoadingStatus, getFilterData } from "@/common/util"
import OrderStatusList from "./components/orderStatusList"
import { GetSaleOrderListApi, RefundOrderSatausApi } from "@/api/salesAfterOrder"
import ApplyRecord from "../components/applyRecord"
import ReturnLogistics from "../components/returnLogistics"
import Search from '@/components/search'
import useLogin from '@/use/useLogin'
import { View } from '@tarojs/components'
import Taro, { useDidShow } from '@tarojs/taro'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import styles from './index.module.scss'
import classnames from 'classnames'
import Order from './components/order'
import InfiniteScroll from '@/components/infiniteScroll'
import { dataLoadingStatus, getFilterData } from '@/common/util'
import OrderStatusList from './components/orderStatusList'
import { GetSaleOrderListApi, RefundOrderSatausApi } from '@/api/salesAfterOrder'
import ApplyRecord from '../components/applyRecord'
import ReturnLogistics from '../components/returnLogistics'
export default () => {
useLogin()
//搜索参数
const [searchField, setSearchField] = useState<{status: number|null, page: number, size: number, name: string}>({
const [searchField, setSearchField] = useState<{ status: number | null; page: number; size: number; name: string }>({
status: null,
page : 1,
size : 10,
name:''
page: 1,
size: 10,
name: '',
})
//获取订单状态
const [statusList, setStatusList] = useState<any[]>([{id: -1, name: '全部'}])
const {fetchData: fetchDataStatus} = RefundOrderSatausApi()
const getOrderStatusList = async () => {
const [statusList, setStatusList] = useState<any[]>([{ id: -1, name: '全部' }])
const { fetchData: fetchDataStatus } = RefundOrderSatausApi()
const getOrderStatusList = async () => {
let res = await fetchDataStatus()
setStatusList((e) => [...e, ...res.data.list])
}
useEffect(() => {
getOrderStatusList()
setSearchField((e) => ({...e, status:-1}))
setSearchField((e) => ({ ...e, status: -1 }))
}, [])
//获取订单列表
const {fetchData: listFetchData, state:orderState} = GetSaleOrderListApi()
const [orderData, setOrderData] = useState<{list:any[], total:number}>({list:[], total:0})
const { fetchData: listFetchData, state: orderState } = GetSaleOrderListApi()
const [orderData, setOrderData] = useState<{ list: any[]; total: number }>({ list: [], total: 0 })
const getOrderList = async () => {
let res = await listFetchData(getFilterData(searchField))
setOrderData({list: res.data.list, total: res.data.total})
setOrderData({ list: res.data.list, total: res.data.total })
setRefresherTriggeredStatus(() => false)
}
useDidShow(() => {
if(searchField.status != null) getOrderList()
if (searchField.status != null) getOrderList()
})
//监听筛选条件变化
useEffect(() => {
if(searchField.status != null) getOrderList()
if (searchField.status != null) getOrderList()
}, [searchField])
//上拉加载数据
const pageNum = useRef({size: searchField.size, page: searchField.page})
const pageNum = useRef({ size: searchField.size, page: searchField.page })
const getScrolltolower = useCallback(() => {
if(orderData.list.length < orderData.total) {
pageNum.current.page++
const size = pageNum.current.size * pageNum.current.page
setSearchField((e) => ({...e, size }))
}
if (orderData.list.length < orderData.total) {
pageNum.current.page++
const size = pageNum.current.size * pageNum.current.page
setSearchField((e) => ({ ...e, size }))
}
}, [orderData])
//状态改变
const changeStatus = useCallback((e) => {
pageNum.current.page = 1
setSearchField((value) => ({...value, status:e, size:10}))
setOrderData(() => ({list:[], total:0}))
setSearchField((value) => ({ ...value, status: e, size: 10 }))
setOrderData(() => ({ list: [], total: 0 }))
}, [])
//数据加载状态
const statusMore = useMemo(() => {
return dataLoadingStatus({list:orderData.list, total: orderData.total, status: orderState.loading})
return dataLoadingStatus({ list: orderData.list, total: orderData.total, status: orderState.loading })
}, [orderData, orderState])
//输入了搜索关键字
const getSearchData = useCallback((e) => {
pageNum.current.page = 1
setOrderData(() => ({list:[], total:0}))
setSearchField((val) => ({...val, name:e, size:10}))
setOrderData(() => ({ list: [], total: 0 }))
setSearchField((val) => ({ ...val, name: e, size: 10 }))
}, [])
//列表下拉刷新
const [refresherTriggeredStatus, setRefresherTriggeredStatus] = useState(false)
const getRefresherRefresh = async () => {
pageNum.current.size = 1
setRefresherTriggeredStatus(true)
setSearchField((val) => ({...val, size:10}))
setSearchField((val) => ({ ...val, size: 10 }))
}
//监听点击的按钮
const [callBackOrderInfo, setCallBackPayOrderInfo] = useState<any>()
const clickOrderBtn = useCallback(({status, orderInfo}) => {
if(status == 1 || status == 6) {
getOrderList()
} else if (status == 8) {
setApplyRecord(true)
} else if (status == 5) {
onShowLogistics(() => true)
}
setCallBackPayOrderInfo(orderInfo)
}, [orderData])
const clickOrderBtn = useCallback(
({ status, orderInfo }) => {
if (status == 1 || status == 6) {
getOrderList()
} else if (status == 8) {
setApplyRecord(true)
} else if (status == 5) {
onShowLogistics(() => true)
}
setCallBackPayOrderInfo(orderInfo)
},
[orderData],
)
//显示记录
const [applyRecord, setApplyRecord] = useState(false)
@@ -112,32 +113,48 @@ export default () => {
//物流显示
const [logisticsShow, setLogisticsShow] = useState(false)
const onShowLogistics = useCallback((val) => {
setLogisticsShow(true)
setLogisticsShow(true)
}, [])
const onCloseLogistics = useCallback(() => {
setLogisticsShow(false)
setLogisticsShow(false)
}, [])
//物流成功上传
const logisticsSuccess = useCallback(() => {
setLogisticsShow(false)
getOrderList()
setLogisticsShow(false)
getOrderList()
}, [orderData])
return (
<View className={styles.order_list_main}>
<View className={styles.title}>
<Search placeIcon="out" placeholder="搜索商品/名称/颜色/订单号" showBtn={true} changeOnSearch={getSearchData} debounceTime={300}/>
<OrderStatusList list={statusList} onSelect={changeStatus} defaultId={1}/>
</View>
<View className={styles.order_list}>
<InfiniteScroll statusMore={statusMore} selfonScrollToLower={getScrolltolower} refresherEnabled={true} refresherTriggered={refresherTriggeredStatus} selfOnRefresherRefresh={getRefresherRefresh}>
{orderData?.list.map(item => {
return <View key={item.id} className={styles.order_item_con}> <Order value={item} onClickBtn={clickOrderBtn}/></View>
})}
</InfiniteScroll>
<Search placeIcon='out' placeholder='搜索商品/名称/颜色/订单号' showBtn={true} changeOnSearch={getSearchData} debounceTime={300} />
<OrderStatusList list={statusList} onSelect={changeStatus} defaultId={1} />
</View>
<ApplyRecord show={applyRecord} id={callBackOrderInfo?.id} onClose={() => setApplyRecord(false)}/>
<ReturnLogistics images={callBackOrderInfo?.accessory_url} descValue={callBackOrderInfo?.take_goods_remark} show={logisticsShow} id={callBackOrderInfo?.return_apply_order_id} onClose={onCloseLogistics} onSubmit={logisticsSuccess}/>
<View className={styles.order_list}>
<InfiniteScroll
statusMore={statusMore}
selfonScrollToLower={getScrolltolower}
refresherEnabled={true}
refresherTriggered={refresherTriggeredStatus}
selfOnRefresherRefresh={getRefresherRefresh}>
{orderData?.list.map((item) => {
return (
<View key={item.id} className={styles.order_item_con}>
<Order value={item} onClickBtn={clickOrderBtn} />
</View>
)
})}
</InfiniteScroll>
</View>
<ApplyRecord show={applyRecord} id={callBackOrderInfo?.id} onClose={() => setApplyRecord(false)} />
<ReturnLogistics
images={callBackOrderInfo?.accessory_url}
descValue={callBackOrderInfo?.take_goods_remark}
show={logisticsShow}
id={callBackOrderInfo?.return_apply_order_id}
onClose={onCloseLogistics}
onSubmit={logisticsSuccess}
/>
</View>
)
}
+201 -201
View File
@@ -1,214 +1,214 @@
.main{
display: flex;
flex-direction: column;
height: 100vh;
background-color: $color_bg_one;
.search{
padding: 20px;
.SearchInput{
background-color: #fff;
padding: 10px 20px;
box-sizing: border-box;
border-radius: 10px;
}
.bluetooth_color{
.color_bock{
width: 100px;
height: 46px;
}
.color_bock_no{
font-size: $font_size_medium;
color: $color_font_three;
}
}
.main {
display: flex;
flex-direction: column;
height: 100vh;
background-color: $color_bg_one;
.search {
padding: 20px;
.SearchInput {
background-color: #fff;
padding: 10px 20px;
box-sizing: border-box;
border-radius: 10px;
}
.filter{
.filter_all {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 130px;
.bluetooth_color {
.color_bock {
width: 100px;
height: 46px;
}
.color_bock_no {
font-size: $font_size_medium;
color: $color_font_three;
}
}
}
.filter {
.filter_all {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 130px;
font-size: $font_size_medium;
color: $color_font_three;
.text_zh,
.text_sc {
color: $color_main;
display: flex;
align-items: center;
.sortIcon {
display: flex;
flex-direction: column;
position: relative;
.icon_one {
font-size: $font_size_medium;
color: $color_font_three;
.text_zh, .text_sc{
color: $color_main;
display: flex;
align-items: center;
.sortIcon{
display: flex;
flex-direction: column;
position: relative;
.icon_one{
font-size: $font_size_medium;
position: absolute;
margin:auto;
top:0;
}
}
}
.text_ss{
position: relative;
.miconfont{
font-size: 20px;
margin-left: 5px;
}
&::before{
content: '';
width: 2px;
height: 32px;
background-color: #C2C2C2;
position: absolute;
top: 0;
left: -30px;
}
}
position: absolute;
margin: auto;
top: 0;
}
}
.filter_btn_con{
display: flex;
justify-content: space-between;
align-items: center;
height: 86px;
}
.text_ss {
position: relative;
.miconfont {
font-size: 20px;
margin-left: 5px;
}
.filter_scroll{
flex:1;
width: 0;
padding-left: 20px;
::-webkit-scrollbar {
display:none;
width:0;
height:0;
color:transparent;
}
&::before {
content: '';
width: 2px;
height: 32px;
background-color: #c2c2c2;
position: absolute;
top: 0;
left: -30px;
}
.filter_btn{
display: flex;
justify-content: space-between;
padding: 20px;
margin-right: 20px;
flex:1;
view{
font-size: $font_size_medium;
background-color: #F0F0F0;
border-radius: 24px;
min-width: 126px;
height: 46.93px;
text-align: center;
line-height: 46.93px;
color: $color_font_three;
&:nth-last-child(n+2) {
margin-right: 10px;
}
&:nth-last-child(1) {
margin-right: 30px;
}
}
.selected{
background-color: #ecf5ff;
border: 2px solid #cde5ff;
color: $color_main;
width: 122px;
height: 42.93px;
}
}
}
.filter_btn_con {
display: flex;
justify-content: space-between;
align-items: center;
height: 86px;
}
.filter_scroll {
flex: 1;
width: 0;
padding-left: 20px;
::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
color: transparent;
}
}
.filter_btn {
display: flex;
justify-content: space-between;
padding: 20px;
margin-right: 20px;
flex: 1;
view {
font-size: $font_size_medium;
background-color: #f0f0f0;
border-radius: 24px;
min-width: 126px;
height: 46.93px;
text-align: center;
line-height: 46.93px;
color: $color_font_three;
&:nth-last-child(n + 2) {
margin-right: 10px;
}
.filter_more{
font-size: $font_size_medium;
color: $color_font_three;
padding: 0 30px 0 20px;
position: relative;
&:nth-last-child(1) {
margin-right: 30px;
}
}
.selected {
background-color: #ecf5ff;
border: 2px solid #cde5ff;
color: $color_main;
width: 122px;
height: 42.93px;
}
}
.filter_more {
font-size: $font_size_medium;
color: $color_font_three;
padding: 0 30px 0 20px;
position: relative;
height: 100%;
line-height: 86px;
&::before {
content: '';
opacity: 1;
width: 30px;
height: 100%;
position: absolute;
left: -15px;
background-image: linear-gradient(to right, rgba(248, 248, 248, 0.3), rgba(248, 248, 248, 1) 60%);
// z-index: 99;
}
.miconfont {
font-size: 27px;
}
}
}
.list {
height: calc(100vh - 440px);
.list_num {
font-size: $font_size_min;
color: $color_font_two;
padding: 10px 38px;
border-bottom: 1px solid rgb(233, 233, 233);
}
.scroll {
height: 100%;
padding-top: 3px;
}
.product_list {
padding: 38px;
display: grid;
grid-template-columns: 321px 321px;
justify-content: space-between;
.product_item {
width: 321px;
background-color: #fff;
border-radius: 20px;
margin-bottom: 20px;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
.product_img {
width: 100%;
height: 224px;
border-radius: 20px 20px 0px 0px;
position: relative;
image {
width: 100%;
height: 100%;
line-height: 86px;
&::before{
content: '';
opacity: 1;
width: 30px;
height: 100%;
position: absolute;
left: -15px;
background-image: linear-gradient(to right, rgba(248, 248, 248, 0.3), rgba(248, 248, 248, 1) 60% );
// z-index: 99;
}
.miconfont{
font-size: 27px;
}
}
}
.list{
height: calc(100vh - 440px);
.list_num {
border-radius: 20px 20px 0px 0px;
}
.color_num {
background: rgba(0, 0, 0, 0.5);
border-radius: 0px 50px 0px 30px;
font-size: $font_size_min;
color:$color_font_two;
padding: 10px 38px;
border-bottom: 1PX solid rgb(233, 233, 233);
color: #fff;
position: absolute;
left: 0;
bottom: 0;
padding: 5px 20px;
box-sizing: border-box;
}
}
.scroll{
height: 100%;
padding-top: 3px;
}
.product_info {
padding: 20px;
.title {
font-size: $font_size;
color: $color_font_three;
@include common_ellipsis();
}
.product_list{
padding: 38px;
display: grid;
grid-template-columns: 321px 321px;
justify-content: space-between;
.product_item{
width: 321px;
background-color: #fff;
border-radius: 20px;
margin-bottom: 20px;
box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.1) ;
.product_img{
width: 100%;
height: 224px;
border-radius: 20px 20px 0px 0px;
position: relative;
image{
width: 100%;
height: 100%;
border-radius: 20px 20px 0px 0px;
}
.color_num {
background: rgba(0,0,0, 0.5);
border-radius: 0px 50px 0px 30px;
font-size: $font_size_min;
color: #fff;
position: absolute;
left:0;
bottom:0;
padding: 5px 20px;
box-sizing: border-box;
}
}
}
.product_info{
padding: 20px;
.title{
font-size: $font_size;
color: $color_font_three;
@include common_ellipsis()
}
.tag_list{
display: flex;
margin-top: 16px;
.tag{
padding: 3px 10px;
background-color: #CDE5FF;
font-size: $font_size_min;
border-radius: 5px;
color: $color_main;
&:nth-child(2) {
margin-left: 10px;
}
}
}
.introduce{
font-size: $font_size_medium;
color: $color_font_two;
margin-top: 16px;
@include common_ellipsis()
}
.tag_list {
display: flex;
margin-top: 16px;
.tag {
padding: 3px 10px;
background-color: #cde5ff;
font-size: $font_size_min;
border-radius: 5px;
color: $color_main;
&:nth-child(2) {
margin-left: 10px;
}
}
}
.introduce {
font-size: $font_size_medium;
color: $color_font_two;
margin-top: 16px;
@include common_ellipsis();
}
}
}
}
}
}
+188 -188
View File
@@ -1,198 +1,198 @@
.main{
display: flex;
flex-direction: column;
height: 100vh;
background-color: #F8F8F8;
.search{
padding: 20px;
.main {
display: flex;
flex-direction: column;
height: 100vh;
background-color: #f8f8f8;
.search {
padding: 20px;
}
.filter {
.filter_all {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 50px;
font-size: $font_size_medium;
color: $color_font_three;
.text_zh,
.text_sc {
color: $color_main;
display: flex;
align-items: center;
.sortIcon {
display: flex;
flex-direction: column;
position: relative;
.icon_one {
font-size: $font_size_medium;
position: absolute;
margin: auto;
top: 0;
}
}
}
.text_ss {
position: relative;
.miconfont {
font-size: 30px;
margin-left: 5px;
}
&::before {
content: '';
width: 2px;
height: 32px;
background-color: #c2c2c2;
position: absolute;
top: 0;
left: -30px;
}
}
}
.filter{
.filter_all {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 50px;
font-size: $font_size_medium;
color: $color_font_three;
.text_zh, .text_sc{
color: $color_main;
display: flex;
align-items: center;
.sortIcon{
display: flex;
flex-direction: column;
position: relative;
.icon_one{
font-size: $font_size_medium;
position: absolute;
margin:auto;
top:0;
}
}
}
.text_ss{
position: relative;
.miconfont{
font-size: 30px;
margin-left: 5px;
}
&::before{
content: '';
width: 2px;
height: 32px;
background-color: #C2C2C2;
position: absolute;
top: 0;
left: -30px;
}
}
.filter_btn_con {
display: flex;
justify-content: space-between;
align-items: center;
height: 86px;
}
.filter_scroll {
flex: 1;
width: 0;
padding-left: 20px;
::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
color: transparent;
}
}
.filter_btn {
display: flex;
justify-content: space-between;
padding: 20px;
margin-right: 20px;
flex: 1;
view {
font-size: $font_size_medium;
background-color: #f0f0f0;
border-radius: 24px;
min-width: 126px;
height: 46.93px;
text-align: center;
line-height: 46.93px;
color: $color_font_three;
&:nth-last-child(n + 2) {
margin-right: 10px;
}
.filter_btn_con{
display: flex;
justify-content: space-between;
align-items: center;
height: 86px;
&:nth-last-child(1) {
margin-right: 30px;
}
.filter_scroll{
flex:1;
width: 0;
padding-left: 20px;
::-webkit-scrollbar {
display:none;
width:0;
height:0;
color:transparent;
}
}
.filter_btn{
display: flex;
justify-content: space-between;
padding: 20px;
margin-right: 20px;
flex:1;
view{
font-size: $font_size_medium;
background-color: #F0F0F0;
border-radius: 24px;
min-width: 126px;
height: 46.93px;
text-align: center;
line-height: 46.93px;
color: $color_font_three;
&:nth-last-child(n+2) {
margin-right: 10px;
}
&:nth-last-child(1) {
margin-right: 30px;
}
}
.selected{
background-color: #ecf5ff;
border: 2px solid #cde5ff;
color: $color_main;
width: 122px;
height: 42.93px;
}
}
.filter_more{
font-size: $font_size_medium;
color: $color_font_three;
padding: 0 30px 0 20px;
position: relative;
}
.selected {
background-color: #ecf5ff;
border: 2px solid #cde5ff;
color: $color_main;
width: 122px;
height: 42.93px;
}
}
.filter_more {
font-size: $font_size_medium;
color: $color_font_three;
padding: 0 30px 0 20px;
position: relative;
height: 100%;
line-height: 86px;
&::before {
content: '';
opacity: 1;
width: 30px;
height: 100%;
position: absolute;
left: -15px;
background-image: linear-gradient(to right, rgba(248, 248, 248, 0.3), rgba(248, 248, 248, 1) 60%);
// z-index: 99;
}
.miconfont {
font-size: 27px;
}
}
}
.list {
height: calc(100vh - 330px);
.list_num {
font-size: $font_size_min;
color: $color_font_two;
padding: 10px 38px;
border-bottom: 1px solid #e9e9e9;
}
.scroll {
height: 100%;
padding-top: 3px;
}
.product_list {
padding: 38px;
display: grid;
grid-template-columns: 321px 321px;
justify-content: space-between;
.product_item {
width: 321px;
background-color: #fff;
border-radius: 20px;
margin-bottom: 20px;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
.product_img {
width: 100%;
height: 224px;
border-radius: 20px 20px 0px 0px;
position: relative;
image {
width: 100%;
height: 100%;
line-height: 86px;
&::before{
content: '';
opacity: 1;
width: 30px;
height: 100%;
position: absolute;
left: -15px;
background-image: linear-gradient(to right, rgba(248, 248, 248, 0.3), rgba(248, 248, 248, 1) 60% );
// z-index: 99;
}
.miconfont{
font-size: 27px;
}
}
}
.list{
height: calc(100vh - 330px);
.list_num {
border-radius: 20px;
}
.color_num {
background: rgba(0, 0, 0, 0.5);
border-radius: 50px 0px 0px 0px;
font-size: $font_size_min;
color:$color_font_two;
padding: 10px 38px;
border-bottom: 1PX solid #e9e9e9;
color: #fff;
position: absolute;
right: 0;
bottom: 0;
padding: 5px 20px;
box-sizing: border-box;
}
}
.scroll{
height: 100%;
padding-top: 3px;
}
.product_info {
padding: 20px;
.title {
font-size: $font_size;
color: $color_font_three;
@include common_ellipsis();
}
.product_list{
padding: 38px;
display: grid;
grid-template-columns: 321px 321px;
justify-content: space-between;
.product_item{
width: 321px;
background-color: #fff;
border-radius: 20px;
margin-bottom: 20px;
box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.1) ;
.product_img{
width: 100%;
height: 224px;
border-radius: 20px 20px 0px 0px;
position: relative;
image{
width: 100%;
height: 100%;
border-radius: 20px 20px 0px 0px;
}
.color_num {
background: rgba(0,0,0, 0.5);
border-radius: 50px 0px 0px 0px;
font-size: $font_size_min;
color: #fff;
position: absolute;
right:0;
bottom:0;
padding: 5px 20px;
box-sizing: border-box;
}
}
}
.product_info{
padding: 20px;
.title{
font-size: $font_size;
color: $color_font_three;
@include common_ellipsis();
}
.tag_list{
display: flex;
margin-top: 16px;
.tag{
padding: 3px 10px;
background-color: #CDE5FF;
font-size: $font_size_min;
border-radius: 5px;
color: $color_main;
@include common_ellipsis();
&:nth-child(2) {
margin-left: 10px;
}
}
}
.introduce{
font-size: $font_size_medium;
color: $color_font_two;
margin-top: 16px;
@include common_ellipsis();
}
.tag_list {
display: flex;
margin-top: 16px;
.tag {
padding: 3px 10px;
background-color: #cde5ff;
font-size: $font_size_min;
border-radius: 5px;
color: $color_main;
@include common_ellipsis();
&:nth-child(2) {
margin-left: 10px;
}
}
}
.introduce {
font-size: $font_size_medium;
color: $color_font_two;
margin-top: 16px;
@include common_ellipsis();
}
}
}
}
}
}