import { View } from '@tarojs/components'
import Taro, { useDidShow, usePullDownRefresh, useRouter } from '@tarojs/taro'
import type { ReactNode } from 'react'
import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import classnames from 'classnames'
import styles from './index.module.scss'
import AddressDetailBox from './components/addressDetailBox'
import GoodsItem from './components/GoodsItem'
import Remark from '@/components/textareaEnhance'
import Popup from '@/components/popup'
import { debounce } from '@/common/util'
import {
MpSaleOrder,
MpSaleOrderPut,
MpsaleOrderaddProductList,
MpsaleOrdersubmit,
} from '@/api/order'
import { alert, goLink } from '@/common/common'
import { formatDateTime, formatHashTag, formatPriceDiv, formatRemoveHashTag, formatWeightDiv } from '@/common/format'
import { MpPurchaserAddressList } from '@/api/addressList'
// 卡片盒子元素
interface Obs {
title?: string
modeName?: string
showMode?: boolean
children?: ReactNode
clickNode?: () => void
}
const DefaultBox = (props: Obs) => {
const {
title = '标题',
modeName = '大货',
showMode = false,
children,
clickNode,
} = props
return (
{title}
{
showMode && clickNode?.()}>{modeName}
}
{children}
)
}
const DefaultBoxWithMemo = memo(DefaultBox)
const OrderDetails = () => {
const router = useRouter()
const addrssRef = useRef([])
const pages = Taro.getCurrentPages()
const currPage = pages[pages.length - 1] // 获取当前页面
const { fetchData: addressFetch } = MpPurchaserAddressList()
let selectId = -1
// 收货方法,1:自提,2物流
const [receivingStatus, setReceivingStatus] = useState(null)
// 切换自提或者物流
const onReceivingStatus = debounce(async(e, value) => {
e.stopPropagation()
if (receivingStatus === value) {
alert.error('不能选择相同的方式')
return false
}
Taro.showLoading({
title: '请稍等...',
mask: true,
})
// 判断是否有默认地址
if (value === 2 && addrssRef.current.length > 0 && !currPage.data?.addressObj) {
setInfoObj(val => ({
...val,
province_name: addrssRef.current[0]?.province_name,
address_id: addrssRef.current[0]?.id,
city_name: addrssRef.current[0]?.city_name,
address_detail: addrssRef.current[0]?.address_detail,
district_name: addrssRef.current[0]?.district_name,
target_user_name: addrssRef.current[0]?.name,
purchaser_phone: addrssRef.current[0]?.phone,
}))
}
// 没有默认地址提示进去选择地址
if (value === 2 && !addrssRef.current.length && !infoObj?.address_id) {
alert.error('请选择地址')
}
setReceivingStatus(value)
Taro.hideLoading()
}, 300)
// 获取客户地址
// 获取地址
const getAddress = async(id) => {
const result = await addressFetch({ purchaser_id: id })
addrssRef.current = result?.data?.list.filter((item) => { return item.is_default })
}
const { fetchData: infoFetch } = MpSaleOrder()
const [infoObj, setInfoObj] = useState({})
const [goodList, setgoodList] = useState([])
// 获取订单详情
const getDetail = async() => {
Taro.showLoading({
title: '加载中...',
mask: true,
})
const res = await infoFetch({ id: router.params.orderId })
setInfoObj(res.data)
res.data.product_list.forEach((item) => {
item.product_colors.map((it) => {
it.nums = res.data?.sale_mode == 0 ? it.roll : it.length / 100
return it
})
})
setgoodList([...res.data.product_list])
orderMsg.map((it) => {
if (it.leftTitle === '订单编号:') {
it.rightTitle = res.data.order_no
}
if (it.leftTitle === '创建时间:') {
it.rightTitle = formatDateTime(res.data.create_time)
}
if (it.leftTitle === '发货时间:') {
it.rightTitle = formatDateTime(res.data.delivery_time)
}
if (it.leftTitle === '业务员:') {
it.rightTitle = res.data.sale_user_name
}
})
setOrderMsg([...orderMsg])
setReceivingStatus(res.data.shipment_mode)
// 小程序提供的api,通知页面停止下拉刷新效果
Taro.stopPullDownRefresh()
Taro.hideLoading()
getAddress(res.data?.purchaser_id)
}
// 订单信息文字数组
const [orderMsg, setOrderMsg] = useState([
{
leftTitle: '订单编号:',
rightTitle: '------',
showBtn: true,
},
{
leftTitle: '创建时间:',
rightTitle: '------',
},
{
leftTitle: '发货时间:',
rightTitle: '------',
},
{
leftTitle: '业务员:',
rightTitle: '------',
},
])
// 备注操作
const [showDesc, setShowDesc] = useState(false)
const { fetchData: remarkFetch } = MpSaleOrderPut()
const getRemark = async() => {
const res = await remarkFetch({ remark: infoObj.remark, id: Number(router.params.orderId) })
if (res.msg === 'success') {
Taro.showToast({
title: '成功',
icon: 'success',
})
setShowDesc(false)
getDetail()
}
}
useEffect(() => {
getDetail()
}, [])
// 面料修改获取金额列表接口
const { fetchData: editFetch } = MpsaleOrderaddProductList()
useDidShow(() => {
// getDetail()
const pages = Taro.getCurrentPages()
const currPage = pages[pages.length - 1] // 获取当前页面
// 获取选择回来的地址
if (currPage.data?.addressObj) {
setInfoObj(val => ({
...val,
province_name: currPage.data?.addressObj?.province_name ? currPage.data?.addressObj?.province_name : '',
address_id: currPage.data?.addressObj?.id ? currPage.data?.addressObj?.id : '',
city_name: currPage.data?.addressObj?.city_name ? currPage.data?.addressObj?.city_name : '',
address_detail: currPage.data?.addressObj?.address_detail ? currPage.data?.addressObj?.address_detail : '',
district_name: currPage.data?.addressObj?.district_name ? currPage.data?.addressObj?.district_name : '',
target_user_name: currPage.data?.addressObj?.name ? currPage.data?.addressObj?.name : '',
purchaser_phone: currPage.data?.addressObj?.phone ? currPage.data?.addressObj?.phone : '',
}))
}
selectId = currPage.data?.addressObj?.id
const obj = currPage?.data?.ids?.filter((item) => { return item == selectId })
if (currPage?.data?.ids && obj.length === 0 && infoObj?.address_id == 0) {
setInfoObj(val => ({
...val,
province_name: '',
address_id: '',
city_name: '',
address_detail: '',
district_name: '',
target_user_name: '',
purchaser_phone: '',
}))
}
if (!currPage.data?.addressObj && infoObj?.address_id == 0) {
setReceivingStatus(1)
}
else {
setReceivingStatus(2)
}
// 获取选择回来的商品
if (currPage.data?.selectGoodsList && currPage.data?.selectGoodsList.length > 0) {
for (let i = 0; i < currPage.data?.selectGoodsList.length; i++) {
let flag = true
for (let j = 0; j < goodList.length; j++) {
if (goodList[j].id === currPage.data?.selectGoodsList[i].id) {
flag = false
goodList[j].product_colors.push(...currPage.data?.selectGoodsList[i].product_colors)
}
}
if (flag) { goodList.push(currPage.data?.selectGoodsList[i]) }
}
handEditMoney(1)
}
})
const goodsObjRef = useRef()
useEffect(() => {
goodsObjRef.current = goodList
}, [goodList])
// 面料修改或者添加获取实时金额
const handEditMoney = async(toastEnum) => {
let toastMsg = ''
if (toastEnum == 1) {
toastMsg = '添加商品成功'
}
else {
toastMsg = '修改商品成功'
}
Taro.showLoading({
title: '请稍等...',
})
const arr: any = []
goodsObjRef.current.forEach((ec) => {
ec.product_colors.forEach((v) => {
const colorsArr: any[] = []
colorsArr.push({
product_color_id: v.id,
length: infoObj?.sale_mode == 0 ? 0 : Number(v.nums) * 100,
roll: infoObj?.sale_mode != 0 ? 0 : Number(v.nums),
sale_price: v.sale_price,
})
arr.push({
product_id: ec.id,
sale_mode: Number(infoObj?.sale_mode),
color_list: colorsArr,
})
})
})
// 合并相同的数据
const idArray: any[] = []
const newAarray: any[] = []
arr.forEach((ele, i) => {
if (!idArray.includes(ele.product_id)) {
newAarray.push({
product_id: ele.product_id,
name: ele.name,
sale_mode: Number(infoObj?.sale_mode),
color_list: ele.color_list,
})
idArray.push(ele.product_id)
}
else {
newAarray.map((dom, k) => {
if (dom.product_id == ele.product_id) {
dom.color_list = [...ele.color_list, ...dom.color_list]
}
})
}
})
const res = await editFetch({ add_product_list_param: newAarray, sale_order_id: infoObj?.id })
if (res.data) {
Taro.hideLoading()
Taro.showToast({
title: toastMsg,
icon: 'none',
})
goodList.map((item) => {
res.data.list?.map((v) => {
if (item.id == v.id) {
item.product_colors?.forEach((edg) => {
v.product_colors?.forEach((ac) => {
if (edg.id == ac.id) {
edg.total_sale_price = ac.total_sale_price
}
})
})
}
})
return item
})
setgoodList([...goodList])
}
else {
Taro.hideLoading()
}
}
// 页面下拉刷新
usePullDownRefresh(() => {
getDetail()
})
// 选择地址
const handSelect = (obj) => {
Taro.navigateTo({
url: `/pages/addressManager/index?orderId=${-100}&purchaser_id=${obj.purchaser_id}`,
})
}
// 是否显示按钮
const showBtn = useMemo(() => {
if ((infoObj.status === 8 || infoObj.status === 9 || infoObj.status === 4 || infoObj.status === 5 || infoObj.status === 11 || infoObj.status === 3)) {
return false
}
else {
return true
}
}, [infoObj])
const showWhatFont = useMemo(() => {
if (infoObj.shipment_mode === 1) {
return '自提商品'
}
else {
return '物流'
}
}, [infoObj])
const onChange = (e) => {
setInfoObj(val => ({ ...val, remark: e }))
}
useEffect(() => {
setInfoObj(infoObj)
}, [infoObj])
const showRemarkFont = useMemo(() => {
if (infoObj.status === 10 || infoObj.status == 0 || infoObj.status == 1 || infoObj.status == 2 || infoObj.status == 7) {
return `${'填写/修改备注'} >`
}
else {
return ''
}
}, [infoObj])
// 待接单、配布中、已配布状态时,叫预估金额,其他状态叫合计金额。
const payFont = useMemo(() => {
if (infoObj?.status === 0 || infoObj?.status === 1 || infoObj?.status === 2) {
return '预估金额'
}
else {
return '合计金额'
}
}, [infoObj])
// 复制功能
const clipboardData = () => {
Taro.setClipboardData({
data: infoObj?.order_no || '',
success(res) {
Taro.showToast({
icon: 'none',
title: '复制成功',
})
},
})
}
// 判断是否整数类型
function isInteger(obj) {
return (obj | 0) === obj
}
// 删除面料的ids数组
const [deleteProductIds, setdeleteProductIds] = useState([])
// 删除商品弹窗
const handCancelToast = (item) => {
// const deletIds: any[] = []
for (let i = 0; i < goodList?.length; i++) {
if (goodList.length === 1 && goodList[i].product_colors?.length === 1) {
return Taro.showToast({
icon: 'none',
title: '至少保留一个面料',
})
}
}
Taro.showModal({
content: '删除所选商品?',
async success(res) {
if (res.confirm) {
// 删除某项商品
goodList.forEach((edg) => {
edg?.product_colors.map((it, index) => {
if (item.id == it.id) {
deleteProductIds.push(item.id)
edg?.product_colors.splice(index, 1)
}
return it
})
return edg
})
// 子商品没有了大商品也删除
goodList.forEach((edg, index) => {
if (!edg?.product_colors.length) {
goodList.splice(index, 1)
}
})
setgoodList([...goodList])
setdeleteProductIds([...deleteProductIds])
}
else if (res.cancel) {
console.log('用户点击取消')
}
},
})
}
// 输入框减
const clickReduce = useCallback((item) => {
goodList.forEach((edg) => {
edg?.product_colors.map((it) => {
if (item.id == it.id) {
if (infoObj?.sale_mode == 0 && item.nums == 1) {
return handCancelToast(item)
}
if (infoObj?.sale_mode == 1 && item.nums == 0.3) {
return handCancelToast(item)
}
if (infoObj?.sale_mode == 2 && item.nums == 3) {
return handCancelToast(item)
}
if (isInteger(item.nums)) {
it.nums--
handEditMoney(2)
}
else {
it.nums = Math.trunc(item.nums)
handEditMoney(2)
}
}
return it
})
return edg
})
setgoodList([...goodList])
// if ((infoObj?.sale_mode == 0 && item.nums > 1) || (infoObj?.sale_mode == 1 && item.nums > 0.3) || (infoObj?.sale_mode == 2 && item.nums > 3)) {
// handEditMoney(2)
// }
}, [goodList])
// 输入框加
const handPlus = useCallback((item) => {
goodList.forEach((edg) => {
edg?.product_colors.map((it) => {
if (item.id == it.id) {
if (isInteger(item.nums)) {
item.nums++
}
else {
item.nums++
item.nums = Math.trunc(item.nums)
}
}
return it
})
return edg
})
setgoodList([...goodList])
handEditMoney(2)
}, [goodList])
// 输入框监听
const onBlur = useCallback((e, item) => {
goodList.forEach((edg) => {
edg?.product_colors.map((it) => {
if (it.id == item.id) {
if (infoObj.sale_mode == 0 && (e.detail.value == '' || Number(e.detail.value) == 0)) {
it.nums = 1
}
else if (infoObj.sale_mode == 0 && (e.detail.value != '' || Number(e.detail.value) > 0)) {
it.nums = Number(e.detail.value)
}
if (infoObj.sale_mode == 1 && Number(e.detail.value) < 0.3) {
it.nums = 0.3
}
else if (infoObj.sale_mode == 1 && Number(e.detail.value) >= 0.3) {
if (isInteger(Number(e.detail.value))) {
it.nums = Number(e.detail.value)
}
else {
it.nums = Number(e.detail.value).toFixed(2)
}
}
if (infoObj.sale_mode == 2 && Number(e.detail.value) < 3) {
it.nums = 3
}
else if (infoObj.sale_mode == 2 && Number(e.detail.value) >= 3) {
if (isInteger(Number(e.detail.value))) {
it.nums = Number(e.detail.value)
}
else {
it.nums = Number(e.detail.value).toFixed(2)
}
}
}
return it
})
return edg
})
setgoodList([...goodList])
handEditMoney(2)
}, [goodList])
// 添加面料
const navTo = () => {
const arr = JSON.stringify(goodList).replace(/%/g, '%25')
Taro.navigateTo({
url: `/pages/addFabric/index?goodList=${arr}&purchaser_id=${infoObj?.purchaser_id}&sale_mode=${infoObj?.sale_mode}`,
})
}
const { fetchData: submitFetch } = MpsaleOrdersubmit()
// 提交修改
const handSubmit = () => {
if ((infoObj?.address_id == 0 || !infoObj?.address_id) && receivingStatus == 2) {
return Taro.showToast(
{
title: '请选择收货地址',
icon: 'error',
},
)
}
const quertArr: any[] = []
goodList.forEach((item) => {
item.product_colors?.forEach((edc) => {
quertArr.push({
length: infoObj?.sale_mode != 0 ? edc.nums * 100 : 0,
product_color_id: edc.id,
product_id: item.id,
roll: infoObj?.sale_mode == 0 ? edc.nums : 0,
// sale_order_detail_id: edc.sale_order_detail_id ? edc.sale_order_detail_id : 0,
})
})
})
const query = {
address_id: infoObj?.address_id,
commodity_list: quertArr,
delete_detail_list: filterArr(deleteProductIds),
remark: infoObj?.remark,
sale_order_id: infoObj?.id,
shipment_mode: receivingStatus,
}
console.log(query, 'quertArrquertArr')
Taro.showModal({
content: '是否确认提交修改',
async success(res) {
if (res.confirm) {
Taro.showLoading({
title: '加载中...',
})
const res = await submitFetch(query)
if (res.data) {
Taro.hideLoading()
Taro.redirectTo({
url: `/pages/orderDetails/index?id=${res.data.id}`,
})
}
else {
Taro.showToast({
title: res.data.msg,
icon: 'none',
})
Taro.hideLoading()
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
},
})
}
// 数组去重
const filterArr = (arr) => {
const newArr: any[] = []
// 控制外循环
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr[j] = 0
}
}
// 去除值为0的
if (arr[i] == 0) {
continue
}
else {
// 放入新的数组
newArr.push(arr[i])
}
}
return newArr
}
// 计算预估金额
const totalMoney = useMemo(() => {
const arr: any = []
goodList.forEach((item) => {
item.product_colors.forEach((it) => {
arr.push(Number(it.total_sale_price))
})
})
const hate = sum(arr)
return hate
}, [goodList])
// 计算总面料
const totalProduct = useMemo(() => {
const arr: any = []
goodList.forEach((item) => {
arr.push(item)
})
return arr.length
}, [goodList])
// 计算总颜色
const totalColors = useMemo(() => {
const arr: any = []
goodList.forEach((item) => {
item.product_colors.forEach((it) => {
arr.push(it)
})
})
return arr.length
}, [goodList])
// 计算总颜色数量
const totalColorsNums = useMemo(() => {
const arr: any = []
goodList.forEach((item) => {
item.product_colors.forEach((it) => {
arr.push(Number(it.nums))
})
})
const hate = sum(arr)
return hate
}, [goodList])
function sum(arr) {
let s = 0
for (let i = arr.length - 1; i >= 0; i--) {
s += arr[i]
}
return s
}
return (
handSelect(obj)}
obj={infoObj}
receivingStatus={receivingStatus}
onReceivingStatus={(e, value) => onReceivingStatus(e, value)}
>
{infoObj.purchaser_name}
{infoObj.purchaser_phone}
navTo()}>添加面料
{totalProduct} 种面料,{totalColors} 个颜色,共 {totalColorsNums} {infoObj.sale_mode === 0 ? '条' : 'm'}
clickReduce(it)}
handPlus={it => handPlus(it)}
onBlur={(e, it) => onBlur(e, it)}
modeFont={infoObj?.sale_mode}
>
{payFont}
¥{formatPriceDiv(totalMoney)}
{/*
实付金额
¥{formatPriceDiv(infoObj.actual_amount)}
*/}
{
infoObj?.wait_pay_amount < 0 &&
{infoObj?.wait_pay_amount?.toString().indexOf('-') !== -1 ? '退款金额' : '待付金额'}
¥{formatPriceDiv(infoObj.wait_pay_amount)}
}
{
infoObj?.wait_pay_amount > 0 &&
{infoObj?.wait_pay_amount?.toString().indexOf('-') !== -1 ? '退款金额' : '待付金额'}
¥{formatPriceDiv(infoObj.wait_pay_amount)}
}
{
orderMsg.map((item, index) => {
return (
{item.leftTitle}
{item.rightTitle}
{item.showBtn && clipboardData()}>复制}
)
})
}
setShowDesc(showRemarkFont != '')}>
{infoObj.remark === '' ? '暂无' : infoObj.remark}
setShowDesc(false)}>
getRemark(e)}
onChange={e => onChange(e)}
defaultValue={infoObj.remark}
/>
getRemark()}>保存
handSubmit()}>提交修改
)
}
export default OrderDetails