订单售后v3

This commit is contained in:
czm 2022-06-15 20:06:32 +08:00
parent cc7bcfe83c
commit b6f58aabbc
19 changed files with 502 additions and 143 deletions

View File

@ -74,6 +74,11 @@
&:nth-child(n+2) { &:nth-child(n+2) {
margin-left: 32px; margin-left: 32px;
} }
&:nth-last-child(1) {
border: 2px solid $color_main;
color: $color_main;
}
} }
.end_btn{ .end_btn{
border: 2px solid $color_main; border: 2px solid $color_main;

View File

@ -1,9 +1,10 @@
import { CancelOrderApi, ReceiveOrderApi } from "@/api/order" import { CancelOrderApi, ReceiveOrderApi } from "@/api/order"
import { alert } from "@/common/common" import { alert } from "@/common/common"
import { ORDER_STATUS, SALE_MODE } from "@/common/enum" import { ORDER_STATUS, SALE_MODE } from "@/common/enum"
import { ScrollView, Text, View } from "@tarojs/components" import {Text, View } from "@tarojs/components"
import Taro from "@tarojs/taro" import Taro from "@tarojs/taro"
import { useCallback, useRef, memo, useState, useEffect, useMemo } from "react" import {useRef, memo, useState, useMemo } from "react"
import classnames from "classnames";
import styles from './index.module.scss' import styles from './index.module.scss'
type Param = { type Param = {
@ -194,7 +195,7 @@ export default memo(({orderInfo, onClick}:Param) => {
<View className={styles.list_scroll}> <View className={styles.list_scroll}>
{orderBtnsShowList.map((item, index) => {orderBtnsShowList.map((item, index) =>
(index < 3)&&<View key={item.id} className={styles.btns_item} onClick={() => submitBtns(item.id, index)}>{item.label}</View> (index < 3)&&<View key={item.id} className={classnames(styles.btns_item)} onClick={() => submitBtns(item.id, index)}>{item.label}</View>
)} )}
</View> </View>

View File

@ -25,7 +25,7 @@
border-radius: 10px; border-radius: 10px;
} }
.num{ .num{
padding: 5px 10px; padding: 5px 10px 5px 20px;
font-size: $font_size_min; font-size: $font_size_min;
position: absolute; position: absolute;
right:0; right:0;
@ -51,7 +51,7 @@
.tag_list{ .tag_list{
display: flex; display: flex;
margin-top: 16px; margin-top: 16px;
.tag{ .tag, .tag_g{
padding: 3px 10px; padding: 3px 10px;
background-color: #CDE5FF; background-color: #CDE5FF;
font-size: $font_size_min; font-size: $font_size_min;
@ -61,6 +61,10 @@
margin-left: 10px; margin-left: 10px;
} }
} }
.tag_g{
background-color: #FFE6CE;
color: #EE7500;
}
} }
.introduce{ .introduce{
font-size: $font_size_medium; font-size: $font_size_medium;

View File

@ -22,7 +22,7 @@ export default ({desStatus = true, productList = []}:Params) => {
<View className={styles.title}><text>{formatHashTag(item.code, '')} </text>{item.name}</View> <View className={styles.title}><text>{formatHashTag(item.code, '')} </text>{item.name}</View>
<View className={styles.tag_list}> <View className={styles.tag_list}>
<View className={styles.tag}>{item.width}</View> <View className={styles.tag}>{item.width}</View>
<View className={styles.tag}>{item.weight_density}</View> <View className={styles.tag_g}>{item.weight_density}</View>
</View> </View>
<View className={styles.introduce}>{item.component}</View> <View className={styles.introduce}>{item.component}</View>
{desStatus&&<View className={styles.des}>{item.describe}</View>} {desStatus&&<View className={styles.des}>{item.describe}</View>}

View File

@ -56,6 +56,7 @@ export default ({show = false, onClose}: param) => {
setLoading(true) setLoading(true)
const {data} = await fetchData() const {data} = await fetchData()
let color_list = data.color_list||[] let color_list = data.color_list||[]
color_list.reverse()
initList(color_list) initList(color_list)
setList(color_list) setList(color_list)
setLoading(false) setLoading(false)

View File

@ -29,8 +29,9 @@
} }
.sideBar_select_title_select{ .sideBar_select_title_select{
background-color: $color_bg_one; background-color: #007AFF;
color: $color_font_one; color: #fff;
border-radius: 0px 14px 14px 0px;
} }
} }
.sideBar_con{ .sideBar_con{

View File

@ -104,7 +104,6 @@ export default memo(({list = [],
) )
}) })
} }
<View className="common_safe_area_y"></View>
</ScrollView> </ScrollView>
<View className={styles.sideBar_con}> <View className={styles.sideBar_con}>
<InfiniteScroll statusMore={statusMore} hasMore={hasMore} selfonScrollToLower={() => selfOnScrolltolower?.()} refresherTriggered={refresherTriggered} refresherEnabled={true} selfOnRefresherRefresh={() => selfOnRefresherRefresh?.()}> <InfiniteScroll statusMore={statusMore} hasMore={hasMore} selfonScrollToLower={() => selfOnScrolltolower?.()} refresherTriggered={refresherTriggered} refresherEnabled={true} selfOnRefresherRefresh={() => selfOnRefresherRefresh?.()}>

View File

@ -9,9 +9,8 @@
color: $color_main; color: $color_main;
width: 46px; width: 46px;
height: 46px; height: 46px;
display: flex; text-align: center;
align-items: center; line-height: 43px;
justify-content:center;
font-size: 50px; font-size: 50px;
background-color: $color_main; background-color: $color_main;
color: #fff; color: #fff;
@ -25,10 +24,13 @@
box-sizing: border-box; box-sizing: border-box;
width: 106px; width: 106px;
border-radius: 10px; border-radius: 10px;
input{
font-size: $font_size_medium;
text-align: right;
padding-right: 10px;
}
} }
input{
font-size: $font_size_medium;
}
.unit{ .unit{
font-size: $font_size_min; font-size: $font_size_min;
color: $color_font_two; color: $color_font_two;

View File

@ -80,6 +80,9 @@
box-sizing: border-box; box-sizing: border-box;
padding-bottom: constant(safe-area-inset-bottom); padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);
.submit_order_number{
padding: 20px 0;
}
.order_btn { .order_btn {
width: 250px; width: 250px;
height: 90px; height: 90px;

View File

@ -1,15 +1,12 @@
import { SaleOrderPreViewApi, SaleOrderApi } from "@/api/order"; import { SaleOrderPreViewApi, SaleOrderApi } from "@/api/order";
import { formatPriceDiv } from "@/common/fotmat"; import { formatPriceDiv } from "@/common/fotmat";
import Popup from "@/components/popup"; import Popup from "@/components/popup";
import SearchInput from "@/components/searchInput"; import { View } from "@tarojs/components"
import { Text, Textarea, View } from "@tarojs/components" import Taro, { useDidShow} from "@tarojs/taro";
import Taro, { useDidShow, useRouter } from "@tarojs/taro";
import classnames from "classnames"; import classnames from "classnames";
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import AddressInfo,{AddressInfoParam} from "./components/addressInfo"; import AddressInfo from "./components/addressInfo";
import EstimatedAmount from "./components/estimatedAmount";
import KindList from "./components/kindList"; import KindList from "./components/kindList";
import OrderState from "./components/orderState";
import Remark from "./components/remark"; import Remark from "./components/remark";
import styles from './comfirm.module.scss' import styles from './comfirm.module.scss'
import { getParam } from "@/common/system"; import { getParam } from "@/common/system";
@ -17,9 +14,9 @@ import useLogin from "@/use/useLogin";
import { alert, goLink } from "@/common/common"; import { alert, goLink } from "@/common/common";
import ShipmentMode from "../editOrder/components/shipmentMode"; import ShipmentMode from "../editOrder/components/shipmentMode";
import SubmitOrderBtn from "./components/submitOrderBtn"; import SubmitOrderBtn from "./components/submitOrderBtn";
import AddressInfoDetail from "./components/addressInfoDetail";
export default () => { export default () => {
const {checkLogin} = useLogin()
const [showDesc, setShowDesc] = useState(false) const [showDesc, setShowDesc] = useState(false)
//下单信息 //下单信息
@ -57,8 +54,7 @@ import SubmitOrderBtn from "./components/submitOrderBtn";
if(preViewOrder) { if(preViewOrder) {
formatData() formatData()
getDataList() getDataList()
//当有默认地址时设置默认地址id setSubmitOrderData((val) => ({...val, address_id:preViewOrder.default_address.id, shipment_mode:preViewOrder.shipment_mode||2}))
preViewOrder.default_address&&setSubmitOrderData((val) => ({...val, address_id:preViewOrder.default_address.id}))
} }
}, [preViewOrder]) }, [preViewOrder])
@ -84,18 +80,16 @@ import SubmitOrderBtn from "./components/submitOrderBtn";
//格式化初始地址 //格式化初始地址
const defaultAddress = useMemo(() => { const defaultAddress = useMemo(() => {
const address = preViewOrder?.default_address const address = preViewOrder?.default_address
if(address) { return {
return { province_name: address?.province_name,
province_name: address.province_name, city_name: address?.city_name,
city_name: address.city_name, district_name: address?.district_name,
district_name: address.district_name, address_detail: address?.address_detail,
address_detail: address.address_detail, id: address?.id,
id: address.id, name: address?.name,
name: address.name, phone: address?.phone,
phone: address.phone shipment_mode: address?.shipment_mode
}
} }
return null
}, [preViewOrder]) }, [preViewOrder])
//获取提交格式数据列表 //获取提交格式数据列表
@ -126,13 +120,17 @@ import SubmitOrderBtn from "./components/submitOrderBtn";
//提交按钮是否可用 //提交按钮是否可用
const btnStatus = useMemo(() => { const btnStatus = useMemo(() => {
if( submitOrderData?.list?.length == 0 || !submitOrderData?.shipment_mode || (submitOrderData?.shipment_mode == 2 && !submitOrderData?.address_id)) { return submitOrderData?.shipment_mode == 1 || (submitOrderData?.shipment_mode == 2 && submitOrderData?.address_id)
return false
} else {
return true
}
}, [submitOrderData]) }, [submitOrderData])
//数量格式
const numText = useMemo(() => {
if(formatPreViewOrder) {
let total_number = formatPreViewOrder?.sale_mode == 0?formatPreViewOrder?.total_number:(formatPreViewOrder?.total_number/100)
return `${formatPreViewOrder?.total_fabrics}种面料,${formatPreViewOrder?.total_colors}种颜色,共${total_number}${formatPreViewOrder?.unit}`
}
}, [formatPreViewOrder])
//提交订单 //提交订单
const {fetchData: saleOrderFetchData} = SaleOrderApi() const {fetchData: saleOrderFetchData} = SaleOrderApi()
const submitOrderEven = () => { const submitOrderEven = () => {
@ -162,8 +160,7 @@ import SubmitOrderBtn from "./components/submitOrderBtn";
} }
return ( return (
<View className={styles.order_main}> <View className={styles.order_main}>
<ShipmentMode onSelect={selectShipmentMode}/> <AddressInfoDetail orderInfo={defaultAddress} onSelect={getAddress} onChangeShipmentMode={selectShipmentMode} status={1}/>
<AddressInfo onSelect={(e) => getAddress(e)} defaultValue={defaultAddress}/>
<KindList order={formatPreViewOrderMemo} comfirm={true}/> <KindList order={formatPreViewOrderMemo} comfirm={true}/>
<View className={styles.order_desc} onClick={() => setShowDesc(true)}> <View className={styles.order_desc} onClick={() => setShowDesc(true)}>
<View className={styles.order_desc_con}></View> <View className={styles.order_desc_con}></View>
@ -176,7 +173,7 @@ import SubmitOrderBtn from "./components/submitOrderBtn";
<View className={styles.submit_order}> <View className={styles.submit_order}>
<View className={styles.submit_order_number}> <View className={styles.submit_order_number}>
<SubmitOrderBtn style={{color:'#007AFF'}} number={formatPriceDiv(preViewOrder?.sale_mode == 1?formatPreViewOrder?.total_should_collect_money:formatPreViewOrder?.estimate_amount)} priceTitle={preViewOrder?.sale_mode == 1?'合计金额':'预估金额'}/> <SubmitOrderBtn style={{color:'#007AFF'}} number={formatPriceDiv(preViewOrder?.sale_mode == 1?formatPreViewOrder?.total_should_collect_money:formatPreViewOrder?.estimate_amount)} priceTitle={preViewOrder?.sale_mode == 1?'合计金额':'预估金额'}/>
<View className={styles.order_number_desc}>{`${formatPreViewOrder?.total_fabrics}种面料,${formatPreViewOrder?.total_colors}种颜色,共${formatPreViewOrder?.total_number + formatPreViewOrder?.unit}`}</View> <View className={styles.order_number_desc}>{numText}</View>
</View> </View>
<View className={classnames(styles.order_btn, btnStatus&&styles.ok_order_btn)} onClick={() => submitOrderEven()}></View> <View className={classnames(styles.order_btn, btnStatus&&styles.ok_order_btn)} onClick={() => submitOrderEven()}></View>
</View> </View>

View File

@ -0,0 +1,163 @@
import { EditSaleOrderAddressApi, EditSaleOrderShipmentModeApi } from "@/api/order";
import { alert } from "@/common/common";
import { ORDER_STATUS } from "@/common/enum";
import { debounce } 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, useState } from "react";
import styles from './index.module.scss'
export type AddressInfoParam = {
province_name: string,
city_name: string,
district_name: string,
address_detail: string,
id?: number,
name: string,
phone: string,
}
type Param = {
onSelect?: (val:any) => void, //选择地址
defaultValue?: AddressInfoParam|null, //默认值
disabled?: false|true, //true禁用后只用于展示
onChangeShipmentMode?: (val: number) => void, //返回收货方式
status?: 1|2, //1确认订单时使用 2订单流程
orderInfo?: {
orderId: number //订单id
shipment_mode: 1|2, //1自提 2物流
status: number //订单状态
}
}
export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue = null, orderInfo, status = 2}: Param, ref) => {
const [showAddressList, setShowAddressList] = useState(false)
useEffect(() => {
setUserInfo(() => defaultValue)
}, [defaultValue])
const [userInfo, setUserInfo] = useState<any>()
//地址格式
const formatAddress = useMemo(() => {
if(userInfo)
return userInfo.province_name + userInfo.city_name + userInfo.district_name + userInfo.address_detail
}, [userInfo])
const changeShow = () => {
if(receivingStatus == 2 && !logisticsShow)
setShowAddressList(() => true)
}
useEffect(() => {
if(orderInfo)
setReceivingStatus(() => orderInfo.shipment_mode||2)
}, [orderInfo])
//把内部方法提供给外部
useImperativeHandle(ref, () => ({
changeShow
}))
//收货方法,1:自提2物流
const [receivingStatus, setReceivingStatus] = useState(2)
const {fetchData: shipmentModeFetchData} = EditSaleOrderShipmentModeApi()
const onReceivingStatus = (value, e) => {
e.stopPropagation()
changeReceivingStatus(value)
}
const changeReceivingStatus = debounce(async (value) => {
if(!orderInfo) return false
if(status == 1) {
onChangeShipmentMode?.(value)
setReceivingStatus(value)
return false
}
alert.loading('正在修改')
const res = await shipmentModeFetchData({id: orderInfo.orderId, shipment_mode:value})
if(res.success) {
alert.success('收货方式修改成功')
onChangeShipmentMode?.(value)
setReceivingStatus(value)
} else {
alert.none(res.msg)
}
}, 10)
//修改地址
const [addressId, setAddressId] = useState(0)
const {fetchData: addressFetchData} = EditSaleOrderAddressApi()
const getAddress = async (value) => {
if(!orderInfo) return false
if(status == 1) {
setShowAddressList(() => false)
setAddressId(value.id)
setUserInfo(() => value)
return false
}
alert.loading('正在修改')
const res = await addressFetchData({id: orderInfo.orderId, address_id: value.id})
if(res.success) {
alert.success('地址修改成功')
onSelect?.(value)
setShowAddressList(() => false)
setAddressId(value.id)
setUserInfo(() => value)
} else {
alert.none(res.msg)
}
}
//订单状态
const {
SaleOrderStatusWaitingReceipt,
SaleOrderStatusAlreadyReceipt,
SaleOrderStatusComplete,
SaleOrderStatusRefund,
SaleOrderStatusCancel
} = ORDER_STATUS
//根据订单状态判断是否显示物流
const logisticsShowList = [SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value]
const logisticsShow = useMemo(() => {
return logisticsShowList.includes(orderInfo?.status as number)
}, [orderInfo])
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={styles.address_text}>{formatAddress}</Text>
{(receivingStatus == 2 && !logisticsShow)&&<Text className={classnames(styles.moreIconfont,'iconfont icon-a-moreback')}></Text>}
</View>
<View className={styles.order_address_text_name}>
<Text>{userInfo?.name}</Text>
<Text>{userInfo?.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>||
<View className={styles.logisticsBtn}>
</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>
)
}))

View File

@ -33,6 +33,11 @@
} }
.address_text{ .address_text{
word-break:break-all; word-break:break-all;
}
.address_text_no{
font-weight: 700;
padding-left: 20px;
} }
} }
.order_address_text_name{ .order_address_text_name{

View File

@ -23,37 +23,43 @@ type Param = {
defaultValue?: AddressInfoParam|null, //默认值 defaultValue?: AddressInfoParam|null, //默认值
disabled?: false|true, //true禁用后只用于展示 disabled?: false|true, //true禁用后只用于展示
onChangeShipmentMode?: (val: number) => void, //返回收货方式 onChangeShipmentMode?: (val: number) => void, //返回收货方式
status?: 1|2, //1确认订单时使用 2订单流程
orderInfo?: { orderInfo?: {
orderId: number //订单id id?: number //订单id
shipment_mode: 1|2, //1自提 2物流 shipment_mode?: 1|2, //1自提 2物流
status: number //订单状态 status?: number //订单状态
province_name: string,
city_name: string,
district_name: string,
address_detail: string
} }
} }
export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue = null, orderInfo}: Param, ref) => { export default memo(forwardRef(({onSelect, onChangeShipmentMode, orderInfo, status = 2}: Param, ref) => {
const [showAddressList, setShowAddressList] = useState(false)
const [addressInfo, setAddressInfo] = useState<any>()
useEffect(() => { useEffect(() => {
setUserInfo(() => defaultValue) setAddressInfo(() => orderInfo)
}, [defaultValue]) if(orderInfo)
setReceivingStatus(() => orderInfo.shipment_mode||2)
const [userInfo, setUserInfo] = useState<any>() }, [orderInfo])
//地址格式 //地址格式
const formatAddress = useMemo(() => { const formatAddress = useMemo(() => {
if(userInfo) if(addressInfo?.province_name) {
return userInfo.province_name + userInfo.city_name + userInfo.district_name + userInfo.address_detail return addressInfo.province_name + addressInfo.city_name + addressInfo.district_name + addressInfo.address_detail
}, [userInfo]) } else {
return ''
}
}, [addressInfo])
//打开地址列表
const [showAddressList, setShowAddressList] = useState(false)
const changeShow = () => { const changeShow = () => {
if(receivingStatus == 2 && !logisticsShow) if(receivingStatus == 2 && !logisticsShow)
setShowAddressList(() => true) setShowAddressList(() => true)
} }
useEffect(() => {
if(orderInfo)
setReceivingStatus(() => orderInfo.shipment_mode)
}, [orderInfo])
//把内部方法提供给外部 //把内部方法提供给外部
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
@ -61,7 +67,7 @@ export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue =
})) }))
//收货方法,1:自提2物流 //收货方法,1:自提2物流
const [receivingStatus, setReceivingStatus] = useState(1) const [receivingStatus, setReceivingStatus] = useState(2)
const {fetchData: shipmentModeFetchData} = EditSaleOrderShipmentModeApi() const {fetchData: shipmentModeFetchData} = EditSaleOrderShipmentModeApi()
const onReceivingStatus = (value, e) => { const onReceivingStatus = (value, e) => {
e.stopPropagation() e.stopPropagation()
@ -69,8 +75,13 @@ export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue =
} }
const changeReceivingStatus = debounce(async (value) => { const changeReceivingStatus = debounce(async (value) => {
if(!orderInfo) return false if(!orderInfo) return false
if(status == 1) {
onChangeShipmentMode?.(value)
setReceivingStatus(value)
return false
}
alert.loading('正在修改') alert.loading('正在修改')
const res = await shipmentModeFetchData({id: orderInfo.orderId, shipment_mode:value}) const res = await shipmentModeFetchData({id: orderInfo.id, shipment_mode:value})
if(res.success) { if(res.success) {
alert.success('收货方式修改成功') alert.success('收货方式修改成功')
onChangeShipmentMode?.(value) onChangeShipmentMode?.(value)
@ -85,14 +96,21 @@ export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue =
const {fetchData: addressFetchData} = EditSaleOrderAddressApi() const {fetchData: addressFetchData} = EditSaleOrderAddressApi()
const getAddress = async (value) => { const getAddress = async (value) => {
if(!orderInfo) return false if(!orderInfo) return false
if(status == 1) {
setShowAddressList(() => false)
setAddressId(value.id)
setAddressInfo(() => value)
onSelect?.(value)
return false
}
alert.loading('正在修改') alert.loading('正在修改')
const res = await addressFetchData({id: orderInfo.orderId, address_id: value.id}) const res = await addressFetchData({id: orderInfo.id, address_id: value.id})
if(res.success) { if(res.success) {
alert.success('地址修改成功') alert.success('地址修改成功')
onSelect?.(value) onSelect?.(value)
setShowAddressList(() => false) setShowAddressList(() => false)
setAddressId(value.id) setAddressId(value.id)
setUserInfo(() => value) setAddressInfo(() => value)
} else { } else {
alert.none(res.msg) alert.none(res.msg)
} }
@ -119,12 +137,12 @@ export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue =
<View className={classnames(styles.order_address_icon, 'iconfont', receivingStatus == 2?'icon-daohang':'icon-fahuo')}></View> <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_con}>
<View className={styles.order_address_text_title}> <View className={styles.order_address_text_title}>
<Text className={styles.address_text}>{formatAddress}</Text> <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>} {(receivingStatus == 2 && !logisticsShow)&&<Text className={classnames(styles.moreIconfont,'iconfont icon-a-moreback')}></Text>}
</View> </View>
<View className={styles.order_address_text_name}> <View className={styles.order_address_text_name}>
<Text>{userInfo?.name}</Text> <Text>{addressInfo?.name}</Text>
<Text>{userInfo?.phone}</Text> <Text>{addressInfo?.phone}</Text>
</View> </View>
</View> </View>
{!logisticsShow&&<View className={styles.updateBtn}> {!logisticsShow&&<View className={styles.updateBtn}>

View File

@ -0,0 +1,190 @@
import { ORDER_STATUS } from "@/common/enum"
import { formatHashTag, formatPriceDiv } from "@/common/fotmat"
import LabAndImg from "@/components/LabAndImg"
import { View } from "@tarojs/components"
import { memo, useCallback, useMemo } from "react"
import EstimatedAmount from "../estimatedAmount"
import styles from './index.module.scss'
type OrderParam = {
estimate_amount: number, //预估金额
list: any[],
sale_mode: number,
sale_mode_name: string,
unit: string,
total_colors: number,
total_fabrics: number,
total_number: number,
status: number, //订单状态
total_sale_price: number, //销售金额
total_should_collect_money: number, //应收金额
total_weight_error_discount: number, //空差优惠
the_previous_status: number, //取消订单时的订单状态
actual_amount: number //实付金额
}
type Param = {
order: OrderParam,
comfirm?: boolean //是否是确认订单页面使用
}
export default memo(({order, comfirm = false}:Param) => {
//对应数量
const formatCount = useCallback((item) => {
return order?.sale_mode == 0? item.roll : Number(item.length / 100)
}, [order])
//对应单价
const standardPrice = useCallback(price => {
return formatPriceDiv(price).toLocaleString() + '/' + (order?.sale_mode == 1?'m':'kg')
}, [order])
//数量格式
const numText = useMemo(() => {
if(order) {
let total_number = order?.sale_mode == 0?order?.total_number:(order?.total_number/100)
return `${order?.total_fabrics}种面料,${order?.total_colors}种颜色,共${total_number}${order?.unit}`
}
}, [order])
const {
SaleOrderStatusBooking, // 待接单
SaleOrderStatusArranging, // 配布中
SaleOrderStatusArranged, // 已配布
SaleOrderStatusWaitingPayment, // 待付款
SaleOrderStatusWaitingDelivery, // 待发货
SaleOrderStatusWaitingReceipt, // 待收货
SaleOrderStatusAlreadyReceipt, // 已收货
SaleOrderStatusComplete, // 已完成
SaleOrderStatusRefund, // 已退款
SaleOrderStatusCancel, // 已取消
SaleorderstatusWaitingPrePayment // 预付款
} = ORDER_STATUS
//金额列表枚举
const priceList = [
{
id:1,
value:[SaleorderstatusWaitingPrePayment.value, SaleOrderStatusBooking.value, SaleOrderStatusArranging.value, ],
label:'预估金额',
field: 'estimate_amount'
},
{
id:2,
value:[SaleorderstatusWaitingPrePayment.value, SaleOrderStatusArranged.value, SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value],
label:'合计金额',
field: 'total_sale_price'
},
{
id:3,
value:[SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value],
label:'空差优惠',
field: 'total_weight_error_discount'
},
{
id:4,
value:[ SaleOrderStatusWaitingPayment.value],
label:'应付金额',
field: 'total_should_collect_money'
},
{
id:5,
value:[SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value],
label:'实付金额',
field: 'actual_amount'
}
]
//是否显示价格
const showPrice = useCallback((priceInfo, status) => {
return priceInfo.value.includes(status)
}, [order])
//金额展示大货
const priceConDom = useMemo(() => {
if(!order) return
if(comfirm == true) {
//确认订单时
return <EstimatedAmount number={formatPriceDiv(order.estimate_amount)} title="预估金额" />
}
if(order?.status == SaleOrderStatusCancel.value) {
//订单状态为取消订单时
return (
<>
{
priceList.map(item => {
return <>{showPrice(item, order?.the_previous_status)&&<EstimatedAmount key={item.id} number={formatPriceDiv(order[item.field])} title={item.label} />}</>
})
}
</>
)
} else {
//其他订单状态
return (
<>
{
priceList.map(item => {
return <>{showPrice(item, order?.status)&&<EstimatedAmount key={item.id} number={formatPriceDiv(order[item.field])} title={item.label} />}</>
})
}
</>
)
}
}, [order])
//金额展示剪板
const cutPriceConDom = useMemo(() => {
if(!order) return
return <EstimatedAmount number={formatPriceDiv(order.total_should_collect_money)} title="合计金额" />
}, [order])
const showPriceAll = useMemo(() => {
if(order?.sale_mode == 1) {
return cutPriceConDom //剪板
} else {
return priceConDom //大货
}
}, [order])
return (
<>
<View className={styles.orders_list_title}>{numText}</View>
<View className={styles.orders_list_con}>
{
order?.list?.map(item => {
return <View key={item.product_code} className={styles.order_list}>
<View className={styles.order_list_title}>
<View className={styles.tag}>{order.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={{lab:item.lab,rgb:item.rgb,texture_url:item.texture_url}}/>
</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}>¥{standardPrice(colorItem.sale_price)}</View>
</View>
<View className={styles.order_list_item_count}>
<View className={styles.count_num}>×{formatCount(colorItem)}<text>{order.unit}</text></View>
<View className={styles.count_price}><text>¥</text>{formatPriceDiv(colorItem.estimate_amount).toLocaleString()}</View>
</View>
</View>
</View>
})}
</View>
</View>
})
}
<View className={styles.order_estimated_amount}>
{showPriceAll}
</View>
</View>
</>
)
})

View File

@ -64,13 +64,13 @@ export default memo(({order, comfirm = false}:Param) => {
const priceList = [ const priceList = [
{ {
id:1, id:1,
value:[SaleOrderStatusBooking.value, SaleOrderStatusArranging.value], value:[SaleorderstatusWaitingPrePayment.value, SaleOrderStatusBooking.value, SaleOrderStatusArranging.value],
label:'预估金额', label:'预估金额',
field: 'estimate_amount' field: 'estimate_amount'
}, },
{ {
id:2, id:2,
value:[SaleorderstatusWaitingPrePayment.value, SaleOrderStatusArranged.value, SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value], value:[SaleOrderStatusArranged.value, SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value, SaleOrderStatusCancel.value],
label:'合计金额', label:'合计金额',
field: 'total_sale_price' field: 'total_sale_price'
}, },
@ -95,56 +95,28 @@ export default memo(({order, comfirm = false}:Param) => {
] ]
//是否显示价格 //是否显示价格
const showPrice = useCallback((priceInfo, status) => { const showPrice = (item) => {
return priceInfo.value.includes(status) if (item.id == 2) {
}, [order]) //合计金额 (剪板特殊请情况)
return (item.value.includes(order.status)|| order.sale_mode == 1)
} else {
return (item.value.includes(order.status) && order.sale_mode != 1 )
}
}
//金额展示大货 //金额展示
const priceConDom = useMemo(() => { const priceConDom = useMemo(() => {
if(!order) return if(!order) return
if(comfirm == true) { return (
//确认订单时 <>
return <EstimatedAmount number={formatPriceDiv(order.estimate_amount)} title="预估金额" /> {
} else if(order?.status == SaleOrderStatusCancel.value) { priceList.map(item => {
//订单状态为取消订单时 return <>{showPrice(item)&&<EstimatedAmount key={item.id} number={formatPriceDiv(order[item.field])} title={item.label} />}</>
return ( })
<> }
{ </>
priceList.map(item => { )
return <>{showPrice(item, order?.the_previous_status)&&<EstimatedAmount key={item.id} number={formatPriceDiv(order[item.field])} title={item.label} />}</>
})
}
</>
)
} else {
//其他订单状态
return (
<>
{
priceList.map(item => {
return <>{showPrice(item, order?.status)&&<EstimatedAmount key={item.id} number={formatPriceDiv(order[item.field])} title={item.label} />}</>
})
}
</>
)
}
}, [order]) }, [order])
//金额展示剪板
const cutPriceConDom = useMemo(() => {
if(!order) return
return <EstimatedAmount number={formatPriceDiv(order.total_should_collect_money)} title="合计金额" />
}, [order])
const showPriceAll = useMemo(() => {
if(order?.sale_mode == 1) {
return cutPriceConDom //剪板
} else {
return priceConDom //大货
}
}, [order])
return ( return (
<> <>
@ -181,7 +153,7 @@ export default memo(({order, comfirm = false}:Param) => {
}) })
} }
<View className={styles.order_estimated_amount}> <View className={styles.order_estimated_amount}>
{showPriceAll} {priceConDom}
</View> </View>
</View> </View>
</> </>

View File

@ -63,7 +63,7 @@ export default memo(({orderInfo = {logistics_details: [],payment_method: 0, stat
<View className={classnames(styles.order_status_time, (index == 0)&&styles.order_status_select)}>{formatDateTime(item.time)}</View> <View className={classnames(styles.order_status_time, (index == 0)&&styles.order_status_select)}>{formatDateTime(item.time)}</View>
</View> </View>
<Text className={classnames(styles.order_status_des, (index == 0)&&styles.order_status_des_select)}>{item.desc}</Text> <Text className={classnames(styles.order_status_des, (index == 0)&&styles.order_status_des_select)}>{item.desc}</Text>
{(orderInfo.status == SaleorderstatusWaitingPrePayment.value)&&<CountDown endTime={endTime}/>} {(orderInfo.status == SaleorderstatusWaitingPrePayment.value)&&<CountDown onFinish={onRefresh} endTime={endTime}/>}
</View>)} </View>)}
</View> </View>
{(dataList.length > 2) && <View className={styles.more} onClick={() => changeMore()}> {(dataList.length > 2) && <View className={styles.more} onClick={() => changeMore()}>
@ -84,7 +84,7 @@ export default memo(({orderInfo = {logistics_details: [],payment_method: 0, stat
}) })
//倒计时 //倒计时
const CountDown = ({endTime = ''}:{endTime:string}) => { const CountDown = ({endTime = '', onFinish}:{endTime:string, onFinish?:() => void}) => {
const [showTime, setShowTime] = useState('') const [showTime, setShowTime] = useState('')
const timeObj:any = useRef() const timeObj:any = useRef()
useEffect(() => { useEffect(() => {
@ -101,7 +101,12 @@ const CountDown = ({endTime = ''}:{endTime:string}) => {
const count_down = () => { const count_down = () => {
var startData = dayjs(); var startData = dayjs();
var endDate = dayjs(endTime); var endDate = dayjs(endTime);
if(startData >= endDate) clearInterval(timeObj.current) if(startData >= endDate) {
clearInterval(timeObj.current)
onFinish?.()
setShowTime(() => '00:00:00')
return false
}
var _dd = endDate.diff(startData,'day'); var _dd = endDate.diff(startData,'day');
var _hh = endDate.diff(startData,'hour'); var _hh = endDate.diff(startData,'hour');
var _mm = endDate.diff(startData,'minute'); var _mm = endDate.diff(startData,'minute');
@ -120,7 +125,7 @@ const CountDown = ({endTime = ''}:{endTime:string}) => {
return ( return (
<> <>
<View className={styles.pay_time}> <View className={styles.pay_time}>
<Text>{showTime||'00:00:00'}</Text> <Text>{showTime||'--:--:--'}</Text>
</View> </View>
</> </>
) )

View File

@ -1,11 +1,9 @@
.order_price{ .order_price{
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; // justify-content: space-between;
width: 100%; width: 100%;
&:nth-last-child(n+2) {
margin-bottom: 30px;
}
.order_price_text{ .order_price_text{
font-size: $font_size_medium; font-size: $font_size_medium;
// margin-right: 10px; // margin-right: 10px;
@ -41,7 +39,7 @@
} }
} }
.emphasis{ .emphasis{
font-weight: 700; // font-weight: 700;
} }
.order_price_num{ .order_price_num{
color: $color_main; color: $color_main;
@ -51,7 +49,7 @@
font-size: $font_size_min; font-size: $font_size_min;
} }
&:nth-child(2) { &:nth-child(2) {
font-size: 26px; font-size: 44px;
} }
&:nth-child(3) { &:nth-child(3) {
font-size: $font_size_medium; font-size: $font_size_medium;
@ -61,7 +59,7 @@
.emphasis_num{ .emphasis_num{
text{ text{
&:nth-child(2) { &:nth-child(2) {
font-size: $font_size_big; font-size: 44px;
} }
} }
} }

View File

@ -26,11 +26,7 @@ export default memo(({style, number = 0, priceTitle = ''}:Param) => {
<> <>
<View className={styles.order_price}> <View className={styles.order_price}>
<View className={classnames(styles.order_price_text, styles.emphasis)}> <View className={classnames(styles.order_price_text, styles.emphasis)}>
<Text>{priceTitle}</Text> <Text>{priceTitle}</Text>
<View className={styles.iconfont_msg}>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-tuikuanshouhou')}></Text>
{/* <View className={classnames(styles.message)}>123123123121212312312312312</View> */}
</View>
</View> </View>
<View className={classnames(styles.order_price_num, styles.emphasis_num)} style={style}> <View className={classnames(styles.order_price_num, styles.emphasis_num)} style={style}>
{priceDom()} {priceDom()}

View File

@ -38,7 +38,8 @@ import styles from './index.module.scss'
setOrderDetail(res.data) setOrderDetail(res.data)
setOrderRemark(res.data.remark) setOrderRemark(res.data.remark)
} }
Taro.stopPullDownRefresh() Taro.stopPullDownRefresh()
Taro.hideToast()
} }
//监听获取到的数据 //监听获取到的数据
@ -85,7 +86,7 @@ import styles from './index.module.scss'
}) })
} }
//格式化初始地址 //初始地址数据
const defaultAddress = useMemo(() => { const defaultAddress = useMemo(() => {
return { return {
province_name: orderDetail?.province_name, province_name: orderDetail?.province_name,
@ -114,12 +115,6 @@ import styles from './index.module.scss'
setShowDesc(() => false) setShowDesc(() => false)
}, []) }, [])
//支付所需数据
// const payOrderInfo = useMemo(() => {
// if(orderDetail)
// return {should_collect_order_id: orderDetail.should_collect_order_id, payment_method:orderDetail.payment_method, pre_collect_order_id:orderDetail.pre_collect_order_id}
// }, [orderDetail])
//去付款 //去付款
const [payMentShow, setPayMentShow] = useState(false) const [payMentShow, setPayMentShow] = useState(false)
const toPay = () => { const toPay = () => {
@ -186,13 +181,17 @@ import styles from './index.module.scss'
//订单状态枚举 //订单状态枚举
const {SaleOrderStatusCancel} = ORDER_STATUS const {SaleOrderStatusCancel} = ORDER_STATUS
//刷新页面
const refresh = useCallback(() => {
alert.loading('刷新中')
getSaleOrderPreView()
}, [orderDetail])
return ( return (
<View className={styles.order_main}> <View className={styles.order_main}>
<OrderState orderInfo={{logistics_details:orderDetail?.logistics_details, payment_method: orderDetail?.payment_method, status:orderDetail?.status}}/> <OrderState orderInfo={orderDetail} onRefresh={refresh}/>
<View > <View >
<AddressInfoDetail orderInfo={addressInfoDetailData} onSelect={getAddress} onChangeShipmentMode={getShipmentMode} ref={addressRef} defaultValue={defaultAddress} /> <AddressInfoDetail orderInfo={defaultAddress} onSelect={getAddress} onChangeShipmentMode={getShipmentMode} ref={addressRef} />
</View> </View>
<KindList order={formatPreViewOrderMemo}/> <KindList order={formatPreViewOrderMemo}/>
<View className={styles.order_info} > <View className={styles.order_info} >