This commit is contained in:
czm 2022-06-10 10:20:51 +08:00
commit 8257f23a1d
23 changed files with 407 additions and 110 deletions

View File

@ -84,9 +84,19 @@ export const SaleOrderApi = () => {
/**
*
*/
export const CancelOrderApi = () => {
export const CancelOrderApi = () => {
return useRequest({
url: `/v1/mall/saleOrder/cancel`,
method: "put",
})
}
/**
*
*/
export const ReceiveOrderApi = () => {
return useRequest({
url: `/v1/mall/saleOrder/receive`,
method: "put",
})
}

View File

@ -164,6 +164,12 @@ export default {
pages: [
"index",
]
},
{
root: "pages/applyAfterSales",
pages: [
"index",
]
}
]
}

View File

@ -9,7 +9,11 @@
// export const BASE_URL = `http://192.168.1.30:50001/lymarket` // 发
// export const BASE_URL = `https://dev.zzfzyc.com/lymarket` // 开发环境
// export const BASE_URL = `https://www.zzfzyc.com/lymarket` // 正式环境
<<<<<<< HEAD
// export const BASE_URL = `http://192.168.1.4:40001/lymarket` // 王霞
=======
// export const BASE_URL = `http://192.168.1.5:40001/lymarket` // 王霞
>>>>>>> 订单售后v2
export const BASE_URL = `http://192.168.1.224:50001/lymarket` // 添
// export const BASE_URL = `http://192.168.1.15:50001/lymarket` // 杰

View File

@ -129,22 +129,4 @@ const uploadCDNImg = (file, secene, type) => {
})
}
const taroChooseImg = () => {
Taro.chooseImage({
count: 1,
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: (res) => {
console.log('res:', res)
Taro.chooseMessageFile({
count: 1,
})
},
fail: (err) => {
console.log('图片选择失败:', err)
}
})
}
export default uploadCDNImg

View File

@ -2,13 +2,23 @@
display: flex;
justify-content: flex-end;
// margin-top: 30px;
.scroll{
white-space: nowrap;
width: 100%;
}
.list_scroll{
white-space: nowrap;
width: 100%;
display: flex;
justify-content: flex-end;
}
.btns_item{
width: 152px;
height: 72px;
padding: 0 10px;
height: 60px;
border: 2px solid #dddddd;
border-radius: 38px;
text-align: center;
line-height: 72px;
line-height: 60px;
font-size: $font_size;
color: $color_font_three;
&:nth-child(n+2) {

View File

@ -1,9 +1,9 @@
import { CancelOrderApi } from "@/api/order"
import { CancelOrderApi, ReceiveOrderApi } from "@/api/order"
import { alert } from "@/common/common"
import { ORDER_STATUS } from "@/common/enum"
import { View } from "@tarojs/components"
import { ScrollView, View } from "@tarojs/components"
import Taro from "@tarojs/taro"
import { useCallback, useRef, memo } from "react"
import { useCallback, useRef, memo, useState, useEffect } from "react"
import styles from './index.module.scss'
type Param = {
@ -24,7 +24,6 @@ export default memo(({orderInfo, onClick}:Param) => {
SaleOrderStatusArranged,
SaleOrderStatusWaitingDelivery,
SaleOrderStatusComplete,
SaleOrderStatusCancel,
SaleOrderStatusRefund,
SaleOrderStatusWaitingPayment,
SaleOrderStatusWaitingReceipt,
@ -73,23 +72,27 @@ export default memo(({orderInfo, onClick}:Param) => {
if(orderInfo) {
if(item.id == 1) {
//取消订单按钮
return( orderInfo.actual_amount == 0 && item.value.includes(orderInfo.status)) //在发货之前没有付过款
return( orderInfo.actual_amount == 0 && item.value.includes(orderInfo.status)) //在发货之前没有付过款
} else if (item.id == 2) {
//去付款按钮
return( orderInfo.wait_pay_amount != 0 && item.value.includes(orderInfo.status)) //只要没有付完款就显示
} else if(item.id == 3) {
//申请退款
return (orderInfo.actual_amount != 0 && item.value.includes(orderInfo.status)) //在发货之前付过款
return (orderInfo.actual_amount != 0 && item.value.includes(orderInfo.status)) //在发货之前付过款
} else {
//其他按钮
return item.value.includes(orderInfo.status)
}
}
},[orderInfo])
//点击按钮操作
const submitBtns = (val) => {
const submitBtns = (val, index) => {
clickEvent(val, index);
(val == 1)&&cancelOrder(); //取消订单按钮
(val == 2)&&onClick?.(val); //去付款按钮
(val == 2)&&onClick?.(2); //去付款按钮
(val == 6)&&receiveOrder(); //确认收货
}
//取消订单
@ -113,11 +116,53 @@ export default memo(({orderInfo, onClick}:Param) => {
})
}
//确认订单
const {fetchData: receiveOrderFetchData} = ReceiveOrderApi()
const receiveOrder = async () => {
console.log('123456')
Taro.showModal({
title: '确定收货?',
success: async function (res) {
if (res.confirm) {
let res = await receiveOrderFetchData({sale_order_id: orderInfo?.orderId})
if(res.success){
onClick?.(6)
alert.success('收货成功')
} else {
alert.error('收货失败')
}
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
}
//按钮点击滚动
const [selectInfo, setSelectInfo] = useState({
selected: -1, //当前选中的id
tabId: '', //需要滚动到的id
})
const clickEvent = (id, index) => {
console.log(id, index)
const num = index > 0?( index - 1) : 0
console.log('num::',orderBtnsList.current[num].id)
setSelectInfo((e) => ({...e, tabId:orderBtnsList.current[num].id.toString(), selected: id}))
}
return (
<View className={styles.btns_list}>
{orderBtnsList.current.map((item) =>
orderBtnsShow(item)&&<View key={item.id} className={styles.btns_item} onClick={() => submitBtns(item.id)}>{item.label}</View>
)}
<ScrollView scrollX scrollIntoView={`orderBtns_${selectInfo.tabId}`} scrollWithAnimation={true} className={styles.scroll}>
<View className={styles.list_scroll}>
{orderBtnsList.current.map((item, index) =>
orderBtnsShow(item)&&<View key={item.id} className={styles.btns_item} onClick={() => submitBtns(item.id, index)}>{item.label}</View>
// <View key={item.id} id={`orderBtns_${item.id}`} className={styles.btns_item} onClick={() => submitBtns(item.id, index)}>{item.label}</View>
)}
</View>
</ScrollView>
</View>
)
})

View File

@ -62,7 +62,7 @@ export default memo((
</View>}
<View className={style.drawer_container_context}>
{children}
{show&&children}
</View>
<View className="common_safe_area_y"></View>
</View>

View File

@ -117,8 +117,6 @@ export default ({show = false, onClose}: param) => {
if(item.select) select_count++
}
})
console.log('list_count::',list_count)
console.log('select_count::',select_count)
setSelectStatus(select_count == list_count)
}

View File

@ -0,0 +1,36 @@
.other_desc{
padding: 0 20px;
box-sizing: border-box;
.title{
font-size: $font_size;
font-weight: 700;
}
.textarea{
position: relative;
height: 165.4px;
.descDataNum{
position: absolute;
right: 10px;
bottom: 10px;
font-size: 22px;
color: #ABABAB;
}
}
.textarea_con, .textarea_con_pretend{
background-color: #f3f3f3;
border: 2px solid #e6e6e6;
border-radius: 10px;
width: 100%;
font-size: 25px;
height: 165.4px;
padding: 20px 20px 30px 20px;
box-sizing: border-box;
margin-top: 20px;
}
.textarea_con_pretend{
color: $color_font_two;
}
.textarea_con_pretend_ed{
color: #000;
}
}

View File

@ -0,0 +1,37 @@
import {Textarea, View } from "@tarojs/components";
import { memo, useMemo, useState } from "react";
import styles from './index.module.scss'
import classnames from "classnames";
//其他说明
export default memo(() => {
const [descData, setDescData] = useState({
number: 0,
value: '',
count: 200,
show: false
})
const getDesc = (e) => {
let value = e.detail.value
let res = value
if(value.length > descData.count) {
res = value.slice(0, descData.count)
}
setDescData({...descData, number:res.length, value: res})
}
const toggleShowRealTextarea = (show) => {
setDescData({...descData, show:show})
}
return (
<View className={styles.other_desc}>
<View className={styles.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>||
<View className={classnames(styles.textarea_con_pretend, descData.value&&styles.textarea_con_pretend_ed)} onClick={() => toggleShowRealTextarea(true)}>{descData.value||'一般情况下选填,当退货说明=“其它问题”时,必填'}</View>
}
<View className={styles.descDataNum}>{descData.number +'/'+ descData.count}</View>
</View>
</View>
)
})

View File

@ -0,0 +1,27 @@
.reason_return_con{
height: 50vh;
.reason_title{
padding: 10px 20px 0 20px;
height: 60px;
border-bottom: 1PX solid #F3F3F3;
box-sizing: border-box;
Text{
font-size: 26px;
border-bottom: 3px solid #000;
padding: 10px;
font-weight: 400;
}
}
.reason_scroll{
height: calc(100% - 70px);
.reason_list{
font-size: 26px;
padding: 30px 20px 0 20px;
color: #707070;
.reason_item{
margin-bottom: 36px;
}
}
}
}

View File

@ -0,0 +1,44 @@
import Popup from "@/components/popup";
import { ScrollView, Text, View } from "@tarojs/components";
import { memo, useMemo } from "react";
import styles from './index.module.scss'
type ReasonParam = 1|2|3 //1 退货原因 2 货物状况 3 退货说明
//原因选择
type ReasonInfoParam = {
show?: boolean,
onClose?: () => void,
status: ReasonParam
}
export default memo(({show = false, onClose, status}: ReasonInfoParam) => {
const title = useMemo(() => {
if(status == 1) return '退货原因'
if(status == 2) return '货物状况'
if(status == 3) return '退货说明'
},[status])
return (
<Popup showIconButton={false} show={show} title="申请退货" onClose={onClose} >
<View className={styles.reason_return_con}>
<View className={styles.reason_title}><Text>{title}</Text></View>
<ScrollView scrollY className={styles.reason_scroll}>
<View className={styles.reason_list}>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
<View className={styles.reason_item}></View>
</View>
</ScrollView>
</View>
</Popup>
)
})

View File

@ -0,0 +1,4 @@
export default {
navigationBarTitleText: '申请售后',
enableShareAppMessage: true,
}

View File

@ -10,6 +10,7 @@
width: 100%;
padding: 20px;
box-sizing: border-box;
border-bottom: 1PX solid #f3f3f3;
text{
background-color: #F6F6F6;
border-radius: 10px;
@ -22,9 +23,11 @@
}
}
.apply_after_sales_con{
height: 80vh;
.scroll{
height: calc(100% - 80px);
height: calc(100% - 170px);
}
.scroll_con{
padding: 20px 0 150px 0;
}
.returnSaleInput{
margin: 0 20px;
@ -34,9 +37,11 @@
display: flex;
align-items: center;
padding-bottom: 20px;
flex-wrap: wrap;
.title{
font-size: $font_size;
font-weight: 700;
width: 119px;
}
.select{
flex:1;
@ -67,6 +72,8 @@
justify-content: center;
align-items: center;
position: relative;
margin-bottom: 20px;
position: relative;
.miconfont{
font-size: 50px;
}
@ -74,39 +81,38 @@
font-size: 26px;
color: $color_font_three;
}
}
}
}
.other_desc{
padding: 0 20px;
box-sizing: border-box;
.title{
font-size: $font_size;
font-weight: 700;
}
.uploadImg{
position: relative;
.descDataNum{
position: absolute;
right: 10px;
bottom: 10px;
font-size: 22px;
color: #ABABAB;
.ImgItem{
width: 202px;
height: 150px;
background: #f0f0f0;
margin-left: 20px;
margin-bottom: 20px;
position: relative;
border-radius: 10px;
image{
width: 100%;
height: 100%;
border-radius: 10px;
}
.miconfont_close{
width: 30px;
height: 30px;
background-color: #ccc;
border-radius: 50%;
position: absolute;
right: -10px;
top: -10px;
text-align: center;
line-height: 30px;
color: #fff;
}
}
}
Textarea{
background-color: #f3f3f3;
border: 2px solid #e6e6e6;
border-radius: 10px;
width: 100%;
font-size: 25px;
height: 165.4px;
padding: 20px 20px 30px 20px;
box-sizing: border-box;
margin-top: 20px;
}
}
}
.apply_after_sales_list{
padding: 0 20px;
@ -172,5 +178,42 @@
}
}
.btns_con{
width: 100%;
position: fixed;
bottom:0;
padding: 0 20px;
box-sizing: border-box;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
.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;
}
}
}
}

View File

@ -1,20 +1,36 @@
import { Image, ScrollView, Text, Textarea, View } from "@tarojs/components";
import { memo, useState } from "react";
import { memo, useCallback, useMemo, useState } from "react";
import classnames from "classnames";
import styles from './index.module.scss'
import Popup from "@/components/popup";
import { formatImgUrl } from "@/common/fotmat";
import Counter from "@/components/counter";
import ReasonPopup from "./components/reasonPopup";
import OtherReason from "./components/otherReason";
import Taro from "@tarojs/taro";
import uploadCDNImg from "@/common/uploadImage";
export default memo(() => {
type ReasonParam = 1|2|3 //1 退货原因 2 货物状况 3 退货说明
export default () => {
const [showDesc, setShowDesc] = useState(true)
//退货选择弹窗
const [showReason, setShowReason] = useState<{show:true|false, status:ReasonParam}>({show:false, status:1})
const closeReason = useCallback(() => setShowReason({...showReason, show:false}), [])
const onShowReason = (status) => setShowReason({...showReason, status, show:true})
//底部按钮
const onSubmit = (val) => {
}
return (
<View className={styles.apply_after_sales_main}>
<Popup showIconButton={true} show={showDesc} showTitle={false} onClose={() => setShowDesc(false)} >
<View className={styles.apply_after_sales_con}>
<View className={styles.apply_after_sales_head}>退</View>
<View className={styles.kind_number}><Text>236</Text></View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.apply_after_sales_con}>
<View className={styles.kind_number}><Text>236</Text></View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.scroll_con}>
<View className={styles.apply_after_sales_list}>
<View className={styles.apply_after_sales_item}>
<View className={styles.apply_after_sales_title}>
@ -64,45 +80,74 @@ export default memo(() => {
<View className={styles.returnSaleInput}>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}>退</View>
<View className={styles.select}>
<View className={styles.select} onClick={() => onShowReason(1)}>
<Text></Text>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></Text>
</View>
</View>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}></View>
<View className={styles.select}>
<View className={styles.select} onClick={() => onShowReason(2)}>
<Text></Text>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></Text>
</View>
</View>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}>退</View>
<View className={styles.select}>
<View className={styles.select} onClick={() => onShowReason(3)}>
<Text></Text>
<Text className={classnames(styles.miconfont, 'iconfont icon-a-moreback')}></Text>
</View>
</View>
<View className={styles.returnSaleInput_item}>
<View className={styles.title}></View>
<View className={styles.uploadImg}>
<Text className={classnames(styles.miconfont, 'iconfont icon-saomazhifu')}></Text>
<Text className={styles.uploadText}></Text>
</View>
</View>
</View>
<View className={styles.other_desc}>
<View className={styles.title}></View>
<View className={styles.uploadImg}>
<Textarea placeholder="一般情况下选填,当退货说明=“其它问题”时,必填" cursorSpacing={100}></Textarea>
<View className={styles.descDataNum}>0/100</View>
<PictureItem/>
</View>
</View>
<View className="common_safe_area_y"></View>
</ScrollView>
</View>
</Popup>
<OtherReason/>
</View>
</ScrollView>
<View className="common_safe_area_y"></View>
</View>
<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 >
<ReasonPopup show={showReason.show} onClose={closeReason} status={showReason.status}/>
</View>
)
})
}
//图片列表
const PictureItem = memo(() => {
//图片
const uploadImage = () => {
Taro.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: function (res) {
// var tempFilePaths = res.tempFilePaths
const file = res.tempFiles[0]
console.log('res:::',res.tempFiles[0])
// uploadCDNImg(file, 'product', 'product')
}
})
}
return (
<>
<View className={styles.ImgItem}>
<Image mode="aspectFill" src={formatImgUrl('')} ></Image>
<View className={classnames(styles.miconfont_close, 'iconfont icon-qingkong')}></View>
</View>
<View className={styles.uploadImg } onClick={uploadImage}>
<Text className={classnames(styles.miconfont, 'iconfont icon-saomazhifu')}></Text>
<Text className={styles.uploadText}></Text>
</View>
</>
)
})

View File

@ -101,12 +101,17 @@
}
.order_address_list {
height: 900px;
height:80vh;
.order_address_title{
font-size: $font_size;
font-weight: 700;
width: 100%;
text-align: center;
padding: 20px 0 30px 0;
height: 100px;
}
.addressList_con{
padding-bottom: 20px;
height: calc(100% - 160px);
}
}

View File

@ -114,9 +114,10 @@ export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue =
<Popup show={showAddressList} showTitle={false} onClose={() => setShowAddressList(false)}>
<View className={styles.order_address_list}>
<View className={styles.order_address_title}></View>
<AddressList onSelect={getAddress}/>
<View className={styles.addressList_con}>
<AddressList onSelect={getAddress}/>
</View>
</View>
<View className="common_safe_area_y"></View>
</Popup>
</View>
)

View File

@ -16,7 +16,6 @@ import classnames from "classnames";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import order from "../orderList/components/order";
import AddressInfoDetail from "./components/addressInfoDetail";
import ApplyAfterSales from "./components/applyAfterSales";
import KindList from "./components/kindList";
import OrderState from "./components/orderState";
import Payment from "./components/payment";
@ -143,12 +142,10 @@ import styles from './index.module.scss'
//获取底部按钮点击, 获取按钮状态
const orderStateClick = useCallback((val) => {
console.log('val::', val)
if(val == 1) {
if(val == 1 || val == 6) {
//取消订单
getSaleOrderPreView()
}
if(val == 2) {
}else if(val == 2) {
//待付款
toPay()
}
@ -226,7 +223,6 @@ import styles from './index.module.scss'
<Remark onSave={(e) => getRemark(e)}/>
</Popup>
<Payment onSubmitSuccess={onPaySuccess} show={payMentShow} onClose={closePayShow} orderInfo={payOrderInfo} />
<ApplyAfterSales/>
<View className="common_safe_area_y"></View>
</View>
)

View File

@ -42,6 +42,9 @@
border-radius: 0px 20px 0px 20px;
}
}
.product_con{
margin-bottom: 20px;
}
.product_title{
display: flex;
align-items: center;

View File

@ -99,7 +99,6 @@ export default memo(({value, onClickBtn}: Param) => {
<View className={styles.color_count_num}>{`${value?.total_fabrics}种面料,${value?.total_colors}种颜色,共${value?.total_number}`}</View>
</View>
<OrderBtns orderInfo={orderInfo} onClick={orderBtnsClick}/>
</View>
)
})

View File

@ -96,7 +96,10 @@ export default () => {
//监听点击的按钮
const clickOrderBtn = useCallback(({status, orderInfo}) => {
if(status == 2) {
console.log('status:::', status)
if(status == 1 || status == 6) {
getOrderList()
} else if(status == 2) {
//去支付
setPayOrderInfo({orderId:orderInfo.should_collect_order_id, payment_method:orderInfo.payment_method})
toPay()

View File

@ -39,6 +39,7 @@ export type UserAdminParam = {
wechat_user_open_id?: number
is_authorize_name?: false|true,
is_authorize_phone?: false|true,
phone?:string,
}
export type SortCodeParam = {

View File

@ -8,8 +8,6 @@ import { GetShortCodeApi } from "@/api/share"
export default () => {
const {setUserInfo, setAdminUserInfo, setSortCode, userInfo} = useUserInfo()
console.log('userInfo:::', userInfo)
//登录请求 (调用这个就不能再useHttp中使用当前这个hook, 否则会死循环内存溢出)
// const {fetchData} = LoginApi()
@ -28,7 +26,7 @@ export default () => {
const {fetchData: useFetchData} = GetAdminUserInfoApi()
const getAdminUserInfo = async () => {
let res = await useFetchData()
setAdminUserInfo(res.data)
setAdminUserInfo({...res.data})
getShortCode(res.data.user_id)
}
@ -76,7 +74,7 @@ export default () => {
})
if(user_res.success) {
setUserInfo({...user_res.data})
reslove(user_res.data)
getAdminUserInfo()
} else {
console.log('aaa:::',user_res.msg)
@ -95,7 +93,7 @@ export default () => {
//获取手机号码
const {fetchData: fetchDataUserPhone} = GetPhoneNumberApi()
const getPhoneNumber = (code) =>{
const getPhoneNumber = (code) => {
return new Promise( async (reslove, reject) => {
if(userInfo.adminUserInfo?.is_authorize_phone) {
reslove(true)