From c3a6e017f001e3b67d528fcd9354ba3b5c35c6a9 Mon Sep 17 00:00:00 2001
From: czm <2192718639@qq.com>
Date: Thu, 24 Nov 2022 10:16:21 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20perf(=E4=BC=98=E5=8C=96=E8=B4=AD?=
=?UTF-8?q?=E7=89=A9=E8=BD=A6):?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/productItem/index.module.scss | 96 +++++
.../shopCart/components/productItem/index.tsx | 93 ++++
.../shopCart/context/shopCartContext.jsx | 0
src/components/shopCart/index copy.tsx | 408 ++++++++++++++++++
src/components/shopCart/index.tsx | 254 +++++------
5 files changed, 705 insertions(+), 146 deletions(-)
create mode 100644 src/components/shopCart/components/productItem/index.module.scss
create mode 100644 src/components/shopCart/components/productItem/index.tsx
create mode 100644 src/components/shopCart/context/shopCartContext.jsx
create mode 100644 src/components/shopCart/index copy.tsx
diff --git a/src/components/shopCart/components/productItem/index.module.scss b/src/components/shopCart/components/productItem/index.module.scss
new file mode 100644
index 0000000..872cf82
--- /dev/null
+++ b/src/components/shopCart/components/productItem/index.module.scss
@@ -0,0 +1,96 @@
+.product_item {
+ display: flex;
+ align-items: center;
+ &:nth-child(n + 2) {
+ margin-top: 37px;
+ }
+ .checkbox {
+ display: flex;
+ align-items: center;
+ }
+ .img {
+ width: 126px;
+ height: 126px;
+ margin-left: 20px;
+ image {
+ width: 100%;
+ height: 100%;
+ border-radius: 10px;
+ }
+ }
+ .des {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ margin-left: 20px;
+ padding-right: 10px;
+ box-sizing: border-box;
+
+ .subtitle {
+ color: $color_font_two;
+ font-size: $font_size_medium;
+ margin: 10px 0;
+ }
+ .tag {
+ font-size: $font_size_min;
+ color: #fff;
+ background-color: $color_main;
+ border-radius: 10px;
+ width: 65px;
+ height: 33px;
+ text-align: center;
+ line-height: 33px;
+ }
+ }
+
+ .count {
+ display: flex;
+ justify-content: space-between;
+ .btn_count {
+ width: 235px;
+ height: 64px;
+ background-color: #ecf5ff;
+ border-radius: 40px 0px 16px 0px;
+ padding: 0 20px;
+ display: flex;
+ align-items: center;
+ }
+
+ .long {
+ color: $color_main;
+ font-size: $font_size_medium;
+ }
+ }
+ .product_item_name {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ color: #3c3c3c;
+ }
+ .product_item_name_header {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 10px;
+ margin-left: 20px;
+ font-size: 28px;
+ .price {
+ font-size: $font_size;
+ font-weight: 700;
+ color: $color_font_one;
+ text {
+ font-size: $font_size_min;
+ }
+ }
+ .title {
+ font-size: $font_size;
+ color: $color_font_one;
+ padding-right: 10px;
+ @include common_ellipsis;
+ flex: 1;
+ }
+ }
+}
+.no_product_item_select {
+ opacity: 0.3;
+}
diff --git a/src/components/shopCart/components/productItem/index.tsx b/src/components/shopCart/components/productItem/index.tsx
new file mode 100644
index 0000000..a28ce64
--- /dev/null
+++ b/src/components/shopCart/components/productItem/index.tsx
@@ -0,0 +1,93 @@
+import { View } from '@tarojs/components'
+import { memo, useCallback, useMemo } from 'react'
+import classnames from 'classnames'
+import styles from './index.module.scss'
+import MCheckbox from '@/components/checkbox'
+import Counter from '@/components/counter'
+import LabAndImg from '@/components/LabAndImg'
+import { formatHashTag, formatImgUrl, formatPriceDiv } from '@/common/fotmat'
+import { saleModeType } from '@/common/enum'
+type param = {
+ sale_model: saleModeType
+ onChangeSelect: (val: any) => any
+ onChangeCount: (val: any) => any
+
+ item: any
+}
+
+export default memo((props: param) => {
+ let { onChangeCount, onChangeSelect, item, sale_model } = props
+
+ const selectCallBack = useCallback(() => {
+ onChangeSelect({ ...item, selected: true })
+ }, [item])
+ const colseCallBack = useCallback(() => {
+ onChangeSelect({ ...item, selected: false })
+ }, [item])
+ const getLabAndImg = useCallback(() => {}, [])
+ const getInputValue = useCallback(
+ (e) => {
+ let roll = item.sale_mode == 0 ? parseFloat(e) : 0
+ let length = item.sale_mode != 0 ? parseFloat(e) * 100 : 0
+ onChangeCount({ ...item, roll, length })
+ },
+ [item],
+ )
+ const rga = useMemo(() => {
+ return { lab: item.lab, rgb: item.rgb, texture_url: item.texture_url, title: item.product_color_code }
+ }, [item])
+
+ console.log('刷新2::', item)
+
+ //格式化金额
+ const formatPirce = useCallback((price) => {
+ return Number(formatPriceDiv(price))
+ }, [])
+ //格式化数量
+ const formatCount = useCallback((item) => {
+ return item.sale_mode == 0 ? item.roll : item.length / 100
+ }, [])
+ //格式化单位
+ const formatUnit = useCallback((item) => {
+ return item.sale_mode == 0 ? '条' : '米'
+ }, [])
+ return (
+
+
+
+
+
+
+
+
+
+ {formatHashTag(item.product_code, item.product_name)}
+
+ ¥
+ {formatPirce(item.sale_price)}
+ /{item.eunit}
+
+
+
+
+ {item.product_color_code + ' ' + item.product_color_name}
+ {item.sale_mode_name}
+
+
+
+
+
+
+
+ )
+})
diff --git a/src/components/shopCart/context/shopCartContext.jsx b/src/components/shopCart/context/shopCartContext.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/shopCart/index copy.tsx b/src/components/shopCart/index copy.tsx
new file mode 100644
index 0000000..f78ef33
--- /dev/null
+++ b/src/components/shopCart/index copy.tsx
@@ -0,0 +1,408 @@
+import { Image, ScrollView, View } from '@tarojs/components'
+import Popup from '@/components/popup'
+import classnames from 'classnames'
+import MCheckbox from '@/components/checkbox'
+import LoadingCard from '@/components/loadingCard'
+import InfiniteScroll from '@/components/infiniteScroll'
+import styles from './index.module.scss'
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import Taro from '@tarojs/taro'
+import { alert, goLink } from '@/common/common'
+import { GetShoppingCartApi, DelShoppingCartApi, UpdateShoppingCartApi } from '@/api/shopCart'
+import { formatHashTag, formatImgUrl, formatPriceDiv } from '@/common/fotmat'
+import { setParam } from '@/common/system'
+import { debounce, throttle } from '@/common/util'
+import Counter from '../counter'
+import { ApplyOrderAccessApi, GetAdminUserInfoApi, SubscriptionMessageApi } from '@/api/user'
+import useCommonData from '@/use/useCommonData'
+import BindSalesmanPopup from '../bindSalesmanPopup'
+import LabAndImgShow from '../LabAndImgShow'
+import LabAndImg from '../LabAndImg'
+
+type param = {
+ show?: true | false
+ onClose?: () => void
+ intoStatus?: 'again' | 'shop'
+ default_sale_mode?: number //面料类型(0:大货, 1:剪版,2:散剪
+}
+export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
+ const selectList = [
+ { value: 0, title: '大货', unit: '条', eunit: 'kg', step: 1, digits: 0, minNum: 1, maxNum: 100000, defaultNum: 1 },
+ { value: 1, title: '剪板', unit: '米', eunit: 'm', step: 1, digits: 2, minNum: 0.5, maxNum: 9.99, defaultNum: 1 },
+ { value: 2, title: '散剪', unit: '米', eunit: 'kg', step: 1, digits: 2, minNum: 3, maxNum: 100000, defaultNum: 3 },
+ ]
+
+ //切换面料类型
+ const [selectIndex, setSelectIndex] = useState(default_sale_mode || 0)
+ const selectProduct = (index: number) => {
+ setSelectIndex(index)
+ }
+ useEffect(() => {
+ setSelectIndex(() => default_sale_mode!)
+ }, [default_sale_mode])
+
+ useEffect(() => {
+ resetList()
+ setSelectStatus(true)
+ }, [selectIndex])
+
+ const MCheckboxRef = useRef(null)
+
+ //获取购物车数据数量
+ const { setShopCount } = useCommonData()
+
+ //重置勾选数据
+ const resetList = () => {
+ list?.map((item) => {
+ if (selectIndex == item.sale_mode || selectIndex == -1) {
+ checkboxData[item.id] = true
+ } else {
+ checkboxData[item.id] = false
+ }
+ })
+ setCheckboxData(() => ({ ...checkboxData }))
+ }
+
+ //获取数据
+ const [list, setList] = useState([])
+ const [loading, setLoading] = useState(false)
+ const { fetchData } = GetShoppingCartApi()
+ const getShoppingCart = async () => {
+ const { data } = await fetchData()
+ let color_list = data.color_list || []
+ setShopCount(color_list.length)
+ initList(color_list)
+ setList(color_list)
+ setLoading(false)
+ }
+
+ //初始化全部数据默认勾选
+ const [checkboxData, setCheckboxData] = useState<{ [index: number]: true | false }>({})
+ const initStatus = useRef(false)
+ const initList = (color_list) => {
+ if (initStatus.current) {
+ color_list?.map((item) => {
+ if (selectIndex == item.sale_mode) checkboxData[item.id] = true
+ })
+ initStatus.current = false
+ }
+ setCheckboxData(() => checkboxData)
+ }
+
+ //显示是展示数据
+ useEffect(() => {
+ if (!show) {
+ setList([])
+ setSelectIndex(default_sale_mode || 0)
+ } else {
+ setLoading(true)
+ initStatus.current = true
+ getShoppingCart()
+ setShowBindSalesman(() => false)
+ }
+ }, [show])
+
+ useEffect(() => {
+ return () => {
+ setList([])
+ }
+ }, [])
+
+ const [showPopup, setShowPopup] = useState(false)
+ useEffect(() => {
+ setShowPopup(show)
+ }, [show])
+
+ //全选反选
+ const [selectStatus, setSelectStatus] = useState(false)
+ const selectAll = () => {
+ list.map((item) => {
+ if (selectIndex == item.sale_mode || selectIndex == -1) checkboxData[item.id] = !selectStatus
+ })
+ setSelectStatus(!selectStatus)
+ setCheckboxData(() => ({ ...checkboxData }))
+ }
+
+ //checkbox选中回调
+ const selectCallBack = useCallback((item) => {
+ checkboxData[item.id] = true
+ checkSelect()
+ setCheckboxData((e) => ({ ...e, ...checkboxData }))
+ }, [])
+
+ //checkbox选中判断是否全部选中,全部选中后是全选,否则反选
+ const checkSelect = () => {
+ let list_count = 0
+ let select_count = 0
+ list?.map((item) => {
+ if (selectIndex == -1 || selectIndex == item.sale_mode) {
+ list_count++
+ if (checkboxData[item.id]) select_count++
+ }
+ })
+ setSelectStatus(select_count == list_count)
+ }
+
+ //checkbox关闭回调
+ const colseCallBack = useCallback((item) => {
+ checkboxData[item.id] = false
+ checkSelect()
+ setCheckboxData((e) => ({ ...e, ...checkboxData }))
+ }, [])
+
+ //popup关闭
+ const closePopup = () => {
+ onClose?.()
+ setShowPopup(false)
+ }
+
+ //删除购物车内容
+ const { fetchData: delShopFetchData } = DelShoppingCartApi()
+ const delSelect = () => {
+ getSelectId()
+ if (selectIds.current.length <= 0) return alert.none('请选择要删除的面料!')
+ Taro.showModal({
+ content: '删除所选商品?',
+ success: async function (res) {
+ if (res.confirm) {
+ const res = await delShopFetchData({ id: selectIds.current })
+ if (res.success) {
+ getShoppingCart()
+ Taro.showToast({
+ title: '成功',
+ icon: 'success',
+ })
+ } else {
+ Taro.showToast({
+ title: res.msg,
+ icon: 'none',
+ })
+ }
+ } else if (res.cancel) {
+ console.log('用户点击取消')
+ }
+ },
+ })
+ }
+
+ //获取面料选中的id
+ const selectIds = useRef([])
+ const getSelectId = () => {
+ selectIds.current = []
+ list?.map((item) => {
+ if (selectIndex == -1 || selectIndex == item.sale_mode) {
+ checkboxData[item.id] && selectIds.current.push(item.id)
+ }
+ })
+ }
+
+ //格式化金额
+ const formatPirce = useCallback((price) => {
+ return Number(formatPriceDiv(price))
+ }, [])
+
+ //格式化数量
+ const formatCount = useCallback((item) => {
+ return item.sale_mode == 0 ? item.roll : item.length / 100
+ }, [])
+
+ //格式化单位
+ const formatUnit = useCallback((item) => {
+ return item.sale_mode == 0 ? '条' : '米'
+ }, [])
+
+ //预估金额和总条数
+ const estimatePrice = useMemo(() => {
+ let estimate_amount = 0
+ let product_list = new Set() //面料
+ let color_count = 0 //颜色数量
+ let all_count = 0 //总数量
+ list.map((item) => {
+ if (checkboxData[item.id]) {
+ estimate_amount += item.estimate_amount
+ product_list.add(item.product_id)
+ color_count++
+ all_count += item.sale_mode == 0 ? item.roll : item.length
+ }
+ })
+ let all_count_text = selectIndex == 0 ? all_count + ' 条' : all_count / 100 + ' 米'
+ return {
+ price: Number(formatPriceDiv(estimate_amount)).toFixed(2),
+ countText: `已选 ${product_list.size} 种面料,${color_count} 个颜色,共 ${all_count_text}`,
+ color_count,
+ }
+ }, [list, checkboxData])
+
+ //去结算
+ const { fetchData: useFetchData } = GetAdminUserInfoApi()
+ const { fetchData: applyOrderAccessFetchData } = ApplyOrderAccessApi()
+ const orderDetail = throttle(async () => {
+ let res = await useFetchData()
+ if (res.data.order_access_status !== 3) {
+ if (res.data.order_access_status == 1) applyOrderAccessFetchData()
+ setShowBindSalesman(() => true)
+ onClose?.()
+ return false
+ }
+ getSelectId()
+ if (selectIds.current.length == 0) {
+ alert.error('请选择面料')
+ } else {
+ let ids = selectIds.current.join('-')
+ setParam({ ids, sale_mode: selectIndex }) //临时存储
+ closePopup()
+ if (intoStatus == 'again') {
+ goLink('/pages/order/comfirm', {}, 'redirectTo')
+ } else {
+ goLink('/pages/order/comfirm')
+ }
+ }
+ }, 500)
+
+ //计数组件-当后端修改完成才修改前端显示
+ const { fetchData: fetchDataUpdateShoppingCart } = UpdateShoppingCartApi()
+ const [UpdateShoppingCartLoading, setUpdateShoppingCartLoading] = useState(false)
+ const getInputValue = debounce(async (num, item) => {
+ let roll = item.sale_mode == 0 ? parseFloat(num) : 0
+ let length = item.sale_mode != 0 ? parseFloat(num) * 100 : 0
+ setUpdateShoppingCartLoading(() => true)
+ let res = await fetchDataUpdateShoppingCart({ id: item.id, roll, length })
+ setUpdateShoppingCartLoading(() => false)
+ if (res.success) {
+ getShoppingCart()
+ }
+ }, 300)
+
+ //绑定业务员和电话号码
+ const [showBindSalesman, setShowBindSalesman] = useState(false)
+
+ //显示图片弹窗
+ const [showLabImage, setShowLabImage] = useState(false)
+ const [labImageValue, setLabImageValue] = useState()
+ const getLabAndImg = useCallback((val) => {
+ setShowLabImage(() => true)
+ setLabImageValue(val)
+ }, [])
+ const closeLabImgShow = useCallback(() => {
+ setShowLabImage(() => false)
+ }, [])
+
+ return (
+
+ closePopup()}>
+
+
+ {!selectStatus ? '全选' : '反选'}
+
+
+ 删除所选
+
+
+ {estimatePrice.countText}
+
+ {selectList.map((item) => {
+ return (
+ selectProduct(item.value)}
+ className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}>
+ {item.title}
+
+ )
+ })}
+
+
+ {loading && }
+ {!loading && list?.length > 0 && (
+
+
+ {list?.map((item) => {
+ return (
+
+
+ selectCallBack(item)}
+ onClose={() => colseCallBack(item)}
+ />
+
+
+
+
+
+
+ {formatHashTag(item.product_code, item.product_name)}
+
+ ¥
+ {formatPirce(item.sale_price)}
+ /{selectList[item.sale_mode].eunit}
+
+
+
+
+ {item.product_color_code + ' ' + item.product_color_name}
+ {item.sale_mode_name}
+
+
+ getInputValue(e, item)}
+ defaultNum={formatCount(item)}
+ step={selectList[selectIndex].step}
+ digits={selectList[selectIndex].digits}
+ onClickBtn={(e) => getInputValue(e, item)}
+ unit={formatUnit(item)}
+ minNum={selectList[selectIndex].minNum}
+ maxNum={selectList[selectIndex].maxNum}
+ disable={UpdateShoppingCartLoading}
+ />
+
+
+
+
+ )
+ })}
+
+
+ )}
+ {!loading && list?.length == 0 && (
+
+ 暂未选择商品
+ 去选购
+
+ )}
+
+
+
+
+
+
+
+
+ ¥
+ {estimatePrice.price}
+
+ 预估金额
+
+ orderDetail()}>
+ 去结算({estimatePrice.color_count})
+
+
+
+
+
+
+ setShowBindSalesman(false)} />
+
+
+
+
+
+ )
+}
diff --git a/src/components/shopCart/index.tsx b/src/components/shopCart/index.tsx
index 5db1201..29cac4b 100644
--- a/src/components/shopCart/index.tsx
+++ b/src/components/shopCart/index.tsx
@@ -18,23 +18,36 @@ import useCommonData from '@/use/useCommonData'
import BindSalesmanPopup from '../bindSalesmanPopup'
import LabAndImgShow from '../LabAndImgShow'
import LabAndImg from '../LabAndImg'
+import ProductItem from './components/productItem'
+import { saleModeType } from '@/common/enum'
type param = {
show?: true | false
onClose?: () => void
intoStatus?: 'again' | 'shop'
- default_sale_mode?: number //面料类型(0:大货, 1:剪版,2:散剪
+ default_sale_mode?: saleModeType //面料类型(0:大货, 1:剪版,2:散剪
+}
+type modelClassType = {
+ value: saleModeType
+ title: string
+ unit: string
+ step: number
+ digits: number
+ minNum: number
+ maxNum: number
+ defaultNum: number
+ eunit: string
}
export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
- const selectList = [
+ const selectList: modelClassType[] = [
{ value: 0, title: '大货', unit: '条', eunit: 'kg', step: 1, digits: 0, minNum: 1, maxNum: 100000, defaultNum: 1 },
{ value: 1, title: '剪板', unit: '米', eunit: 'm', step: 1, digits: 2, minNum: 0.5, maxNum: 9.99, defaultNum: 1 },
{ value: 2, title: '散剪', unit: '米', eunit: 'kg', step: 1, digits: 2, minNum: 3, maxNum: 100000, defaultNum: 3 },
]
//切换面料类型
- const [selectIndex, setSelectIndex] = useState(default_sale_mode || 0)
- const selectProduct = (index: number) => {
+ const [selectIndex, setSelectIndex] = useState(default_sale_mode || 0)
+ const selectProduct = (index: 0 | 1 | 2) => {
setSelectIndex(index)
}
useEffect(() => {
@@ -49,63 +62,78 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
//获取购物车数据数量
const { setShopCount } = useCommonData()
- //重置勾选数据
- const resetList = () => {
- list?.map((item) => {
- if (selectIndex == item.sale_mode || selectIndex == -1) {
- checkboxData[item.id] = true
- } else {
- checkboxData[item.id] = false
- }
- })
- setCheckboxData(() => ({ ...checkboxData }))
- }
-
- //获取数据
- const [list, setList] = useState([])
+ //获取所有数据数据
+ const [list, setList] = useState<{ [id: number]: any }>({})
const [loading, setLoading] = useState(false)
- const { fetchData } = GetShoppingCartApi()
+ const { fetchData: getShoppingFetchData } = GetShoppingCartApi()
const getShoppingCart = async () => {
- const { data } = await fetchData()
+ const { data } = await getShoppingFetchData()
let color_list = data.color_list || []
- setShopCount(color_list.length)
initList(color_list)
- setList(color_list)
setLoading(false)
}
- //初始化全部数据默认勾选
- const [checkboxData, setCheckboxData] = useState<{ [index: number]: true | false }>({})
- const initStatus = useRef(false)
- const initList = (color_list) => {
- if (initStatus.current) {
- color_list?.map((item) => {
- if (selectIndex == item.sale_mode) checkboxData[item.id] = true
- })
- initStatus.current = false
+ //更新单条数据
+ const getShoppingCartInfo = async (item) => {
+ const res = await getShoppingFetchData({ id: item.id })
+ if (res.success) {
+ let info = res.data.color_list[0]
+ let newInfo = {
+ ...item,
+ estimate_amount: info.estimate_amount,
+ estimate_weight: info.estimate_weight,
+ lab: info.lab,
+ roll: info.roll,
+ length: info.length,
+ sale_offset: info.sale_offset,
+ sale_price: info.sale_price,
+ standard_price: info.standard_price,
+ }
+ setList((e) => ({ ...e, [item['id']]: newInfo }))
}
- setCheckboxData(() => checkboxData)
}
- //显示是展示数据
+ const listData = useMemo(() => {
+ return Object.values(list)
+ }, [list])
+
+ //初始化全部数据默认勾选
+ const initList = (color_list) => {
+ let obj = {}
+ color_list?.map((item) => {
+ item.selected = selectIndex == item.sale_mode
+ const { unit, eunit, step, digits, minNum, maxNum } = selectList[item.sale_mode]
+ item = { ...item, unit, eunit, step, digits, minNum, maxNum }
+ obj[item.id] = item
+ })
+ setList(() => ({ ...obj }))
+ }
+
+ //重置勾选数据
+ const resetList = () => {
+ Object.values(list)?.map((item) => {
+ if (selectIndex == item.sale_mode) {
+ item.selected = true
+ } else {
+ item.selected = false
+ }
+ list[item['id']] = { ...item }
+ })
+ setList(() => ({ ...list }))
+ }
+
+ //显示时展示数据
useEffect(() => {
if (!show) {
- setList([])
+ setList({})
setSelectIndex(default_sale_mode || 0)
} else {
setLoading(true)
- initStatus.current = true
getShoppingCart()
setShowBindSalesman(() => false)
}
}, [show])
- useEffect(() => {
- return () => {
- setList([])
- }
- }, [])
-
const [showPopup, setShowPopup] = useState(false)
useEffect(() => {
setShowPopup(show)
@@ -114,39 +142,38 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
//全选反选
const [selectStatus, setSelectStatus] = useState(false)
const selectAll = () => {
- list.map((item) => {
- if (selectIndex == item.sale_mode || selectIndex == -1) checkboxData[item.id] = !selectStatus
+ Object.values(list)?.map((item) => {
+ if (selectIndex == item.sale_mode) {
+ item.selected = !selectStatus
+ list[item['id']] = { ...item }
+ }
})
+ setList(() => ({ ...list }))
setSelectStatus(!selectStatus)
- setCheckboxData(() => ({ ...checkboxData }))
- }
-
- //checkbox选中回调
- const selectCallBack = (item) => {
- checkboxData[item.id] = true
- checkSelect()
- setCheckboxData(() => ({ ...checkboxData }))
}
//checkbox选中判断是否全部选中,全部选中后是全选,否则反选
- const checkSelect = () => {
+ useEffect(() => {
let list_count = 0
let select_count = 0
- list?.map((item) => {
- if (selectIndex == -1 || selectIndex == item.sale_mode) {
+ Object.values(list)?.map((item) => {
+ if (selectIndex == item.sale_mode) {
list_count++
- if (checkboxData[item.id]) select_count++
+ if (item.selected) select_count++
}
})
setSelectStatus(select_count == list_count)
- }
+ }, [list])
- //checkbox关闭回调
- const colseCallBack = (item) => {
- checkboxData[item.id] = false
- checkSelect()
- setCheckboxData(() => ({ ...checkboxData }))
- }
+ //修改数量
+ const onChangeCount = useCallback((item) => {
+ getInputValue(item)
+ }, [])
+
+ //修改选择
+ const onChangeSelect = useCallback((item) => {
+ setList((e) => ({ ...e, [item.id]: { ...item } }))
+ }, [])
//popup关闭
const closePopup = () => {
@@ -187,49 +214,35 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
const selectIds = useRef([])
const getSelectId = () => {
selectIds.current = []
- list?.map((item) => {
- if (selectIndex == -1 || selectIndex == item.sale_mode) {
- checkboxData[item.id] && selectIds.current.push(item.id)
+ Object.values(list)?.map((item) => {
+ if (selectIndex == item.sale_mode) {
+ item.selected && selectIds.current.push(item.id)
}
})
}
- //格式化金额
- const formatPirce = useCallback((price) => {
- return Number(formatPriceDiv(price))
- }, [])
-
- //格式化数量
- const formatCount = useCallback((item) => {
- return item.sale_mode == 0 ? item.roll : item.length / 100
- }, [])
-
- //格式化单位
- const formatUnit = useCallback((item) => {
- return item.sale_mode == 0 ? '条' : '米'
- }, [])
-
//预估金额和总条数
const estimatePrice = useMemo(() => {
let estimate_amount = 0
let product_list = new Set() //面料
let color_count = 0 //颜色数量
let all_count = 0 //总数量
- list.map((item) => {
- if (checkboxData[item.id]) {
+ Object.values(list)?.map((item) => {
+ if (item.selected) {
estimate_amount += item.estimate_amount
product_list.add(item.product_id)
color_count++
- all_count += item.sale_mode == 0 ? item.roll : item.length
+ all_count += item.sale_mode == 0 ? parseFloat(item.roll) : parseFloat(item.length)
}
})
let all_count_text = selectIndex == 0 ? all_count + ' 条' : all_count / 100 + ' 米'
+ console.log('text::', list)
return {
price: Number(formatPriceDiv(estimate_amount)).toFixed(2),
countText: `已选 ${product_list.size} 种面料,${color_count} 个颜色,共 ${all_count_text}`,
color_count,
}
- }, [list, checkboxData])
+ }, [list])
//去结算
const { fetchData: useFetchData } = GetAdminUserInfoApi()
@@ -250,7 +263,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
setParam({ ids, sale_mode: selectIndex }) //临时存储
closePopup()
if (intoStatus == 'again') {
- goLink('/pages/order/comfirm', {}, 'redirectTo')
+ goLink('/pages/order/comfirm', null, 'redirectTo')
} else {
goLink('/pages/order/comfirm')
}
@@ -259,15 +272,13 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
//计数组件-当后端修改完成才修改前端显示
const { fetchData: fetchDataUpdateShoppingCart } = UpdateShoppingCartApi()
- const [UpdateShoppingCartLoading, setUpdateShoppingCartLoading] = useState(false)
- const getInputValue = debounce(async (num, item) => {
- let roll = item.sale_mode == 0 ? parseFloat(num) : 0
- let length = item.sale_mode != 0 ? parseFloat(num) * 100 : 0
- setUpdateShoppingCartLoading(() => true)
- let res = await fetchDataUpdateShoppingCart({ id: item.id, roll, length })
- setUpdateShoppingCartLoading(() => false)
+ const getInputValue = debounce(async (item) => {
+ let res = await fetchDataUpdateShoppingCart({ id: item.id, roll: item.roll, length: item.length })
if (res.success) {
- getShoppingCart()
+ console.log('item修改::', item)
+ getShoppingCartInfo(item)
+ } else {
+ setList((e) => ({ ...e }))
}
}, 300)
@@ -311,65 +322,16 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
{loading && }
- {!loading && list?.length > 0 && (
+ {!loading && listData?.length > 0 && (
- {list?.map((item) => {
- return (
-
-
- selectCallBack(item)}
- onClose={() => colseCallBack(item)}
- />
-
-
-
-
-
-
- {formatHashTag(item.product_code, item.product_name)}
-
- ¥
- {formatPirce(item.sale_price)}
- /{selectList[item.sale_mode].eunit}
-
-
-
-
- {item.product_color_code + ' ' + item.product_color_name}
- {item.sale_mode_name}
-
-
- getInputValue(e, item)}
- defaultNum={formatCount(item)}
- step={selectList[selectIndex].step}
- digits={selectList[selectIndex].digits}
- onClickBtn={(e) => getInputValue(e, item)}
- unit={formatUnit(item)}
- minNum={selectList[selectIndex].minNum}
- maxNum={selectList[selectIndex].maxNum}
- disable={UpdateShoppingCartLoading}
- />
-
-
-
-
- )
+ {listData?.map((item) => {
+ return
})}
)}
- {!loading && list?.length == 0 && (
+ {!loading && listData?.length == 0 && (
暂未选择商品
去选购