电子商城测试版v3

This commit is contained in:
czm 2022-06-29 20:32:12 +08:00
parent ed90e50092
commit d0d4219413
10 changed files with 252 additions and 36 deletions

View File

@ -99,4 +99,14 @@ export const ReceiveOrderApi = () => {
url: `/v1/mall/saleOrder/receive`,
method: "put",
})
}
/**
*
*/
export const OrderStatusListApi = () => {
return useRequest({
url: `/v1/mall/enum/filterSaleOrderStatus`,
method: "get",
})
}

View File

@ -10,8 +10,8 @@
// export const BASE_URL = `https://dev.zzfzyc.com/lymarket` // 开发环境
// export const BASE_URL = `https://www.zzfzyc.com/lymarket` // 正式环境
// export const BASE_URL = `http://192.168.1.5:40001/lymarket` // 王霞
export const BASE_URL = `http://192.168.1.7:50002/lymarket` // 添
// export const BASE_URL = `http://192.168.1.42:50001/lymarket` // 杰
// export const BASE_URL = `http://192.168.1.7:50002/lymarket` // 添
export const BASE_URL = `http://192.168.1.42:50001/lymarket` // 杰
// CDN
// 生成密钥

View File

@ -1,5 +1,5 @@
import {Textarea, View } from "@tarojs/components";
import { memo, useMemo, useState } from "react";
import { memo, useEffect, useMemo, useState } from "react";
import styles from './index.module.scss'
import classnames from "classnames";
@ -17,8 +17,7 @@ export default memo(({onChange, title = '', placeholder = '请输入', defaultVa
count: 200,
show: false
})
const getDesc = (e) => {
let value = e.detail.value
const getDesc = (value) => {
let res = value
if(value.length > descData.count) {
res = value.slice(0, descData.count)
@ -27,6 +26,10 @@ export default memo(({onChange, title = '', placeholder = '请输入', defaultVa
onChange?.(res)
}
useEffect(() => {
getDesc(defaultValue)
}, [defaultValue])
const toggleShowRealTextarea = (show) => {
setDescData({...descData, show:show})
}
@ -34,7 +37,7 @@ export default memo(({onChange, title = '', placeholder = '请输入', defaultVa
<View className={styles.other_desc}>
<View className={styles.title}>{title}</View>
<View className={styles.textarea}>
{descData.show&&<Textarea autoFocus value={descData.value} onBlur={() => toggleShowRealTextarea(false)} className={styles.textarea_con} cursorSpacing={100} maxlength={descData.count} onInput={(e) => getDesc(e)}></Textarea>||
{descData.show&&<Textarea autoFocus value={descData.value} onBlur={() => toggleShowRealTextarea(false)} className={styles.textarea_con} cursorSpacing={100} maxlength={descData.count} onInput={(e) => getDesc(e.detail.value)}></Textarea>||
<View className={classnames(styles.textarea_con_pretend, descData.value&&styles.textarea_con_pretend_ed)} onClick={() => toggleShowRealTextarea(true)}>{descData.value||placeholder}</View>
}
<View className={styles.descDataNum}>{descData.number +'/'+ descData.count}</View>

View File

@ -8,11 +8,17 @@ import styles from './index.module.scss'
//图片列表
type ImageParam = {
onChange?:(val: string[]) => void
onChange?:(val: string[]) => void,
defaultList?: string[]
}
const PictureItem:FC<ImageParam> = memo(({onChange}) => {
const PictureItem:FC<ImageParam> = memo(({onChange, defaultList = []}) => {
const {getWxPhoto} = useUploadCDNImg()
const [imageList, setImageLise] = useState<string[]>([])
useEffect(() => {
setImageLise(defaultList)
}, [defaultList])
//上传图片
const uploadImage = async () => {
let res:any = await getWxPhoto('after-sale')

View File

@ -0,0 +1,194 @@
import Search from "@/components/search"
import useLogin from "@/use/useLogin"
import { Image, ScrollView, Text, View } from "@tarojs/components"
import Taro, { useDidShow, usePullDownRefresh, useRouter } 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 {GetOrderStatusListApi, GetOrderListApi, OrderStatusListApi} from '@/api/order'
import { dataLoadingStatus, getFilterData } from "@/common/util"
import OrderStatusList from "./components/orderStatusList"
import Payment from "../order/components/payment"
import { ORDER_STATUS } from "@/common/enum"
import { AddShoppingCartApi } from "@/api/shopCart"
import ShopCart from "@/components/shopCart"
import ApplyRefund from "./components/applyRefund"
import { alert } from "@/common/common"
export default () => {
const {checkLogin} = useLogin()
useDidShow(async () => {
await checkLogin()
})
//搜索参数
const [searchField, setSearchField] = useState({
status: -1,
page : 1,
size : 10,
Name:''
})
//获取订单状态
const {fetchData: orderStatusListFetchData} = OrderStatusListApi()
const [statusList, setStatusList] = useState<any[]>([{id: -1, name: '全部'}])
const getOrderStatusList = () => {
const status = Object.values(ORDER_STATUS).map(item => {
return {id: item.value, name: item.label}
})
setStatusList((e) => [...e, ...status])
}
useEffect(() => {
getOrderStatusList()
}, [])
//获取订单列表
const {fetchData: listFetchData, state:orderState} = GetOrderListApi()
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})
setRefresherTriggeredStatus(() => false)
}
//监听筛选条件变化
useEffect(() => {
getOrderList()
}, [searchField])
//上拉加载数据
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({...searchField, size })
}
}, [orderData])
//状态改变
const changeStatus = useCallback((e) => {
pageNum.current.page = 1
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})
}, [orderData, orderState])
//输入了搜索关键字
const getSearchData = useCallback((e) => {
pageNum.current.page = 1
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}))
}
//监听点击的按钮
const clickOrderBtn = useCallback(({status, orderInfo}) => {
setCallBackPayOrderInfo(() => orderInfo)
if(status == 1 || status == 6) {
getOrderList()
} else if(status == 2) {
//去支付
toPay()
} else if (status == 3) {
//申请退款
if(!orderInfo?.av_return_roll) return alert.none('该订单已申请过退款')
setRefundShow(true)
} else if (status == 7) {
//购买
addShopCart(orderInfo)
}
}, [orderData])
const [callBackOrderInfo, setCallBackPayOrderInfo] = useState<any>()
//去付款
const [payMentShow, setPayMentShow] = useState(false)
const toPay = () => {
setPayMentShow(true)
}
//关闭支付弹窗
const closePayShow = useCallback(() => {
setPayMentShow(() => false)
}, [])
//支付成功
const onPaySuccess = useCallback(() => {
getOrderList()
closePayShow()
}, [])
//添加购物车
const [showCart, setShowCart] = useState(false)
const {fetchData:addFetchData} = AddShoppingCartApi()
const addShopCart = async (item) => {
let color_list:{product_color_id: number, roll?: number, length?: number}[] = []
item?.product_list.map(pitem => {
pitem?.product_colors.map(citem => {
if(item?.sale_mode == 0) {
return color_list.push({product_color_id: citem.id, roll: citem.roll})
} else {
return color_list.push({product_color_id: citem.id, length: citem.length})
}
})
})
const state = await addFetchData({
sale_mode: item?.sale_mode,
color_list
})
if(state.success) {
Taro.showToast({
title:'已加入购物车'
})
setShowCart(true)
} else {
Taro.showToast({
icon:'none',
title: state.msg
})
}
}
//申请退款
const [refundShow, setRefundShow] = useState(false)
const applyRefundClose = useCallback(() => {
setRefundShow(false)
}, [])
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={false} 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>
<ApplyRefund show={refundShow} onClose={applyRefundClose} orderId={callBackOrderInfo?.id}/>
<ShopCart show={showCart} onClose={() => setShowCart(false)}/>
<Payment onSubmitSuccess={onPaySuccess} show={payMentShow} onClose={closePayShow} orderInfo={callBackOrderInfo}/>
</View>
)
}

View File

@ -1,17 +1,15 @@
import Search from "@/components/search"
import useLogin from "@/use/useLogin"
import { Image, ScrollView, Text, View } from "@tarojs/components"
import Taro, { useDidShow, usePullDownRefresh, useRouter } from "@tarojs/taro"
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 {GetOrderStatusListApi, GetOrderListApi} from '@/api/order'
import { GetOrderListApi, OrderStatusListApi} from '@/api/order'
import { dataLoadingStatus, getFilterData } from "@/common/util"
import OrderStatusList from "./components/orderStatusList"
import Payment from "../order/components/payment"
import { ORDER_STATUS } from "@/common/enum"
import { AddShoppingCartApi } from "@/api/shopCart"
import ShopCart from "@/components/shopCart"
import ApplyRefund from "./components/applyRefund"
@ -32,13 +30,11 @@ export default () => {
})
//获取订单状态
// const {fetchData: statusFetchData} = GetOrderStatusListApi()
const {fetchData: orderStatusListFetchData} = OrderStatusListApi()
const [statusList, setStatusList] = useState<any[]>([{id: -1, name: '全部'}])
const getOrderStatusList = () => {
const status = Object.values(ORDER_STATUS).map(item => {
return {id: item.value, name: item.label}
})
setStatusList((e) => [...e, ...status])
const getOrderStatusList = async () => {
let res = await orderStatusListFetchData()
setStatusList((e) => [...e, ...res.data.list])
}
useEffect(() => {
getOrderStatusList()

View File

@ -11,9 +11,11 @@ type Param = {
show?: true|false,
onClose?: () => void,
onSubmit?: () => void,
id?: number //订单id
id?: number, //订单id
images: string[], //图片列表
descValue?: string, //描述
}
export default memo(({show = false, onClose, onSubmit, id = 0}: Param) => {
export default memo(({show = false, onClose, onSubmit, id = 0, images = [], descValue = ''}: Param) => {
//需要提交的数据
const submitData = useRef({
accessory_url: [],
@ -45,6 +47,7 @@ export default memo(({show = false, onClose, onSubmit, id = 0}: Param) => {
} else {
alert.error('上传失败')
}
onSubmit?.()
}
return (
@ -54,11 +57,11 @@ export default memo(({show = false, onClose, onSubmit, id = 0}: Param) => {
<View className={styles.logistics_image}>
<Text className={styles.title_desc}></Text>
<View className={styles.upload_image}>
<UploadImage onChange={getImageList}/>
<UploadImage onChange={getImageList} defaultList={images}/>
</View>
</View>
<View className={styles.logistics_desc}>
<TextareaEnhance onChange={getOtherReason} title="备注:" placeholder="请输入备注信息"/>
<TextareaEnhance defaultValue={descValue} onChange={getOtherReason} title="备注:" placeholder="请输入备注信息"/>
</View>
<View className={styles.btns_two}>
<View className={styles.verify_btn } onClick={() => onSubmitEven()}></View>

View File

@ -116,9 +116,13 @@ import styles from './index.module.scss'
})
}
}, [orderDetail])
const onCloseLogistics = useCallback(() => setLogisticsShow(false), [])
const onCloseLogistics = useCallback(() => {
setLogisticsShow(false)
}, [])
//物流成功上传
const logisticsSuccess = useCallback(() => {
console.log('12312132121113')
setLogisticsShow(false)
getSaleOrderPreView()
}, [])
@ -137,7 +141,7 @@ import styles from './index.module.scss'
<AfterOrderBtns orderInfo={orderInfo} onClick={orderStateClick} />
</View>
<AfterSalePricture urls={orderDetail?.fabric_piece_accessory_url}/>
<ReturnLogistics show={logisticsShow} id={orderDetail?.return_apply_order_id} onClose={onCloseLogistics} onSubmit={logisticsSuccess}/>
<ReturnLogistics 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>

View File

@ -10,7 +10,7 @@ import InfiniteScroll from "@/components/infiniteScroll"
import { dataLoadingStatus, getFilterData } from "@/common/util"
import OrderStatusList from "./components/orderStatusList"
import { AFTER_ORDER_STATUS } from "@/common/enum"
import { GetSaleOrderListApi, RefundOrderSatausApi } from "@/api/salesAfterOrder"
import { GetSaleOrderListApi } from "@/api/salesAfterOrder"
import ReturnLogistics from "./components/returnLogistics"
export default () => {
@ -29,10 +29,11 @@ export default () => {
//获取订单状态
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])
const getOrderStatusList = () => {
const status = Object.values(AFTER_ORDER_STATUS).map(item => {
return {id: item.value, name: item.label}
})
setStatusList((e) => [...e, ...status])
}
useEffect(() => {
getOrderStatusList()

View File

@ -10,7 +10,7 @@ import InfiniteScroll from "@/components/infiniteScroll"
import { dataLoadingStatus, getFilterData } from "@/common/util"
import OrderStatusList from "./components/orderStatusList"
import { AFTER_ORDER_STATUS } from "@/common/enum"
import { GetSaleOrderListApi } from "@/api/salesAfterOrder"
import { GetSaleOrderListApi, RefundOrderSatausApi } from "@/api/salesAfterOrder"
import ReturnLogistics from "./components/returnLogistics"
export default () => {
@ -29,11 +29,10 @@ export default () => {
//获取订单状态
const [statusList, setStatusList] = useState<any[]>([{id: -1, name: '全部'}])
const getOrderStatusList = () => {
const status = Object.values(AFTER_ORDER_STATUS).map(item => {
return {id: item.value, name: item.label}
})
setStatusList((e) => [...e, ...status])
const {fetchData: fetchDataStatus} = RefundOrderSatausApi()
const getOrderStatusList = async () => {
let res = await fetchDataStatus()
setStatusList((e) => [...e, ...res.data.list])
}
useEffect(() => {
getOrderStatusList()