2023-03-03 16:50:16 +08:00

246 lines
8.0 KiB
TypeScript

import { Text, View } from '@tarojs/components'
import Taro, { getCurrentPages, useDidShow, useUnload } from '@tarojs/taro'
import { useCallback, useMemo, useRef, useState } from 'react'
import styles from './index.module.scss'
import type { AddressItem } from './components/address'
import Address from './components/address'
import type { ColorItem } from './components/productCard'
import ProductCard from './components/productCard'
import Remark from './components/remark'
import { alert, goLink } from '@/common/common'
import { SubmitColorCardApi } from '@/api/colorCard'
import { getFilterData } from '@/common/util'
import { UseSubscriptionMessage } from '@/use/useCommon'
import { SUBSCRIPTION_MESSAGE_SCENE } from '@/common/enum'
import { formatHashTag } from '@/common/fotmat'
import { submitCutSampleOrderApi } from '@/api/cutSample'
import { addressListApi } from '@/api/addressManager'
import NavBar from '@/components/navBar'
import IconFont from '@/components/iconfont/iconfont'
export interface submitData {
address_id: number
cut_sample_order_product_color_list: { color_num: number; product_color_id: number }[]
remark: string
shipment_mode: number
}
export interface ParamItem {
code: string
id: number
color_card_name: string
texture_url: string
lab: { l: number; a: number; b: number }
rgb: { r: number; g: number; b: number }
is_add: boolean
count?: number
component: string
craft: string
describe: string
hexadecimal_code: string
is_favorite: boolean
kind_code: string
kind_id: number
kind_name: string
name: string
product_color_count: number
product_screw_id: number
weight_density: string
width: string
colors: ColorItem[]
}
export default () => {
const submitData = useRef<submitData>({
address_id: 0,
cut_sample_order_product_color_list: [],
remark: '',
shipment_mode: 2,
})
const [addressInfo, setAddressInfo] = useState<AddressItem>()
const getAddress = (e) => {
submitData.current.address_id = e.id
setAddressInfo(() => e)
}
const [list, setList] = useState<ParamItem[]>([])
useDidShow(() => {
const list = Taro.getStorageSync('cutSample') ? JSON.parse(Taro.getStorageSync('cutSample')) : []
const info = Taro.getStorageSync('cutSampleOther') ? JSON.parse(Taro.getStorageSync('cutSampleOther')) : {}
setList(() => list)
computeCount(list)
if (info.address) {
setAddressInfo(info.address)
submitData.current.address_id = info?.address?.id || 0
}
else {
getAddressDefault()
}
setRemarkData(info.remark)
})
useUnload(() => {
Taro.removeStorageSync('cutSample')
Taro.removeStorageSync('cutSampleOther')
})
const onAddCard = () => {
Taro.setStorageSync('cutSample', JSON.stringify(list))
Taro.setStorageSync('cutSampleOther', JSON.stringify({ address: addressInfo || {}, remark: submitData.current.remark }))
Taro.navigateTo({
url: '/pages/cutSampleList/index',
})
}
const onDelData = useCallback((val: ParamItem) => {
return (id: number) => {
const res = val.colors?.filter((citem) => {
return citem.id != id
})
if (res.length <= 0 && list.length === 1) {
return alert.none('不能删除最后一个剪样')
}
else {
if (res.length > 0) {
list?.map((item, index) => {
if (item.id === val.id) {
list[index] = { ...item, colors: [...res] }
}
})
computeCount(list)
setList(() => [...list])
}
else {
const data = list?.filter(item => item.id != val.id)
computeCount(data)
setList(() => [...data])
}
}
}
}, [list])
// 计算总数
const [numText, setNumText] = useState('')
const computeCount = (list) => {
let p_count = 0
let c_count = 0
let all_count = 0
list?.map((item) => {
p_count += 1
item.colors?.map((citem) => {
c_count += 1
all_count += citem.count
})
})
console.log('list:::', list)
setNumText(() => `当前共 ${p_count} 种面料, ${c_count} 种色号,共 ${all_count}`)
}
const onChangeNum = useCallback((val: { id: number; count: number }) => {
list?.map((item) => {
item?.colors?.map((citem) => {
if (citem.id == val.id) {
citem.count = val.count
}
})
})
setList(() => list)
computeCount(list)
}, [list])
// 订阅消息
const { ColorCard } = SUBSCRIPTION_MESSAGE_SCENE
const { openSubscriptionMessage } = UseSubscriptionMessage()
const { fetchData: submitFetchData } = submitCutSampleOrderApi()
const onSubmitData = async() => {
Taro.showModal({
title: '确定提交订单?',
async success(val) {
if (val.confirm) {
submitData.current.cut_sample_order_product_color_list = []
list?.map((item) => {
item.colors?.map((citem) => {
submitData.current.cut_sample_order_product_color_list.push({
color_num: citem.count || 0,
product_color_id: citem.id,
})
})
})
if (!submitData.current.address_id) { return alert.none('请选择收货地址') }
await openSubscriptionMessage({ scenes: ColorCard.value })
const res = await submitFetchData(getFilterData(submitData.current))
if (res.success) {
alert.success('提交成功')
goLink('/pages/cutSampleListOrderDetail/index', { id: res.data.id }, 'redirectTo')
}
}
},
})
}
const [remarkData, setRemarkData] = useState('')
const onRemark = (e) => {
submitData.current.remark = e
setRemarkData(e)
}
// 获取默认地址
const { fetchData: addressListFetchData, state } = addressListApi()
const getAddressDefault = async() => {
const res = await addressListFetchData()
let defaultInfo: AddressItem|null = null
res?.data.list?.map((item) => {
if (item.is_default) {
defaultInfo = {
id: item.id,
address_title: item.province_name + item.city_name + item.district_name + item.address_detail,
address_name: item.name,
address_phone: item.phone,
}
}
})
submitData.current.address_id = defaultInfo!.id || 0
setAddressInfo(defaultInfo!)
}
const onClickBack = () => {
Taro.showModal({
content: '返回后页面数据将不回保留,确认返回?',
confirmColor: '#4a8dff',
success: ({ confirm }) => {
if (confirm) {
Taro.navigateBack({
delta: 1,
})
}
},
})
}
return <View className={styles.main}>
<NavBar hasLeft leftSlot={
<View onClick={onClickBack}>
<IconFont customClassName={styles.backIcon} name="icon-rukou" size={48} color="#191919"></IconFont>
</View>
} title="领取剪样"
></NavBar>
<View className={styles.address_info}><Address onSelect={getAddress} defaultValue={addressInfo} /></View>
<View className={styles.add_card_btn} onClick={onAddCard}></View>
{list?.map((item, index) => <View key={item.id} className={styles.card_con}>
<View className={styles.card_header}>{formatHashTag(item.code, item.name)}</View>
<View className={styles.card_list}>
{item.colors?.map(citem =>
<ProductCard key={citem.id} value={citem} onDelData={onDelData(item)} onChangeNum={onChangeNum} />,
)}
{(list?.length - 1 === index) && <View className={styles.express_btn}></View>}
</View>
</View>)}
<View className={styles.remark}><Remark onSave={onRemark} defaultValue={remarkData} /></View>
<View className={styles.order_btn}>
<View className={styles.btn_con} onClick={onSubmitData}>
<Text>{numText}</Text>
<View className={styles.btn}></View>
</View>
</View>
</View>
}