🐞 fix(ID1000725): 购物车已选条数计算有误(取消勾选时没做减计算)

This commit is contained in:
xuan 2022-11-18 11:38:10 +08:00
parent ec748ea9ac
commit 36df372777
8 changed files with 51 additions and 37 deletions

View File

@ -31,7 +31,6 @@ const IconText: FC<PropsType> = (props) => {
const textComponent = children ? children : <Text className={classnames(props.textClassName, styles['text'])} style={textCustomStyle}>{text}</Text> const textComponent = children ? children : <Text className={classnames(props.textClassName, styles['text'])} style={textCustomStyle}>{text}</Text>
const component = ()=>{ const component = ()=>{
console.log('direction===>',direction);
if(direction === 'left' || direction === 'top'){ if(direction === 'left' || direction === 'top'){
return <> return <>
{iconComponent} {iconComponent}

View File

@ -22,10 +22,10 @@ export default (props: PropsType) => {
const selectCallBack = () => { const selectCallBack = () => {
onSelectCheckbox && onSelectCheckbox(true) onSelectCheckbox && onSelectCheckbox(true)
dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION, data: true }) dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS, data: true })
} }
const closeCallBack = () => { const closeCallBack = () => {
dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION, data: false }) dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS, data: false })
onSelectCheckbox && onSelectCheckbox(false) onSelectCheckbox && onSelectCheckbox(false)
} }

View File

@ -9,9 +9,8 @@ type PropsType = {
onSettleAccount?: Function onSettleAccount?: Function
} }
export default props => { export default (props: PropsType) => {
const { onSettleAccount, amount = 0 } = props const { onSettleAccount, amount = 0 } = props
console.log('amount==>', amount)
const handleSettle = () => { const handleSettle = () => {
onSettleAccount && onSettleAccount() onSettleAccount && onSettleAccount()

View File

@ -42,26 +42,31 @@ let ColorKindItem: FC<PropsType> = props => {
const formatUnit = itemData => { const formatUnit = itemData => {
return itemData.sale_mode == EnumSaleMode.Bulk ? '条' : '米' return itemData.sale_mode == EnumSaleMode.Bulk ? '条' : '米'
} }
// 选中
const handleSelect = () => { const handleSelect = () => {
dispatch({ dispatch({
type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX, type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX,
data: { data: {
purchaserId: purchaserId, purchaserId: purchaserId,
multipleSelection: { ...state?.multipleSelection, [itemData.id]: { multipleSelection: {
id: itemData?.id, ...state?.multipleSelection,
estimate_amount: itemData.estimate_amount, [itemData.id]: {
product_code: itemData.product_code, id: itemData?.id,
product_color_code: itemData.product_color_code, estimate_amount: itemData.estimate_amount,
sale_mode: itemData.sale_mode, product_code: itemData.product_code,
count: itemData.sale_mode === EnumSaleMode.Bulk ? itemData.roll : Number(formatMeterDiv(itemData.length)), product_color_code: itemData.product_color_code,
} }, sale_mode: itemData.sale_mode,
count: itemData.sale_mode === EnumSaleMode.Bulk ? itemData.roll : Number(formatMeterDiv(itemData.length)),
}
},
}, },
}) })
} }
// 未选中
const handleClose = () => { const handleClose = () => {
const temp = state?.multipleSelection const temp = {...state?.multipleSelection}
delete temp?.[itemData.id] delete temp?.[itemData.id]
console.log('handleClose==>',temp);
dispatch({ dispatch({
type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX, type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX,
data: { data: {

View File

@ -1,5 +1,6 @@
import { FC, ReactNode, useEffect, useMemo, useReducer, useRef } from 'react' import { FC, ReactNode, useEffect, useMemo, useReducer, useRef } from 'react'
import { import {
GoodsMeta,
ShoppingAction, ShoppingAction,
ShoppingDispatchContext, ShoppingDispatchContext,
ShoppingDispatchContextValue, ShoppingDispatchContextValue,
@ -11,8 +12,7 @@ import { ColorStore, ShoppingStateContextValue } from '../../context'
import { ShoppingStore } from '../../context/shoppingStore' import { ShoppingStore } from '../../context/shoppingStore'
export type TriggerCheckboxOptions = { export type TriggerCheckboxOptions = {
colorStore: ColorStore multipleSelection: GoodsMeta['multipleSelection']
currentCheckedPurchaserId: ShoppingStateContextValue['currentCheckedPurchaserId']
setSelectedAmount: ShoppingDispatchContextValue['UPDATE_SELECTED_AMOUNT'] setSelectedAmount: ShoppingDispatchContextValue['UPDATE_SELECTED_AMOUNT']
} }
@ -42,13 +42,12 @@ export const ShoppingProvider: FC<ShoppingCartPropsType> = props => {
// 这里要在 useEffect 也就是刷新 state 后再调用,否则如果在 onFieldsChangeRef 修改值会覆盖掉上次修改 // 这里要在 useEffect 也就是刷新 state 后再调用,否则如果在 onFieldsChangeRef 修改值会覆盖掉上次修改
useEffect(() => { useEffect(() => {
console.log('onTriggerCheckboxRef start run') console.log('onTriggerCheckboxRef start run', state.colorStore?.[state.currentCheckedPurchaserId]?.multipleSelection)
onTriggerCheckboxRef.current?.({ onTriggerCheckboxRef.current?.({
colorStore: state.colorStore, multipleSelection: state.colorStore?.[state.currentCheckedPurchaserId]?.multipleSelection,
currentCheckedPurchaserId: state.currentCheckedPurchaserId,
setSelectedAmount: amount => dispatch({ type: ShoppingDispatchType.UPDATE_SELECTED_AMOUNT, data: amount }), setSelectedAmount: amount => dispatch({ type: ShoppingDispatchType.UPDATE_SELECTED_AMOUNT, data: amount }),
}) })
}, [state.colorStore, state.currentCheckedPurchaserId]) }, [state.colorStore?.[state.currentCheckedPurchaserId]?.multipleSelection])
// 加入一个监听,为 onFieldsChange 回调服务 // 加入一个监听,为 onFieldsChange 回调服务
// useEffect(() => { // useEffect(() => {

View File

@ -86,7 +86,7 @@ let ShoppingCartItem: FC<PropsType> = props => {
dispatch({ type: ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE, data: type }) dispatch({ type: ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE, data: type })
// 重置预估金额 // 重置预估金额
dispatch({ type: ShoppingDispatchType.UPDATE_SELECTED_AMOUNT, data: 0 }) dispatch({ type: ShoppingDispatchType.UPDATE_SELECTED_AMOUNT, data: 0 })
dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION, data: false }) dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS, data: false })
} }
@ -100,7 +100,7 @@ let ShoppingCartItem: FC<PropsType> = props => {
type: ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID, type: ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID,
data: itemData?.purchaser_id as number, data: itemData?.purchaser_id as number,
}) })
dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION, data: false }) dispatch({ type: ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS, data: false })
} }
// 统计已选面料 // 统计已选面料
@ -118,6 +118,7 @@ let ShoppingCartItem: FC<PropsType> = props => {
// 统计已选颜色 // 统计已选颜色
const colorChecked = useMemo(() => { const colorChecked = useMemo(() => {
console.log('colorChecked item',multipleSelection);
if (!multipleSelection || isEmptyObject(multipleSelection)) return 0 if (!multipleSelection || isEmptyObject(multipleSelection)) return 0
return new Set( return new Set(
Object.values(multipleSelection).reduce((prev, item: Goods) => { Object.values(multipleSelection).reduce((prev, item: Goods) => {
@ -135,13 +136,10 @@ let ShoppingCartItem: FC<PropsType> = props => {
if (!multipleSelection || isEmptyObject(multipleSelection)) return 0 if (!multipleSelection || isEmptyObject(multipleSelection)) return 0
return ( return (
Object.values(multipleSelection).reduce((prev, item: Goods) => { Object.values(multipleSelection).reduce((prev, item: Goods) => {
if (selected === EnumSaleMode.Bulk) { return prev + item.count
return prev + item.count
}
return prev
}, 0) || 0 }, 0) || 0
) )
}, [multipleSelection, currentCheckedPurchaserId, selected]) }, [multipleSelection, currentCheckedPurchaserId, selected, itemData])
const [isPending, startTransition] = useTransition() const [isPending, startTransition] = useTransition()
const { fetchData } = ShoppingCartListApi() const { fetchData } = ShoppingCartListApi()
@ -222,7 +220,7 @@ let ShoppingCartItem: FC<PropsType> = props => {
<View className={styles.summary}> <View className={styles.summary}>
<Text> <Text>
{materialChecked} {colorChecked} {' '} {materialChecked} {colorChecked} {' '}
{selected === EnumSaleMode.Bulk ? `${lengthOrRollChecked}` : `${formatMeterDiv(lengthOrRollChecked).toLocaleString()}`} {selected === EnumSaleMode.Bulk ? `${lengthOrRollChecked}` : `${(lengthOrRollChecked).toLocaleString()}`}
</Text> </Text>
</View> </View>
</View> </View>
@ -370,12 +368,28 @@ const GoodsList = memo<GoodsListPropType>(props => {
const withStateSlice = (comp, slice) => { const withStateSlice = (comp, slice) => {
const MemoComp = memo(comp, (prevProps, nextProps) => { const MemoComp = memo(comp, (prevProps, nextProps) => {
let needMemo = true let needMemo = true
// const prevCheckedPurchaserId = prevProps.state.currentCheckedPurchaserId
// const nextCheckedPurchaserId = nextProps.state.currentCheckedPurchaserId
// const purchaser_id = prevProps.itemData.purchaser_id
// const prevMultipleSelection = prevProps.state.colorStore[purchaser_id].multipleSelection
// const nextMultipleSelection = nextProps.state.colorStore[purchaser_id].multipleSelection
if (JSON.stringify(prevProps.itemData) !== JSON.stringify(nextProps.itemData)) { if (JSON.stringify(prevProps.itemData) !== JSON.stringify(nextProps.itemData)) {
needMemo = false needMemo = false
} }
if(prevProps.itemData.purchaser_name === '牛逼哄哄纺织'){
console.log('------withStateSlice props-------');
console.log('withStateSlice props prevProps', prevProps);
console.log('withStateSlice props nextProps', nextProps);
console.log('------withStateSlice props-------');
}
if (JSON.stringify(prevProps.state) !== JSON.stringify(nextProps.state)) { if (JSON.stringify(prevProps.state) !== JSON.stringify(nextProps.state)) {
console.log('MultipleSelection 有变化');
needMemo = false needMemo = false
} }
// if (JSON.stringify(prevCheckedPurchaserId) !== JSON.stringify(nextCheckedPurchaserId)) {
// console.log('checkedPurchaserId 有变化');
// needMemo = false
// }
return needMemo return needMemo
}) })
const Wrapper = (props, ref) => { const Wrapper = (props, ref) => {

View File

@ -64,7 +64,7 @@ export interface ShoppingStateContextValue {
export enum ShoppingDispatchType { export enum ShoppingDispatchType {
UPDATE_MANAGE_STATUS = 'UPDATE_MANAGE_STATUS', UPDATE_MANAGE_STATUS = 'UPDATE_MANAGE_STATUS',
UPDATE_MULTIPLE_SELECTION = 'UPDATE_MULTIPLE_SELECTION', UPDATE_MULTIPLE_SELECTION_STATUS = 'UPDATE_MULTIPLE_SELECTION_STATUS',
UPDATE_CURRENT_CHECKED_PURCHASERID = 'UPDATE_CURRENT_CHECKED_PURCHASERID', UPDATE_CURRENT_CHECKED_PURCHASERID = 'UPDATE_CURRENT_CHECKED_PURCHASERID',
UPDATE_CURRENT_CHECKED_SALEMODE = 'UPDATE_CURRENT_CHECKED_SALEMODE', UPDATE_CURRENT_CHECKED_SALEMODE = 'UPDATE_CURRENT_CHECKED_SALEMODE',
UPDATE_COLOR_STORE = 'UPDATE_COLOR_STORE', UPDATE_COLOR_STORE = 'UPDATE_COLOR_STORE',
@ -74,7 +74,7 @@ export enum ShoppingDispatchType {
export interface ShoppingDispatchContextValue { export interface ShoppingDispatchContextValue {
[ShoppingDispatchType.UPDATE_MANAGE_STATUS]: (isManageStatus: ShoppingStateContextValue['isManageStatus']) => void [ShoppingDispatchType.UPDATE_MANAGE_STATUS]: (isManageStatus: ShoppingStateContextValue['isManageStatus']) => void
[ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION]: (isMultipleSelection: ShoppingStateContextValue['isMultipleSelection']) => void [ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS]: (isMultipleSelection: ShoppingStateContextValue['isMultipleSelection']) => void
[ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID]: (purchaserId: ShoppingStateContextValue['currentCheckedPurchaserId']) => void [ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID]: (purchaserId: ShoppingStateContextValue['currentCheckedPurchaserId']) => void
[ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE]: (saleMode: ShoppingStateContextValue['currentCheckedSaleMode']) => void [ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE]: (saleMode: ShoppingStateContextValue['currentCheckedSaleMode']) => void
[ShoppingDispatchType.UPDATE_COLOR_STORE]: (colorStore: React.SetStateAction<ColorStore>) => void [ShoppingDispatchType.UPDATE_COLOR_STORE]: (colorStore: React.SetStateAction<ColorStore>) => void
@ -94,7 +94,7 @@ export function shoppingReducer(state: ShoppingStateContextValue, action: Shoppi
case ShoppingDispatchType.UPDATE_MANAGE_STATUS: { case ShoppingDispatchType.UPDATE_MANAGE_STATUS: {
return { ...state, isManageStatus: data } return { ...state, isManageStatus: data }
} }
case ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION: { case ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION_STATUS: {
return { ...state, isMultipleSelection: data } return { ...state, isMultipleSelection: data }
} }
case ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID: { case ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID: {
@ -117,7 +117,7 @@ export function shoppingReducer(state: ShoppingStateContextValue, action: Shoppi
[data.purchaserId as number]: { [data.purchaserId as number]: {
purchaserId: data.purchaserId, purchaserId: data.purchaserId,
goodsKind: { ...state.colorStore[data.purchaserId]?.goodsKind, ...data.goodsKind }, goodsKind: { ...state.colorStore[data.purchaserId]?.goodsKind, ...data.goodsKind },
multipleSelection: data?.multipleSelection ? data.multipleSelection : state.colorStore[data.purchaserId]?.multipleSelection, multipleSelection: data.multipleSelection ? data.multipleSelection : state.colorStore[data.purchaserId]?.multipleSelection,
}, },
}, },
} }

View File

@ -18,15 +18,13 @@ import { alert, goLink, isEmptyObject } from '@/common/common'
export const Shopping: FC = memo(() => { export const Shopping: FC = memo(() => {
// 计算总的预估金额 // 计算总的预估金额
const handleTriggerCheckbox = ({ colorStore, currentCheckedPurchaserId, setSelectedAmount }) => { const handleTriggerCheckbox = ({ multipleSelection, setSelectedAmount }) => {
const multipleSelection = colorStore?.[currentCheckedPurchaserId]?.multipleSelection
console.log('handleTriggerCheckbox==>', multipleSelection) console.log('handleTriggerCheckbox==>', multipleSelection)
if (multipleSelection) { if (multipleSelection) {
const result = Object.values(multipleSelection).reduce((prev: number, value: Goods) => { const result = Object.values(multipleSelection).reduce((prev: number , value: Goods) => {
return prev + Number(formatPriceDiv(value.estimate_amount)) return prev + Number(formatPriceDiv(value.estimate_amount))
}, 0) as number }, 0) as number
console.log('result==>', result)
// 同步修改上下文的 预估金额 // 同步修改上下文的 预估金额
setSelectedAmount(result) setSelectedAmount(result)
} else { } else {