import React from 'react' import { connect } from 'dva/index' import { Input, Icon } from 'antd' import FormModal from '../form/FormModal' import { extendFilterGroup, extendGroupRule, extendInclude, extendOrder, initFilter, initFilterGroup } from '../utils/common' import moment from 'moment' class ScannerComponent extends React.Component { constructor (props) { super(props) this.state = { data: { Data: [] }, value: '', oldValue: '' } this.handleAutoCompleteKeyDown = this.handleAutoCompleteKeyDown.bind(this) }; componentDidMount () { const { value } = this.props this.updateStateData({ value: value, oldValue: value, isUpdateValue: false }) } UNSAFE_componentWillReceiveProps (NextProps) { const { value } = NextProps if (this.state.oldValue !== value || this.state.isUpdateValue) { this.updateStateData({ value: value, oldValue: value, isUpdateValue: false }) } } handleFetchAutoFilterEvent = (params) => { const { data } = this.props const { onFilter } = data || {} if (typeof onFilter === 'function') { onFilter({ params: params, colConfig: this.props.colConfig, thisRef: this.props.thisRef }) } }; updateStateData = (data, onComplete) => { if (this.updateStateDataFunc) { this.setState(data, () => { this.updateStateDataFunc(data, onComplete) }) } else { this.setState(data, () => { if (typeof onComplete === 'function') { onComplete() } }) } }; regUpdateStateData = (regFunc) => { this.updateStateDataFunc = regFunc }; getAutoCompleteLoadParam = (params = {}, e) => { const { data } = this.props const { filterField, sortField, sortOrder, navField, extIncludeFields } = data || {} const sortName = filterField ? filterField.split(',') : ['NAME', 'CODE'] const initParams = initFilter(this.props.login.OrgId, '', sortName[0], 0) const sortFields = sortField ? sortField.split(',') : [] const sortOrders = sortOrder ? sortOrder.split(',') : [] if (e) { if (e.target.value) { const group = initFilterGroup(false) sortName.forEach((i, n) => { extendGroupRule(group, i, 9, e.target.value) }) extendFilterGroup(initParams, group) } this.updateStateData({ autoChangeValue: e.target.value }) } const loadParam = { ...initParams, ...params } // 添加自定义排序 if (sortFields && sortOrders && sortFields.length && sortFields.length && sortOrders.length) { loadParam['Sort'] = '' sortFields.forEach((n, i) => { extendOrder(loadParam, n, sortOrders[i]) }) } const navFields = [] // 添加导航属性 const tmpNavFields = navField ? navField.split(',') : ['ID'] if (tmpNavFields && tmpNavFields.length > 0) { tmpNavFields.forEach(t => { if (t && t.indexOf('.') > 0) { const pos = t.lastIndexOf('.') const includeField = t.substring(0, pos) navFields.push(includeField) } }) } // 填充导航属性 if (extIncludeFields) { extIncludeFields.forEach(t => { navFields.push(t) }) } // 去重添加 if (navFields.length) { const tmp = [...new Set(navFields)] tmp.forEach((n, i) => { extendInclude(loadParam, n) }) } return loadParam }; fetchAutoComData = (params = {}, e) => { // 获取autocomplete数据 const { api, data } = this.props if (!api) { return } const loadParam = this.getAutoCompleteLoadParam(params, e) if (data && data.filterOrgType) { loadParam.OrgType = data.filterOrgType } this.handleFetchAutoFilterEvent(loadParam) this.updateStateData({ loadParam }) this.props.dispatch({ type: 'app/getDataByPost', payload: loadParam, url: api, onlyData: false, onComplete: (ret) => { this.updateStateData({ data: ret }, () => { if (ret && ret.Data && ret.Data.length) { this.selectAutoItem(ret.Data[0].ID) } else { this.selectAutoItem(null) } }) } }) }; // autoComDataPage = ( num) => { // const { data } = this.props; // const {filterField }=data?data:{}; // const arrOBj = filterField ? filterField.split(','):['NAME','CODE']; // const sortName = filterField ? filterField.split(',') : ['NAME','CODE']; // let params = initFilter(this.props.login.OrgId,'',sortName[0],0,num); // if (this.state.autoChangeValue) { // let group=initFilterGroup(false); // arrOBj.forEach((i,n) => { // extendGroupRule(group,i,9,this.state.autoChangeValue); // }); // extendFilterGroup(params,group); // } // this.fetchAutoComData( params); // }; // getState=()=> { // return this.state; // }; handleFieldChangeEvent = (value) => { const { data } = this.props const { onChange } = data || {} if (typeof onChange === 'function') { onChange({ value, colConfig: this.props.colConfig, thisRef: this.props.thisRef }) } this.updateStateData({ value: value }) if (!value) { this.selectAutoItem(null) } else { if (!this.isSelectItem) { if (value.toString().indexOf('-') === -1) { this.isCheckAutoComplete = true } } } // this.props.dispatch({ // type: 'app/save', // payload: { // drawerComponent: { // open: true, // content: 20, // position: "top", // selfData: { // data: this.state.data, // disabled: this.props.disabled, // loadParam: this.state.loadParam, // autoChangeValue: this.state.autoChangeValue, // selectAutoItem: this.selectAutoItem, // handleChangeAuto: this.handleChangeAuto, // autoComDataPage: this.autoComDataPage // } // }, // }, // }); }; getDataByScannerValue = (value) => { const { api, onScan } = this.props if (!api) { if (typeof onScan === 'function') { onScan({ value }) } return } if (this.isSelectItem) { return } const { data } = this.props const { filterField, onChangeHandle } = data || {} const arrOBj = filterField ? filterField.split(',') : ['NAME', 'CODE'] const sortName = filterField ? filterField.split(',') : ['NAME', 'CODE'] const params = initFilter(this.props.login.OrgId, '', sortName[0], 0) if (value) { const group = initFilterGroup(false) arrOBj.forEach((i, n) => { extendGroupRule(group, i, 9, value) }) extendFilterGroup(params, group) } const nowT = moment().format('x') if (!this.autoCompleteChangeT || nowT - this.autoCompleteChangeT > 200) { this.fetchAutoComData(params) } this.updateStateData({ autoChangeValue: value }) this.autoCompleteChangeT = moment().format('x') this.handleFieldChangeEvent(value) if (onChangeHandle && typeof onChangeHandle === 'function') { onChangeHandle(value) } }; handleAutoCompleteKeyDown (event) { if (event.keyCode === 13) { this.isCheckAutoComplete = true // this.checkAutoComplete(); this.getDataByScannerValue(this.state.autoChangeValue) } } checkAutoComplete = () => { if (this.isCheckAutoComplete) { this.getDataByScannerValue(this.state.autoChangeValue) } }; selectAutoItem = (value, option) => { const { data, onSelect } = this.props const { navField } = data || {} this.isSelectItem = true this.isCheckAutoComplete = false if (typeof onSelect === 'function') { if (value) { if (this.state.data && this.state.data.Data) { const navFields = navField ? navField.split(',') : ['ID'] this.state.data.Data.forEach(t => { if (value === t.ID) { const saveValues = [] for (let j = 0; j < navFields.length; j++) { saveValues.push(t[navFields[j]]) } onSelect({ data: saveValues, record: t, complete: () => { this.isSelectItem = false }, colConfig: this.props.colConfig, thisRef: this.props.thisRef }) } }) } } else { onSelect({ data: [], record: null, isClear: true, complete: () => { this.isSelectItem = false }, colConfig: this.props.colConfig, thisRef: this.props.thisRef }) this.updateStateData({ isUpdateValue: true }) } } }; render () { const { disabled, onChange, onBlur, placeholder, showFormCode, showFormId } = this.props const isShowSrcBtn = showFormCode && showFormId const value = this.state.value return ( <> { if (typeof onBlur === 'function') { onBlur() } this.checkAutoComplete() }} onChange={(e) => { if (e !== null && e !== undefined) { const tmpValue = (e && e.target && e.target.value ? e.target.value : (typeof e === 'object' ? null : e)) // if(tmpValue&&caseType&&caseType===1){ // tmpValue=tmpValue.toString().toUpperCase(); // } // else if(tmpValue&&caseType&&caseType===2){ // tmpValue=tmpValue.toString().toLowerCase(); // } this.isCheckAutoComplete = true this.updateStateData({ autoChangeValue: tmpValue }) if (typeof onChange === 'function') { onChange({ value: tmpValue }) } } }} onKeyDown={(e) => { this.handleAutoCompleteKeyDown(e) }} addonAfter={ { this.checkAutoComplete() }} />} /> { isShowSrcBtn ? ( ) : null } ) } } export default connect(({ app, loading, login }) => ({ app, loading, login }))(ScannerComponent)