feat(颜色取样|取色查找|样品对比): 已完成颜色对比|取色查找|样品对比100%】

This commit is contained in:
xuan 2022-11-02 17:53:13 +08:00
parent 7eb3394cd8
commit b5de3a031b
14 changed files with 299 additions and 218 deletions

View File

@ -197,6 +197,20 @@
"query": "", "query": "",
"launchMode": "default", "launchMode": "default",
"scene": null "scene": null
},
{
"name": "",
"pathName": "pages/colorRelated/findColor/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "",
"pathName": "pages/colorRelated/sampleComparison/index",
"query": "",
"launchMode": "default",
"scene": null
} }
] ]
} }

View File

@ -7,5 +7,6 @@ export const FindColorListApi = () => {
return useRequest({ return useRequest({
url: `/v1/mp/product/color/absorb/match`, url: `/v1/mp/product/color/absorb/match`,
method: 'get', method: 'get',
pagination: true
}) })
} }

View File

@ -3,7 +3,7 @@ import { useRequest } from '@/use/useHttp'
//取色对比 //取色对比
export const productabsorbcontrast = () => { export const productabsorbcontrast = () => {
return useRequest({ return useRequest({
url: `/v1/mall/product/color/absorb/contrast`, url: `/v1/mp/product/color/absorb/contrast`,
method: 'get', method: 'get',
}) })
} }

View File

@ -1,69 +1,97 @@
import Popup from "@/components/popup" import Popup from '@/components/popup'
import { ScrollView, View } from "@tarojs/components" import { ScrollView, View } from '@tarojs/components'
import { FC, useEffect, useState } from "react" import { FC, forwardRef, useEffect, useImperativeHandle, useState } from 'react'
import styles from './index.module.scss' import styles from './index.module.scss'
import { formatDateTime} from "@/common/format"; import { formatDateTime, formatHashTag } from '@/common/format'
import {toRgb} from '@/common/bluetooth/color/colorSpace' import { toRgb } from '@/common/bluetooth/color/colorSpace'
import Taro from "@tarojs/taro"; import Taro from '@tarojs/taro'
import { usePropsValue } from '@/use/useCommon'
type PropsType = { type PropsType = {
showModal: boolean showModal: boolean
onColor?:Function onVisibleChange?: (visible: boolean) => void
onColor?: Function
} }
type HistoryListItem = {
p_time: number
lab: number[]
code: string
name: string
}
const HistoryColor: FC<PropsType> = forwardRef((props, ref) => {
const { onColor, showModal, onVisibleChange } = props
const HistoryColor: FC<PropsType> = (props) => { const [visible, setVisible] = usePropsValue({
value: showModal,
defaultValue: showModal,
const { onColor, showModal } = props onChange: onVisibleChange,
const [show, setShow] = useState(false) })
useEffect(() => { useEffect(() => {
setShow(showModal) if (visible) {
}, [showModal]) getList()
}
}, [visible])
useImperativeHandle(
ref,
() => {
return {
show: () => setVisible(true),
hide: () => setVisible(false),
visible,
}
},
[visible],
)
const closeEven = () => { const closeEven = () => {
setShow(false) console.log('closeEven')
setVisible(false)
} }
const [list, setList] = useState([ //获取本地列表(无差别存储版本)
{ const getList = () => {
p_time: 0, let historyColorList = Taro.getStorageSync('historyColor')
lab: [], console.log('historyColorList==>', historyColorList)
code: '', setList(historyColorList || [])
name: '' }
}
]) const [list, setList] = useState<HistoryListItem[]>([])
//保留1位小数 //保留1位小数
const noScale = (val, num = 1) => { const noScale = (val, num = 1) => {
return val?.toFixed(num) return val?.toFixed(num)
} }
//rgb转换字符串 //rgb转换字符串
const labRoRgb = (val) => { const labRoRgb = val => {
const rgb = toRgb(val) const rgb = toRgb(val)
return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})` return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})`
} }
const getInfo = (item) => { const getInfo = val => {
onColor && onColor(item) const index = list.findIndex(item => item.p_time == val.p_time)
let tempList = JSON.parse(JSON.stringify(list))
tempList.splice(index, 1)
tempList.unshift(val)
setList(tempList)
Taro.setStorageSync('historyColor', tempList)
onColor && onColor(val)
setVisible(false)
} }
return ( return (
<View className={styles.history_color}> <View className={styles.history_color}>
<Popup title='历史取样记录 ( 最近30条 )' show={show} onClose={closeEven}> <Popup title='历史取样记录 ( 最近30条 )' show={visible} onClose={closeEven}>
<ScrollView className={styles['selectList-scroll-color']} scrollY> <ScrollView className={styles['selectList-scroll-color']} scrollY>
<View className={styles.selectCon}> <View className={styles.selectCon}>
{!!list?.length ? ( {list?.length ? (
list.map((item, index) => { list.map((item, index) => {
return ( return (
<View key={item.p_time} className={styles.selectList} onClick={() => getInfo(item)}> <View key={index} className={styles.selectList} onClick={() => getInfo(item)}>
<View className={styles.rgbColor} style={{ background: labRoRgb(item.lab) }}></View> <View className={styles.rgbColor} style={{ background: labRoRgb(item.lab) }}></View>
<View className={styles.product_con}> <View className={styles.product_con}>
<View className={styles.product_name}>{item.code + ' ' + item.name}</View> <View className={styles.product_name}>{formatHashTag(item.code, item.name)}</View>
<View className={styles.date}>{formatDateTime(item.p_time)}</View> <View className={styles.date}>{formatDateTime(item.p_time)}</View>
</View> </View>
<View className={styles.labColor}> <View className={styles.labColor}>
@ -78,12 +106,12 @@ const HistoryColor: FC<PropsType> = (props) => {
) )
}) })
) : ( ) : (
<View className='noData'></View> <View className={styles.noData}></View>
)} )}
</View> </View>
</ScrollView> </ScrollView>
</Popup> </Popup>
</View> </View>
) )
} })
export default HistoryColor export default HistoryColor

View File

@ -37,7 +37,7 @@ const LabColor: FC<PropsType> = (props) => {
return ( return (
<View className={styles.lab_color_main}> <View className={styles.lab_color_main}>
<View className={styles.btnColor} onClick={onLabEven} style={{ background: labObj.rgb }}> <View className={styles.btnColor} onClick={onLabEven} style={{ background: labObj.rgb }}>
{!!labObj.lab.length ? '' : '点击取色'} {labObj.lab.length ? '' : '点击取色'}
</View> </View>
<View className={styles.labCon}> <View className={styles.labCon}>
<View className={styles.lab}> <View className={styles.lab}>

View File

@ -53,8 +53,9 @@
.product_title { .product_title {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
.product_name { .product_name {
@include common_ellipsis(); @include common_ellipsis(2);
color: #0c68c5; color: #0c68c5;
font-weight: 700; font-weight: 700;
font-size: 28px; font-size: 28px;
@ -62,6 +63,9 @@
margin-right: 10px; margin-right: 10px;
} }
.product_num { .product_num {
display: flex;
justify-content: center;
align-items: center;
background: #c9e4ff; background: #c9e4ff;
color: #00499f; color: #00499f;
padding: 3px 6px; padding: 3px 6px;

View File

@ -1,5 +1,5 @@
import { View, Text } from '@tarojs/components' import { View, Text } from '@tarojs/components'
import { FC, useEffect, useState } from 'react' import { FC, useEffect, useMemo, useState } from 'react'
import styles from './index.module.scss' import styles from './index.module.scss'
import LineBluetooth from '../components/bluetooth/LinkBlueTooth' import LineBluetooth from '../components/bluetooth/LinkBlueTooth'
import HistoryColor from './components/HistoryColor' import HistoryColor from './components/HistoryColor'
@ -13,29 +13,30 @@ import Taro from '@tarojs/taro'
import { throttle } from '@/common/util' import { throttle } from '@/common/util'
const FindColor: FC = () => { const FindColor: FC = () => {
const { measureAndGetLab, disconnect, connected, deviceLab } = useBluetooth() const { measureAndGetLab, disconnect, state: bluetoothState } = useBluetooth()
const { state: colorState, fetchData: ApiFindColorList } = FindColorListApi() const { state: colorState, fetchData: ApiFindColorList } = FindColorListApi()
const [list, setList] = useState([]) const [list, setList] = useState([])
const [product, setProduct] = useState<Record<string, any>>({}) const [product, setProduct] = useState<Record<string, any>>({})
//获取数据 //获取数据
const getData = async () => { const getData = async lab => {
setList([]) const res = await ApiFindColorList({
await ApiFindColorList({
product_id: product.id, product_id: product.id,
l: labArray[0], l: lab[0],
a: labArray[1], a: lab[1],
b: labArray[2], b: lab[2],
}) })
setList(colorState.data.list) if (res.success) {
setList(res.data.list)
}
} }
const [labArray, setlabArray] = useState<Array<any>>([]) const [labArray, setlabArray] = useState<Array<any>>([])
const [labtime, setLabtime] = useState<any>(+new Date()) const [labtime, setLabtime] = useState<any>(+new Date())
//点击获取lab按钮 //点击获取lab按钮
const labEven = throttle(async () => { const labEven = throttle(async () => {
if (!connected) { if (!bluetoothState.connected) {
Taro.showToast({ title: '请先链接设备', icon: 'none' }) Taro.showToast({ title: '请先链接设备', icon: 'none' })
return return
} }
@ -45,6 +46,7 @@ const FindColor: FC = () => {
} }
await measureAndGetLab() await measureAndGetLab()
}, 500) }, 500)
const selectInput = (val) => { const selectInput = (val) => {
setProduct(val) setProduct(val)
setLabtime('') setLabtime('')
@ -53,6 +55,7 @@ const FindColor: FC = () => {
} }
const getColor = (val) => { const getColor = (val) => {
console.log('val===>', val)
setList([]) setList([])
setlabArray(val.lab) setlabArray(val.lab)
setLabtime(val.p_time) setLabtime(val.p_time)
@ -62,28 +65,26 @@ const FindColor: FC = () => {
id: val.id, id: val.id,
name: val.name, name: val.name,
}) })
getData() getData(val.lab)
} }
const [listLoading, setListLoading] = useState(false) const handleVisibleChange = (visible) => {
setShowHistory(visible)
useEffect(() => { }
setListLoading(colorState.loading)
}, [colorState])
const [showHistory, setShowHistory] = useState(false) const [showHistory, setShowHistory] = useState(false)
const ResultContainer = () => { const ResultContainer = useMemo(() => {
if (!listLoading && list?.length > 0) { if (!colorState.loading && list?.length > 0) {
return <RecommendColor customStyle={{ flex: 1 }} list={list} /> return <RecommendColor customStyle={{ flex: 1 }} list={list} />
} else if (!listLoading && labArray.length == 0) { } else if (!colorState.loading && labArray.length == 0) {
return <View className={styles.noList}>--</View> return <View className={styles.noList}>--</View>
} else if (!listLoading && labArray.length > 0 && list?.length == 0) { } else if (!colorState.loading && labArray.length > 0 && list?.length == 0) {
return <View className={styles.noList}>--</View> return <View className={styles.noList}>--</View>
} else if (listLoading) { } else if (colorState.loading) {
return <Loading /> return <Loading />
} }
} }, [colorState, list])
//历史取样 //历史取样
const historyShowEven = () => { const historyShowEven = () => {
@ -95,22 +96,22 @@ const FindColor: FC = () => {
Taro.showToast({ title: '请选择面料', icon: 'none' }) Taro.showToast({ title: '请选择面料', icon: 'none' })
return return
} }
if (deviceLab) { if (bluetoothState.deviceLab) {
setLabtime(+new Date()) setLabtime(+new Date())
setlabArray([deviceLab.L, deviceLab.a, deviceLab.b]) setlabArray([bluetoothState.deviceLab.L, bluetoothState.deviceLab.a, bluetoothState.deviceLab.b])
// console.log('state.labArray::',state.labArray) // console.log('state.labArray::',state.labArray)
localSave() localSave([bluetoothState.deviceLab.L, bluetoothState.deviceLab.a, bluetoothState.deviceLab.b])
getData() getData([bluetoothState.deviceLab.L, bluetoothState.deviceLab.a, bluetoothState.deviceLab.b])
} }
}, [deviceLab]) }, [bluetoothState.deviceLab])
//本地存储取色记录(无差别存储版本) //本地存储取色记录(无差别存储版本)
const localSave = () => { const localSave = lab => {
let historyColorList = Taro.getStorageSync('historyColor') || [] let historyColorList = Taro.getStorageSync('historyColor') || []
let obj = { let obj = {
...product, ...product,
p_time: labtime, p_time: +new Date(),
lab: labArray, lab,
} }
historyColorList.unshift(obj) historyColorList.unshift(obj)
if (historyColorList.length > 30) historyColorList.pop() if (historyColorList.length > 30) historyColorList.pop()
@ -121,7 +122,7 @@ const FindColor: FC = () => {
<View className={styles.findColor_main}> <View className={styles.findColor_main}>
<View className={styles.findColor_main_search}> <View className={styles.findColor_main_search}>
<LineBluetooth></LineBluetooth> <LineBluetooth></LineBluetooth>
<SelectProduct selectColorId={product?.id} noAll={true} onSelect={selectInput} /> <SelectProduct selectColorId={product?.id} onSelect={selectInput} />
</View> </View>
<LabColor lab={labArray} time={labtime} onLab={labEven} /> <LabColor lab={labArray} time={labtime} onLab={labEven} />
<View className={styles.findColor_main_title}> <View className={styles.findColor_main_title}>
@ -130,8 +131,8 @@ const FindColor: FC = () => {
<Text onClick={historyShowEven}></Text> <Text onClick={historyShowEven}></Text>
</View> </View>
</View> </View>
<HistoryColor showModal={showHistory} onColor={getColor} /> <HistoryColor showModal={showHistory} onColor={getColor} onVisibleChange={handleVisibleChange} />
{ResultContainer()} {ResultContainer}
<View className='common_safe_area_y'></View> <View className='common_safe_area_y'></View>
</View> </View>
) )

View File

@ -7,6 +7,7 @@ import LinkBlueTooth from '../components/bluetooth/LinkBlueTooth'
import { toRgb } from '@/common/bluetooth/color/colorSpace' import { toRgb } from '@/common/bluetooth/color/colorSpace'
import styles from './index.module.scss' import styles from './index.module.scss'
import { productabsorbcontrast } from '@/api/index' import { productabsorbcontrast } from '@/api/index'
import { isObject } from '@tarojs/shared'
export default () => { export default () => {
//搜索参数 //搜索参数
const [searchField, setSearchField] = useState({ const [searchField, setSearchField] = useState({
@ -18,8 +19,8 @@ export default () => {
b2: '', b2: '',
}) })
type ColorList = { type ColorList = {
one?: any one?: Record<string, any> | null
two?: any two?: Record<string, any> | null
} }
const [colorList, setColorList] = useState<ColorList>({ const [colorList, setColorList] = useState<ColorList>({
one: null, one: null,
@ -27,7 +28,7 @@ export default () => {
}) })
const { state: colorState, measureAndGetLab } = useBluetooth() const { state: colorState, measureAndGetLab } = useBluetooth()
const getLab = async (val) => { const getLab = async val => {
if (colorState.connected) { if (colorState.connected) {
let res = await measureAndGetLab() let res = await measureAndGetLab()
if (val === 1) { if (val === 1) {
@ -58,14 +59,16 @@ export default () => {
const [timeTwo, setTimeTwo] = useState('') const [timeTwo, setTimeTwo] = useState('')
useEffect(() => { useEffect(() => {
if (colorState.deviceLab) { if (colorState.deviceLab) {
if ((colorList as any).one?.constructor === Object) { const one = colorList.one
const rgb = toRgb([(colorList as any).one?.L, (colorList as any).one?.a, (colorList as any).one?.b]) const two = colorList.two
if (isObject(one)) {
const rgb = toRgb([one?.L, one?.a, one?.b])
setBlueToothColor(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`) setBlueToothColor(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`)
setTime(getNowTime()) setTime(getNowTime())
setSearchField({ ...searchField, l1: rgb[0], a1: rgb[1], b1: rgb[2] }) setSearchField({ ...searchField, l1: rgb[0], a1: rgb[1], b1: rgb[2] })
} }
if ((colorList as any).two?.constructor === Object) { if (isObject(two)) {
const rgb = toRgb([(colorList as any).two?.L, (colorList as any).two?.a, (colorList as any).two?.b]) const rgb = toRgb([two?.L, two?.a, two?.b])
setBlueToothColorTwo(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`) setBlueToothColorTwo(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`)
setTimeTwo(getNowTime()) setTimeTwo(getNowTime())
setSearchField({ ...searchField, l2: rgb[0], a2: rgb[1], b2: rgb[2] }) setSearchField({ ...searchField, l2: rgb[0], a2: rgb[1], b2: rgb[2] })
@ -103,7 +106,7 @@ export default () => {
...searchField, ...searchField,
} }
const res = await fetchData(query) const res = await fetchData(query)
if (res.data) { if (res.success) {
setData(res.data) setData(res.data)
let diffarray = [ let diffarray = [
res.data.reddish && '偏红', res.data.reddish && '偏红',
@ -113,7 +116,7 @@ export default () => {
res.data.whitish && '偏亮', res.data.whitish && '偏亮',
res.data.darker && '偏暗', res.data.darker && '偏暗',
] ]
let resCont = diffarray.filter((item) => item).join(',') let resCont = diffarray.filter(item => item).join(',')
setResult(resCont) setResult(resCont)
} }
} }

View File

@ -1,22 +1,28 @@
import { View, Text } from '@tarojs/components' import { View, Text } from '@tarojs/components'
import React, { FC } from 'react' import React, { FC, memo, useEffect, useRef, useState, useTransition } from 'react'
import classnames from 'classnames' import classnames from 'classnames'
import styles from './index.module.scss' import styles from './index.module.scss'
import { formatHashTag } from '@/common/format' import { formatHashTag } from '@/common/format'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { alert } from '@/common/common'
import { BluetoothStateType } from '@/use/contextBlueTooth'
import { toRgb } from '@/common/bluetooth/color/colorSpace'
type PropsType = { type PropsType = {
currentTakeColorIndex?: number | null
item?: Record<string, any> item?: Record<string, any>
key?: any
index?: number index?: number
onPreviewRgb?: Function onPreviewRgb?: Function
onTakeColor?: Function onTakeColor?: Function
measureAndGetLab: Function
bluetoothState: BluetoothStateType
} }
const ColorCard: FC<PropsType> = (params) => { const ColorCard: FC<PropsType> = params => {
const { item = {}, index, onTakeColor, onPreviewRgb, key } = params const { item = {}, index, onTakeColor, onPreviewRgb, currentTakeColorIndex, measureAndGetLab, bluetoothState } = params
console.log('Rerender component: ColorCard', params)
const truncation = (ev) => { console.log('item===>', item)
const truncation = ev => {
if (ev) { if (ev) {
ev += '' ev += ''
let index = ev.lastIndexOf('.') let index = ev.lastIndexOf('.')
@ -30,9 +36,45 @@ const ColorCard: FC<PropsType> = (params) => {
return 0 return 0
} }
} }
const [moveBorder, setMoveBorder] = useState<number>(0)
const [color, setColor] = useState({
currnetRgb: item.rgb,
currentLab: item.lab,
})
const handleTakeColor = () => { useEffect(() => {
onTakeColor && onTakeColor(index) console.log('lastTakeColorIndex,index', currentTakeColorIndex, index)
if (currentTakeColorIndex != null && currentTakeColorIndex !== index) {
setMoveBorder(0)
}
}, [currentTakeColorIndex, index])
const handleTakeColor = async () => {
if (bluetoothState.connected) {
onTakeColor?.(index)
setMoveBorder(1)
console.log('moveBorder==> start measure', moveBorder)
let lab = await measureAndGetLab()
//转rgb
const rgb = toRgb([lab.L, lab.a, lab.b])
setColor({
currnetRgb: {
r: rgb[0],
g: rgb[1],
b: rgb[2],
},
currentLab: {
l: lab.L,
a: lab.a,
b: lab.b,
},
})
setMoveBorder(2)
console.log('moveBorder==> end measure', moveBorder)
} else {
alert.none('请连接蓝牙')
}
} }
const handlePreviewRgb = () => { const handlePreviewRgb = () => {
@ -40,26 +82,28 @@ const ColorCard: FC<PropsType> = (params) => {
} }
return ( return (
<View className={classnames(styles['color-list'], { flash: item.moveBorder == 1 })} key={key}> <View className={classnames(styles['color-list'], { [styles['flash']]: moveBorder === 1 })}>
<View className={classnames(styles.vertical, { 'move-vertical': item.moveBorder == 2 })}> <View className={classnames(styles.vertical, { [styles['move-vertical']]: moveBorder === 2 })}>
<View></View> <View></View>
</View> </View>
<View className={classnames(styles.horizontal, { 'move-horizontal': item.moveBorder == 2 })}></View> <View className={classnames(styles.horizontal, { [styles['move-horizontal']]: moveBorder === 2 })}></View>
<View <View
onClick={handlePreviewRgb} onClick={handlePreviewRgb}
className={styles['c-image']} className={styles['c-image']}
style={{ style={{
backgroundColor: `rgb( backgroundColor: `rgb(
${item.currnetRgb?.r}, ${color.currnetRgb?.r},
${item.currnetRgb?.g}, ${color.currnetRgb?.g},
${item.currnetRgb?.b} ${color.currnetRgb?.b}
)`, )`,
}}> }}>
{!item.sampling && <Text></Text>} {color.currentLab?.l == 0 && color.currentLab?.a == 0 && color.currentLab?.b == 0 && <Text></Text>}
</View> </View>
<View className={styles['c-info']}> <View className={styles['c-info']}>
<View className={styles['c-i-title']}>{formatHashTag(item.product_code, item.product_name)}</View> <View className={styles['c-i-title']}>{formatHashTag(item.product_code, item.product_name)}</View>
<Text>{formatHashTag(item.product_color_code, item.product_color_name)}</Text> <Text>
{formatHashTag(item.product_color_code, item.product_color_name)}({moveBorder})
</Text>
<View className={styles['c-i-date']}>{item.absorb_lab_time && dayjs(item.absorb_lab_time).format('YYYY-MM-DD HH:mm:ss')}</View> <View className={styles['c-i-date']}>{item.absorb_lab_time && dayjs(item.absorb_lab_time).format('YYYY-MM-DD HH:mm:ss')}</View>
</View> </View>
<View className={styles['c-lab']}> <View className={styles['c-lab']}>
@ -67,9 +111,9 @@ const ColorCard: FC<PropsType> = (params) => {
{item.sampling ? '重新取样' : '取样'} {item.sampling ? '重新取样' : '取样'}
</View> </View>
<View className={styles['c-lab-text']}> <View className={styles['c-lab-text']}>
<View>L*: {truncation(item?.currentLab?.l)}</View> <View>L*: {truncation(color?.currentLab?.l)}</View>
<View>a*: {truncation(item?.currentLab?.a)}</View> <View>a*: {truncation(color?.currentLab?.a)}</View>
<View>b*: {truncation(item?.currentLab?.b)}</View> <View>b*: {truncation(color?.currentLab?.b)}</View>
</View> </View>
</View> </View>
</View> </View>

View File

@ -36,36 +36,42 @@ page {
align-items: center; align-items: center;
} }
.lb-t-serach { .lb-t-serach {
flex: 0 1 60%;
@include flex-vertical-center; @include flex-vertical-center;
} .lb-t-search-content {
.lb-t-serach .icon-a-sousuo1 { position: relative;
font-size: 38px; width: 100%;
color: #cccccc; display: flex;
} .input-bar {
.lb-t-serach .lb-t-search-content { width: 100%;
display: flex; box-sizing: border-box;
justify-content: flex-end; padding-left: 36px;
align-items: center; border-radius: 100px;
padding-right: 100px;
}
.lb-t-sc-clear {
position: absolute;
right: 36px;
top: 50%;
transform: translateY(-50%);
display: flex;
justify-content: center;
align-items: center;
@include flex-vertical-center;
height: 66px;
width: 66px;
border-radius: 50%;
background-color: #e7e7e7;
font-size: 28px;
}
}
} }
.lb-t-serach .lb-t-search-content > text { .lb-t-serach .lb-t-search-content > text {
padding: 10px 0; padding: 10px 0;
color: #707070; color: #707070;
font-size: 24px; font-size: 24px;
} }
.lb-t-search-content > view {
@include flex-vertical-center;
width: 280px;
height: 66px;
background-color: #e7e7e7;
border-radius: 30px;
margin-right: 10px;
font-size: 28px;
padding-left: 20px;
padding-right: 10px;
overflow: hidden;
}
.lb-title input { .lb-title input {
width: 80%;
height: 66px; height: 66px;
background-color: #e7e7e7; background-color: #e7e7e7;
font-size: 26px; font-size: 26px;
@ -74,20 +80,7 @@ page {
color: #fff; color: #fff;
font-size: 30px; font-size: 30px;
} }
.lb-t-sc-clear {
display: flex;
justify-content: center;
align-items: center;
}
.lb-t-sc-clear .icon-a-cuowuwrong {
width: 43px;
height: 43px;
text-align: center;
line-height: 43px;
border-radius: 50%;
background: #c7c7c7;
display: inline-block;
}
.not-list { .not-list {
font-size: 28px; font-size: 28px;
font-weight: 400; font-weight: 400;

View File

@ -1,5 +1,5 @@
import { View, Input, Text } from '@tarojs/components' import { View, Input, Text } from '@tarojs/components'
import { FC, useMemo, useRef, useState } from 'react' import { FC, useCallback, useMemo, useRef, useState } from 'react'
import LinkBlueTooth from '../components/bluetooth/LinkBlueTooth' import LinkBlueTooth from '../components/bluetooth/LinkBlueTooth'
import SelectProduct from '@/components/selectProduct/index' import SelectProduct from '@/components/selectProduct/index'
import styles from './index.module.scss' import styles from './index.module.scss'
@ -36,73 +36,54 @@ const TakeColor: FC = () => {
item.moveBorder = 0 item.moveBorder = 0
item.key = index item.key = index
}) })
// setListData(res.data?.list) setListData(res.data?.list)
await detailFetchData({ id: event.id }) await detailFetchData({ id: event.id })
} }
alert.hideLoading() alert.hideLoading()
} else { } else {
state.data.list = [] setListData([])
alert.hideLoading() alert.hideLoading()
} }
} }
const clearSearchValue = () => { const clearSearchValue = () => {
console.log('asdfasdf')
setSearchValue('') setSearchValue('')
} }
const handleTransfSearch = (bool: boolean) => { const handlePrViewRgb = useCallback(event => {
setShowScreen(bool)
}
const handlePrViewRgb = event => {
setLabPreview(event) setLabPreview(event)
setShowLabPreview(true) setShowLabPreview(true)
}, [])
const [currentTakeColorIndex, setCurrentTakeColorIndex] = useState<number | null>(null)
const handleTakeColor = (index: number) => {
setCurrentTakeColorIndex(index)
} }
const lastTakeColorIndex = useRef(null) const [listData, setListData] = useState<Record<string, any>[]>([])
// const listData = useMemo(() => {
const handleTakeColor = async index => { // return state.data?.list?.filter(item => {
if (bluetoothState.connected) { // if (searchValue) {
if (lastTakeColorIndex.current != null) { // return formatHashTag(item.product_color_name, item.product_color_code)!.includes(searchValue)
state.data.list[lastTakeColorIndex.current].moveBorder = 0 // }
} // return true
lastTakeColorIndex.current = index // })
let item = state.data.list[index] // }, [state.data?.list, state])
item.moveBorder = 1
let lab = await measureAndGetLab()
//转rgb
const rgb = toRgb([lab.L, lab.a, lab.b])
item.sampling = true
item.currnetRgb = {
r: rgb[0],
g: rgb[1],
b: rgb[2],
}
item.currentLab = {
l: lab.L,
a: lab.a,
b: lab.b,
}
item.moveBorder = 2
} else {
alert.none('请连接蓝牙')
}
}
// const [listData, setListData] = useState<Record<string, any>[]>([])
const listData = useMemo(() => {
return state.data?.list?.filter(item => {
if (searchValue) {
return formatHashTag(item.product_color_name, item.product_color_code)!.includes(searchValue)
}
return true
})
}, [state.data?.list, state])
const [showScreen, setShowScreen] = useState(false)
const onSearchInput = event => { const onSearchInput = event => {
const current = event.detail.value const current = event.detail.value
setSearchValue(current) if (current === '') {
setListData(state.data.list)
} else {
setListData(
state.data?.list?.filter(item => {
return formatHashTag(item.product_color_name, item.product_color_code)!.includes(current)
}),
)
}
} }
// 底部提交 // 底部提交
const handleSubmit = async () => { const handleSubmit = async () => {
@ -136,14 +117,17 @@ const TakeColor: FC = () => {
} }
// 重置 // 重置
const handleReset = () => { const handleReset = () => {
console.log('handleReset')
if (selectedProduct.id) { if (selectedProduct.id) {
state.data.list.map(item => { setListData(
item.moveBorder = 0 state.data.list.map(item => {
item.currnetRgb = item.rgb item.moveBorder = 0
item.currentLab = item.lab item.currnetRgb = item.rgb
item.sampling = !(item.currentLab?.l == 0 && item.currentLab?.a == 0 && item.currentLab?.b == 0) item.currentLab = item.lab
return item item.sampling = !(item.currentLab?.l == 0 && item.currentLab?.a == 0 && item.currentLab?.b == 0)
}) return item
}),
)
} else { } else {
productSelectEl.current.clickEvent() productSelectEl.current.clickEvent()
alert.none('请选择面料') alert.none('请选择面料')
@ -200,38 +184,42 @@ const TakeColor: FC = () => {
<LinkBlueTooth /> <LinkBlueTooth />
<SelectProduct selectColorId={selectedProduct?.id} onSelect={selectInput} ref={productSelectEl} /> <SelectProduct selectColorId={selectedProduct?.id} onSelect={selectInput} ref={productSelectEl} />
</View> </View>
<Texture uploadConfirmState={uploadConfirmState} onUploadConfirm={handleUploadConfirm} list={state.data.list} detail={detail.data} /> <Texture uploadConfirmState={uploadConfirmState} onUploadConfirm={handleUploadConfirm} list={listData} detail={detail.data} />
<View className={styles['list-box']}> <View className={styles['list-box']}>
<View className={styles['lb-title']}> <View className={styles['lb-title']}>
<Text>{listData?.length ?? 0}</Text> <Text>{listData?.length ?? 0}</Text>
<View className={styles['lb-t-serach']}> <View className={styles['lb-t-serach']}>
{showScreen ? ( <View className={styles['lb-t-search-content']}>
<View className={styles['lb-t-search-content']}> <Input type='text' className={styles['input-bar']} onInput={onSearchInput} placeholder='筛选颜色或颜色编号' />
<View> <View onClick={clearSearchValue} className={styles['lb-t-sc-clear']}>
<Input value={searchValue} type='text' onInput={onSearchInput} placeholder='筛选颜色或颜色编号' /> {searchValue.length > 0 && <IconFont name='icon-guanbi' size={36}></IconFont>}
<View onClick={clearSearchValue} className={styles['lb-t-sc-clear']}>
{searchValue.length > 0 && <IconFont name='icon-guanbi' size={36}></IconFont>}
</View>
</View>
<Text onClick={() => handleTransfSearch(false)}></Text>
</View> </View>
) : ( </View>
<View onClick={() => handleTransfSearch(true)}>
<IconFont name='icon-sousuo' size={40}></IconFont>
</View>
)}
</View> </View>
</View> </View>
{listData ? ( {listData.length ? (
listData.map((item, index) => { listData.map((item, index) => {
return <ColorCard onPreviewRgb={handlePrViewRgb} onTakeColor={handleTakeColor} key={index} item={item} index={item.key} /> return (
<ColorCard
currentTakeColorIndex={currentTakeColorIndex}
onPreviewRgb={handlePrViewRgb}
onTakeColor={handleTakeColor}
bluetoothState={bluetoothState}
measureAndGetLab={measureAndGetLab}
key={index}
item={item}
index={item.key}
/>
)
}) })
) : ( ) : (
<View className={styles['not-list']}>--</View> <View className={styles['not-list']}>--</View>
)} )}
</View> </View>
<View className={styles['fixedBottom-container']}> <View className={styles['fixedBottom-container']}>
<View onClick={handleReset}></View> <View onClick={handleReset} hoverClass='filter'>
</View>
<View onClick={handleSubmit} className={styles['fb-confirm']}> <View onClick={handleSubmit} className={styles['fb-confirm']}>
</View> </View>

View File

@ -92,3 +92,6 @@ $customTabBarHeight: 100px;
content: 'E'; content: 'E';
font-size: $font_size; font-size: $font_size;
} }
.filter{
filter: blur(1);
}

View File

@ -14,7 +14,7 @@ interface params {
} }
const Context = React.createContext<params | unknown>(null) const Context = React.createContext<params | unknown>(null)
interface stateStype { export interface BluetoothStateType {
listeners: any listeners: any
discovering: boolean discovering: boolean
available: boolean available: boolean
@ -39,7 +39,7 @@ interface stateStype {
deviceLab: any deviceLab: any
} }
let stateObj: stateStype = { let stateObj: BluetoothStateType = {
/** 事件监听器 */ /** 事件监听器 */
listeners: new Set(), listeners: new Set(),
/** 正在扫描设备 */ /** 正在扫描设备 */

View File

@ -8,16 +8,16 @@ import useLoginRequest from './useLoginRequest'
type Params = { type Params = {
code: string | null code: string | null
success: true | false success: boolean
data: any data: any
msg: string msg: string
loading: true | false loading: boolean | null
error: any error: any
query: any query: any
filter: any filter: any
sort: any sort: any
total: number total: number
multiple: true | false // 请求多次 multiple: boolean // 请求多次
count: number // 第几次请求 count: number // 第几次请求
token: string // token token: string // token
page?: number page?: number
@ -31,9 +31,9 @@ type option = {
data?: OptionData data?: OptionData
page?: number page?: number
pageSize?: number pageSize?: number
pagination?: true | false pagination?: boolean
base_url?: string base_url?: string
apiMsgStatus?: true | false apiMsgStatus?: boolean
} }
/** /**
@ -110,11 +110,13 @@ export const useRequest = (
success: false, // 请求是否成功 success: false, // 请求是否成功
data: {}, data: {},
msg: '', msg: '',
loading: true, loading: null,
error: null, error: null,
query: {}, query: {},
filter: null, filter: null,
sort: '', sort: '',
page: options.page || 1,
pageSize: options.pageSize || 24,
total: 0, total: 0,
multiple: true, // 请求多次 multiple: true, // 请求多次
count: 0, // 第几次请求 count: 0, // 第几次请求