diff --git a/src/api/share.ts b/src/api/share.ts new file mode 100644 index 0000000..aaecc87 --- /dev/null +++ b/src/api/share.ts @@ -0,0 +1,31 @@ +import { useRequest } from "@/use/useHttp" + +/** + * 分享短码 + */ + export const GetShortCodeApi = () => { + return useRequest({ + url: `/v1/mall/shortCode/add`, + method: "post", + }) +} + +/** + * 解析短码 + */ + export const AnalysisShortCodeApi = () => { + return useRequest({ + url: `/v1/mall/shortCode`, + method: "get", + }) +} + +/** + * 绑定上下级 + */ +export const BindShortCodeApi = () => { + return useRequest({ + url: `/v1/mall/shortCode/bind`, + method: "post", + }) +} \ No newline at end of file diff --git a/src/app.config.ts b/src/app.config.ts index 2d92a16..61bd39e 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -146,6 +146,18 @@ export default { pages: [ "index" ] + }, + { + root: "pages/salesAfterList", + pages: [ + "index", + ] + }, + { + root: "pages/salesAfter", + pages: [ + "index", + ] } ] } diff --git a/src/app.tsx b/src/app.tsx index c5cff86..0b1ad6c 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -2,15 +2,52 @@ import { FC } from 'react' import ContextBlueTooth from "@/use/contextBlueTooth" import { Provider } from 'react-redux' import configStore from './store' - import './app.scss' +import Taro, { useDidShow} from '@tarojs/taro' +import { analysisShortCodeApi } from './common/shortCode' const store = configStore() -const App:FC = ({children}) => { +const App:FC = (params) => { + + Taro.showShareMenu({ + withShareTicket: true + }) + + useDidShow(() => { + console.log('params:',params) + }) + + const page = Taro.getCurrentInstance().page + console.log('res:::', page) + if(page && page.onShareAppMessage) { + //当有分享参数时,绑定上下级 + if(page.options?.share) { + analysisShortCodeApi(page.options.share) + } + page.onShareAppMessage = (res) => { + let path = '' + let title = '' + let imageUrl = '' + let sortCode = Taro.getStorageSync('sort_code')?JSON.parse(Taro.getStorageSync('sort_code')):'' + if(res.from === 'button') { + path = `/pages/details/index?share=${sortCode.shareShortDetail.code}` + title = sortCode.shareShortDetail.title + } else { + path = `/pages/index/index?share=${sortCode.shareShortPage.code}` + title = sortCode.shareShortPage.title + } + return { + title, + path, + imageUrl, + } + } + } + return ( - {children} + {params.children} ) diff --git a/src/common/constant.js b/src/common/constant.js index 0a47de3..40b4cdc 100644 --- a/src/common/constant.js +++ b/src/common/constant.js @@ -8,9 +8,9 @@ // export const BASE_URL = `http://192.168.1.30:40001/lymarket` // 发 // 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.224:50001/lymarket` // 添 -// export const BASE_URL = `http://192.168.1.15:50001/lymarket` // 添 +// export const BASE_URL = `http://192.168.1.4:40001/lymarket` // 王霞 +export const BASE_URL = `http://192.168.1.224:50001/lymarket` // 添 +// export const BASE_URL = `http://192.168.1.15:50001/lymarket` // 杰 // CDN // 生成密钥 diff --git a/src/common/enum.ts b/src/common/enum.ts index df57d45..00a8ec1 100644 --- a/src/common/enum.ts +++ b/src/common/enum.ts @@ -1,7 +1,41 @@ + +//订单状态枚举 export const ORDER_STATUS = { - 0:{value:0, label:'申请中'}, - 1:{value:1, label:'配布中'}, - 2:{value:2, label:'待发货'}, - 3:{value:3, label:'已发货'}, - 4:{value:4, label:'已完成'} + SaleOrderStatusBooking : {value:0, label:'待接单'}, // 待接单 + SaleOrderStatusArranging : {value:1, label:'配布中'}, // 配布中 + SaleOrderStatusArranged : {value:2, label:'已配布'}, // 已配布 + SaleOrderStatusWaitingPayment : {value:7, label:'待付款'}, // 待付款 + SaleOrderStatusWaitingDelivery : {value:3, label:'待发货'}, // 待发货 + SaleOrderStatusWaitingReceipt : {value:8, label:'待收货'}, // 待收货 + SaleOrderStatusAlreadyReceipt : {value:9, label:'已收货'}, // 已收货 + SaleOrderStatusComplete : {value:4, label:'已完成'}, // 已完成 + SaleOrderStatusRefund : {value:6, label:'已退款'}, // 已退款 + SaleOrderStatusCancel : {value:5, label:'已取消'}, // 已取消 +} + +//售后单状态枚举 +export const AFTER_ORDER_STATUS = { + SaleOrderStatusBooking : {value:0, label:'申请中'}, + SaleOrderStatusArranging : {value:1, label:'退货中'}, + SaleOrderStatusArranged : {value:2, label:'待验布'}, + SaleOrderStatusWaitingPayment : {value:7, label:'退款中'}, + SaleOrderStatusWaitingDelivery : {value:3, label:'已退款'}, + SaleOrderStatusWaitingReceipt : {value:8, label:'已取消'}, + SaleOrderStatusAlreadyReceipt : {value:9, label:'已拒绝'}, +} + +//支付方式 +export const PAYMENT_METHOD = { + PaymentMethodPreDeposit: {value:1, label:'预存款'}, + PaymentMethodAccountPeriod : {value:2, label:'账期'}, + PaymentMethodofflineRemittance: {value:3, label:'线下汇款'}, + PaymentMethodScanCodeToPay: {value:4, label:'扫码支付'}, + PaymentMethodCashOnDelivery: {value:5, label:'货到付款'}, +} +export type PAYMENT_METHOD_PARAM = 1|2|3|4|5 + +//分享场景枚举 +export const SHARE_SCENE = { + ShareDetail: {value:1, label:'详情分享'}, + SharePage : {value:2, label:'页面分享'}, } \ No newline at end of file diff --git a/src/common/shortCode/index.js b/src/common/shortCode/index.js new file mode 100644 index 0000000..7e32a27 --- /dev/null +++ b/src/common/shortCode/index.js @@ -0,0 +1,33 @@ +import Taro from "@tarojs/taro" +import { BASE_URL } from "../constant" + +//解析短码(主要用于右上角按钮分享) +export const analysisShortCodeApi = (val) => { + //解析短码 + Taro.request({ + url:BASE_URL+'/v1/mall/shortCode', + method:"GET", + data:{md5_key: val}, + success:(res) => { + if(res.data.code == 0) { + //绑定上下级 + bindParent(res.data.data.share_user_id) + } + } + }) +} + +//绑定上下级 +const bindParent = (share_user_id) => { + //绑定上下级 + Taro.request({ + url:BASE_URL+'/v1/mall/shortCode/bind', + method:"POST", + data:{share_user_id: share_user_id}, + success:(res) => { + if(res.data.code == 0) { + //绑定上下级 + } + } + }) + } \ No newline at end of file diff --git a/src/components/counter/index.module.scss b/src/components/counter/index.module.scss new file mode 100644 index 0000000..fe96cca --- /dev/null +++ b/src/components/counter/index.module.scss @@ -0,0 +1,37 @@ + +.main{ + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + .reduce, .plus{ + font-size: $font_size_big; + color: $color_main; + width: 46px; + height: 46px; + display: flex; + align-items: center; + justify-content:center; + font-size: 50px; + background-color: $color_main; + color: #fff; + border-radius: 8px; + } + .input{ + display: flex; + align-items: flex-end; + background-color: #fff; + padding: 5px 10px; + box-sizing: border-box; + width: 106px; + border-radius: 10px; + } + input{ + font-size: $font_size_medium; + } + .unit{ + font-size: $font_size_min; + color: $color_font_two; + } + +} \ No newline at end of file diff --git a/src/components/counter/index.tsx b/src/components/counter/index.tsx new file mode 100644 index 0000000..d7f632d --- /dev/null +++ b/src/components/counter/index.tsx @@ -0,0 +1,111 @@ +import { Input, View } from "@tarojs/components" +import { useEffect, useMemo, useRef, useState } from "react" +import Big from 'big.js' +import styles from "./index.module.scss" +type params = { + minNum?: number, //最小值 + maxNum?: number, //最大值 + step?: number, //步长 + defaultNum?: number, //默认值 + digits?: number //多少位小数 + onChange?:(val:number) => void, + onBlue?:(val:number) => void, //失去焦点触发 + onClickBtn?:(val:number) => void, + unit?: string +} +export default ({minNum = 0, maxNum = 100, step=1, digits = 0, defaultNum = 0, onChange, onBlue, onClickBtn, unit = ''}: params) => { + const [value, setValue] = useState({count:defaultNum}) + + const onPlus = () => { + let {count} = value + let num_res = Big(count).add(step).toNumber() + num_res = num_res >= maxNum?maxNum:num_res + num_res = formatDigits(num_res) + setValue({...value, count:num_res}) + onChange?.(parseFloat(num_res)) + onClickBtn?.(parseFloat(num_res)) + } + const minus = () => { + let {count} = value + let num_res = Big(count).minus(step).toNumber() + num_res = num_res < minNum?0:num_res + setValue({...value, count:num_res}) + onChange?.(parseFloat(num_res)) + onClickBtn?.(parseFloat(num_res)) + } + + //保留小数 + const formatDigits = (num) => { + num = num + '' + if(num.includes('.')&&digits > 0) { + console.log('num::',num.includes('.')) + let res = num.split('.') + let last_num = res[1].substr(0, digits) + return res[0] + '.' + last_num + } + return parseFloat(num) + } + + //检查数据 + const checkData = (val) => { + let num = parseFloat(val) + if(num > maxNum) return maxNum + if(num < minNum) return minNum + return val + } + + + const onInputEven = (e) => { + let res = e.detail.value + if(res === '') { + setValue({...value, count:minNum}) + onChange?.(minNum) + } + else if(!isNaN(Number(res))) { + let count = formatDigits(res) + count = checkData(count) + setValue({...value, count}) + onChange?.(parseFloat(count as string)) + } else { + let num = parseFloat(res) + if(!isNaN(num)) { + let count = formatDigits(num) + count = checkData(count) + setValue({...value, count}) + onChange?.(count as number) + } else { + setValue({...value, count:defaultNum}) + onChange?.(defaultNum) + } + + } + } + + const onBluerEven = () => { + let num = parseFloat(value.count) + if(!isNaN(num)) { + let count = formatDigits(num) + count = checkData(count) + setValue({...value, count}) + onBlue?.(count as number) + } else { + setValue({...value, count:defaultNum}) + onBlue?.(defaultNum) + } + } + return ( + + minus()}>- + + + {unit} + + onPlus()}>+ + + ) +} \ No newline at end of file diff --git a/src/components/orderBtns/index.tsx b/src/components/orderBtns/index.tsx index 4ae23d6..f098520 100644 --- a/src/components/orderBtns/index.tsx +++ b/src/components/orderBtns/index.tsx @@ -1,5 +1,6 @@ import { CancelOrderApi } from "@/api/order" import { alert } from "@/common/common" +import { ORDER_STATUS } from "@/common/enum" import { View } from "@tarojs/components" import Taro from "@tarojs/taro" import { useCallback, useRef, memo } from "react" @@ -7,63 +8,83 @@ import styles from './index.module.scss' type Param = { orderInfo: { - status?: number, //订单状态 + status: number, //订单状态 orderId: number, //订单id - payModel: number, //支付方式 - realPayPrice: number, //实付金额 - pendingPayPrice: number, //待付金额 - }, + actual_amount: number, //实付金额 + wait_pay_amount: number, //待付金额 + }|null, onClick?: (val: number) => void //点击后触发的事件,返回订单状态 } + +// export const OrderBtnsemus = [{id:1, label:'取消订单'},{id:2, label:'去付款'},{id:3, label:'申请退款'},{id:4, label:'查看物流'}, {id:5, label:'申请退货'}, {id:6, label:'确认收货'}, {id:7, label:'再次购买'}] export default memo(({orderInfo, onClick}:Param) => { + const { + SaleOrderStatusBooking, + SaleOrderStatusArranging, + SaleOrderStatusArranged, + SaleOrderStatusWaitingDelivery, + SaleOrderStatusComplete, + SaleOrderStatusCancel, + SaleOrderStatusRefund, + SaleOrderStatusWaitingPayment, + SaleOrderStatusWaitingReceipt, + SaleOrderStatusAlreadyReceipt + } = ORDER_STATUS //订单按钮按订单状态归类 const orderBtnsList = useRef([ { id: 1, - value: [0, 1, 2, 3, 4], //取消订单按钮对应: 待接单,待配布,已配布, 待付款, 待发货 + value: [SaleOrderStatusBooking.value, SaleOrderStatusArranging.value, SaleOrderStatusArranged.value, SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value], //取消订单按钮对应: 待接单,配布中,已配布, 待付款, 待发货 label: '取消订单' }, { id: 2, - value: [3, 4], //去付款按钮对应:待付款, 待发货 + value: [SaleOrderStatusWaitingPayment.value, SaleOrderStatusWaitingDelivery.value, SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value], //去付款按钮对应:待付款, 待发货, 待收货, 已收货, 已完成 label: '去付款' }, { id: 3, - value: [4], //取消订单按钮对应: 待发货 + value: [SaleOrderStatusWaitingDelivery.value], //取消订单按钮对应: 待发货 label: '申请退款' }, { id: 4, - value: [5, 6, 7, 8], //取消订单按钮对应: 待收货, 已收货, 已完成, 已退款 + value: [SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusComplete.value, SaleOrderStatusRefund.value], //取消订单按钮对应: 待收货, 已收货, 已完成, 已退款 label: '查看物流' }, { id: 5, - value: [5, 6, 8], //取消订单按钮对应: 待收货, 已收货, 已退款 + value: [SaleOrderStatusWaitingReceipt.value, SaleOrderStatusAlreadyReceipt.value, SaleOrderStatusRefund.value], //取消订单按钮对应: 待收货, 已收货, 已退款 label: '申请退货' }, { id: 6, - value: [5], //取消订单按钮对应: 待收货 + value: [SaleOrderStatusWaitingReceipt.value], //取消订单按钮对应: 待收货 label: '确认收货' }, { id: 7, - value: [5,6,7,8], //取消订单按钮对应: 待收货,已收货,已完成, 已退款 + value: [SaleOrderStatusWaitingReceipt.value,SaleOrderStatusAlreadyReceipt.value,SaleOrderStatusComplete.value,SaleOrderStatusRefund.value], //取消订单按钮对应: 待收货,已收货,已完成, 已退款 label: '再次购买' } ]) //判断是否显示该按钮 - const orderBtnsShow = useCallback((item, status) => { - if(item.id == 1) { - return( orderInfo.realPayPrice == 0 && status <= 4) //在代发货之前没有付过款 - } - if(item.id == 2) { - return( orderInfo.pendingPayPrice != 0 && status <= 4) //在代发货之前没有付完款 + const orderBtnsShow = useCallback((item) => { + if(orderInfo) { + if(item.id == 1) { + //取消订单按钮 + 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)) //在代发货之前付过款 + } else { + return item.value.includes(orderInfo.status) + } } - return item.value.includes(status) - },[]) + },[orderInfo]) //点击按钮操作 const submitBtns = (val) => { @@ -73,12 +94,12 @@ export default memo(({orderInfo, onClick}:Param) => { //取消订单 const {fetchData: cancelFetchData} = CancelOrderApi() - const cancelOrder = () => { + const cancelOrder = () => { Taro.showModal({ title: '要取消该订单吗?', success: async function (res) { if (res.confirm) { - let res = await cancelFetchData({id: orderInfo.orderId}) + let res = await cancelFetchData({id: orderInfo?.orderId}) if(res.success) { alert.success('取消成功') onClick?.(1) @@ -94,8 +115,8 @@ export default memo(({orderInfo, onClick}:Param) => { return ( - {orderBtnsList.current.map((item, index) => - orderBtnsShow(item, status)&& submitBtns(item.id)}>{item.label} + {orderBtnsList.current.map((item) => + orderBtnsShow(item)&& submitBtns(item.id)}>{item.label} )} ) diff --git a/src/components/searchInput/index.module.scss b/src/components/searchInput/index.module.scss index c381191..dcdd256 100644 --- a/src/components/searchInput/index.module.scss +++ b/src/components/searchInput/index.module.scss @@ -3,25 +3,25 @@ display: flex; align-items: center; min-height: 62px; - padding: 10px 0; border-bottom: 1px solid #F0F0F0; .searchInput_title { - width: 150px; + min-width: 145px; min-height: 50px; font-size: 28px; - border-right: 1px solid #F0F0F0; color: $color_font_two; margin-right: 20px; padding-left: 20px; display: flex; align-items: center; - - // &::before{ - // content: ""; - // height: 50px; - // width: 1px; - // background-color: #F0F0F0; - // } + position: relative; + &::before{ + content: ""; + height: 30px; + width: 1px; + background-color: #F0F0F0; + position: absolute; + right: 0; + } } .searchInput_con{ flex:1; diff --git a/src/components/searchInput/index.tsx b/src/components/searchInput/index.tsx index 4fe82cd..2fbaebf 100644 --- a/src/components/searchInput/index.tsx +++ b/src/components/searchInput/index.tsx @@ -13,7 +13,8 @@ type Params = { clickOnInput?: () => void, children?: ReactNode height?: number, - titleStyle?: Object + titleStyle?: Object, + styleObj?: Object } @@ -38,7 +39,7 @@ export default memo((props: Params) => { return {} }, [showBorder]) return ( - + {showTitle&&{title}} {!props.children&& clickOnInput?.()} onInput={(e) => changeOnInput?.(e.detail.value)}/> diff --git a/src/components/shopCart/index.tsx b/src/components/shopCart/index.tsx index 3caff3d..1ca3aa5 100644 --- a/src/components/shopCart/index.tsx +++ b/src/components/shopCart/index.tsx @@ -224,7 +224,7 @@ export default ({show = false, onClose}: param) => { {loading&&} - {!loading&&list?.length > 0&& + {!loading&&list?.length > 0&& {list?.map((item, index) => { return diff --git a/src/constants/userInfo.ts b/src/constants/userInfo.ts index b2f5338..88982c6 100644 --- a/src/constants/userInfo.ts +++ b/src/constants/userInfo.ts @@ -2,7 +2,9 @@ export const SET_USERINFO = 'setUserInfo' export const SET_ADMINUSERINFO = 'setAdminUserInfo' export const SET_TOKEN = 'setToken' export const SET_SESSIONKEY = 'setSessionkey' +export const SET_SORTCODE = 'setSortCode' export const CLEAR_TOKEN = 'clearToken' export const CLEAR_SESSIONKEY = 'clearSessionkey' export const CLEAR_USERINFO = 'clearUserInfo' -export const CLEAR_ADMINUSERINFO = 'clearAdminUserInfo' \ No newline at end of file +export const CLEAR_ADMINUSERINFO = 'clearAdminUserInfo' +export const CLEAR_SORTCODE = 'clearSortCode' \ No newline at end of file diff --git a/src/pages/details/components/swiper/index.tsx b/src/pages/details/components/swiper/index.tsx index be07358..a0cb48e 100644 --- a/src/pages/details/components/swiper/index.tsx +++ b/src/pages/details/components/swiper/index.tsx @@ -4,12 +4,11 @@ import { useMemo, useRef, useState } from "react" import styles from './index.module.scss' type item = {title:string, img:string, url:string, id:number} - type params = { list?: item[] } + export default ({list = []}: params) => { - const [pageIndex, setPageIndex] = useState(1) const pageRef = useRef(null) @@ -26,13 +25,13 @@ export default ({list = []}: params) => { swiperChange(e)}> {list.map((item) => { return - - - + + + })} - {pageIndex+'/'+pageCount} + {(list.length > 0)&&{pageIndex+'/'+pageCount}} ) } \ No newline at end of file diff --git a/src/pages/details/index.config.ts b/src/pages/details/index.config.ts index f0757fd..20c0853 100644 --- a/src/pages/details/index.config.ts +++ b/src/pages/details/index.config.ts @@ -1,5 +1,6 @@ export default { navigationBarTitleText: '详情', enablePullDownRefresh: true, - backgroundTextStyle: 'dark' + backgroundTextStyle: 'dark', + enableShareAppMessage: true } diff --git a/src/pages/details/index.tsx b/src/pages/details/index.tsx index c845f9e..b7afb2c 100644 --- a/src/pages/details/index.tsx +++ b/src/pages/details/index.tsx @@ -1,5 +1,5 @@ -import { Button, CustomWrapper, Image, RichText, ScrollView, Swiper, SwiperItem, Text, View } from '@tarojs/components' +import { Button, CustomWrapper, Image, RichText, Text, View } from '@tarojs/components' import Taro, { useDidShow, usePullDownRefresh, useRouter, useShareAppMessage } from '@tarojs/taro'; import classnames from "classnames"; import DesSwiper from './components/swiper'; @@ -7,56 +7,81 @@ import OrderCount from './components/orderCount'; import ShopCart from '@/components/shopCart'; import Preview,{colorItem} from './components/preview'; import styles from './index.module.scss' -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import {formatHashTag, formatImgUrl} from '@/common/fotmat' -import useManualPullDownRefresh from '@/use/useManualPullDownRefresh'; -import { goLink } from '@/common/common'; -import useUserInfo from '@/use/useUserInfo'; import {GetProductDetailApi} from '@/api/material' import useLogin from '@/use/useLogin'; +import { AnalysisShortCodeApi, BindShortCodeApi, GetShortCodeApi } from '@/api/share'; +import { SHARE_SCENE } from '@/common/enum'; +import useUserInfo from '@/use/useUserInfo'; type item = {title:string, img:string, url:string, id:number} -type params = { +type Params = { list?: item[] swiperOnClick?: (val: item) => void, style?: Object } -export default (props:params) => { +export default (props:Params) => { const {checkLogin, getPhoneNumber, userInfo} = useLogin() + //获取参数(有两种参数:1.商品id, 2.页面分享) + const router = useRouter() + const [params, setParams] = useState({id: '', share: null}) + + //判断是否是分享过来的参数 + const judgeParam = async () => { + if(router.params.id) { + setParams({...params, id:router.params.id}) + }else if(router.params.share) { + analysisShortCode() + } + } + + //解析短码参数 + const {fetchData: fetchDataAnalysisShortCode} = AnalysisShortCodeApi() + const analysisShortCode = async () => { + let res = await fetchDataAnalysisShortCode({md5_key: router.params.share}) + setParams({id: res.data.product_id, share: res.data}) + } + useDidShow(() => { checkLogin() + judgeParam() }) - const router = useRouter() - + useEffect(() => { + if(params.id) { + getProductDetail() + } + }, [params]) + //获取数据 const [productInfo, setProductInfo] = useState({}) const {fetchData} = GetProductDetailApi() - useEffect(() => { - getProductDetail() - }, []) const getProductDetail = async () => { - let {data} = await fetchData({id: router.params.id}) + let {data} = await fetchData({id: params.id}) setProductInfo(data) Taro.stopPullDownRefresh() } + useEffect(() => { + if(productInfo.code) getShortCode() + }, [productInfo]) + + //面料名称 const productName = useMemo(() => { return formatHashTag(productInfo.code, productInfo.name) },[productInfo]) const [showCart, setShowCart] = useState(false) - const [showOrderCount, setShowOrderCount] = useState(false) - const html = ` ` - + //弹窗提示 const [colorInfo, setColorInfo] = useState() const [showPreview, setShowPreview] = useState(false) const getColorItem = (item) => { @@ -67,6 +92,7 @@ export default (props:params) => { setShowPreview(true) } + //收藏功能 const [collectStatus, setCollectStatus] = useState(false) const changeCollect = () => { setCollectStatus(!collectStatus) @@ -77,18 +103,14 @@ export default (props:params) => { }) } - useShareAppMessage(res => { - if (res.from === 'button') { - // 来自页面内转发按钮 - console.log(res.target) - } - return { - title: '自定义转发标题', - path: '/pages/details/index?id=10', - imageUrl: '' - } - }) - + const {setSortCode, userInfo : userObj } = useUserInfo() + //详情页获取分享短码 + const {ShareDetail} = SHARE_SCENE + const {fetchData: fetchDataShortCode} = GetShortCodeApi() + const getShortCode = async () => { + const {data: resDetail} = await fetchDataShortCode({"share_user_id": userObj.adminUserInfo.user_id, type:ShareDetail.value, product_id: parseInt(params.id)}) + setSortCode({... userObj.sort_code, shareShortDetail: {title: productName as string, code: resDetail.md5_key, img:''}}) + } //开始下单 const placeOrder = async (e:any) => { @@ -108,7 +130,6 @@ export default (props:params) => { //页面下拉刷新 usePullDownRefresh(() => { getProductDetail() - }) @@ -123,13 +144,11 @@ export default (props:params) => { 分享 - changeCollect()}> 收藏 - diff --git a/src/pages/editOrder/index.config.ts b/src/pages/editOrder/index.config.ts index 1c3223c..52979d7 100644 --- a/src/pages/editOrder/index.config.ts +++ b/src/pages/editOrder/index.config.ts @@ -1,5 +1,6 @@ export default { navigationBarTitleText: '修改地址', enablePullDownRefresh: true, - backgroundTextStyle: 'dark' + backgroundTextStyle: 'dark', + enableShareAppMessage: true, } diff --git a/src/pages/index/index.config.ts b/src/pages/index/index.config.ts index 86e3b2e..c0922b9 100644 --- a/src/pages/index/index.config.ts +++ b/src/pages/index/index.config.ts @@ -1,3 +1,4 @@ export default { navigationBarTitleText: '首页', + enableShareAppMessage: true, } diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index de0e0b0..77a2031 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -8,10 +8,9 @@ import ShopCart from '@/components/shopCart' import { goLink } from '@/common/common' import styles from './index.module.scss' import React, { useEffect, useMemo, useRef, useState } from 'react' -import Taro, { Events, useDidShow, usePullDownRefresh, useRouter } from '@tarojs/taro' +import Taro, { Events, useDidShow, usePullDownRefresh} from '@tarojs/taro' import {GetProductKindListApi, GetProductListApi} from '@/api/material' import useLogin from '@/use/useLogin' -import LoadingCard from '@/components/loadingCard' import { dataLoadingStatus } from '@/common/util' export default () => { @@ -96,7 +95,7 @@ export default () => { //数据加载状态 const statusMore = useMemo(() => { return dataLoadingStatus({list:productData.list, total: productData.total, status: productState.loading}) - }, [productData]) + }, [productData, productState.loading]) return ( setShowShopCart(!showShopCart)}> diff --git a/src/pages/order/comfirm.config.ts b/src/pages/order/comfirm.config.ts index b0cb522..67ce23e 100644 --- a/src/pages/order/comfirm.config.ts +++ b/src/pages/order/comfirm.config.ts @@ -1,3 +1,4 @@ export default { - navigationBarTitleText: '确认订单' + navigationBarTitleText: '确认订单', + enableShareAppMessage: true, } diff --git a/src/pages/order/comfirm.tsx b/src/pages/order/comfirm.tsx index 3dd3e12..e8a8a45 100644 --- a/src/pages/order/comfirm.tsx +++ b/src/pages/order/comfirm.tsx @@ -31,7 +31,7 @@ import SubmitOrderBtn from "./components/submitOrderBtn"; const param = getParam() const idsAndSaleModel = useRef({shopping_cart_product_color_list:[], sale_mode:0}) useDidShow(async () => { - // await checkLogin() + idsAndSaleModel.current = {shopping_cart_product_color_list:[], sale_mode:0} //初始化 idsAndSaleModel.current.sale_mode = Number(param?.sale_mode) param?.ids?.split('-')?.map(item => { return idsAndSaleModel.current.shopping_cart_product_color_list?.push({ @@ -163,7 +163,7 @@ import SubmitOrderBtn from "./components/submitOrderBtn"; getAddress(e)} defaultValue={defaultAddress}/> - + setShowDesc(true)}> 订单备注 { diff --git a/src/pages/order/components/applyAfterSales/index.module.scss b/src/pages/order/components/applyAfterSales/index.module.scss new file mode 100644 index 0000000..594b36e --- /dev/null +++ b/src/pages/order/components/applyAfterSales/index.module.scss @@ -0,0 +1,63 @@ + +.apply_after_sales_main{ + .apply_after_sales_head{ + font-size: 30px; + text-align: center; + padding: 20px 0; + font-weight: 700; + } + .kind_number{ + width: 100%; + padding: 20px; + box-sizing: border-box; + text{ + background-color: #F6F6F6; + border-radius: 10px; + font-size: $font_size_medium; + padding: 5px 0; + text-align: center; + width: 100%; + display: block; + color: $color_font_three; + } + } + .apply_after_sales_con{ + padding: 0 20px; + .apply_after_sales_title{ + display: flex; + align-items: center; + .tag{ + font-size: $font_size_min; + background-color: #CDE5FF; + padding: 5px 10px; + border-radius: 6px; + color: $color_main; + } + .title{ + font-weight: 700; + font-size: $font_size; + margin-left: 20px; + flex:1; + } + } + .color_list { + .color_item{ + display: flex; + align-items: center; + } + .image{ + width: 70px; + height: 70px; + image{ + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .name_and_number{ + + } + } + } +} + diff --git a/src/pages/order/components/applyAfterSales/index.tsx b/src/pages/order/components/applyAfterSales/index.tsx new file mode 100644 index 0000000..1c6e31a --- /dev/null +++ b/src/pages/order/components/applyAfterSales/index.tsx @@ -0,0 +1,35 @@ +import { Image, Text, View } from "@tarojs/components"; +import { memo, 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"; + +export default memo(() => { + const [showDesc, setShowDesc] = useState(true) + return ( + + setShowDesc(false)} > + 申请退货 + 2种面料,3种颜色,共6条 + + + 大货 + 0770# 21S单面平纹(食毛) + + + + + 1# 薄荷绿x1 + + + + + + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/order/components/kindList/index.tsx b/src/pages/order/components/kindList/index.tsx index e6ea05a..e93be35 100644 --- a/src/pages/order/components/kindList/index.tsx +++ b/src/pages/order/components/kindList/index.tsx @@ -1,3 +1,4 @@ +import { ORDER_STATUS } from "@/common/enum" import { formatHashTag, formatPriceDiv } from "@/common/fotmat" import { View } from "@tarojs/components" import { memo, useCallback, useMemo } from "react" @@ -17,45 +18,122 @@ type OrderParam = { total_sale_price: number, //销售金额 total_should_collect_money: number, //应收金额 total_weight_error_discount: number, //空差优惠 - + the_previous_status: number, //取消订单时的订单状态 + actual_amount: number //实付金额 } -export default memo(({value}:{value?:OrderParam}) => { +type Param = { + order: OrderParam, + comfirm?: boolean //是否是确认订单页面使用 +} + +export default memo(({order, comfirm = false}:Param) => { //对应数量 const formatCount = useCallback((item) => { - return value?.sale_mode == 0? item.roll : Number(item.length / 100) - }, [value]) + return order?.sale_mode == 0? item.roll : Number(item.length / 100) + }, [order]) //对应单价 const standardPrice = useCallback(price => { - return formatPriceDiv(price).toLocaleString() + '/' + (value?.sale_mode == 1?'m':'kg') - }, [value]) + return formatPriceDiv(price).toLocaleString() + '/' + (order?.sale_mode == 1?'m':'kg') + }, [order]) //数量格式 const numText = useMemo(() => { - if(value) - return `${value?.total_fabrics}种面料,${value?.total_colors}种颜色,共${value?.total_number}${value?.unit}` - }, [value]) + if(order) + return `${order?.total_fabrics}种面料,${order?.total_colors}种颜色,共${order?.total_number}${order?.unit}` + }, [order]) + + const { + SaleOrderStatusBooking, // 待接单 + SaleOrderStatusArranging, // 配布中 + SaleOrderStatusArranged, // 已配布 + SaleOrderStatusWaitingPayment, // 待付款 + SaleOrderStatusWaitingDelivery, // 待发货 + SaleOrderStatusWaitingReceipt, // 待收货 + SaleOrderStatusAlreadyReceipt, // 已收货 + SaleOrderStatusComplete, // 已完成 + SaleOrderStatusRefund, // 已退款 + SaleOrderStatusCancel, // 已取消 + } = ORDER_STATUS + + //金额列表枚举 + const priceList = [ + { + id:1, + value:[SaleOrderStatusBooking.value, SaleOrderStatusArranging.value], + label:'预估金额', + field: 'estimate_amount' + }, + { + id:2, + 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(() => { - return ( - <> - {(value&&value.status < 3)&&} - {(value&&value.status >= 3)&&} - {(value&&value.status >= 3)&&} - {(value&&value.status >= 3)&&} - - ) - }, [value]) + if(!order) return + //确认订单 + if(comfirm == true) { + return + } + //订单为取消订单状态 + if(order?.status == SaleOrderStatusCancel.value) { + return ( + <> + { + priceList.map(item => { + return <>{showPrice(item, order?.the_previous_status)&&} + }) + } + + ) + } else { + return ( + <> + { + priceList.map(item => { + return <>{showPrice(item, order?.status)&&} + }) + } + + ) + } + }, [order]) return ( <> {numText} { - value?.list?.map(item => { + order?.list?.map(item => { return - {value.sale_mode_name} + {order.sale_mode_name} {formatHashTag(item.code, item.name)} 共{item?.product_colors.length}种 @@ -69,7 +147,7 @@ export default memo(({value}:{value?:OrderParam}) => { ¥{standardPrice(colorItem.sale_price)} - ×{formatCount(colorItem)}{value.unit} + ×{formatCount(colorItem)}{order.unit} ¥{formatPriceDiv(colorItem.estimate_amount).toLocaleString()} diff --git a/src/pages/order/components/orderState/index.tsx b/src/pages/order/components/orderState/index.tsx index 0ba593d..18ac43d 100644 --- a/src/pages/order/components/orderState/index.tsx +++ b/src/pages/order/components/orderState/index.tsx @@ -3,13 +3,29 @@ import { memo, useMemo, useState } from "react" import styles from './index.module.scss' import classnames from "classnames"; import { formatDateTime, formatImgUrl } from "@/common/fotmat"; +import { PAYMENT_METHOD, PAYMENT_METHOD_PARAM } from "@/common/enum"; + + + type Param = { - status: string, - time: string, - tag: string, - desc: string + list: { + status: string, + time: string, + tag: string, + desc: string + }[], + payment_method: 0|PAYMENT_METHOD_PARAM, + } -export default memo(({list = []}:{list?:Param[]}) => { + +//支付方式枚举 +const { + PaymentMethodAccountPeriod, + PaymentMethodCashOnDelivery, +} = PAYMENT_METHOD + +export default memo(({list = [], payment_method = 0}:Param) => { + const [showMore, setShowMore] = useState(false) const changeMore = () => { setShowMore(() => !showMore) @@ -38,7 +54,8 @@ export default memo(({list = []}:{list?:Param[]}) => { } - {/* */} + {(payment_method == PaymentMethodCashOnDelivery.value)&&} + {(payment_method == PaymentMethodAccountPeriod.value)&&} } diff --git a/src/pages/order/components/payment/index.tsx b/src/pages/order/components/payment/index.tsx index 3d6f42a..86d4306 100644 --- a/src/pages/order/components/payment/index.tsx +++ b/src/pages/order/components/payment/index.tsx @@ -1,5 +1,5 @@ import { Text, View } from "@tarojs/components"; -import { memo, useEffect, useMemo, useState } from "react"; +import { memo, useCallback, useEffect, useMemo, useState } from "react"; import AmountShow from "../amountShow"; import classnames from "classnames"; import styles from './index.module.scss' @@ -11,20 +11,22 @@ import ScanPay from "../scanPay"; import { GetOrderPayApi, SubmitOrderPayApi } from "@/api/orderPay"; import { formatPriceDiv } from "@/common/fotmat"; import {alert} from "@/common/common" +import { PAYMENT_METHOD, PAYMENT_METHOD_PARAM } from "@/common/enum"; type Param = { show?: true|false, onClose?: () => void, - orderId?: number, //应付单id - onSubmitSuccess?: () => void //支付成功 + onSubmitSuccess?: () => void, //支付成功 + orderInfo?: OrderInfo } -type PayInfo = { - amount: string +type OrderInfo = { + orderId: number, //应付单id + payment_method: 0|PAYMENT_METHOD_PARAM //支付方式 } -type PayStatus = 0|1|2|3|4|null //0:预存款, 1:账期,2:线下汇款, 3:扫码支付, 4:货到付款 -export default memo(({show = false, onClose, orderId = 0, onSubmitSuccess}:Param) => { +type PayStatus = 1|2|3|4|5|null //1:预存款, 2:账期,3:线下汇款, 4:扫码支付, 5:货到付款 +export default memo(({show = false, onClose, orderInfo, onSubmitSuccess}:Param) => { //提交参数 const [submitData, setSubmitData] = useState<{id:number, payment_method: PayStatus}>({ @@ -50,19 +52,21 @@ export default memo(({show = false, onClose, orderId = 0, onSubmitSuccess}:Param const [payInfo, setPayInfo] = useState() const {fetchData: orderFetchData} = GetOrderPayApi() const getOrderPay = async () => { - let {data} = await orderFetchData({id: orderId}) + let {data} = await orderFetchData({id: orderInfo?.orderId}) setPayInfo(() => data) } useEffect(() => { - if(show&&orderId) - setSubmitData((val) => ({...val, id:orderId})) + if(show&&orderInfo?.orderId) { + setSubmitData((val) => ({...val, id:orderInfo.orderId})) getOrderPay() - }, [show, orderId]) + } + }, [show, orderInfo]) //预存款选择 - const advanceSelectData = (val) => { + const advanceSelectData = useCallback((val) => { setSubmitData((e) => ({...e, payment_method:val})) - } + }, []) + //账期选择 const periodSelectData = (val) => { setSubmitData((e) => ({...e, payment_method:val})) @@ -85,13 +89,25 @@ export default memo(({show = false, onClose, orderId = 0, onSubmitSuccess}:Param } } + //预付款 const advance_payment = useMemo(() => { - const price = formatPriceDiv(payInfo?.should_collect_money - payInfo?.amount_paid) + const price = payInfo?.should_collect_money - payInfo?.amount_paid return ( - {(payInfo?.advance_deposit_balance < price)&&'余额不足,' }剩余 ¥{payInfo?.advance_deposit_balance} + {(payInfo?.advance_deposit_balance < price)&&'余额不足,' }剩余 ¥{formatPriceDiv(payInfo?.advance_deposit_balance)} ) }, [payInfo]) + //账期 + const account_peyment = useMemo(() => { + const price = payInfo?.should_collect_money - payInfo?.amount_paid + return ( + {(payInfo?.account_period_credit_available_line < price)&&'额度不足, '}剩余 ¥{formatPriceDiv(payInfo?.account_period_credit_available_line)} + ) + }, [payInfo]) + + //支付方式枚举 + const {PaymentMethodPreDeposit, PaymentMethodAccountPeriod} = PAYMENT_METHOD + return ( @@ -125,18 +141,19 @@ export default memo(({show = false, onClose, orderId = 0, onSubmitSuccess}:Param {advance_payment} - advanceSelectData(0)} onClose={() => advanceSelectData(null)}/> + advanceSelectData(PaymentMethodPreDeposit.value)} onClose={() => advanceSelectData(null)}/> - + {(orderInfo?.payment_method != PaymentMethodAccountPeriod.value)&& {payInfo?.account_period}天账期 - 可用额度 ¥{payInfo?.account_period_credit_available_line} + {/* 可用额度 ¥{formatPriceDiv(payInfo?.account_period_credit_available_line)} */} + {account_peyment} - periodSelectData(1)} onClose={() => periodSelectData(null)}/> - + periodSelectData(PaymentMethodAccountPeriod.value)} onClose={() => periodSelectData(null)}/> + } diff --git a/src/pages/order/index.config.ts b/src/pages/order/index.config.ts index b518f53..030cb10 100644 --- a/src/pages/order/index.config.ts +++ b/src/pages/order/index.config.ts @@ -1,5 +1,6 @@ export default { navigationBarTitleText: '订单详情', enablePullDownRefresh: true, - backgroundTextStyle: 'dark' + backgroundTextStyle: 'dark', + enableShareAppMessage: true, } diff --git a/src/pages/order/index.tsx b/src/pages/order/index.tsx index abeee6e..060dc54 100644 --- a/src/pages/order/index.tsx +++ b/src/pages/order/index.tsx @@ -5,6 +5,7 @@ import { } from "@/api/order"; import { GetOrderPayApi } from "@/api/orderPay"; import { alert, goLink } from "@/common/common"; +import { ORDER_STATUS } from "@/common/enum"; import { formatDateTime, formatPriceDiv } from "@/common/fotmat"; import OrderBtns from "@/components/orderBtns"; import Popup from "@/components/popup"; @@ -15,8 +16,8 @@ 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 OrderState from "./components/orderState"; import Payment from "./components/payment"; import Remark from "./components/remark"; @@ -24,10 +25,8 @@ import styles from './index.module.scss' export default () => { const [showDesc, setShowDesc] = useState(false) - const router = useRouter() const orderId = useRef(Number(router.params.id)) - useDidShow(() => { getSaleOrderPreView() }) @@ -66,6 +65,9 @@ import styles from './index.module.scss' 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, //取消订单时的订单状态 + }) } const formatPreViewOrderMemo = useMemo(() => { @@ -114,6 +116,12 @@ import styles from './index.module.scss' setShowDesc(() => false) }, []) + //支付所需数据 + const payOrderInfo = useMemo(() => { + if(orderDetail) + return {orderId: orderDetail.should_collect_order_id, payment_method:orderDetail.payment_method } + }, [orderDetail]) + //去付款 const [payMentShow, setPayMentShow] = useState(false) const toPay = () => { @@ -165,24 +173,29 @@ import styles from './index.module.scss' //按钮所需数据 const orderInfo = useMemo(() => { return { - status: orderDetail?.status, + status: orderDetail?.status, //订单状态 orderId: orderDetail?.id, - payModel: orderDetail?.id, //支付方式 - realPayPrice: orderDetail?.id, //实付金额 - pendingPayPrice: orderDetail?.id, //待付金额 + settle_mode: orderDetail?.settle_mode, + actual_amount: orderDetail?.actual_amount, //实付金额 + wait_pay_amount: orderDetail?.wait_pay_amount, //待付金额 } }, [orderDetail]) + //订单状态枚举 + const {SaleOrderStatusCancel} = ORDER_STATUS + + + return ( {/* */} - + - + 订单信息 @@ -206,14 +219,14 @@ import styles from './index.module.scss' } - + {(orderDetail?.status != SaleOrderStatusCancel.value)&& - {/* toPay()}>去支付 */} - + } setShowDesc(false)} > getRemark(e)}/> - + + ) diff --git a/src/pages/orderList/components/order/index.module.scss b/src/pages/orderList/components/order/index.module.scss index e453de3..85e1123 100644 --- a/src/pages/orderList/components/order/index.module.scss +++ b/src/pages/orderList/components/order/index.module.scss @@ -117,5 +117,6 @@ background-color: #F6F6F6; border-radius: 10px; padding: 10px 22px; + margin-top: 20px; } } \ No newline at end of file diff --git a/src/pages/orderList/components/order/index.tsx b/src/pages/orderList/components/order/index.tsx index 7ad9512..7bff925 100644 --- a/src/pages/orderList/components/order/index.tsx +++ b/src/pages/orderList/components/order/index.tsx @@ -1,14 +1,15 @@ import { goLink } from "@/common/common"; import { formatHashTag, formatImgUrl, formatPriceDiv } from "@/common/fotmat"; 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 classnames from "classnames"; -import { memo, useCallback, useMemo, useRef } from "react"; +import { memo, useCallback, useMemo, useRef, useState } from "react"; import styles from './index.module.scss' type Param = { - value?: { + value: { order_no: string, sale_mode: number, sale_mode_name: string, @@ -19,9 +20,13 @@ type Param = { total_colors: number, total_number: number, status: 0, - id: number + id: number, + payment_method: number, //支付方式 + actual_amount: number, //实付金额 + wait_pay_amount: number //待付金额 + should_collect_order_id: number //应付单id }, - onClickBtn?: (val:number) => void + onClickBtn?: (val:{status:number, orderInfo:Param['value']}) => void } export default memo(({value, onClickBtn}: Param) => { const userInfo = useSelector(state => state.userInfo) @@ -36,7 +41,17 @@ export default memo(({value, onClickBtn}: Param) => { //点击订单按钮 const orderBtnsClick = useCallback((status) => { - onClickBtn?.(status) + onClickBtn?.({status, orderInfo:value}) + }, [value]) + + //按钮所需数据 + const orderInfo = useMemo(() => { + return { + status: value?.status, //订单状态 + orderId: value?.id, + actual_amount: value?.actual_amount, //实付金额 + wait_pay_amount: value?.wait_pay_amount, //待付金额 + } }, [value]) return ( @@ -83,7 +98,8 @@ export default memo(({value, onClickBtn}: Param) => { {`${value?.total_fabrics}种面料,${value?.total_colors}种颜色,共${value?.total_number}条`} - + + ) }) diff --git a/src/pages/orderList/index.config.ts b/src/pages/orderList/index.config.ts index c47055c..ef55be9 100644 --- a/src/pages/orderList/index.config.ts +++ b/src/pages/orderList/index.config.ts @@ -1,3 +1,4 @@ export default { navigationBarTitleText: '订单列表', + enableShareAppMessage: true, } diff --git a/src/pages/orderList/index.module.scss b/src/pages/orderList/index.module.scss index f7222c8..e8f528a 100644 --- a/src/pages/orderList/index.module.scss +++ b/src/pages/orderList/index.module.scss @@ -1,5 +1,5 @@ .order_list_main{ - min-height: 100vh; + height: 100vh; background-color: $color_bg_one; display: flex; flex-direction: column; @@ -8,6 +8,7 @@ background-color: #fff; box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.16); border-bottom: 2px solid #e2e2e2; + height: 160px; .order_status_list{ font-size: $font_size; color: #9E9E9E; @@ -28,8 +29,7 @@ } } .order_list{ - flex:1; - height: 0; + height: calc(100vh - 160px); .order_item_con{ margin-top: 20px; padding: 0 20px; diff --git a/src/pages/orderList/index.tsx b/src/pages/orderList/index.tsx index 866597b..dee8c57 100644 --- a/src/pages/orderList/index.tsx +++ b/src/pages/orderList/index.tsx @@ -10,6 +10,8 @@ import InfiniteScroll from "@/components/infiniteScroll" import {GetOrderStatusListApi, GetOrderListApi} 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" export default () => { const {checkLogin} = useLogin() @@ -26,12 +28,13 @@ export default () => { }) //获取订单状态 - const {fetchData: statusFetchData} = GetOrderStatusListApi() + // const {fetchData: statusFetchData} = GetOrderStatusListApi() const [statusList, setStatusList] = useState([{id: -1, name: '全部'}]) - const getOrderStatusList = async () => { - let res = await statusFetchData() - let list = [...statusList, ...res.data.list||[]] - setStatusList(() => list) + const getOrderStatusList = () => { + const status = Object.values(ORDER_STATUS).map(item => { + return {id: item.value, name: item.label} + }) + setStatusList((e) => [...e, ...status]) } useEffect(() => { getOrderStatusList() @@ -82,10 +85,7 @@ export default () => { setSearchField((val) => ({...val, name:e, size:10})) }, []) - const clickOrderBtn = useCallback((state) => { - getOrderList() - }, [orderData]) - + //列表下拉刷新 const [refresherTriggeredStatus, setRefresherTriggeredStatus] = useState(false) const getRefresherRefresh = async () => { @@ -93,6 +93,33 @@ export default () => { setRefresherTriggeredStatus(true) setSearchField((val) => ({...val, size:10})) } + + //监听点击的按钮 + const clickOrderBtn = useCallback(({status, orderInfo}) => { + if(status == 2) { + //去支付 + setPayOrderInfo({orderId:orderInfo.should_collect_order_id, payment_method:orderInfo.payment_method}) + toPay() + } + }, [orderData]) + + + //去付款 + const [payOrderInfo, setPayOrderInfo] = useState() + const [payMentShow, setPayMentShow] = useState(false) + const toPay = () => { + setPayMentShow(true) + } + //关闭支付弹窗 + const closePayShow = useCallback(() => { + setPayMentShow(() => false) + }, []) + //支付成功 + const onPaySuccess = useCallback(() => { + getOrderList() + closePayShow() + }, []) + return ( @@ -107,6 +134,7 @@ export default () => { })} + ) } diff --git a/src/pages/salesAfter/components/addressInfo/index.module.scss b/src/pages/salesAfter/components/addressInfo/index.module.scss new file mode 100644 index 0000000..4e9ea21 --- /dev/null +++ b/src/pages/salesAfter/components/addressInfo/index.module.scss @@ -0,0 +1,71 @@ +.order_address{ + height: 178px; + background: #ffffff; + border-radius: 20px; + display: flex; + align-items: center; + padding: 30px; + box-sizing: border-box; + margin-top: 20px; + .order_address_icon{ + font-size: 76px; + color: $color_main; + } + .order_address_text_con{ + flex:1; + padding: 0 30px; + box-sizing: border-box; + .order_address_text_title{ + font-size: $font_size_medium; + margin-top: 10px; + @include common_ellipsis; + } + .order_address_text_name{ + + align-items: center; + text{ + &:nth-child(1) { + color: #000; + font-weight: 700; + font-size: $color_font_one; + margin-right: 40px; + } + &:nth-child(2) { + color: $color_font_one; + font-size: $font_size_medium; + } + } + } + } + .updateBtn{ + font-size: $font_size_medium; + color: $color_font_three; + width: 96px; + height: 52px; + border: 2px solid #dddddd; + border-radius: 28px; + text-align: center; + line-height: 52px; + } + .order_address_text_no{ + flex: 1; + font-size: $font_size; + font-weight: 700; + margin-left: 30px; + } + .order_address_more_icon{ + color: $color_font_three; + font-size: $font_size; + } + +} +.order_address_list { + height: 900px; + .order_address_title{ + font-size: $font_size; + font-weight: 700; + width: 100%; + text-align: center; + padding: 20px 0 30px 0; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/addressInfo/index.tsx b/src/pages/salesAfter/components/addressInfo/index.tsx new file mode 100644 index 0000000..4225fea --- /dev/null +++ b/src/pages/salesAfter/components/addressInfo/index.tsx @@ -0,0 +1,76 @@ +import AddressList from "@/components/AddressList"; +import Popup from "@/components/popup"; +import { Text, View } from "@tarojs/components" +import classnames from "classnames"; +import { memo, useCallback, useEffect, 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禁用后只用于展示 +} + +export default memo(({onSelect, defaultValue = null, disabled = false}: Param) => { + const [showAddressList, setShowAddressList] = useState(false) + + useEffect(() => { + setUserInfo(() => defaultValue) + }, [defaultValue]) + + //选择地址 + const [userInfo, setUserInfo] = useState() + const getAddress = useCallback((val) => { + setShowAddressList(() => false) + setUserInfo(() => val) + onSelect?.(val) + }, []) + + //地址格式 + const formatAddress = useMemo(() => { + if(userInfo) + return userInfo.province_name + userInfo.city_name + userInfo.district_name + userInfo.address_detail + }, [userInfo]) + + const changeShow = () => { + if(!disabled) + setShowAddressList(() => true) + } + return ( + + changeShow()}> + + {!userInfo&& + <> + 请选择收货地址及信息 + + + ||<> + + + {userInfo?.name} + {userInfo?.phone} + + {formatAddress} + + 修改 + } + + {!disabled&& setShowAddressList(false)}> + + 请选择收货地址 + getAddress(item)}/> + + } + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/addressInfoDetail/index.module.scss b/src/pages/salesAfter/components/addressInfoDetail/index.module.scss new file mode 100644 index 0000000..68e6171 --- /dev/null +++ b/src/pages/salesAfter/components/addressInfoDetail/index.module.scss @@ -0,0 +1,112 @@ +.order_address{ + height: 178px; + background: #ffffff; + border-radius: 20px; + display: flex; + align-items: center; + padding: 30px; + box-sizing: border-box; + margin-top: 20px; + position: relative; + .order_address_icon{ + font-size: 50px; + color: $color_main; + position: absolute; + top: 35px; + left: 20px; + } + .order_address_text_con{ + flex:1; + padding-left: 50px; + box-sizing: border-box; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + .order_address_text_title{ + font-size: $font_size_medium; + margin-top: 10px; + @include common_ellipsis; + display: flex; + align-items: center; + justify-content: space-between; + .moreIconfont{ + font-size: 20px; + } + } + .order_address_text_name{ + + align-items: center; + text{ + &:nth-child(1) { + color: #000; + font-weight: 700; + font-size: $color_font_one; + margin-right: 40px; + } + &:nth-child(2) { + color: $color_font_one; + font-size: $font_size_medium; + } + } + } + } + .updateBtn{ + width:200px; + font-size: $font_size_min; + background-color: #F0F0F0; + height: 64px; + border-radius: 24px; + color: $color_font_two; + position: absolute; + bottom: 10px; + right: 10px; + z-index: 999; + .updateBtn_list{ + position: absolute; + display: flex; + z-index: 5; + width: 100%; + .updateBtn_item_select{ + color: #fff; + } + } + .updateBtn_item{ + flex:1; + text-align: center; + line-height: 64px; + } + .updateBtn_select{ + color: #fff; + background-color: $color_main; + border-radius: 24px; + position: absolute; + width: 100px; + height: 61px; + z-index: 1; + transition: all 0.3s ease-in-out; + } + + } + .order_address_text_no{ + flex: 1; + font-size: $font_size; + font-weight: 700; + margin-left: 30px; + } + .order_address_more_icon{ + color: $color_font_three; + font-size: $font_size; + } + +} +.order_address_list { + height: 900px; + .order_address_title{ + font-size: $font_size; + font-weight: 700; + width: 100%; + text-align: center; + padding: 20px 0 30px 0; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/addressInfoDetail/index.tsx b/src/pages/salesAfter/components/addressInfoDetail/index.tsx new file mode 100644 index 0000000..7290ae6 --- /dev/null +++ b/src/pages/salesAfter/components/addressInfoDetail/index.tsx @@ -0,0 +1,122 @@ +import { EditSaleOrderAddressApi, EditSaleOrderShipmentModeApi } from "@/api/order"; +import { alert } from "@/common/common"; +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, useCallback, 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禁用后只用于展示 + shipment_mode?: 1|2, //1自提 2物流 + onChangeShipmentMode?: (val: number) => void, //返回收货方式 + orderId?: number //订单id +} + +export default memo(forwardRef(({onSelect, onChangeShipmentMode, defaultValue = null, orderId = 0, shipment_mode = 1}: Param, ref) => { + const [showAddressList, setShowAddressList] = useState(false) + + useEffect(() => { + setUserInfo(() => defaultValue) + }, [defaultValue]) + + const [userInfo, setUserInfo] = useState() + + //地址格式 + const formatAddress = useMemo(() => { + if(userInfo) + return userInfo.province_name + userInfo.city_name + userInfo.district_name + userInfo.address_detail + }, [userInfo]) + + const changeShow = () => { + if(receivingStatus == 2) + setShowAddressList(() => true) + } + + useEffect(() => { + setReceivingStatus(() => shipment_mode) + }, [shipment_mode]) + + //把内部方法提供给外部 + useImperativeHandle(ref, () => ({ + changeShow + })) + + //收货方法,1:自提,2物流 + const [receivingStatus, setReceivingStatus] = useState(1) + const {fetchData: shipmentModeFetchData} = EditSaleOrderShipmentModeApi() + const onReceivingStatus = (value, e) => { + e.stopPropagation() + changeReceivingStatus(value) + } + const changeReceivingStatus = debounce(async (value) => { + alert.loading('正在修改') + const res = await shipmentModeFetchData({id: orderId, shipment_mode:value}) + if(res.success) { + alert.success('收货方式修改成功') + onChangeShipmentMode?.(value) + setReceivingStatus(value) + } else { + alert.none(res.msg) + } + }, 10) + + //修改地址 + const {fetchData: addressFetchData} = EditSaleOrderAddressApi() + const getAddress = async (value) => { + alert.loading('正在修改') + const res = await addressFetchData({id: orderId, address_id: value.id}) + if(res.success) { + alert.success('地址修改成功') + onSelect?.(value) + setShowAddressList(() => false) + setUserInfo(() => value) + } else { + alert.none(res.msg) + } + } + + return ( + + changeShow()}> + + + + {formatAddress} + {(receivingStatus == 2)&&} + + + {userInfo?.name} + {userInfo?.phone} + + + + + onReceivingStatus(1,e)}>自提 + onReceivingStatus(2,e)}>物流 + + + + + setShowAddressList(false)}> + + 请选择收货地址 + + + + + ) +})) \ No newline at end of file diff --git a/src/pages/salesAfter/components/amountShow/index.module.scss b/src/pages/salesAfter/components/amountShow/index.module.scss new file mode 100644 index 0000000..647e203 --- /dev/null +++ b/src/pages/salesAfter/components/amountShow/index.module.scss @@ -0,0 +1,35 @@ +.order_price_num{ + color: $color_main; + font-weight: 700; + text{ + &:nth-child(1) { + font-size: $font_size_min; + } + &:nth-child(2) { + font-size: $font_size; + } + &:nth-child(3) { + font-size: $font_size_medium; + } + } +} +.emphasis_num{ + .price_text{ + &:nth-child(2) { + font-size: $font_size_big; + } + } +} +.emphasis_num_big{ + .price_text{ + &:nth-child(1) { + font-size: $font_size_big; + } + &:nth-child(2) { + font-size: 60px; + } + &:nth-child(1) { + font-size: $font_size_big; + } + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/amountShow/index.tsx b/src/pages/salesAfter/components/amountShow/index.tsx new file mode 100644 index 0000000..877f7df --- /dev/null +++ b/src/pages/salesAfter/components/amountShow/index.tsx @@ -0,0 +1,28 @@ +import { Text, View } from "@tarojs/components"; +import { memo, useCallback } from "react"; +import styles from './index.module.scss' +import classnames from "classnames"; + +type Param = { + number: number, //数字 + status: 0|1|2 //0 小型,1中型,2大 +} +export default memo(({number = 0, status = 1}:Param) => { + const priceDom = useCallback(() => { + let res = number.toFixed(2).split('.') + let int_num = parseInt(res[0]) + '' + let decimals_num = res[1] + return ( + <> + ¥ + {Number(int_num).toLocaleString()} + .{decimals_num} + + ) + }, [number]) + return ( + + {priceDom()} + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/contentBox/index.module.scss b/src/pages/salesAfter/components/contentBox/index.module.scss new file mode 100644 index 0000000..a5a2fc0 --- /dev/null +++ b/src/pages/salesAfter/components/contentBox/index.module.scss @@ -0,0 +1,14 @@ +.content_box { + background-color: #fff; + margin-top: 20px; + border-radius: 20px; + padding: 20px; + .content_box_title{ + font-size: $font_size; + font-weight: 700; + margin-bottom: 20px; + } + .content_box_con { + + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/contentBox/index.tsx b/src/pages/salesAfter/components/contentBox/index.tsx new file mode 100644 index 0000000..8a81420 --- /dev/null +++ b/src/pages/salesAfter/components/contentBox/index.tsx @@ -0,0 +1,20 @@ +import {View } from "@tarojs/components"; +import { memo, ReactDOM, ReactNode } from "react"; +import styles from './index.module.scss' + +type Param = { + children?: ReactNode, + title?: string +} +export default memo(({children, title=''}: Param) => { + return ( + <> + + {title} + + {children} + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/estimatedAmount/index.module.scss b/src/pages/salesAfter/components/estimatedAmount/index.module.scss new file mode 100644 index 0000000..4b4a958 --- /dev/null +++ b/src/pages/salesAfter/components/estimatedAmount/index.module.scss @@ -0,0 +1,70 @@ +.order_price{ + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + &:nth-last-child(n+2) { + margin-bottom: 30px; + } + .order_price_text{ + font-size: $font_size_medium; + // margin-right: 10px; + display: flex; + .iconfont_msg{ + position: relative; + } + .miconfont{ + font-size: 26px; + font-weight: normal; + margin-left: 5px; + } + .message{ + position: absolute; + top: -50px; + background: #A8B3BD; + z-index: 9; + min-height: 50px; + border-radius: 10px; + padding: 10px; + box-sizing: border-box; + &::before{ + z-index: 1; + position: absolute; + bottom: -7px; + left: 10px; + width: 15px; + height: 15px; + content: " "; + transform: rotate(45deg); + background: #A8B3BD; + box-sizing: border-box; + } + } + } + .emphasis{ + font-weight: 700; + } + .order_price_num{ + color: $color_main; + font-weight: 700; + text{ + &:nth-child(1) { + font-size: $font_size_min; + } + &:nth-child(2) { + font-size: 26px; + } + &:nth-child(3) { + font-size: $font_size_medium; + } + } + } + .emphasis_num{ + text{ + &:nth-child(2) { + font-size: $font_size_big; + } + } + } + +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/estimatedAmount/index.tsx b/src/pages/salesAfter/components/estimatedAmount/index.tsx new file mode 100644 index 0000000..04bc49a --- /dev/null +++ b/src/pages/salesAfter/components/estimatedAmount/index.tsx @@ -0,0 +1,29 @@ +import { Text, View } from "@tarojs/components" +import { memo, useCallback, useEffect, useMemo } from "react" +import {formatKbPrice} from '@/common/common' +import classnames from "classnames"; +import styles from './index.module.scss' +import AmountShow from "../amountShow"; +type Param = { + style?: Object, + number?: number, + title?: string, + titleStatus?: true|false, //true 标题加大加深 + numberStatus?: 0|1|2, //数字尺寸 +} +export default memo(({style, number = 0, titleStatus = true, title = '', numberStatus = 1}:Param) => { + return ( + <> + + + {title} + + + {/* 123123123121212312312312312 */} + + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/kindList/index.module.scss b/src/pages/salesAfter/components/kindList/index.module.scss new file mode 100644 index 0000000..be8f53f --- /dev/null +++ b/src/pages/salesAfter/components/kindList/index.module.scss @@ -0,0 +1,109 @@ + +.orders_list_title{ + padding: 20px 20px 10px 20px; + color: $color_font_two; + font-size: $font_size_medium; +} +.orders_list_con{ + + background-color: #fff; + border-radius: 20px; + padding: 20px; + .order_list{ + &:nth-child(n+2) { + margin-top: 30px; + } + .order_list_title{ + display: flex; + align-items: center; + .tag{ + font-size: $font_size_min; + background-color: #CDE5FF; + padding: 5px 10px; + border-radius: 6px; + color: $color_main; + } + .title{ + font-weight: 700; + font-size: $font_size; + margin-left: 20px; + flex:1; + } + .num{ + color: $color_font_two; + font-size: $font_size_min; + } + } + } + .order_list_scroll{ + margin-top: 30px; + + .order_list_item { + display: flex; + &:nth-child(2) { + margin-top: 30px; + } + .order_list_item_img{ + width: 126px; + height: 126px; + border-radius: 20px; + background-color: red; + } + .order_list_item_con{ + display: flex; + width: 100%; + flex:1; + border-bottom: 1px solid #f0f0f0; + height: 150px; + padding-top: 20px; + box-sizing: border-box; + } + .order_list_item_des{ + flex:1; + box-sizing: border-box; + padding-left: 30px; + .order_list_item_title{ + font-weight: 700; + font-size: $font_size; + margin-bottom: 15px; + } + .order_list_item_price{ + font-size: 26px; + color: $color_font_three; + } + } + .order_list_item_count{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-end; + .count_num{ + color: $color_main; + font-size: $font_size; + margin-bottom: 15px; + font-weight: 400; + text{ + font-size: $font_size_min; + } + } + .count_price { + font-size: $font_size; + font-weight: 700; + text{ + font-size: $font_size_min; + } + } + } + } + } + .order_estimated_amount{ + display: flex; + align-items: flex-end; + flex-direction: column; + padding: 30px 0; + .order_price_des{ + font-size: $font_size_medium; + color: $color_font_two; + } + } +} diff --git a/src/pages/salesAfter/components/kindList/index.tsx b/src/pages/salesAfter/components/kindList/index.tsx new file mode 100644 index 0000000..e93be35 --- /dev/null +++ b/src/pages/salesAfter/components/kindList/index.tsx @@ -0,0 +1,166 @@ +import { ORDER_STATUS } from "@/common/enum" +import { formatHashTag, formatPriceDiv } from "@/common/fotmat" +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) + return `${order?.total_fabrics}种面料,${order?.total_colors}种颜色,共${order?.total_number}${order?.unit}` + }, [order]) + + const { + SaleOrderStatusBooking, // 待接单 + SaleOrderStatusArranging, // 配布中 + SaleOrderStatusArranged, // 已配布 + SaleOrderStatusWaitingPayment, // 待付款 + SaleOrderStatusWaitingDelivery, // 待发货 + SaleOrderStatusWaitingReceipt, // 待收货 + SaleOrderStatusAlreadyReceipt, // 已收货 + SaleOrderStatusComplete, // 已完成 + SaleOrderStatusRefund, // 已退款 + SaleOrderStatusCancel, // 已取消 + } = ORDER_STATUS + + //金额列表枚举 + const priceList = [ + { + id:1, + value:[SaleOrderStatusBooking.value, SaleOrderStatusArranging.value], + label:'预估金额', + field: 'estimate_amount' + }, + { + id:2, + 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 + } + //订单为取消订单状态 + if(order?.status == SaleOrderStatusCancel.value) { + return ( + <> + { + priceList.map(item => { + return <>{showPrice(item, order?.the_previous_status)&&} + }) + } + + ) + } else { + return ( + <> + { + priceList.map(item => { + return <>{showPrice(item, order?.status)&&} + }) + } + + ) + } + }, [order]) + + return ( + <> + {numText} + + { + order?.list?.map(item => { + return + + {order.sale_mode_name} + {formatHashTag(item.code, item.name)} + 共{item?.product_colors.length}种 + + + {item?.product_colors?.map(colorItem => { + return + + + + {colorItem.code + ' ' + colorItem.name} + ¥{standardPrice(colorItem.sale_price)} + + + ×{formatCount(colorItem)}{order.unit} + ¥{formatPriceDiv(colorItem.estimate_amount).toLocaleString()} + + + + })} + + + }) + } + + {priceConDom} + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/offlinePay/index.module.scss b/src/pages/salesAfter/components/offlinePay/index.module.scss new file mode 100644 index 0000000..f84e995 --- /dev/null +++ b/src/pages/salesAfter/components/offlinePay/index.module.scss @@ -0,0 +1,46 @@ +$top:170px; +.offlinePay_main{ + .offlinePay_con{ + padding: 20px; + background-color: #F6F6F6; + border-radius: 20px; + .miconfont_title{ + transform: rotate(-180deg); + position: absolute; + left: 20px; + top: 27px; + font-size: 37px; + color: $color_font_three; + z-index: 99; + } + } + .title{ + font-size: $font_size_big; + color: #000000; + text-align: center; + font-weight: 700; + position: relative; + + } + + .offlinePay_list{ + border-radius: 10px; + padding: 60px 0; + .offlinePay_con_text{ + font-size: $font_size; + font-weight: 700; + } + } + .btns{ + background: #007aff; + border-radius: 40px; + width: 668px; + height: 82px; + text-align: center; + line-height: 80px; + width: 100%; + color: #fff; + font-size: 32px; + margin-top: 30px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/offlinePay/index.tsx b/src/pages/salesAfter/components/offlinePay/index.tsx new file mode 100644 index 0000000..4022374 --- /dev/null +++ b/src/pages/salesAfter/components/offlinePay/index.tsx @@ -0,0 +1,52 @@ +import { Text, View } from "@tarojs/components"; +import { memo } from "react"; +import AmountShow from "../amountShow"; +import classnames from "classnames"; +import styles from './index.module.scss' + +import MCheckbox from "@/components/checkbox"; +import Popup from "@/components/popup"; +import SearchInput from "@/components/searchInput"; +import Taro from "@tarojs/taro"; + +type Param = { + show?: true|false, + onClose?: () => void +} +export default memo(({show = true, onClose}:Param) => { + //复制功能 + const clipboardData = () => { + Taro.setClipboardData({ + data: '开户名称:佛山市浩川盛世科技有限公司; 开户银行:招商银行汾江支行; 转账汇款账号:62062342120001221231212', + success: function (res) { + Taro.showToast({ + icon: 'none', + title: '复制成功' + }) + } + }) + } + return ( + + + + + 线下汇款 + + + 佛山市浩川盛世科技有限公司 + + + 招商银行汾江支行 + + + 62062342120001221231212 + + + 复制信息 + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/orderState copy/index.module.scss b/src/pages/salesAfter/components/orderState copy/index.module.scss new file mode 100644 index 0000000..78bda44 --- /dev/null +++ b/src/pages/salesAfter/components/orderState copy/index.module.scss @@ -0,0 +1,18 @@ +.order_flow_state{ + display: flex; + align-items: center; + padding: 0 30px; + height: 116px; + background-color: #fff; + border-radius: 20px; + .order_flow_state_text{ + color: $color_main; + font-size:$font_size; + font-weight: 700; + } + .order_flow_state_desc{ + color: $color_font_three; + font-size: $font_size_medium; + margin-left: 50px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/orderState copy/index.tsx b/src/pages/salesAfter/components/orderState copy/index.tsx new file mode 100644 index 0000000..58fec4d --- /dev/null +++ b/src/pages/salesAfter/components/orderState copy/index.tsx @@ -0,0 +1,14 @@ +import { View } from "@tarojs/components" +import styles from './index.module.scss' + +export default ({ + state = '', + desc = '' +}) => { + return ( + + {state} + {desc} + + ) +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/orderState/index.module.scss b/src/pages/salesAfter/components/orderState/index.module.scss new file mode 100644 index 0000000..90dbcbb --- /dev/null +++ b/src/pages/salesAfter/components/orderState/index.module.scss @@ -0,0 +1,105 @@ +.order_flow_state{ + background-color: #fff; + border-radius: 20px; + padding: 20px; + box-sizing:border-box; + position: relative; + overflow: hidden; + .order_status_list{ + max-height: 250px; + overflow: hidden; + transition: all 0.3s ease-in-out; + } + .order_status_list_show { + max-height: 1000px !important; + } + .order_status_item{ + position: relative; + padding-left: 50px; + &:nth-last-child(n+2) { + padding-bottom: 30px; + } + .order_status_tail_end, .order_status_tail{ + width: 15px; + height: 15px; + border: 2px solid $color_main; + background-color: #fff; + border-radius: 50%; + position:absolute; + left: 0; + top: 10px; + z-index: 10; + } + .order_status_tail_end{ + background-color: $color_main; + } + .order_status_line{ + border-left: 2px solid $color_main; + height: 100%; + top: 10px; + left: 9px; + position: absolute; + z-index: 1; + } + .order_status_content{ + display: flex; + align-items: center; + .order_status_title{ + color: $color_font_two; + font-size: $font_size; + font-weight: 700; + } + .order_status_time{ + color: $color_font_two; + font-size: $font_size_medium; + padding: 0 20px; + } + .order_status_tag{ + font-size: $font_size_min; + background: #F0F0F0; + border-radius: 6px; + padding: 5px 10px; + color: $color_font_two; + } + .order_status_select{ + color: $color_main; + } + .order_status_tag_select{ + color: $color_main; + } + } + .order_status_des{ + color: $color_font_two; + font-size: $font_size_medium; + } + .order_status_des_select{ + color: $color_font_one; + } + } + .more{ + width: 100%; + text-align: center; + font-size: $font_size_min; + color: $color_font_one; + padding-top: 20px; + .miconfonts{ + display: inline-block; + font-size: 25px; + transform:rotate(90deg); + } + .open_miconfonts{ + transform:rotate(-90deg); + } + } + .image_tag{ + width: 140px; + height: 144px; + .image{ + width: 140px; + height: 144px; + } + position: absolute; + top: -10px; + right: -10px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/orderState/index.tsx b/src/pages/salesAfter/components/orderState/index.tsx new file mode 100644 index 0000000..82ed17f --- /dev/null +++ b/src/pages/salesAfter/components/orderState/index.tsx @@ -0,0 +1,63 @@ +import { Image, Text, View } from "@tarojs/components" +import { memo, useMemo, useState } from "react" +import styles from './index.module.scss' +import classnames from "classnames"; +import { formatDateTime, formatImgUrl } from "@/common/fotmat"; +import { PAYMENT_METHOD, PAYMENT_METHOD_PARAM } from "@/common/enum"; + + + +type Param = { + list: { + status: string, + time: string, + tag: string, + desc: string + }[], + payment_method: 0|PAYMENT_METHOD_PARAM, + +} + +//支付方式枚举 +const { + PaymentMethodAccountPeriod, + PaymentMethodCashOnDelivery, +} = PAYMENT_METHOD + +export default memo(({list = [], payment_method = 0}:Param) => { + + const [showMore, setShowMore] = useState(false) + const changeMore = () => { + setShowMore(() => !showMore) + } + const dataList = useMemo(() => { + return list.reverse() + }, [list]) + + return ( + <> + {(dataList.length > 0)&& + + {dataList.map((item, index) => + {(dataList.length > 1)&&} + {(dataList.length != (index + 1))&&} + + {item.status} + {formatDateTime(item.time)} + {/* {item.tag} */} + + {item.desc} + )} + + {(dataList.length > 2) && changeMore()}> + {showMore&&'收起详情'||'点击查看详情'} + + } + + {(payment_method == PaymentMethodAccountPeriod.value)&&} + {(payment_method == PaymentMethodCashOnDelivery.value)&&} + + } + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/payment/index.module.scss b/src/pages/salesAfter/components/payment/index.module.scss new file mode 100644 index 0000000..340b0ed --- /dev/null +++ b/src/pages/salesAfter/components/payment/index.module.scss @@ -0,0 +1,126 @@ +$top:190px; +.payment_main{ + .payment_con{ + padding: 20px; + background-color: #F6F6F6; + border-radius: 20px; + .miconfont_title{ + transform: rotate(-180deg); + position: absolute; + left: 20px; + top: 27px; + font-size: 37px; + color: $color_font_three; + z-index: 99; + } + + } + .title{ + font-size: $font_size_big; + color: #000000; + text-align: center; + font-weight: 700; + position: relative; + + } + .amount{ + text-align: center; + padding: 25px 0; + } + + .payment_list{ + background-color: #fff; + // box-shadow: 2px 2px 6px 0px rgba(0,0,0,0.16); + min-height: 300px; + border-radius: 10px; + padding-bottom: 100px; + position: relative; + background: radial-gradient(circle 20px at left $top, transparent 20px, #fff 20px + 3px) left 0px/60% no-repeat , + radial-gradient(circle 20px at right $top, transparent 20px, #fff 20px + 3px) right 0px/60% no-repeat; + filter: drop-shadow(2px 2px 6px rgba(0, 0, 0, .16)); + position: relative; + &::before{ + content: ''; + position: absolute; + border-bottom: 3px dashed #ccc; + top: $top; + width: calc(100% - 100px); + left:0; + right: 0; + margin: auto; + + } + .payment_list_top_border{ + height: 32px; + width: 100%; + background: linear-gradient(215deg,#cde5ff 2%, #cde5ff 2%, #68b4ff 72%); + border-radius: 10px 10px 0px 0px; + } + .payment_list_title{ + text-align: center; + padding: 30px 0 50px 0; + font-size: $font_size; + color: $color_font_three; + .payment_list_title_price_item{ + display: flex; + justify-content: space-between; + padding: 0 90px; + &:nth-child(1) { + margin-bottom: 15px; + } + } + text{ + &:nth-child(2) { + color: $color_main; + } + } + } + .payment_list_con{ + padding: 20px 30px 0 30px; + .payment_list_item{ + display: flex; + justify-content: space-between; + align-items: center; + height: 123px; + &:nth-last-child(n+2) { + border-bottom: 2px solid #F3F3F3; + } + } + .payment_list_item_left{ + display: flex; + flex-direction: column; + font-size: $font_size; + .payment_list_item_left_name{ + display: flex; + align-items: center; + } + .miconfont{ + font-size: 30px; + color: #FFC300; + padding-right: 10px; + } + .payment_list_item_left_price{ + font-size: $font_size_min; + color: $color_font_two; + padding-left: 35px; + padding-top: 5px; + } + } + .miconfont_more{ + font-size: 20px; + } + } + } + .btns{ + background: #007aff; + border-radius: 40px; + width: 668px; + height: 82px; + text-align: center; + line-height: 80px; + width: 100%; + color: #fff; + font-size: 32px; + margin-top: 30px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/payment/index.tsx b/src/pages/salesAfter/components/payment/index.tsx new file mode 100644 index 0000000..8af70dc --- /dev/null +++ b/src/pages/salesAfter/components/payment/index.tsx @@ -0,0 +1,185 @@ +import { Text, View } from "@tarojs/components"; +import { memo, useCallback, useEffect, useMemo, useState } from "react"; +import AmountShow from "../amountShow"; +import classnames from "classnames"; +import styles from './index.module.scss' + +import MCheckbox from "@/components/checkbox"; +import Popup from "@/components/popup"; +import OfflinePay from "../offlinePay"; +import ScanPay from "../scanPay"; +import { GetOrderPayApi, SubmitOrderPayApi } from "@/api/orderPay"; +import { formatPriceDiv } from "@/common/fotmat"; +import {alert} from "@/common/common" +import { PAYMENT_METHOD, PAYMENT_METHOD_PARAM } from "@/common/enum"; + +type Param = { + show?: true|false, + onClose?: () => void, + onSubmitSuccess?: () => void, //支付成功 + orderInfo?: OrderInfo +} + +type OrderInfo = { + orderId: number, //应付单id + payment_method: 0|PAYMENT_METHOD_PARAM //支付方式 +} + +type PayStatus = 1|2|3|4|5|null //1:预存款, 2:账期,3:线下汇款, 4:扫码支付, 5:货到付款 +export default memo(({show = false, onClose, orderInfo, onSubmitSuccess}:Param) => { + + //提交参数 + const [submitData, setSubmitData] = useState<{id:number, payment_method: PayStatus}>({ + id:0, + payment_method: null + }) + + //线下付款 + const [offlinePayShow, setofflinePayShow] = useState(false) + const onShowOfflinePay = () => { + setofflinePayShow(true) + onClose?.() + } + + //扫码支付 + const [scanPayShow, setScanPayShow] = useState(false) + const onShowScanPay = () => { + setScanPayShow(true) + onClose?.() + } + + //获取支付方式数据 + const [payInfo, setPayInfo] = useState() + const {fetchData: orderFetchData} = GetOrderPayApi() + const getOrderPay = async () => { + let {data} = await orderFetchData({id: orderInfo?.orderId}) + setPayInfo(() => data) + } + useEffect(() => { + if(show&&orderInfo?.orderId) { + setSubmitData((val) => ({...val, id:orderInfo.orderId})) + getOrderPay() + } + }, [show, orderInfo]) + + //预存款选择 + const advanceSelectData = useCallback((val) => { + setSubmitData((e) => ({...e, payment_method:val})) + }, []) + + //账期选择 + const periodSelectData = (val) => { + setSubmitData((e) => ({...e, payment_method:val})) + } + + //提交支付 + const {fetchData: submitFetchData} = SubmitOrderPayApi() + const submitPay = async () => { + if(submitData.payment_method === null) { + alert.error('请选择支付方式') + return false + } + alert.loading('正在支付') + let res = await submitFetchData(submitData) + if(res.success) { + alert.success('支付成功') + onSubmitSuccess?.() + } else { + alert.none(res.msg) + } + } + + //预付款 + const advance_payment = useMemo(() => { + const price = payInfo?.should_collect_money - payInfo?.amount_paid + return ( + {(payInfo?.advance_deposit_balance < price)&&'余额不足,' }剩余 ¥{formatPriceDiv(payInfo?.advance_deposit_balance)} + ) + }, [payInfo]) + + //账期 + const account_peyment = useMemo(() => { + const price = payInfo?.should_collect_money - payInfo?.amount_paid + return ( + {(payInfo?.account_period < price)&&'额度不足, '}剩余 ¥{formatPriceDiv(payInfo?.account_period_credit_available_line)} + ) + }, [payInfo]) + + //支付方式枚举 + const {PaymentMethodPreDeposit, PaymentMethodAccountPeriod} = PAYMENT_METHOD + + return ( + + + + + 订单支付 + + + + + + + {/* 向商家发起支付 */} + + + 订单金额 + ¥{formatPriceDiv(payInfo?.should_collect_money)} + + + 已付金额 + ¥{formatPriceDiv(payInfo?.amount_paid)} + + + + + + + + + 预存款 + + {advance_payment} + + advanceSelectData(PaymentMethodPreDeposit.value)} onClose={() => advanceSelectData(null)}/> + + {(orderInfo?.payment_method != PaymentMethodAccountPeriod.value)&& + + + + {payInfo?.account_period}天账期 + + {/* 可用额度 ¥{formatPriceDiv(payInfo?.account_period_credit_available_line)} */} + {account_peyment} + + periodSelectData(PaymentMethodAccountPeriod.value)} onClose={() => periodSelectData(null)}/> + } + + + + + 线下汇款 + + + + + + + + + 扫码支付 + + + + + + + 确认交易 + + + setofflinePayShow(false)}/> + setScanPayShow(false)}/> + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/remark/index.module.scss b/src/pages/salesAfter/components/remark/index.module.scss new file mode 100644 index 0000000..d624050 --- /dev/null +++ b/src/pages/salesAfter/components/remark/index.module.scss @@ -0,0 +1,48 @@ +.order_popup{ + display: flex; + flex-direction: column; + align-items: center; + padding: 20px 0; + .order_popup_title{ + color: $font_size_big; + font-weight: 700; + color: #000000; + padding-bottom: 20px; + } + .order_popup_input{ + width: 100%; + padding: 0 25px; + box-sizing: border-box; + margin-top: 43px; + position: relative; + .descDataNum{ + position: absolute; + right: 40px; + bottom: 10px; + height: 39px; + font-size: $font_size_medium; + color: $color_font_two; + } + textarea{ + background-color: #f3f3f3; + border-radius: 10px; + width: 100%; + height: 313px; + padding: 20px; + padding-bottom: 50px; + box-sizing: border-box; + font-size: $font_size; + border: 2px solid #e6e6e6; + } + } + .order_save_address{ + height: 82px; + background: #007aff; + border-radius: 40px; + width: 668px; + text-align: center; + line-height: 82px; + color: #fff; + margin-top: 60px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/remark/index.tsx b/src/pages/salesAfter/components/remark/index.tsx new file mode 100644 index 0000000..14d981b --- /dev/null +++ b/src/pages/salesAfter/components/remark/index.tsx @@ -0,0 +1,38 @@ +import Popup from "@/components/popup" +import { Textarea, View } from "@tarojs/components" +import { useCallback, useState } from "react" +import styles from './index.module.scss' + +type Param = { + onBlur?: (val:any) => void + onSave?: (val: string) => void +} +export default ({onBlur, onSave}:Param) => { + const [descData, setDescData] = useState({ + number: 0, + value: '', + count: 200 + }) + const getDesc = useCallback((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 setSave = () => { + onSave?.(descData.value) + } + return ( + + 编辑备注 + + + {descData.number}/{descData.count} + + setSave()}>保存 + + ) +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/scanPay/index.module.scss b/src/pages/salesAfter/components/scanPay/index.module.scss new file mode 100644 index 0000000..dcb356d --- /dev/null +++ b/src/pages/salesAfter/components/scanPay/index.module.scss @@ -0,0 +1,54 @@ +$top:170px; +.scanPay_main{ + .scanPay_con{ + padding: 20px; + background-color: #F6F6F6; + border-radius: 20px; + .miconfont_title{ + transform: rotate(-180deg); + position: absolute; + left: 20px; + top: 27px; + font-size: 37px; + color: $color_font_three; + z-index: 99; + + } + } + .title{ + font-size: $font_size_big; + color: #000000; + text-align: center; + font-weight: 700; + position: relative; + } + .desc{ + font-size: $font_size_min; + color: $color_main; + text-align: center; + padding: 10px 0; + .miconfont{ + font-size: 25px; + } + } + + .scanPay_list{ + border-radius: 10px; + height: 900px; + image{ + width: 100%; + } + } + .btns{ + background: #007aff; + border-radius: 40px; + width: 668px; + height: 82px; + text-align: center; + line-height: 80px; + width: 100%; + color: #fff; + font-size: 32px; + margin-top: 30px; + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/scanPay/index.tsx b/src/pages/salesAfter/components/scanPay/index.tsx new file mode 100644 index 0000000..d6fb06e --- /dev/null +++ b/src/pages/salesAfter/components/scanPay/index.tsx @@ -0,0 +1,161 @@ +import { Image, ScrollView, Text, View } from "@tarojs/components"; +import { memo, useEffect, useRef, useState } from "react"; +import classnames from "classnames"; +import styles from './index.module.scss' +import Popup from "@/components/popup"; +import Taro from "@tarojs/taro"; +import { alert } from "@/common/common"; +import { formatImgUrl } from "@/common/fotmat"; +import useCheckAuthorize from "@/use/useCheckAuthorize"; +import { GetPayCode } from "@/api/onlinePay"; +import LoadingCard from "@/components/loadingCard"; + + +type Param = { + show?: true|false, + onClose?: () => void +} + + +type Item = { + product_code: string, + product_name: string, + product_color_code: string, + product_color_name: string, + num: string, + weight: string, + sale_price: string, + total_price: string +} +type CodeParam = { + title: string, + company: string, + order_type: string, + sale_user: string, + order_created_time: string, + order_no: string, + department: string, + shipment_mode: string, + target_user_name: string, + target_address: string, + target_description: string, + pay_account: string, + bank_account_name: string, + bank_name: string, + pay_type: string, + client: string, + phone: string, + order_total_length: string, + order_total_price: string, + qrcode: string, + order_total_weight: string, + list: Item[] +} +export default memo(({show = true, onClose}:Param) => { + + //获取支付二维码 + const [payCodeImage, setPayCodeImage] = useState('') + const fileData = useRef({ + filePath: '', + base64: '' + }) + const {fetchData, state} = GetPayCode() + const getCore = async () => { + let res = await fetchData({ + title: "面料销售电子确认单", + company: "什么什么公司123", + order_type: "散剪", + sale_user: "小崔", + order_created_time:"2022/02/01 12:32:13", + order_no:"XS-211005888", + department:"嘻嘻嘻", + shipment_mode:"自提", + target_user_name:"大崔", + target_address:"阿斯顿发斯蒂芬", + target_description:"无", + pay_account:"1234567890123450001", + bank_account_name:"佛山市浩川长盛科技有限公司", + bank_name:"招商银行佛山分行禅城支行", + pay_type:"现结", + client:"客户名称", + phone:"15818085802", + order_total_length:"12", + order_total_price:"63000", + qrcode:"https://www.zzfzyc.com/checkorder/XS-211005888", + order_total_weight:"300.00", + list: [{product_code:'5215',product_name:'26S双纱亲水滑爽棉',product_color_code:'053',product_color_name:'洋红',num:'4',weight:'123.23',sale_price:'43',total_price:'4510.7'}] + }) + const base64 = res.data.base64 + setPayCodeImage(() => base64) + const time = new Date().valueOf() + const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || []; + let filePath = Taro.env.USER_DATA_PATH + '/img' + time +'.'+ format + fileData.current.filePath = filePath + fileData.current.base64 = bodyData + const save = Taro.getFileSystemManager() + save.writeFile({ + filePath: fileData.current.filePath, + data: fileData.current.base64, + encoding: 'base64', + }) + + } + useEffect(() => { + if(show) + getCore() + }, [show]) + + //检查是否开启保存图片权限 + const {check} = useCheckAuthorize({scope:'scope.writePhotosAlbum', msg:'您没授权,无法保存图片'}) + const saveImageCheck = async () => { + const res = await check() + res&&saveImage() + } + + //保存图片 + const saveImage = () => { + alert.loading('正在保存图片') + Taro.saveImageToPhotosAlbum({ + filePath: fileData.current.filePath, + success: function (res) { + alert.success('图片保存成功') + }, + fail: function (err) { + console.log('err::', err) + } + }) + } + + //预览图片 + const showImage = () => { + console.log('fileData.current.filePath::', fileData.current.filePath) + Taro.previewImage({ + current: fileData.current.filePath, // 当前显示 + urls: [fileData.current.filePath] // 需要预览的图片http链接列表 + }) + } + + //复制功能 + return ( + + + + + 扫码支付 + + + 扫码支付成功后,自动更新状态 + + + {(state.loading)&&|| + + + } + + 保存电子确认单 + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/shipmentMode/index.module.scss b/src/pages/salesAfter/components/shipmentMode/index.module.scss new file mode 100644 index 0000000..5f818f9 --- /dev/null +++ b/src/pages/salesAfter/components/shipmentMode/index.module.scss @@ -0,0 +1,33 @@ + + .order_title{ + display: flex; + align-items: center; + padding: 20px 30px; + box-sizing: border-box; + background-color: #fff; + height: 116px; + border-radius: 20px; + margin-top: 20px; + text{ + flex:1; + font-size: $font_size; + font-weight: 700; + } + .order_status{ + background-color: #F0F0F0; + width: 148px; + height: 55px; + color: $color_font_three; + text-align: center; + line-height: 55px; + font-size: $font_size_medium; + border-radius: 30px; + &:nth-last-child(1) { + margin-left: 20px; + } + } + .order_status_selected{ + color: $color_main; + border: 1px solid $color_main; + } + } \ No newline at end of file diff --git a/src/pages/salesAfter/components/shipmentMode/index.tsx b/src/pages/salesAfter/components/shipmentMode/index.tsx new file mode 100644 index 0000000..235591c --- /dev/null +++ b/src/pages/salesAfter/components/shipmentMode/index.tsx @@ -0,0 +1,28 @@ +import { Text, View } from "@tarojs/components" +import styles from './index.module.scss' +import classnames from "classnames"; +import { memo, useRef, useState } from "react"; + +type Param = { + onSelect?:(val:number) => void +} +export default memo(({onSelect}: Param) => { + //收货方法 1:自提,2:物流 + const shipmentMode = useRef([ + {value:1, label:'上门自提', selected:false}, + {value:2, label:'物流', selected:false} + ]) + const [selectValue, setSelectValue] = useState() + const selectShipmentMode = (value) => { + setSelectValue(() => value) + onSelect?.(value) + } + return ( + + 收货方式 + {shipmentMode.current.map(item => { + return selectShipmentMode(item.value)}>{item.label} + })} + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/submitOrderBtn/index.module.scss b/src/pages/salesAfter/components/submitOrderBtn/index.module.scss new file mode 100644 index 0000000..c5ac9ed --- /dev/null +++ b/src/pages/salesAfter/components/submitOrderBtn/index.module.scss @@ -0,0 +1,69 @@ +.order_price{ + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + &:nth-last-child(n+2) { + margin-bottom: 30px; + } + .order_price_text{ + font-size: $font_size_medium; + // margin-right: 10px; + display: flex; + .iconfont_msg{ + position: relative; + } + .miconfont{ + font-size: 30px; + font-weight: normal; + } + .message{ + position: absolute; + top: -50px; + background: #A8B3BD; + z-index: 9; + min-height: 50px; + border-radius: 10px; + padding: 10px; + box-sizing: border-box; + &::before{ + z-index: 1; + position: absolute; + bottom: -7px; + left: 10px; + width: 15px; + height: 15px; + content: " "; + transform: rotate(45deg); + background: #A8B3BD; + box-sizing: border-box; + } + } + } + .emphasis{ + font-weight: 700; + } + .order_price_num{ + color: $color_main; + font-weight: 700; + text{ + &:nth-child(1) { + font-size: $font_size_min; + } + &:nth-child(2) { + font-size: 26px; + } + &:nth-child(3) { + font-size: $font_size_medium; + } + } + } + .emphasis_num{ + text{ + &:nth-child(2) { + font-size: $font_size_big; + } + } + } + +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/submitOrderBtn/index.tsx b/src/pages/salesAfter/components/submitOrderBtn/index.tsx new file mode 100644 index 0000000..db9b432 --- /dev/null +++ b/src/pages/salesAfter/components/submitOrderBtn/index.tsx @@ -0,0 +1,40 @@ +import { Text, View } from "@tarojs/components" +import { memo, useCallback, useEffect, useMemo } from "react" +import {formatKbPrice} from '@/common/common' +import classnames from "classnames"; +import styles from './index.module.scss' +type Param = { + style?: Object, + number?: number +} +export default memo(({style, number = 0}:Param) => { + const priceDom = useCallback(() => { + let res = number.toFixed(2).split('.') + let int_num = parseInt(res[0]) + '' + let decimals_num = res[1] + return ( + <> + ¥ + {Number(int_num).toLocaleString()} + .{decimals_num} + + ) + }, [number]) + return ( + <> + + + 应付金额 + + + {/* 123123123121212312312312312 */} + + + + {priceDom()} + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/components/weightMemo/index.module.scss b/src/pages/salesAfter/components/weightMemo/index.module.scss new file mode 100644 index 0000000..3c74511 --- /dev/null +++ b/src/pages/salesAfter/components/weightMemo/index.module.scss @@ -0,0 +1,39 @@ + +.weight_memo{ + background-color: #fff; + border-radius: 20px; + padding: 0 20px; + .weight_memo_item{ + display: flex; + justify-content: space-between; + height: 130px; + &:nth-child(1) { + border-bottom: 1px solid #f3f3f3; + } + .title, .desc{ + display: flex; + align-items: center; + } + .title { + font-size: $font_size; + font-weight: 700; + } + .desc{ + color: $color_font_two; + font-size: $font_size_medium; + } + .miconfont_check, .miconfont_custom{ + font-size: 37px; + color: $color_main; + font-weight: normal; + padding-right: 10px; + } + .miconfont_custom{ + color:#FFC300; + } + .miconfont_more{ + font-size: 30px; + padding-left: 10px; + } + } +} \ No newline at end of file diff --git a/src/pages/salesAfter/components/weightMemo/index.tsx b/src/pages/salesAfter/components/weightMemo/index.tsx new file mode 100644 index 0000000..7cbfd13 --- /dev/null +++ b/src/pages/salesAfter/components/weightMemo/index.tsx @@ -0,0 +1,36 @@ +import Popup from "@/components/popup" +import { Text, Textarea, View } from "@tarojs/components" +import { memo, useCallback, useState } from "react" +import styles from './index.module.scss' +import classnames from "classnames"; + +type Param = { + onCheck?: () => void + onCustom?: () => void +} +export default memo(({onCheck, onCustom}:Param) => { + return ( + + onCheck?.()}> + + + 陆盈纺织 + + + 查看原码单 + + + + onCustom?.()}> + + + 我的码单 + + + 自定义 + + + + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfter/index.config.ts b/src/pages/salesAfter/index.config.ts new file mode 100644 index 0000000..5000759 --- /dev/null +++ b/src/pages/salesAfter/index.config.ts @@ -0,0 +1,6 @@ +export default { + navigationBarTitleText: '售后详情', + enablePullDownRefresh: true, + backgroundTextStyle: 'dark', + enableShareAppMessage: true, +} diff --git a/src/pages/salesAfter/index.module.scss b/src/pages/salesAfter/index.module.scss new file mode 100644 index 0000000..f44eb04 --- /dev/null +++ b/src/pages/salesAfter/index.module.scss @@ -0,0 +1,153 @@ +.order_main{ + min-height: 100%; + background-color:$color_bg_one; + padding: 20px; + padding-bottom: 190px; + box-sizing: border-box; + + .order_title{ + display: flex; + align-items: center; + padding: 20px 30px; + box-sizing: border-box; + background-color: #fff; + height: 116px; + border-radius: 20px; + margin-top: 20px; + text{ + flex:1; + font-size: $font_size; + font-weight: 700; + } + .order_status{ + background-color: #F0F0F0; + width: 148px; + height: 55px; + color: $color_font_three; + text-align: center; + line-height: 55px; + font-size: $font_size_medium; + border-radius: 30px; + &:nth-last-child(1) { + margin-left: 20px; + } + } + } + .order_desc{ + display: flex; + align-items: center; + background-color: #fff; + padding: 20px; + min-height: 116px; + border-radius: 20px; + margin-top: 20px; + box-sizing: border-box; + .order_desc_con{ + width: 150px; + font-size: $font_size; + font-weight: 700; + } + .order_desc_text, .order_desc_text_hint{ + font-size: $font_size_medium; + color: $color_font_two; + margin-right: 10px; + flex:1; + word-break:break-all; + } + .order_desc_text_hint{ + text-align: right; + } + .miconfont{ + font-size: 20px; + color: $color_font_two; + } + } + .submit_order{ + display: flex; + position: fixed; + bottom: 0; + left: 0; + justify-content: flex-end; + width: 100%; + height: 175px; + align-items: center; + background-color: #fff; + box-shadow: 6px 0px 12px 0px rgba(0,0,0,0.16); + padding: 20px 20px; + box-sizing: border-box; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + .order_btn { + width: 152px; + height: 72px; + border: 2px solid #dddddd; + border-radius: 46px; + display: flex; + justify-content: center; + align-items: center; + color: $color_font_three; + &:nth-child(n+2) { + margin-left: 34px; + } + } + .order_btn_select{ + color: $color_main; + border: 2px solid $color_main; + } + .order_number_desc{ + font-size: $font_size_medium; + color: $color_font_two; + } + } + .order_info{ + background-color: #fff; + margin-top: 20px; + border-radius: 20px; + padding: 20px; + .order_info_title{ + font-size: $font_size; + font-weight: 700; + margin-bottom: 20px; + + } + .order_num{ + display: flex; + justify-content: space-between; + align-items: center; + .order_num_btn{ + font-size: $font_size_medium; + padding: 5px; + border: 2px solid #007cf7; + border-radius: 10px; + color: $color_main; + } + } + text{ + font-size: $font_size; + } + + } + + .after_sale_picture_list{ + display: grid; + grid-template-columns: repeat(5, 102px); + justify-items: center; + grid-row-gap:20px; + grid-column-gap: calc((100% - 102px*5)/4); + .after_sale_picture_item{ + width: 102px; + height: 102px; + image{ + width:100%; + height: 100%; + border-radius: 10px; + } + } + } + + + .weight_memo_con{ + margin-bottom: 20px; + } + +} \ No newline at end of file diff --git a/src/pages/salesAfter/index.tsx b/src/pages/salesAfter/index.tsx new file mode 100644 index 0000000..aff512d --- /dev/null +++ b/src/pages/salesAfter/index.tsx @@ -0,0 +1,188 @@ +import { + GetSaleOrderDetailApi, + EditSaleOrderRemarkApi, +} from "@/api/order"; +import { GetOrderPayApi } from "@/api/orderPay"; +import { alert, goLink } from "@/common/common"; +import { ORDER_STATUS } from "@/common/enum"; +import { formatDateTime, formatImgUrl, formatPriceDiv } from "@/common/fotmat"; +import OrderBtns from "@/components/orderBtns"; +import SearchInput from "@/components/searchInput"; +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 ContentBox from "./components/contentBox"; +import KindList from "./components/kindList"; +import OrderState from "./components/orderState"; +import styles from './index.module.scss' + + export default () => { + + const router = useRouter() + const orderId = useRef(Number(router.params.id)) + useDidShow(() => { + getSaleOrderPreView() + }) + + //获取订单详情 + const [orderDetail, setOrderDetail] = useState() //获取到的原始数据 + const {fetchData: getOrderFetchData} = GetSaleOrderDetailApi() + const getSaleOrderPreView = async () => { + if(orderId.current) { + let res = await getOrderFetchData({id: orderId.current}) + setOrderDetail(res.data) + } + Taro.stopPullDownRefresh() + } + + //监听获取到的数据 + useEffect(() => { + if(orderDetail) + formatData() + }, [orderDetail]) + + //格式化数据格式 + const [formatDetailOrder, setFormatDetailOrder] = useState() //格式化后的数据 + 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, + status: orderDetail.status, //订单状态 + 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, //取消订单时的订单状态 + }) + } + const formatPreViewOrderMemo = useMemo(() => { + return formatDetailOrder + }, [formatDetailOrder]) + + + //获取底部按钮点击, 获取按钮状态 + const orderStateClick = useCallback((val) => { + if(val == 1) { + //取消订单 + getSaleOrderPreView() + } + if(val == 2) { + + } + }, [orderDetail]) + + //页面下拉刷新 + usePullDownRefresh(() => { + getSaleOrderPreView() + }) + + + //按钮所需数据 + const orderInfo = useMemo(() => { + return { + status: orderDetail?.status, //订单状态 + orderId: orderDetail?.id, + settle_mode: orderDetail?.settle_mode, + actual_amount: orderDetail?.actual_amount, //实付金额 + wait_pay_amount: orderDetail?.wait_pay_amount, //待付金额 + } + }, [orderDetail]) + + //订单状态枚举 + const {SaleOrderStatusCancel} = ORDER_STATUS + + return ( + + + + + {(orderDetail?.status != SaleOrderStatusCancel.value)&& + + } + + + + ) + } + + const OrderDes = memo(({val = ''}:{val?:string}) => { + //复制功能 + const clipboardData = () => { + Taro.setClipboardData({ + data: val, + success: function (res) { + Taro.showToast({ + icon: 'none', + title: '复制成功' + }) + } + }) + } + return ( + + 订单信息 + + + RA-LY-2204240002 + clipboardData()}>复制 + + + + + XS-LY-2204210002 + clipboardData()}>复制 + + + + 其他问题 + + + 板布疵点太多 + + + 2022-04-24 08:32:39 + + + ) + }) + + const AfterSalePricture = memo(() => { + //预览图片 + const showImage = () => { + Taro.previewImage({ + current: formatImgUrl(''), // 当前显示 + urls: [formatImgUrl('')] // 需要预览的图片http链接列表 + }) + } + return ( + + + + + + + + + + + + + + + + + + + + + + + ) + }) diff --git a/src/pages/salesAfterList/components/order/index.module.scss b/src/pages/salesAfterList/components/order/index.module.scss new file mode 100644 index 0000000..ece7c61 --- /dev/null +++ b/src/pages/salesAfterList/components/order/index.module.scss @@ -0,0 +1,144 @@ +.order_item{ + background-color: #fff; + border-radius: 20px; + padding: 20px; + box-sizing: border-box; + .header{ + display: flex; + align-items: center; + .user{ + display: flex; + align-items: center; + .name { + color: #000; + font-weight: 700; + margin-left: 15px; + font-size: $font_size; + } + image{ + width: 70px; + height: 70px; + border-radius: 50%; + } + } + .order_num { + flex: 1; + font-size: $font_size_medium; + color: $color_font_one; + text-align: right; + padding-right: 30px; + display: flex; + justify-content: flex-end; + align-items: center; + .miconfont { + font-size: 20px; + } + } + .tag{ + font-size: $font_size_min; + padding: 5px 15px; + background-color: $color_main; + color: #fff; + border-radius: 0px 20px 0px 20px; + } + } + .product_title{ + display: flex; + align-items: center; + padding: 35px 0; + .product_tag{ + background-color: #CDE5FF; + font-size: $font_size_min; + padding: 5px 10px; + color: $color_main; + border-radius: 6px; + } + .product_name{ + flex:1; + font-size: $font_size; + font-weight: 700; + padding-left: 20px; + } + .product_status{ + font-size: $font_size; + color: $color_main; + } + } + .product_list{ + display: flex; + .image{ + width: 126px; + height: 126px; + background: #e5ad3a; + 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 10px; + box-sizing: border-box; + } + } + .color_list{ + flex:1; + padding-left: 30px; + .color_item{ + display: flex; + justify-content: space-between; + font-size: $font_size_min; + color: $color_font_three; + align-items: center; + margin-bottom: 20px; + .color_title{ + font-weight: 700; + font-size: $font_size; + color: #000; + } + .color_more{ + color: $color_font_three; + } + } + } + + } + .color_count_num{ + font-size: $font_size_min; + color: $color_font_two; + background-color: #F6F6F6; + border-radius: 10px; + padding: 10px 22px; + margin-top: 20px; + } + .order_number{ + display: flex; + background-color: #F6F6F6; + padding: 20px; + margin-top: 20px; + align-items: center; + font-size: $font_size_medium; + border-radius: 10px; + text{ + &:nth-child(1) { + + font-weight: 700; + color: $color_font_three; + border-right: 2px solid #CCCCCC; + padding-right: 20px; + } + &:nth-child(2) { + padding-left: 20px; + color: $color_font_one; + } + } + } +} \ No newline at end of file diff --git a/src/pages/salesAfterList/components/order/index.tsx b/src/pages/salesAfterList/components/order/index.tsx new file mode 100644 index 0000000..30cf95b --- /dev/null +++ b/src/pages/salesAfterList/components/order/index.tsx @@ -0,0 +1,109 @@ +import { goLink } from "@/common/common"; +import { formatHashTag, formatImgUrl, formatPriceDiv } from "@/common/fotmat"; +import OrderBtns from "@/components/orderBtns"; +import { useSelector } from "@/reducers/hooks"; +import { Image, Text, View } from "@tarojs/components" +import classnames from "classnames"; +import { memo, useCallback, useMemo, useRef, useState } from "react"; +import OrderStatusTag from "../orderStatusTag"; +import styles from './index.module.scss' + +type Param = { + value: { + order_no: string, + sale_mode: number, + sale_mode_name: string, + status_name: string, + shipment_mode_name: string, + product_list: any[], + total_fabrics: number, + total_colors: number, + total_number: number, + status: 0, + id: number, + payment_method: number, //支付方式 + actual_amount: number, //实付金额 + wait_pay_amount: number //待付金额 + should_collect_order_id: number //应付单id + }, + onClickBtn?: (val:{status:number, orderInfo:Param['value']}) => void +} +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 orderBtnsClick = useCallback((status) => { + onClickBtn?.({status, orderInfo:value}) + }, [value]) + + //按钮所需数据 + const orderInfo = useMemo(() => { + return { + status: value?.status, //订单状态 + orderId: value?.id, + actual_amount: value?.actual_amount, //实付金额 + wait_pay_amount: value?.wait_pay_amount, //待付金额 + } + }, [value]) + + return ( + + goLink('/pages/salesAfter/index', {id: value?.id})}> + + + {userInfo?.adminUserInfo?.user_name} + + + 订单号:{value?.order_no} + + + + + goLink('/pages/salesAfter/index', {id: value?.id})}> + + {value?.sale_mode_name} + {formatHashTag(value?.product_list[0].code, value?.product_list[0].name)} + {value?.status_name} + + + + + {value?.product_list[0].product_colors[0].code} + + + {value?.product_list[0].product_colors.map((itemColor, index) => { + return ( + (index <= 1)&& + {formatHashTag(itemColor.code, itemColor.name)} + {standardPrice(itemColor.sale_price, value.sale_mode)} + ×{formatCount(itemColor, value.sale_mode)}条 + + ) + }) + } + + …… + …… + …… + + + + {`${value?.total_fabrics}种面料,${value?.total_colors}种颜色,共${value?.total_number}条`} + + 已申请退款 + 订单号:LY2278204399678 + + + + + ) +}) + diff --git a/src/pages/salesAfterList/components/orderStatusList/index.module.scss b/src/pages/salesAfterList/components/orderStatusList/index.module.scss new file mode 100644 index 0000000..47de83d --- /dev/null +++ b/src/pages/salesAfterList/components/orderStatusList/index.module.scss @@ -0,0 +1,18 @@ +.order_status_list{ + font-size: $font_size; + color: #9E9E9E; + margin-top: 20px; + .order_status_item{ + padding: 20px; + box-sizing: border-box; + } + .selected{ + font-weight: 700; + color: #000; + border-bottom: 4px solid #707070; + } + .order_list_scroll{ + white-space: nowrap; + display: flex; + } +} \ No newline at end of file diff --git a/src/pages/salesAfterList/components/orderStatusList/index.tsx b/src/pages/salesAfterList/components/orderStatusList/index.tsx new file mode 100644 index 0000000..3e12f6f --- /dev/null +++ b/src/pages/salesAfterList/components/orderStatusList/index.tsx @@ -0,0 +1,46 @@ +import { ScrollView, View } from "@tarojs/components" +import { memo, useEffect, useState } from "react" +import styles from './index.module.scss' +import classnames from "classnames"; + +type Param = { + list: {id: number, name: string}[], + defaultId?: number|null, + onSelect?: (val: number) => void +} +export default memo(({list = [], defaultId = null, onSelect}: Param) => { + const [selectInfo, setSelectInfo] = useState({ + selected: -1, //当前选中的id + tabId: '', //需要滚动到的id + }) + useEffect(() => { + if(defaultId) { + const index = list?.findIndex(item => { + console.log(item.id, defaultId) + return item.id == defaultId + }) + if(index !== -1) { + const num = index > 0?( index - 1) : 0 + setSelectInfo((e) => ({...e, tabId:list[num].id.toString()})) + } + } + }, [defaultId]) + const clickEvent = ({item, index}: {item:any, index:number}) => { + const num = index > 0?( index - 1) : 0 + setSelectInfo((e) => ({...e, tabId:list[num].id.toString(), selected: item.id})) + onSelect?.(item.id) + } + + return ( + + + + {list.map((item, index) => { + return clickEvent({item, index})} className={classnames(styles.order_status_item, (selectInfo.selected==item.id)&&styles.selected)}>{item.name} + })} + + + + ) +}) + diff --git a/src/pages/salesAfterList/components/orderStatusTag/index.module.scss b/src/pages/salesAfterList/components/orderStatusTag/index.module.scss new file mode 100644 index 0000000..df84721 --- /dev/null +++ b/src/pages/salesAfterList/components/orderStatusTag/index.module.scss @@ -0,0 +1,21 @@ +.tag{ + font-size: $font_size_min; + padding: 5px 15px; + background-color: $color_main; + color: #fff; + border-radius: 0px 20px 0px 20px; + display: flex; + align-items: center; + .miconfont{ + font-size: 30px; + } + +} +.saleReturn_tag{ + background-color: #E4E4FF; + color: #1818B4; +} +.refund_tag { + background-color: #FFE6CE; + color: #EE7500; +} \ No newline at end of file diff --git a/src/pages/salesAfterList/components/orderStatusTag/index.tsx b/src/pages/salesAfterList/components/orderStatusTag/index.tsx new file mode 100644 index 0000000..5664c7c --- /dev/null +++ b/src/pages/salesAfterList/components/orderStatusTag/index.tsx @@ -0,0 +1,19 @@ +import { Text, View } from "@tarojs/components" +import { memo } from "react" +import classnames from "classnames"; +import styles from './index.module.scss' + + +type Param = { + status?: 0|1|2 //0默认不处理, 1退款,2退货 +} +export default memo(({status = 0}:Param) => { + return ( + <> + {(status !== 0)&& + + { status == 1?'退款':'退货'} + } + + ) +}) \ No newline at end of file diff --git a/src/pages/salesAfterList/index.config.ts b/src/pages/salesAfterList/index.config.ts new file mode 100644 index 0000000..d4c9fc3 --- /dev/null +++ b/src/pages/salesAfterList/index.config.ts @@ -0,0 +1,4 @@ +export default { + navigationBarTitleText: '退货/售后', + enableShareAppMessage: true, +} diff --git a/src/pages/salesAfterList/index.module.scss b/src/pages/salesAfterList/index.module.scss new file mode 100644 index 0000000..e8f528a --- /dev/null +++ b/src/pages/salesAfterList/index.module.scss @@ -0,0 +1,38 @@ +.order_list_main{ + height: 100vh; + background-color: $color_bg_one; + display: flex; + flex-direction: column; + .title{ + padding: 0 20px; + background-color: #fff; + box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.16); + border-bottom: 2px solid #e2e2e2; + height: 160px; + .order_status_list{ + font-size: $font_size; + color: #9E9E9E; + margin-top: 20px; + .order_status_item{ + padding: 20px; + box-sizing: border-box; + } + .selected{ + font-weight: 700; + color: #000; + border-bottom: 4px solid #707070; + } + .order_list_scroll{ + white-space: nowrap; + display: flex; + } + } + } + .order_list{ + height: calc(100vh - 160px); + .order_item_con{ + margin-top: 20px; + padding: 0 20px; + } + } +} \ No newline at end of file diff --git a/src/pages/salesAfterList/index.tsx b/src/pages/salesAfterList/index.tsx new file mode 100644 index 0000000..f5c59c7 --- /dev/null +++ b/src/pages/salesAfterList/index.tsx @@ -0,0 +1,139 @@ +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} from '@/api/order' +import { dataLoadingStatus, getFilterData } from "@/common/util" +import OrderStatusList from "./components/orderStatusList" +import Payment from "../order/components/payment" +import { AFTER_ORDER_STATUS } from "@/common/enum" + +export default () => { + const {checkLogin} = useLogin() + useDidShow(async () => { + await checkLogin() + }) + + //搜索参数 + const [searchField, setSearchField] = useState({ + status: -1, + page : 1, + size : 10, + Name:'' + }) + + //获取订单状态 + const [statusList, setStatusList] = useState([{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]) + } + 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}) => { + if(status == 2) { + //去支付 + setPayOrderInfo({orderId:orderInfo.should_collect_order_id, payment_method:orderInfo.payment_method}) + toPay() + } + }, [orderData]) + + + //去付款 + const [payOrderInfo, setPayOrderInfo] = useState() + const [payMentShow, setPayMentShow] = useState(false) + const toPay = () => { + setPayMentShow(true) + } + //关闭支付弹窗 + const closePayShow = useCallback(() => { + setPayMentShow(() => false) + }, []) + //支付成功 + const onPaySuccess = useCallback(() => { + getOrderList() + closePayShow() + }, []) + + + return ( + + + + + + + + {orderData?.list.map(item => { + return + })} + + + + + ) +} diff --git a/src/pages/search/index.config.ts b/src/pages/search/index.config.ts index 2a9c72b..eac2247 100644 --- a/src/pages/search/index.config.ts +++ b/src/pages/search/index.config.ts @@ -1,3 +1,4 @@ export default { - navigationBarTitleText: '搜索' + navigationBarTitleText: '搜索', + enableShareAppMessage: true, } diff --git a/src/pages/searchList/search.config.ts b/src/pages/searchList/search.config.ts index 6241274..eac2247 100644 --- a/src/pages/searchList/search.config.ts +++ b/src/pages/searchList/search.config.ts @@ -1,3 +1,4 @@ export default { navigationBarTitleText: '搜索', + enableShareAppMessage: true, } diff --git a/src/pages/searchList/search.tsx b/src/pages/searchList/search.tsx index 301c413..7505bcd 100644 --- a/src/pages/searchList/search.tsx +++ b/src/pages/searchList/search.tsx @@ -8,7 +8,7 @@ import { useEffect, useRef, useState } from 'react'; import {GetHotSearchApi, GetSearchHistoryApi, AddSearchHistoryApi} from "@/api/search" import { SCENE } from '@/common/constant'; import useLogin from '@/use/useLogin'; -import Taro, { useDidShow } from '@tarojs/taro'; +import Taro, { useDidShow, useShareAppMessage } from '@tarojs/taro'; type searchDataParam = {'search_key':''} export default () => { diff --git a/src/pages/searchList/searchList.tsx b/src/pages/searchList/searchList.tsx index 2fe2769..7acb9fe 100644 --- a/src/pages/searchList/searchList.tsx +++ b/src/pages/searchList/searchList.tsx @@ -64,7 +64,7 @@ export default () => { //数据加载状态 const statusMore = useMemo(() => { return dataLoadingStatus({list:materialList.list, total: materialList.total, status: materialState.loading}) - }, [materialList]) + }, [materialList, materialState]) //输入了搜索关键字 const getSearchData = useCallback((e) => { diff --git a/src/pages/user/index.tsx b/src/pages/user/index.tsx index f41333b..06b76c7 100644 --- a/src/pages/user/index.tsx +++ b/src/pages/user/index.tsx @@ -4,6 +4,8 @@ import styles from './index.module.scss' import classnames from "classnames"; import { useSelector } from "@/reducers/hooks"; import { GetAdminUserInfoApi } from "@/api/user"; +import { goLink } from "@/common/common"; + export default () => { @@ -15,7 +17,6 @@ export default () => { ) } - // 头部 | 订单 const Header = memo(() => { let menu = [{ text: "待配布", icon: "icon-daipeibu" }, { text: "待付款", icon: "icon-daifukuan" }, @@ -71,7 +72,7 @@ const Header = memo(() => { 订单 - 全部 + goLink('/pages/orderList/index')}>全部 { diff --git a/src/reducers/userInfo.ts b/src/reducers/userInfo.ts index 5fbd4db..bcf3724 100644 --- a/src/reducers/userInfo.ts +++ b/src/reducers/userInfo.ts @@ -5,10 +5,12 @@ import { SET_ADMINUSERINFO, SET_TOKEN, SET_SESSIONKEY, + SET_SORTCODE, CLEAR_TOKEN, CLEAR_USERINFO, CLEAR_SESSIONKEY, CLEAR_ADMINUSERINFO, + CLEAR_SORTCODE } from '../constants/userInfo' export type UserParam = { @@ -36,14 +38,20 @@ export type UserAdminParam = { user_name?: string, wechat_user_open_id?: number is_authorize_name?: false|true, - is_authorize_phone?: false|true + is_authorize_phone?: false|true, +} + +export type SortCodeParam = { + shareShortDetail?: {title:string, code: string, img: string}, //详情分享页面短码 + shareShortPage?: {title:string, code: string, img: string}, //右上角分享页面短码 } export type DataParam = { token?: string session_key?: string, userInfo: UserParam, - adminUserInfo: UserAdminParam + adminUserInfo: UserAdminParam, + sort_code: SortCodeParam } type Action = { @@ -52,12 +60,12 @@ type Action = { } - const INIT_USER = { userInfo: Taro.getStorageSync('userInfo')?JSON.parse(Taro.getStorageSync('userInfo')):null, adminUserInfo: Taro.getStorageSync('adminUserInfo')?JSON.parse(Taro.getStorageSync('adminUserInfo')):null, token: Taro.getStorageSync('token')||'', session_key: Taro.getStorageSync('session_key')||'', + sort_code: Taro.getStorageSync('sort_code')?JSON.parse(Taro.getStorageSync('sort_code')):null, } export default function counter (state = INIT_USER, action: Action) { @@ -75,6 +83,9 @@ export default function counter (state = INIT_USER, action: Action) { case SET_SESSIONKEY: Taro.setStorageSync('session_key',data?.session_key) return {...state,...data} + case SET_SORTCODE: + Taro.setStorageSync('sort_code',JSON.stringify(data?.sort_code)) + return {...state,...data} case CLEAR_TOKEN: Taro.removeStorageSync('token') return {...state, token:''} @@ -87,6 +98,9 @@ export default function counter (state = INIT_USER, action: Action) { case CLEAR_ADMINUSERINFO: Taro.removeStorageSync('adminUserInfo') return {...state, adminUserInfo: null} + case CLEAR_SORTCODE: + Taro.removeStorageSync('sort_code') + return {...state, sortCode: null} default: return state } diff --git a/src/use/useHttp.ts b/src/use/useHttp.ts index ead24a2..2663ab8 100644 --- a/src/use/useHttp.ts +++ b/src/use/useHttp.ts @@ -168,7 +168,6 @@ export const useRequest = (options:option = { msg, data } = result.data - console.log(code, msg, data, statusCode); if (statusCode === 200) { stateRef.current.success = (code === 0 ? true : false) stateRef.current.code = code diff --git a/src/use/useLogin.ts b/src/use/useLogin.ts index aa662d7..7085254 100644 --- a/src/use/useLogin.ts +++ b/src/use/useLogin.ts @@ -1,18 +1,14 @@ -import { useEffect, useState } from "react" -import {BASE_URL, WX_APPID } from "@/common/constant" import useUserInfo from "./useUserInfo" import Taro, { useRouter } from "@tarojs/taro" -import { LoginApi } from "@/api/login" import { GetWxUserInfoApi, GetAdminUserInfoApi, GetPhoneNumberApi } from "@/api/user" -import qs from 'qs'; import useLoginRequest from "./useLoginRequest" +import { SHARE_SCENE } from "@/common/enum" +import { GetShortCodeApi } from "@/api/share" export default () => { - const {setUserInfo, setAdminUserInfo, userInfo} = useUserInfo() - - useEffect(() => { - console.log('userInfo::',userInfo.token) - }, [userInfo]) + const {setUserInfo, setAdminUserInfo, setSortCode, userInfo} = useUserInfo() + + console.log('userInfo:::', userInfo) //登录请求 (调用这个就不能再useHttp中使用,当前这个hook, 否则会死循环内存溢出) // const {fetchData} = LoginApi() @@ -33,6 +29,7 @@ export default () => { const getAdminUserInfo = async () => { let res = await useFetchData() setAdminUserInfo(res.data) + getShortCode(res.data.user_id) } //登录加checkLogin检查 @@ -45,7 +42,7 @@ export default () => { Taro.checkSession({ success: async () => { reslove(true) - if(!userInfo.adminUserInfo) getAdminUserInfo() + if(!userInfo.adminUserInfo) getAdminUserInfo() }, fail: async () => { await wxLogin() @@ -84,7 +81,6 @@ export default () => { } else { reject(user_res.msg) } - }, fail:(e) => { reject(e) @@ -115,6 +111,14 @@ export default () => { }) } + //获取分享码(右上角分享码) + const {SharePage} = SHARE_SCENE + const {fetchData: fetchDataShortCode} = GetShortCodeApi() + const getShortCode = async (user_id) => { + const {data: resPage} = await fetchDataShortCode({"share_user_id": user_id, type:SharePage.value}) + setSortCode({...userInfo.sort_code, shareShortPage: {title: '陆盈电子商城', code: resPage.md5_key, img:''}}) + } + return { checkLogin, wxLogin, diff --git a/src/use/useUserInfo.ts b/src/use/useUserInfo.ts index 9e03fc7..025bef6 100644 --- a/src/use/useUserInfo.ts +++ b/src/use/useUserInfo.ts @@ -1,6 +1,6 @@ import { useDispatch, useSelector } from 'react-redux' -import { CLEAR_SESSIONKEY, SET_USERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_USERINFO, CLEAR_TOKEN, SET_ADMINUSERINFO} from '@/constants/userInfo' -import {DataParam, UserParam, UserAdminParam} from '@/reducers/userInfo' +import { CLEAR_SESSIONKEY, SET_USERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_USERINFO, CLEAR_TOKEN, SET_ADMINUSERINFO, SET_SORTCODE} from '@/constants/userInfo' +import {DataParam, UserParam, UserAdminParam, SortCodeParam} from '@/reducers/userInfo' export default () => { const userInfo = useSelector((state:DataParam) => state.userInfo) as DataParam const dispatch = useDispatch() @@ -21,6 +21,10 @@ export default () => { dispatch({type:SET_ADMINUSERINFO, data:{adminUserInfo}}) } + const setSortCode = (sortCode:SortCodeParam) => { + dispatch({type:SET_SORTCODE, data:{sort_code:sortCode}}) + } + const removeUserInfo = () => { dispatch({type:CLEAR_USERINFO}) } @@ -41,6 +45,7 @@ export default () => { removeUserInfo, removeToken, removeSessionKey, + setSortCode, userInfo, //响应式数据返回 } } \ No newline at end of file