feat: filter form 搜索组件

feature/2.0-sales-trade
Lei OT 2 years ago
parent 836d4b9597
commit 08aecb6fdb

@ -1,10 +1,13 @@
import { Tag } from 'antd';
import { CaretUpOutlined, CaretDownOutlined } from '@ant-design/icons';
export const VSTag = (diffPercent, diffData, data1, data2) => {
export const VSTag = (props) => {
const { diffPercent, diffData, data1, data2 } = props;
const CaretIcon = parseInt(diffPercent) < 0 ? CaretDownOutlined : CaretUpOutlined;
const tagColor = parseInt(diffPercent) < 0 ? "gold" : "lime";
return parseInt(diffPercent) === 0 ? "-" : (
const tagColor = parseInt(diffPercent) < 0 ? 'gold' : 'lime';
return parseInt(diffPercent) === 0 ? (
'-'
) : (
<span>
<div>
{data1} vs {data2}

@ -119,6 +119,7 @@ export const resultDataCb = (dataRaw, dateGroup, { data1, data2 }, fieldMapper,
const parseData2 = parse2.data.map((ele) => ({
[fieldMapper.dateKey]: ele.groupKey,
[fieldMapper.valueKey]: ele.value,
[fieldMapper.seriesKey]: ele[fieldMapper.seriesKey],
groups: _data2[0].groups,
dateKey: ele.dateKey,
dateRange: ele.dateRange,
@ -128,5 +129,6 @@ export const resultDataCb = (dataRaw, dateGroup, { data1, data2 }, fieldMapper,
const reindecData2 = parseData2.map((ele, index) => ({ ...ele, [fieldMapper.dateKey]: useKeys[index] || `X.${ele[fieldMapper.dateKey]}`, dateKey: ele.dateKey }));
const retData = [].concat(parseData1, reindecData2);
const avg1 = parse1.avgVal;
// console.log('callback', dateGroup, retData);
cb(dateGroup, retData, avg1);
};

@ -5,16 +5,23 @@ import { biz } from '../../libs/ht';
const Business_unit = (props) => {
const {store} = props;
const { store, mode, value, onChange, show_all, ...extProps } = props;
return (
<div>
<Select
mode={store.bu_select_mode}
mode={mode || store?.bu_select_mode || null}
allowClear
style={{width: '100%',}}
placeholder="选择事业部"
value={store.business_units}
onChange={(value) => store.bu_handleChange(value)}
value={value || store?.business_units || { key: '-1', label: 'ALL 事业部' }}
onChange={(value) => {
if (typeof onChange === 'function') {
onChange(value);
}
store?.bu_handleChange(value);
}}
labelInValue={true}
{...extProps}
>
{props.show_all ? <Select.Option key="-1" value="ALL">ALL 事业部</Select.Option> : ''}
{biz.map(ele => <Select.Option key={ele.key} value={ele.label}>{ele.label}</Select.Option>)}

@ -8,15 +8,30 @@ class DataTypeSelect extends Component {
super(props);
}
// debug:
// componentDidMount() {
// console.log(this.props, 'DataTypeSelect props');
// }
handleChange = (value) => {
if (this.props.store) {
this.props.store.onChange_datetype(value);
}
if (this.props.onChange) {
this.props.onChange(value);
}
};
render() {
const store = this.props.store;
return (
<div>
<Select
value={store.date_type}
<Select labelInValue={true}
// value={store.date_type}
value={this.props?.value || store?.date_type}
style={{ width: '100%' }}
placeholder="选择日期类型"
onChange={(value) => store.onChange_datetype(value)}
// onChange={(value) => store.onChange_datetype(value)}
onChange={this.handleChange}
>
{dateTypes.map((ele) => (
<Select.Option key={ele.key} value={ele.key}>
@ -24,7 +39,6 @@ class DataTypeSelect extends Component {
</Select.Option>
))}
</Select>
</div>
);
}
}

@ -1,5 +1,5 @@
import React, { Component } from "react";
import { Col, DatePicker, Row } from "antd";
import { Col, DatePicker, Row, Form } from "antd";
import { observer } from "mobx-react";
import * as config from "../../config";
import moment from "moment";
@ -21,12 +21,13 @@ class DatePickerCharts extends Component {
<div>
<Row>
<Col span={24}>
<Form.Item name={`applyDate`} noStyle initialValue={[date_picker_store.start_date, date_picker_store.end_date]}>
<DatePicker.RangePicker
style={{width: '100%'}}
format={config.DATE_FORMAT}
locale={locale}
allowClear={false}
value={[date_picker_store.start_date, date_picker_store.end_date]}
// value={[date_picker_store.start_date, date_picker_store.end_date]}
onChange={(e) => {
date_picker_store.onChange_dataPicker(e);
if (typeof this.props.onChange === 'function') {
@ -45,20 +46,27 @@ class DatePickerCharts extends Component {
今年: [moment().startOf("year"), moment().endOf("year")],
去年: [moment().subtract(1, "year").startOf("year"), moment().subtract(1, "year").endOf("year")],
}}
/>
/></Form.Item>
</Col>
{this.props.hide_vs ? (
""
) : (
<Col span={24}>
<Form.Item name={`applyDate2`} noStyle initialValue={[date_picker_store.start_date_cp, date_picker_store.end_date_cp]}>
<DatePicker.RangePicker
bordered={false}
style={{width: '100%'}}
format={config.DATE_FORMAT}
locale={locale}
value={[date_picker_store.start_date_cp, date_picker_store.end_date_cp]}
// value={[date_picker_store.start_date_cp, date_picker_store.end_date_cp]}
placeholder={["对比 Start date", "End date"]}
onChange={date_picker_store.onChange_dataPicker_cp}
// onChange={date_picker_store.onChange_dataPicker_cp}
onChange={(value) => {
if (typeof this.props.onChange === 'function') {
this.props.onChange(value);
}
date_picker_store?.onChange_dataPicker_cp(value);
}}
ranges={{
上一时间段: date_picker_store.previous_date(),
去年同期: date_picker_store.previous_year(),
@ -68,7 +76,7 @@ class DatePickerCharts extends Component {
前三个月: [moment().subtract(5, "month").startOf("month"), moment().subtract(3, "month").endOf("month")],
去年: [moment().subtract(1, "year").startOf("year"), moment().subtract(1, "year").endOf("year")],
}}
/>
/></Form.Item>
</Col>
)}
</Row>

@ -10,22 +10,28 @@ class GroupSelect extends Component {
render() {
const { store, mode, value, onChange, show_all, ...extProps } = this.props;
const _mode = mode || store?.group_select_mode || null;
const _show_all = ['tags', 'multiple'].includes(_mode) ? false : show_all;
return (
<div>
<Select
mode={mode || store?.group_select_mode || null}
mode={_mode}
style={{ width: '100%' }}
placeholder="选择小组"
value={value || store?.groups || '0'}
value={value || store?.groups || undefined} // { key: '0', label: '' }
onChange={(value) => {
if (typeof onChange === 'function') {
onChange(value);
}
store?.group_handleChange(value);
}}
labelInValue={true}
maxTagCount={1}
maxTagPlaceholder={(omittedValues) => ` + ${omittedValues.length} 更多...`}
allowClear={_mode != null}
{...extProps}
>
{show_all ? (
{_show_all ? (
<Select.Option key="0" value="0">
所有小组
</Select.Option>

@ -0,0 +1,324 @@
import { createContext } from 'react';
import { observer } from 'mobx-react';
import { DATE_FORMAT } from './../../config';
import { SearchOutlined, } from "@ant-design/icons";
import { Form, Row, Col, Select, Button, Space, DatePicker } from 'antd';
import moment from 'moment';
// import locale from 'antd/es/date-picker/locale/zh_CN';
import BusinessSelect from './BusinessSelect';
import GroupSelect from './GroupSelect';
import SiteSelect from './SiteSelect';
import DateTypeSelect from './DataTypeSelect';
import DatePickerCharts from './DatePickerCharts';
import YearPickerCharts from './YearPickerCharts';
import { objectMapper, at } from './../../utils/commons';
import './search.css';
const EditableContext = createContext();
const Option = Select.Option;
/**
* 搜索表单
* @property defaultValue
* * { initialValue, fieldProps, hides, shows, sort }
* @property onSubmit
*/
export default observer((props) => {
const [form] = Form.useForm();
const { sort, initialValue, hides, shows, fieldProps } = {
sort: '',
initialValue: '',
fieldProps: '',
hides: [],
shows: [],
...props.defaultValue,
};
const { onSubmit } = props;
const onFinish = (values) => {
console.log('Received values of form, origin form value: ', values);
const destinationObject = {
'DateType': {
key: 'DateType',
transform: (value) => value?.key || '',
default: '',
},
'businessUnits': {
key: 'businessUnits',
transform: (value) => {
return Array.isArray(value) ? value.map((ele) => ele.key).join(',') : value ? (!isNaN(parseInt(value.key), 10) ? value.key : '') : '-1';
},
default: '',
},
'DepartmentList': {
key: 'DepartmentList',
transform: (value) => {
return Array.isArray(value) ? value.map((ele) => ele.key).join(',') : value ? (!isNaN(parseInt(value.key), 10) ? value.key : '') : '-1';
},
default: '',
},
'WebCode': {
key: 'WebCode',
transform: (value) => {
return Array.isArray(value) ? value.map((ele) => ele.key).join(',') : value ? (!isNaN(parseInt(value.key), 10) ? value.key : '') : '-1';
},
default: '',
},
'IncludeTickets': {
key: 'IncludeTickets',
transform: (value) => value?.key || '',
default: '',
},
'applyDate': [
{
key: 'Date1',
transform: (value) => (value === '' || !Array.isArray(value) ? undefined : moment(value[0]).format(DATE_FORMAT)),
default: '',
},
{
key: 'Date2',
transform: (value) => (value === '' || !Array.isArray(value) ? undefined : moment(value[1]).format(`${DATE_FORMAT} 23:59:59`)),
default: '',
},
],
'applyDate2': [
{
key: 'DateDiff1',
transform: (value) => (value === '' || !Array.isArray(value) ? undefined : value[0] ? moment(value[0]).format(DATE_FORMAT) : undefined),
default: '',
},
{
key: 'DateDiff2',
transform: (value) => (value === '' || !Array.isArray(value) ? undefined : value[1] ? moment(value[1]).format(`${DATE_FORMAT} 23:59:59`) : undefined),
default: '',
},
],
'year': [
{
key: 'Date1',
transform: (value) => (value ? moment(value).format(`YYYY-01-01`) : undefined),
default: '',
},
{
key: 'Date2',
transform: (value) => (value ? moment(value).format(`YYYY-12-31 23:59:59`) : undefined),
default: '',
},
],
'yearDiff': [
{
key: 'DateDiff1',
transform: (value) => (value ? moment(value).format(`YYYY-01-01`) : undefined),
default: '',
},
{
key: 'DateDiff2',
transform: (value) => (value ? moment(value).format(`YYYY-12-31 23:59:59`) : undefined),
default: '',
},
],
};
let dest = {};
const { applyDate, applyDate2, year, yearDiff, ...omittedValue } = values;
dest = { ...omittedValue, ...objectMapper(values, destinationObject) };
for (const key in dest) {
if (Object.prototype.hasOwnProperty.call(dest, key)) {
dest[key] = typeof dest[key] === 'string' ? (dest[key] || '').trim() : dest[key];
}
}
// omit empty
Object.keys(dest).forEach((key) => (dest[key] == null || dest[key] === '' || dest[key].length === 0) && delete dest[key]);
console.log('form value send to onSubmit:', dest);
const str = new URLSearchParams(dest).toString();
if (typeof onSubmit === 'function') {
onSubmit(null, dest, values, str);
}
};
const onReset = () => {
form.setFieldsValue({
// 'DateType': undefined,
});
};
return (
// layout="inline"
<Form form={form} name="advanced_search" className="orders-search-form" onFinish={onFinish}>
<EditableContext.Provider value={form}>
<Row gutter={10} style={{ background: '#f9fafa', margin: '0px 0px 10px 0px', padding: '16px 8px' }}>
{getFields({ sort, initialValue, hides, shows, fieldProps })}
{/* 'textAlign': 'right' */}
<Col flex="1 0 120px" style={{ padding: '0px 5px', }}>
<Space align="center">
<Button size={'middle'} type="primary" icon={<SearchOutlined />} htmlType="submit">
统计
</Button>
{/* <Button size="small" onClick={onReset}>
重置
</Button> */}
</Space>
</Col>
</Row>
</EditableContext.Provider>
</Form>
);
});
function getFields(props) {
const { fieldProps } = props;
const bigCol = 4 * 2;
const midCol = 6;
const layoutProps = {
gutter: { xs: 8, sm: 8, lg: 16 },
lg: { span: 4 },
sm: { span: 12 },
xs: { span: 24 },
};
const item = (name, sort = 0, render, col) => {
const customCol = col || 4;
return {
'key': '',
sort,
name,
render,
'hide': false,
'col': { lg: { span: customCol } },
};
};
let baseChildren = [];
baseChildren = [
item(
'businessUnits',
99,
<Form.Item name={`businessUnits`} initialValue={at(props, 'initialValue.businessUnits')[0] || undefined}>
<BusinessSelect {...fieldProps.businessUnits} />
</Form.Item>
),
item(
'DepartmentList',
99,
<Form.Item name={`DepartmentList`} initialValue={at(props, 'initialValue.DepartmentList')[0] || (fieldProps?.DepartmentList?.show_all ? { key: '0', label: '所有小组' } : undefined)}>
<GroupSelect {...fieldProps.DepartmentList} />
</Form.Item>
),
item(
'WebCode',
99,
<Form.Item name={`WebCode`} initialValue={at(props, 'initialValue.WebCode')[0] || (fieldProps?.WebCode?.show_all ? { key: 'ALL', label: '所有来源' } : undefined)}>
<SiteSelect {...fieldProps.WebCode} />
</Form.Item>
),
item(
'IncludeTickets',
99,
// value={orders_store.include_tickets} onChange={orders_store.handleChange_include_tickets}
<Form.Item name={`IncludeTickets`} initialValue={at(props, 'initialValue.IncludeTickets')[0] || { key: '1', label: '含门票' }}>
<Select style={{ width: '100%' }} placeholder="是否含门票" labelInValue>
<Option key="1" value="1">
含门票
</Option>
<Option key="0" value="0">
不含门票
</Option>
</Select>
</Form.Item>,
2
),
//
item(
'DateType',
99,
<Form.Item name={`DateType`} initialValue={at(props, 'initialValue.DateType')[0] || { key: 'applyDate', label: '提交日期' }}>
<DateTypeSelect />
</Form.Item>,
2
),
// item(
// 'applyDate',
// 99,
// <Form.Item
// name={`applyDate`}
// initialValue={[moment('2015/01/01', DATE_FORMAT), moment('2015/01/01', DATE_FORMAT)]}
// // initialValue={at(props, 'initialValue.applyDate')[0] || undefined}
// >
// <RangePicker ranges={quickRange} format={DATE_FORMAT} style={{ width: '100%' }} locale={locale} />
// </Form.Item>,
// midCol
// ),
// item(
// 'applyDate2',
// 99,
// <Form.Item>
// <Form.Item name={`applyDate1`} noStyle>
// <RangePicker ranges={quickRange} format={DATE_FORMAT} style={{ width: '100%' }} locale={locale} />
// </Form.Item>
// <Form.Item name={`applyDate2`} noStyle>
// <RangePicker ranges={quickRange} format={DATE_FORMAT} style={{ width: '100%' }} locale={locale} />
// </Form.Item>
// </Form.Item>,
// 12
// ),
item(
'dates',
99,
<Form.Item>
<DatePickerCharts {...fieldProps.dates} />
</Form.Item>,
midCol
),
item(
'year',
99,
<Form.Item>
{/* <DatePicker picker="year" placeholder='年份' /> */}
<YearPickerCharts {...fieldProps.years} />
</Form.Item>,2
),
];
baseChildren = baseChildren
.map((x) => {
x.hide = false;
if (props.sort === undefined) {
return x;
}
const tmpSort = props.sort;
for (const key in tmpSort) {
if (Object.prototype.hasOwnProperty.call(tmpSort, key)) {
if (x.name === key) {
x.sort = tmpSort[key];
}
}
}
return x;
})
.map((x) => {
if (props.hides.length === 0 && props.shows.length === 0) {
return x;
}
if (props.hides.length === 0) {
x.hide = !props.shows.includes(x.name);
} else if (props.shows.length === 0) {
x.hide = props.hides.includes(x.name);
}
return x;
})
.filter((x) => !x.hide)
.sort((a, b) => {
return a.sort < b.sort ? -1 : 1;
});
const children = [];
const leftStyle = {}; // { borderRight: '1px solid #dedede' };
for (let i = 0; i < baseChildren.length; i++) {
let style = { padding: '0px 2px' };
style = i % 2 === 0 && baseChildren[i].col === 12 ? { ...style, ...leftStyle } : style;
style = !baseChildren[i].hide ? { ...style, display: 'block' } : { ...style, display: 'none' };
const Item = (
<Col key={String(i)} style={style} {...layoutProps} {...baseChildren[i].col}>
{baseChildren[i].render}
</Col>
);
children.push(Item);
}
return children;
}

@ -11,22 +11,28 @@ class SiteSelect extends Component {
render() {
const { store, mode, value, onChange, show_all, ...extProps } = this.props;
const _mode = mode || store?.group_select_mode || null;
const _show_all = ['tags', 'multiple'].includes(_mode) ? false : show_all;
return (
<div>
<Select
mode={mode || store?.site_select_mode || null}
mode={_mode}
style={{width: '100%'}}
placeholder="选择来源"
defaultValue={value || store?.webcode || 'ALL'}
defaultValue={value || store?.webcode || undefined }
onChange={(value) => {
if (typeof onChange === 'function') {
onChange(value);
}
store?.handleChange_webcode(value);
}}
labelInValue={true}
maxTagCount={1}
maxTagPlaceholder={(omittedValues) => ` + ${omittedValues.length} 更多...`}
allowClear={_mode != null}
{...extProps}
>
{show_all===true ? <Select.Option key="1" value="ALL">所有来源</Select.Option> : ''}
{_show_all===true ? <Select.Option key="1" value="ALL">所有来源</Select.Option> : ''}
{sites.map(ele => <Select.Option key={ele.key} value={ele.code}>{ele.label}</Select.Option>)}
</Select>
</div>

@ -0,0 +1,70 @@
import React, { Component } from 'react';
import { Col, DatePicker, Row, Form } from 'antd';
import { observer } from 'mobx-react';
import * as config from '../../config';
import moment from 'moment';
import 'moment/locale/zh-cn';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { stores_Context } from '../../config';
//
class DatePickerCharts extends Component {
static contextType = stores_Context;
constructor(props) {
super(props);
}
render() {
const { date_picker_store } = this.context;
return (
<div>
<Row>
<Col span={24}>
<Form.Item name={`year`} noStyle initialValue={date_picker_store.start_date}>
<DatePicker
picker="year"
style={{ width: '100%' }}
format={`YYYY`}
locale={locale}
allowClear={false}
onChange={(e) => {
const fullYear = [e.clone().set('month', 0).set('date', 1), e.clone().set('month', 11).set('date', 31)];
date_picker_store.onChange_dataPicker(fullYear);
if (typeof this.props.onChange === 'function') {
this.props.onChange(fullYear);
}
}}
/>
</Form.Item>
</Col>
{this.props.hide_vs ? (
''
) : (
<Col span={24}>
<Form.Item name={`yearDiff`} noStyle initialValue={date_picker_store.start_date_cp}>
<DatePicker
picker="year"
bordered={false}
style={{ width: '100%' }}
format={`YYYY`}
locale={locale}
placeholder={"对比 Year"}
onChange={(value) => {
const fullYear = [value.clone().set('month', 0).set('date', 1), value.clone().set('month', 11).set('date', 31)];
if (typeof this.props.onChange === 'function') {
this.props.onChange(fullYear);
}
date_picker_store?.onChange_dataPicker_cp(fullYear);
}}
/>
</Form.Item>
</Col>
)}
</Row>
</div>
);
}
}
export default observer(DatePickerCharts);

@ -0,0 +1,4 @@
.ant-form-item{
margin: 0;
margin-bottom: 8px;
}

@ -1,27 +0,0 @@
{
"get|/service-web/QueryData/GetOrderCount/test": {
"errcode": "",
"errmsg": "",
"data": null,
"ordercount1|10": [
{
"id|10-99": 1,
"key|10-99": 1,
"orderCount|1-100": 5,
"WebCode|1": ["ah", "cht"],
"groups": "groups1",
"ApplyDate": "@date(\"2023-08-dd\")"
}
],
"ordercount2|10": [
{
"id|100-200": 1,
"key|100-200": 1,
"orderCount|1-100": 5,
"WebCode|1": ["ah", "cht"],
"groups": "groups2",
"ApplyDate": "@date(\"2023-08-dd\")"
}
]
}
}

@ -0,0 +1,19 @@
{
"get|/service-web/baseinfo/operator/test": {
"errcode": 0,
"errmsg": "",
"data": null,
"loading": null,
"result|10": [
{
"mobile": "13@integer(99999999,999999999)",
"op_id": "@integer(10,99)",
"cn_name": "@cname",
"email": "@email",
"en_name": "@first",
"code": "@word(2,3)",
"key": "@increment"
}
]
}
}

@ -0,0 +1,54 @@
import { makeAutoObservable, runInAction, toJS } from 'mobx';
import * as req from '../utils/request';
import { isEmpty, sortBy, objectMapper } from '../utils/commons';
const modelMapper = {
'operator': {
url: '/service-web/baseinfo/operator/test',
mapper: {
op_id: [{ key: 'key' }, { key: 'value' }],
cn_name: { key: 'label' },
en_name: { key: 'label_alias' },
},
},
'vendor': {
url: '/service-web/QueryData/GetVEIName',
mapper: {
CAV_VEI_SN: [{ key: 'key' }, { key: 'value' }],
VEI2_CompanyBN: { key: 'label' },
},
},
'creditcardbilltype': {
url: '/service-web/QueryData/GetCreditCardBillType',
mapper: {
cb_billtype: [{ key: 'key' }, { key: 'value' }, { key: 'label' }],
},
},
};
class DictData {
constructor(appStore) {
this.appStore = appStore;
makeAutoObservable(this);
}
async fetchDictData(model = '') {
const mkey = model.toLowerCase();
this[mkey] = { loading: true, dataSource: [] };
const json = await req.fetchJSON(modelMapper[mkey].url);
if (json.errcode === 0) {
runInAction(() => {
this[mkey].loading = false;
this[mkey].dataSource = objectMapper(json.result, modelMapper[mkey].mapper);
console.log({ loading: false, ...json }, model, 'DictData', toJS(this[mkey]));
});
}
return this[mkey];
}
data = {};
operator = { loading: false, dataSource: [] };
vendor = { loading: false, dataSource: [] };
creditcardbilltype = { loading: false, dataSource: [] };
}
export default DictData;

@ -12,6 +12,7 @@ import WhatsAppStore from "./WhatsApp";
import CustomerServicesStore from "./CustomerServices";
import TradeStore from "./Trade";
import KPI from "./KPI";
import DictData from "./DictData";
class Index {
constructor() {
this.dashboard_store = new DashboardStore(this);
@ -27,6 +28,7 @@ class Index {
this.customerServicesStore = new CustomerServicesStore(this);
this.TradeStore = new TradeStore(this);
this.KPIStore = new KPI(this);
this.DictDataStore = new DictData(this);
makeAutoObservable(this);
}

@ -76,10 +76,15 @@ class Trade {
});
}
setStateSearch(body) {
this.searchPayloadHome = body;
}
summaryData = { loading: false, dataSource: [] };
sideData = { loading: false, dataSource: {}, kpi: {}, monthData: [] };
topData = {};
defaultDataSubject = 'CJCount';
searchPayloadHome = {};
}
export default Trade;

@ -441,3 +441,60 @@ export function objectMapper(input, keyMap) {
return input;
}
/**
* 创建一个对应于对象路径的值数组
*/
export function at(obj, path) {
let result;
if (Array.isArray(obj)) {
// array case
const indexes = path.split('.').map((i) => parseInt(i));
result = [];
for (let i = 0; i < indexes.length; i++) {
result.push(obj[indexes[i]]);
}
} else {
// object case
const indexes = path.split('.').map((i) => i);
result = [obj];
for (let i = 0; i < indexes.length; i++) {
result = [result[0][indexes[i]]];
}
}
return result;
}
/**
* 删除 null/undefined
*/
export function flush(collection) {
let result, len, i;
if (!collection) {
return undefined;
}
if (Array.isArray(collection)) {
result = [];
len = collection.length;
for (i = 0; i < len; i++) {
const elem = collection[i];
if (elem != null) {
result.push(elem);
}
}
return result;
}
if (typeof collection === 'object') {
result = {};
const keys = Object.keys(collection);
len = keys.length;
for (i = 0; i < len; i++) {
const key = keys[i];
const value = collection[key];
if (value != null) {
result[key] = value;
}
}
return result;
}
return undefined;
}

@ -9,7 +9,7 @@ import Bullet from '../components/Bullet';
import Waterfall from '../components/Waterfall';
import Column from '../components/Column';
import DataFieldRadio from './../components/DateFieldRadio';
import DatePickerCharts from './../components/search/DatePickerCharts';
import SearchForm from './../components/search/SearchForm';
import { empty } from './../utils/commons';
import './home.css';
@ -17,7 +17,7 @@ import './home.css';
export default observer(() => {
const navigate = useNavigate();
const { TradeStore } = useContext(stores_Context);
const { sideData, summaryData, topData } = TradeStore;
const { searchPayloadHome, sideData, summaryData, topData } = TradeStore;
const topSeries = [
{ key: 'Country', label: '国籍' },
@ -28,15 +28,19 @@ export default observer(() => {
useEffect(() => {
if (empty(summaryData.dataSource)) {
TradeStore.fetchSummaryData();
TradeStore.fetchTradeDataByMonth();
for (const iterator of topSeries) {
TradeStore.fetchTradeDataByType(iterator.key);
}
// pageRefresh();
}
return () => {};
}, []);
const pageRefresh = (queryData) => {
TradeStore.fetchSummaryData();
TradeStore.fetchTradeDataByMonth(queryData);
for (const iterator of topSeries) {
TradeStore.fetchTradeDataByType(iterator.key, queryData);
}
};
const layoutProps = {
gutter: { xs: 8, sm: 8, lg: 16 },
lg: { span: 6 },
@ -106,10 +110,30 @@ export default observer(() => {
return (
<>
<Row gutter={16}>
<Col className="gutter-row" span={24} style={{ margin: '-16px -8px', padding: 0 }}>
<SearchForm
defaultValue={{
'initialValue': {
...searchPayloadHome,
},
hides: ['businessUnits', 'dates'],
// shows: ['DateType', 'DepartmentList', 'WebCode', 'IncludeTickets', 'applyDate'],
'fieldProps': {
DepartmentList: { show_all: true, },
WebCode: { show_all: true, },
},
}}
onSubmit={(_err, obj, form, str) => {
TradeStore.setStateSearch(form);
pageRefresh(obj);
}}
/>
</Col>
</Row>
<section>
<Space>
<h2>年度业绩</h2>
<DatePickerCharts hide_vs={true} />
</Space>
<Spin spinning={summaryData.loading}>
<Row gutter={layoutProps.gutter}>
@ -146,7 +170,7 @@ export default observer(() => {
<Row gutter={layoutProps.gutter}>
{topSeries.map((item) => (
<Col {...layoutProps} key={item.key}>
<Spin spinning={topData[item.key]?.loading}>
<Spin spinning={topData[item.key]?.loading || false}>
<h3 style={{ textAlign: 'center' }}>{item.label}</h3>
<Bullet {...BulletConfig} dataSource={topData[item.key]?.dataSource || []} />
</Spin>

Loading…
Cancel
Save