import { ScrollView, Text, View } from '@tarojs/components' import Taro, { useDidShow, useRouter, useUnload } from '@tarojs/taro' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import classNames from 'classnames' import styles from './index.module.scss' import Search from '@/components/search' import NormalButton from '@/components/normalButton' import LabAndImg from '@/components/LabAndImg2' import Tag from '@/components/tag' import MCheckbox from '@/components/checkbox' import InfiniteScroll from '@/components/infiniteScroll' import { dataLoadingStatus, debounce, getFilterData } from '@/common/util' import { alert, goLink } from '@/common/common' import { formatHashTag, formatRemoveHashTag } from '@/common/format' import Popup from '@/components/popup' import IconFont from '@/components/iconfont/iconfont' import { GetCutSampleOrderColorList, GetCutSampleOrderProducts } from '@/api/sampleCutting' export interface SampleCuttingCache { product_id: number product_code_and_name: string multipleSelection: { product_color_id: number product_color_code: string product_color_name: string lab: { l: number a: number b: number } rgb: { r: number g: number b: number } texture_url: string count: number }[] } const SampleCuttingList = () => { const router = useRouter() const isAdd = router?.params?.isAddSampleCutIdList const { fetchData, state } = GetCutSampleOrderProducts() const [orderList, setOrderList] = useState<{ list: any[]; total: number }>({ list: [], total: 0, }) const multipleSelection = useRef([]) // 搜索 const getSearchData = debounce((value: string) => { console.log('search', value) setSearchField(val => ({ ...val, product_code_and_name: value })) }, 300) // 取消 const handleCancel = () => { Taro.navigateBack() } // redirectTo 会触发 onLoad 事件 let isRedirect = false // 确认 const handleSubmit = () => { Taro.setStorageSync('sampleCuttingCache', JSON.stringify(multipleSelection.current)) if (router?.params.isGoBack) { isRedirect = true Taro.navigateBack({ delta: 1, }) } else { isRedirect = true // 携带id跳转 goLink('/pages/sampleCutting/addSampleCutting/index', null, 'redirectTo') } } const labAndImgObj = useCallback((item) => { return { lab: item?.lab, rgb: item?.rgb, texture_url: item?.texture_url } }, []) // 页码和页数 const [searchField, setSearchField] = useState<{ product_code_and_name?: string; product_ids?: string; page: number; size: number }>({ product_code_and_name: '', product_ids: '', page: 1, size: 10, }) const getData = async() => { console.log('searchField==>', searchField) const res = await fetchData(getFilterData(searchField)) if (!res.success) { return alert.error(res.msg) } setOrderList({ list: res.data.list, total: res.data.total }) } useEffect(() => { getData() }, [searchField]) useDidShow(() => { const cache = Taro.getStorageSync('sampleCuttingCache') if (cache) { multipleSelection.current = JSON.parse(cache) as SampleCuttingCache[] } if (isAdd) { console.log('isAdd', isAdd) // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain setSearchField(val => ({ ...val, product_ids: isAdd })) } }) // 上拉加载数据 const pageNum = useRef({ size: searchField.size, page: searchField.page }) // 列表下拉刷新 const [refresherTriggeredStatus, setRefresherTriggeredStatus] = useState(false) // 下拉刷新 const getRefresherRefresh = async() => { pageNum.current.size = 1 setRefresherTriggeredStatus(true) setSearchField(val => ({ ...val, size: 10 })) } // 数据加载状态 const statusMore = useMemo(() => { return dataLoadingStatus({ list: orderList.list, total: orderList.total, status: state.loading! }) }, [orderList, state.loading]) const getScrollToLower = useCallback(() => { if (orderList.list.length < orderList.total) { pageNum.current.page++ const size = pageNum.current.size * pageNum.current.page setSearchField({ ...searchField, size }) } }, [orderList]) const { fetchData: getColorList } = GetCutSampleOrderColorList() const currentSelect = useRef({}) const handleClickAddButton = async(item: any) => { currentSelect.current = item const res = await getColorList({ id: item.id }) if (res.success) { setProductList(res.data.list) const index = multipleSelection.current.findIndex(val => val.product_id === item.id) if (index !== -1) { setProductMultipleSelection(multipleSelection.current[index].multipleSelection) } else { setProductMultipleSelection([]) } setShow(true) } else { return alert.error(res.msg) } } useUnload(() => { console.log('onUnload', isRedirect) if (!isRedirect) { Taro.removeStorageSync('sampleCuttingCache') } }) const [show, setShow] = useState(false) const onClose = () => { setShow(false) setProductMultipleSelection([]) } const [productList, setProductList] = useState([]) // 点击产品颜色 const handleClickProductColor = (item: any) => { const index = productMultipleSelection.findIndex(val => val.product_color_id === item.product_color_id) console.log(index, productMultipleSelection) if (index !== -1) { setProductMultipleSelection((prev) => { prev.splice(index, 1) return [...prev] }) } else { setProductMultipleSelection(prev => [...prev, { product_color_id: item.product_color_id, product_color_code: item.product_color_code, product_color_name: item.product_color_name, lab: item.lab, rgb: item.rgb, texture_url: item.texture_url, count: 1, }]) } } const handleClose = () => { onClose() } const handleAddProduct = () => { const index = multipleSelection.current.findIndex(mul => mul.product_id === currentSelect.current.id) if (index !== -1) { multipleSelection.current[index].multipleSelection = productMultipleSelection } else { multipleSelection.current.push({ product_id: currentSelect.current.id, product_code_and_name: formatHashTag(currentSelect.current.code, currentSelect.current.name) as string, multipleSelection: productMultipleSelection, }) } onClose() } const [productMultipleSelection, setProductMultipleSelection] = useState([]) return 取消 { orderList.list.map((item) => { return { item.is_multiple_product ? 24色 : null } {formatHashTag(item.code, item.name)} {item.width} {item.weight_density} {item.component} handleClickAddButton(item)} > { isAdd?.includes(item.id) || multipleSelection.current.some(mul => mul.product_id === item.id) ? '继续添加' : '添加' } {/* onSelect(item)} onClose={() => onUnSelect(item)} /> */} }) } { multipleSelection.current.length ? `确认(已选 ${multipleSelection.current.length} 个)` : '确认' } {formatHashTag(currentSelect.current.code, currentSelect.current.name)}( {productList.length} ) 剪样大小为A4,大约22cm*30cm { productList.map((item, index) => { const isChecked = productMultipleSelection.some(mul => mul.product_color_id === item.product_color_id) return handleClickProductColor(item)}> { isChecked ? : null } {item.product_color_name} }) } 取消 领取剪样({productMultipleSelection.length}) } export default SampleCuttingList