liuyiliang 4 months ago
parent 0a3218b399
commit bf15dbb29d
  1. 6
      packages/examination/src/App.tsx
  2. 10
      packages/examination/src/api/statistical/index.tsx
  3. 5
      packages/examination/src/components/contentMain/index.js
  4. 7
      packages/examination/src/style/common.css
  5. 78
      packages/examination/src/views/slider/index.js
  6. 30
      packages/examination/src/views/slider/menu.tsx
  7. 34
      packages/examination/src/views/statistical/detail.tsx
  8. 247
      packages/examination/src/views/statistical/list.tsx

@ -1,10 +1,11 @@
import React from 'react'
import { Layout } from 'antd';
import {Layout, Select} from 'antd';
import Header from 'views/header';
import Slider from 'views/slider';
import ContentMain from 'components/contentMain';
const { Content, Footer, Sider } = Layout;
class App extends React.Component {
state = {
collapsed: false,
@ -18,6 +19,9 @@ class App extends React.Component {
this.setState({collapsed: value})
}
componentDidMount() {
}
render() {
const { collapsed } = this.state;
return (

@ -0,0 +1,10 @@
import axios from '../axios';
export function getList(obj: any){
console.log("1",obj)
return axios({
url: "/ex/statistics/page",
method: "post",
data: obj
})
}

@ -21,6 +21,9 @@ import Store from 'views/store_manage'; // 店铺管理
import DemoList from 'views/demo/demoList'; // demo list
import Customer from 'views/statistical/list';
import CustomerDetail from 'views/statistical/detail';
class ContentMain extends Component {
render() {
return (
@ -35,6 +38,8 @@ class ContentMain extends Component {
<Route exact path='/integralRule' component={ IntegralRule }/>
<Route exact path='/store' component={ Store }/>
<Route exact path='/demoList' component={ DemoList }/>
<Route exact path='/customer' component={ Customer } />
<Route exact path='/customerDetail' component={ CustomerDetail }/>
<Redirect exact from='/' to='/home'/>
</Switch>
</div>

@ -159,6 +159,13 @@ body {
font-weight: 600;
}
.logo p{
color: rgba(16, 16, 16, 1);
font-size: larger;
text-align: center;
font-family: PingFangSC-regular;
}
.logo img {
position: absolute;
width: 110px;

@ -2,14 +2,10 @@ import React from 'react'
import { Menu } from 'antd';
import { Link, withRouter } from 'react-router-dom'
import menuList from './menu'
import { createFromIconfontCN } from '@ant-design/icons';
import { FolderOutlined, FileTextOutlined } from '@ant-design/icons';
const { SubMenu } = Menu;
const IconFont = createFromIconfontCN({
scriptUrl: [
'//at.alicdn.com/t/font_2370456_9g9eu6j06v.js',
],
});
class Slider extends React.Component {
constructor(props) {
super(props);
@ -35,7 +31,7 @@ class Slider extends React.Component {
return (
<Menu.Item key={key}>
<Link to={key}>
{icon && <IconFont type={icon} />}
<FileTextOutlined />
<span>{title}</span>
</Link>
</Menu.Item>
@ -45,40 +41,64 @@ class Slider extends React.Component {
// 二级菜单
renderSubMenu = ({ key, icon, title, subs }) => {
return (
<SubMenu key={key} title={<span>{icon && <IconFont type={icon} />}<span>{title}</span></span>}>
{
subs && subs.map(item => {
return item.subs && item.subs.length > 0 ? this.renderSubMenu(item) : this.renderMenuItem(item)
})
<SubMenu
key={key}
title={
<span>
{icon && <FolderOutlined />}
<span>{title}</span>
</span>
}
>
{subs &&
subs.map((item) =>
item.subs && item.subs.length > 0
? this.renderSubMenu(item)
: this.renderMenuItem(item)
)}
</SubMenu>
)
}
);
};
handleMenu = (e) => {
this.setState({ selectedKeys: [e.key] })
// console.log('menu======', e)
}
// onOpenChange = (openKeys) => {
// // console.log('change=====', openKeys)
// if (openKeys.length === 0 || openKeys.length === 1) {
// this.setState({
// openKeys
// })
// return
// }
//
// //最新展开的菜单
// const latestOpenKey = openKeys[openKeys.length - 1]
// if (latestOpenKey.includes(openKeys[0])) {
// this.setState({ openKeys })
// } else {
// this.setState({
// openKeys: [latestOpenKey]
// })
// }
// }
onOpenChange = (openKeys) => {
// console.log('change=====', openKeys)
if (openKeys.length === 0 || openKeys.length === 1) {
this.setState({
openKeys
})
return
}
// 这里只控制展开的菜单项
const latestOpenKey = openKeys[openKeys.length - 1];
//最新展开的菜单
const latestOpenKey = openKeys[openKeys.length - 1]
if (latestOpenKey.includes(openKeys[0])) {
this.setState({ openKeys })
if (this.state.openKeys.includes(latestOpenKey)) {
this.setState({
openKeys: openKeys.length === 1 ? [] : openKeys
});
} else {
this.setState({
openKeys: [latestOpenKey]
})
}
openKeys
});
}
};
render() {
const { openKeys, selectedKeys } = this.state;
@ -91,7 +111,7 @@ class Slider extends React.Component {
this.props.collapsed ?
<div className='logoSmall'>LOGO</div> :
<div className="logo">
<p>重构项目LOGO</p>
<p>安责险系统</p>
{/* <img src={require('../../assets/logo_left.png')} alt="" /> */}
</div>
}

@ -1,8 +1,27 @@
const menuList = [
{
title: '首页',
key: 'home',
icon: 'icon-home'
title: '统计分析看板',
key: 'statistical_analysis_dashboard',
icon: 'icon',
subs: [
{
title: '统计动态看板',
key: 'dynamic_dashboard',
icon: 'icon',
subs: [
{
title: '客户列表',
key: 'customer',
icon: 'icon',
},
{
title: '服务统计',
key: 'demoList2',
icon: 'icon',
}
]
}
]
},
{
title: 'demo',
@ -77,6 +96,11 @@ const menuList = [
key: 'store',
}
]
},
{
title: '首页',
key: 'home',
icon: 'icon-home'
}
]

@ -0,0 +1,34 @@
import React from 'react'
import { useLocation } from 'react-router-dom';
import {Breadcrumb, Descriptions} from 'antd';
const Detail = () => {
const location = useLocation();
// @ts-ignore
const { record } = location.state || {}; // Access the record passed from the previous page
if (!record) {
return <div>No record found!</div>;
}
return (
<div>
{/*<Breadcrumb style={{ margin: '16px 16px' }}>*/}
{/* {breadcrumb.map((item, index) => (*/}
{/* <Breadcrumb.Item key={index}>{item}</Breadcrumb.Item>*/}
{/* ))}*/}
{/*</Breadcrumb>*/}
<h1></h1>
<Descriptions title="客户信息">
<Descriptions.Item label="客户编号">{record.customerNo}</Descriptions.Item>
<Descriptions.Item label="企业名称">{record.customerName}</Descriptions.Item>
<Descriptions.Item label="行业分类">{record.typePname}</Descriptions.Item>
<Descriptions.Item label="企业联系人">{record.contacts}</Descriptions.Item>
<Descriptions.Item label="联系电话">{record.contactsPhone}</Descriptions.Item>
</Descriptions>
</div>
);
}
export default Detail;

@ -0,0 +1,247 @@
import React from 'react'
import { Form, Input, Button, DatePicker, Table, Modal, Select, Descriptions} from 'antd'
import { getList } from 'api/statistical'
import Detail from 'components/order_manage/promotion_detail'
import { dictionary } from "api/dict/index";
const { Option } = Select
const { RangePicker } = DatePicker;
interface Props {
currentId: number
}
interface State {
listQuery: {
keyword: string,
page: number,
num: number,
activityName?: string,
memberName?: string,
mobile?: number | string,
start?: number,
end?: number
},
order_time?: string[],
list: object[],
total: any,
loading: boolean,
detailVisible: boolean,
currentId: number,
affiliationDict: any,
manageTypeDict: any,
showDetail: boolean
}
class Customer extends React.Component<Props, State>{
formRef = React.createRef<any>();
constructor(props: Props) {
super(props);
this.state = {
listQuery: {
keyword: '',
page: 1,
num: 20
},
list: [],
total: 0,
loading: false,
detailVisible: false,
currentId: 0,
affiliationDict: undefined,
manageTypeDict: undefined,
showDetail: false
}
// this.getListApi = this.getListApi.bind(this)
}
componentDidMount() {
this.getListApi(this.state.listQuery)
this.getDict()
}
// 列表接口
getListApi(listQuery: object) {
this.setState({ loading: true });
getList(listQuery).then(res => {
this.setState({
loading: false,
list: res.data.rows,
total: res.data.total
})
}).catch(() => { })
}
getDict() {
dictionary('affiliation').then((res) => {
if(res.data){
this.setState({ affiliationDict: res.data })
}
})
dictionary('manage_type').then((res) => {
if(res.data){
this.setState({ manageTypeDict: res.data })
}
})
}
// handleDetail(text: any, record: any) {
// // console.log(text)
// // console.log(record)
// this.setState({
// detailVisible: true,
// currentId: text.orderId,
// showDetail: true
// })
// }
handleDetail(record: any) {
// @ts-ignore
const { history } = this.props;
history.push({
pathname: '/customerDetail',
state: { record },
});
}
render() {
const onFinish = (values: object) => {
const { customerNo, customerName, typePname, contacts, contactsPhone } = JSON.parse(JSON.stringify(values))
const _listQuery = { ...this.state.listQuery, customerNo, customerName, typePname, contacts, contactsPhone }
this.setState({ listQuery: _listQuery })
this.getListApi(this.state.listQuery)
// console.log(this.state.listQuery)
}
const onFinishFailed = (errorInfo: object) => {
console.log('failes', errorInfo)
}
const columns: any = [
{ title: '客户编号', dataIndex: 'customerNo', key: 'customerNo', align: 'center', width: 180 },
{ title: '企业名称', dataIndex: 'customerName', key: 'customerName', align: 'center', width: 150 },
{ title: '行业分类', dataIndex: 'typePname', key: 'typePname', align: 'center', width: 120 },
{ title: '企业联系人', dataIndex: 'contacts', key: 'contacts', align: 'center', width: 120 },
{ title: '企业联系电话', dataIndex: 'contactsPhone', key: 'contactsPhone', align: 'center', width: 120 },
{
title: '操作',
key: 'operation',
align: 'center',
fixed: 'right',
width: 100,
// render: (text: any, record: any) => <p className='link' onClick={() => { this.handleDetail(text, record) }}>查看</p>,
render: (text: any, record: any) => <p className='link' onClick={() => { this.handleDetail(record) }}></p>,
}
];
// 分页切换
const changePage = (current: number, pageSize?: number) => {
const query = { ...this.state.listQuery, page: current, num: pageSize || 20 }
console.log('query', query)
setTimeout(() => {
this.setState({ listQuery: query })
this.getListApi(this.state.listQuery)
}, 0)
}
// 多少每页
const selectchange = (page: number, num: number) => {
const query = { ...this.state.listQuery, page, num }
this.setState({ listQuery: query })
this.getListApi(query);
}
// 详情model
const handleCancel = () => {
this.setState({ detailVisible: false })
};
const onReset = () => {
const form = this.formRef.current;
// 获取字段的当前值
const keyword = form.getFieldValue('keyword');
const affiliation = form.getFieldValue('affiliation');
const manageType = form.getFieldValue('manageType');
console.log('Current values before reset:', keyword, affiliation, manageType);
// 清空字段值
form.resetFields();
};
const { list, loading, affiliationDict, manageTypeDict } = this.state;
return (
<div className="container">
{/* {JSON.stringify(this.state.listQuery)} */}
<div className="ikd-page-header"><div className="title"></div></div>
<div className="list-filter">
<Form
ref={this.formRef}
className="filter"
layout="inline"
name="basic"
onFinish={onFinish}
onFinishFailed={onFinishFailed}>
<Form.Item
label="关键字:"
name="keyword">
<Input style={{ width: 230 }} placeholder="请输入输入客户名称/编号关键字" />
</Form.Item>
<Form.Item
label="归属机构:"
name="affiliation">
<Select placeholder="全部" style={{ width: 200 }} allowClear>
{
affiliationDict && affiliationDict.map((item: { dictKey: any; dictValue: string }) => {
return <Option value={item.dictKey}>{item.dictValue}</Option>
})
}
</Select>
</Form.Item>
<Form.Item
label="管理分类:"
name="manageType">
<Select placeholder="全部" style={{ width: 200 }} allowClear>
{
manageTypeDict && manageTypeDict.map((item: { dictKey: any; dictValue: string }) => {
return <Option value={item.dictKey}>{item.dictValue}</Option>
})
}
</Select>
</Form.Item>
<Form.Item>
<Button htmlType="button" onClick={onReset}>
</Button>
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit"></Button>
</Form.Item>
</Form>
</div>
<Table dataSource={list} columns={columns} rowKey="orderId"
loading={loading} scroll={{ y: '400px' }}
pagination={{
total: this.state.total,
current: this.state.listQuery.page,
showQuickJumper: true,
showSizeChanger: true,
showTotal: total => `${total}`,
onShowSizeChange: selectchange,
onChange: changePage
}} />
{/* 查看详情 */}
<Modal title="查看详情"
width={'80%'}
bodyStyle={{ lineHeight: '2.8' }}
visible={this.state.detailVisible}
maskClosable={false}
onCancel={handleCancel}
footer={[
<Button type="primary" key="back" onClick={handleCancel}>
</Button>
]}>
<Detail currentId={this.state.currentId}></Detail>
</Modal>
</div>
)
}
}
export default Customer;
Loading…
Cancel
Save