356 lines
11 KiB
JavaScript
356 lines
11 KiB
JavaScript
import React, { Component } from 'react'
|
|
import {
|
|
Button,
|
|
Card,
|
|
Cascader,
|
|
Form,
|
|
Input,
|
|
Tag,
|
|
Popconfirm,
|
|
message as Message,
|
|
Radio,
|
|
Select,
|
|
} from 'antd'
|
|
import { isEqual } from 'lodash'
|
|
import { AntIcon, Auth, Container, QueryTable, QueryTableActions } from 'components'
|
|
import { api } from 'common/api'
|
|
import getDictData from 'util/dic'
|
|
import auth from 'components/authorized/handler'
|
|
import { toCamelCase } from 'util/format'
|
|
import { getSearchInfo } from 'util/query'
|
|
|
|
// 配置页面所需接口函数
|
|
const apiAction = {
|
|
page: api.houseCodePage,
|
|
}
|
|
|
|
// 用于弹窗标题
|
|
const name = '房屋编码'
|
|
|
|
export default class index extends Component {
|
|
state = {
|
|
codes: {
|
|
houseType: [],
|
|
houseIndustry: [],
|
|
},
|
|
|
|
options: {
|
|
areaTree: [],
|
|
},
|
|
|
|
type: '',
|
|
}
|
|
|
|
// 表格实例
|
|
table = React.createRef()
|
|
|
|
// 表格字段
|
|
columns = [
|
|
{
|
|
title: '房屋编码',
|
|
dataIndex: 'houseCode',
|
|
sorter: true,
|
|
width: 300,
|
|
render: (text, record) => (
|
|
<>
|
|
{`${record.areaName}-${record.roadName}-${record.commName}-${
|
|
record.note
|
|
}-${record.no.toString().padStart(3, '0')}`}
|
|
<br />
|
|
<Tag color="purple">{text}</Tag>
|
|
</>
|
|
),
|
|
},
|
|
{
|
|
title: '房屋性质及行业',
|
|
dataIndex: 'type',
|
|
sorter: true,
|
|
width: 150,
|
|
render: (text, record) =>
|
|
this.bindCodeValue(text, 'house_type') +
|
|
(text === 2 ? `(${this.bindCodeValue(record.industry, 'house_industry')})` : ''),
|
|
},
|
|
{
|
|
title: '地址',
|
|
dataIndex: 'address',
|
|
sorter: true,
|
|
},
|
|
{
|
|
title: '登记时间',
|
|
dataIndex: 'createdTime',
|
|
sorter: true,
|
|
width: 150,
|
|
},
|
|
]
|
|
|
|
/**
|
|
* 构造函数,在渲染前动态添加操作字段等
|
|
* @param {*} props
|
|
*/
|
|
constructor(props) {
|
|
super(props)
|
|
|
|
const flag = auth({ houseCode: [['edit'], ['delete']] })
|
|
|
|
if (flag) {
|
|
this.columns.push({
|
|
title: '操作',
|
|
width: 150,
|
|
dataIndex: 'actions',
|
|
render: (text, record) => (
|
|
<QueryTableActions>
|
|
<Auth auth="houseCode:edit">
|
|
<a onClick={() => this.onOpen(record)}>编辑</a>
|
|
</Auth>
|
|
<Auth auth="houseCode:delete">
|
|
<Popconfirm
|
|
placement="topRight"
|
|
title="是否确认删除"
|
|
onConfirm={() => this.onDelete(record)}
|
|
>
|
|
<a>删除</a>
|
|
</Popconfirm>
|
|
</Auth>
|
|
</QueryTableActions>
|
|
),
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 阻止外部组件引发的渲染,提升性能
|
|
* 可自行添加渲染条件
|
|
* [必要]
|
|
* @param {*} props
|
|
* @param {*} state
|
|
* @returns
|
|
*/
|
|
shouldComponentUpdate(props, state) {
|
|
return !isEqual(this.state, state)
|
|
}
|
|
|
|
/**
|
|
* 加载字典数据,之后开始加载表格数据
|
|
* 如果必须要加载字典数据,可直接对表格设置autoLoad=true
|
|
*/
|
|
componentDidMount() {
|
|
const { onLoading, onLoadData } = this.table.current
|
|
onLoading()
|
|
getDictData('house_type', 'house_industry').then(async res => {
|
|
const { data } = await api.getAreaTree()
|
|
this.setState(
|
|
{
|
|
codes: res,
|
|
options: {
|
|
areaTree: data,
|
|
},
|
|
},
|
|
() => {
|
|
onLoadData()
|
|
}
|
|
)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 调用加载数据接口,可在调用前对query进行处理
|
|
* [异步,必要]
|
|
* @param {*} params
|
|
* @param {*} query
|
|
* @returns
|
|
*/
|
|
loadData = async (params, query) => {
|
|
if (query.areaCode) {
|
|
query.areaCode = query.areaCode.pop()
|
|
}
|
|
|
|
const searchInfo = getSearchInfo({
|
|
query,
|
|
queryType: {
|
|
areaCode: '=',
|
|
houseCode: 'like',
|
|
type: '=',
|
|
address: 'like',
|
|
},
|
|
})
|
|
|
|
const { data } = await apiAction.page({
|
|
...params,
|
|
searchInfo,
|
|
})
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* 绑定字典数据
|
|
* @param {*} code
|
|
* @param {*} name
|
|
* @returns
|
|
*/
|
|
bindCodeValue(code, name) {
|
|
name = toCamelCase(name)
|
|
const codes = this.state.codes[name]
|
|
if (codes) {
|
|
const c = codes.find(p => p.code == code)
|
|
if (c) {
|
|
return c.value
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
/**
|
|
* 打开新增/编辑弹窗
|
|
* @param {*} modal
|
|
* @param {*} record
|
|
*/
|
|
onOpen(record) {
|
|
const path = 'business/house/code/form'
|
|
window.openContentWindow({
|
|
key: record ? record.id : path,
|
|
title: record ? '修改房屋编码' : '新增房屋编码',
|
|
subTitle:
|
|
record &&
|
|
`${record.areaName}-${record.roadName}-${record.commName}-${record.note}-${record.no
|
|
.toString()
|
|
.padStart(3, '0')}`,
|
|
path,
|
|
param: {
|
|
id: record && record.id,
|
|
},
|
|
})
|
|
// modal.current.open({
|
|
// record
|
|
// })
|
|
}
|
|
|
|
/**
|
|
* 对表格上的操作进行统一处理
|
|
* [异步]
|
|
* @param {*} action
|
|
* @param {*} successMessage
|
|
*/
|
|
async onAction(action, successMessage) {
|
|
const { onLoading, onLoaded, onReloadData } = this.table.current
|
|
onLoading()
|
|
try {
|
|
if (action) {
|
|
await action
|
|
}
|
|
if (successMessage) {
|
|
Message.success(successMessage)
|
|
}
|
|
onReloadData()
|
|
} catch {
|
|
onLoaded()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除
|
|
* @param {*} record
|
|
*/
|
|
onDelete(record) {
|
|
this.onAction(apiAction.delete(record), '删除成功')
|
|
}
|
|
|
|
//#region 自定义方法
|
|
//#endregion
|
|
|
|
render() {
|
|
const { options, codes, type } = this.state
|
|
|
|
return (
|
|
<Container mode="fluid">
|
|
<br />
|
|
<Card bordered={false}>
|
|
<QueryTable
|
|
ref={this.table}
|
|
autoLoad={false}
|
|
loadData={this.loadData}
|
|
columns={this.columns}
|
|
queryInitialValues={{
|
|
type: '',
|
|
}}
|
|
onQueryChange={values => {
|
|
if (values.hasOwnProperty('type')) {
|
|
this.setState({ type: values.type })
|
|
}
|
|
}}
|
|
query={
|
|
<Auth auth="houseCode:page">
|
|
<Form.Item name="areaCode">
|
|
<Cascader
|
|
displayRender={labels => labels.join(' - ')}
|
|
fieldNames={{
|
|
label: 'name',
|
|
value: 'code',
|
|
children: 'children',
|
|
}}
|
|
options={options.areaTree}
|
|
className="w-400"
|
|
expandTrigger="hover"
|
|
placeholder="请选择所在区域"
|
|
/>
|
|
</Form.Item>
|
|
<Form.Item label="房屋唯一编码" name="houseCode">
|
|
<Input autoComplete="off" placeholder="请输入房屋唯一编码" />
|
|
</Form.Item>
|
|
{/* <Form.Item label="编号" name="no">
|
|
<InputNumber
|
|
formatter={value => value && value.padStart(3, '0')}
|
|
max={999}
|
|
min={1}
|
|
precision={0}
|
|
step={1}
|
|
placeholder="请输入房屋序号"
|
|
/>
|
|
</Form.Item> */}
|
|
<Form.Item label="房屋性质" name="type">
|
|
<Radio.Group buttonStyle="solid">
|
|
<Radio.Button value="">全部</Radio.Button>
|
|
{codes.houseType.map(item => (
|
|
<Radio.Button key={item.code} value={item.code}>
|
|
{item.value}
|
|
</Radio.Button>
|
|
))}
|
|
</Radio.Group>
|
|
</Form.Item>
|
|
{type == 2 && (
|
|
<Form.Item label="行业" name="industry">
|
|
<Select
|
|
allowClear
|
|
className="w-150"
|
|
placeholder="请选择行业"
|
|
>
|
|
{codes.houseIndustry.map(item => (
|
|
<Select.Option key={item.code} value={item.code}>
|
|
{item.value}
|
|
</Select.Option>
|
|
))}
|
|
</Select>
|
|
</Form.Item>
|
|
)}
|
|
<Form.Item label="地址" name="address">
|
|
<Input autoComplete="off" placeholder="请输入地址" />
|
|
</Form.Item>
|
|
</Auth>
|
|
}
|
|
operator={
|
|
<Auth auth="houseCode:add">
|
|
<Button
|
|
icon={<AntIcon type="plus" />}
|
|
onClick={() => this.onOpen()}
|
|
>
|
|
新增{name}
|
|
</Button>
|
|
</Auth>
|
|
}
|
|
/>
|
|
</Card>
|
|
{this.props.supportInfo}
|
|
</Container>
|
|
)
|
|
}
|
|
}
|