Merge remote-tracking branch 'origin/main' into main
# Conflicts: # src/pages/configuration/Configuration.tsxmain
commit
2fbdc8cadd
|
@ -1,12 +1,214 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import {
|
||||||
|
ActionType,
|
||||||
|
EditableProTable,
|
||||||
|
ProColumns,
|
||||||
|
} from "@ant-design/pro-components";
|
||||||
|
import axiosInstance from "../../../utils/axiosInstance";
|
||||||
|
|
||||||
|
type DataSourceType = {
|
||||||
|
id: React.Key;
|
||||||
|
placeName: string;
|
||||||
|
subsidyPerDay: number;
|
||||||
|
baseExisted: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CityConfig extends React.Component<any, any> {
|
||||||
|
actionRef = React.createRef<ActionType>();
|
||||||
|
|
||||||
|
constructor(props: any) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
activated: props.activate,
|
||||||
|
tableData: [],
|
||||||
|
editableKeys: [],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveRow = (row: DataSourceType) => {
|
||||||
|
console.log(row)
|
||||||
|
this.update()
|
||||||
|
}
|
||||||
|
deleteRow = (row: DataSourceType) => {
|
||||||
|
console.log(row);
|
||||||
|
this.update()
|
||||||
|
}
|
||||||
|
update = () => {
|
||||||
|
this.actionRef.current?.reload()
|
||||||
|
}
|
||||||
|
|
||||||
|
convertor = (columns: DataSourceType[] | undefined | null) => {
|
||||||
|
if (columns === undefined || columns === null) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
return this.fakeData
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async request() {
|
||||||
|
let response = await axiosInstance.get("common/place")
|
||||||
|
let data = this.convertor(response.data)
|
||||||
|
return {
|
||||||
|
data: data,
|
||||||
|
success: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDerivedStateFromProps(props: any, state: any) {
|
||||||
|
return {activated: props.activate};
|
||||||
|
}
|
||||||
|
|
||||||
class CityConfig extends React.Component<any,any>{
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>City Config</h1>
|
<EditableProTable<DataSourceType>
|
||||||
|
actionRef={this.actionRef}
|
||||||
|
rowKey="id"
|
||||||
|
headerTitle="城市信息配置"
|
||||||
|
maxLength={5}
|
||||||
|
scroll={{
|
||||||
|
x: 960,
|
||||||
|
}}
|
||||||
|
recordCreatorProps={
|
||||||
|
{
|
||||||
|
creatorButtonText: '添加城市',
|
||||||
|
position: "bottom",
|
||||||
|
record: {
|
||||||
|
id: (Math.random() * 1000000).toFixed(0),
|
||||||
|
placeName: "",
|
||||||
|
subsidyPerDay: 0,
|
||||||
|
baseExisted: false
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loading={false}
|
||||||
|
columns={this.columns}
|
||||||
|
request={async (params, sorter, filter) => {
|
||||||
|
return this.request()
|
||||||
|
}}
|
||||||
|
value={this.state.tableData}
|
||||||
|
onChange={(data) => {
|
||||||
|
this.setState({tableData: data})
|
||||||
|
}}
|
||||||
|
editable={{
|
||||||
|
type: 'single',
|
||||||
|
editableKeys: this.state.editableKeys,
|
||||||
|
onSave: async (rowKey, data, row) => {
|
||||||
|
if (typeof data.baseExisted === "string") {
|
||||||
|
data.baseExisted = data.baseExisted === "true"
|
||||||
|
}
|
||||||
|
this.saveRow(data)
|
||||||
|
},
|
||||||
|
onChange: (e) => {
|
||||||
|
this.setState({editableKeys: e});
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
columns: ProColumns<DataSourceType>[] = [
|
||||||
|
{
|
||||||
|
title: '地点名称',
|
||||||
|
dataIndex: 'placeName',
|
||||||
|
formItemProps: {
|
||||||
|
rules: [{
|
||||||
|
required: true, type: "string", whitespace: true, validator: (rule, value) => {
|
||||||
|
if (value === undefined || value === null || typeof value !== "string" || value.trim() === "") {
|
||||||
|
return Promise.reject("此项为必填项")
|
||||||
|
}
|
||||||
|
for (let i = 0; i < this.state.tableData.length; i++) {
|
||||||
|
if (this.state.tableData[i] === value.trim()) {
|
||||||
|
return Promise.reject("地点名称重复")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.resolve()
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
editable: (text, record, index) => {
|
||||||
|
return record.placeName === "";
|
||||||
|
},
|
||||||
|
width: '15%',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '每日补贴',
|
||||||
|
dataIndex: 'subsidyPerDay',
|
||||||
|
render: (_) => <span>¥{_}</span>,
|
||||||
|
formItemProps: (a, b) => {
|
||||||
|
return {
|
||||||
|
rules: [{
|
||||||
|
required: true, validator: (rule, value) => {
|
||||||
|
if (!isNaN(Number(value)) && Number(value) >= 0 && Number(value) <= 1000000) {
|
||||||
|
if ((typeof value === "string") && value.split(".").length === 2 && value.split(".")[1].length > 2) {
|
||||||
|
return Promise.reject("至多两位小数")
|
||||||
|
}
|
||||||
|
return Promise.resolve()
|
||||||
|
}
|
||||||
|
return Promise.reject("请输入正确金额")
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
//style: {width: '100%'}
|
||||||
|
},
|
||||||
|
valueType: "text",
|
||||||
|
width: '25%'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '设有基地',
|
||||||
|
dataIndex: 'baseExisted',
|
||||||
|
width: '15%',
|
||||||
|
valueType: 'radio',
|
||||||
|
valueEnum: {
|
||||||
|
true: {text: '是', status: 'Success'},
|
||||||
|
false: {text: '否', status: 'Error'},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
valueType: 'option',
|
||||||
|
width: 200,
|
||||||
|
render: (text, record, _, action) => [
|
||||||
|
<a
|
||||||
|
key="editable"
|
||||||
|
onClick={() => {
|
||||||
|
action?.startEditable?.(record.id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</a>,
|
||||||
|
<a
|
||||||
|
key="delete"
|
||||||
|
onClick={(item) => {
|
||||||
|
this.deleteRow(record);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</a>,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
fakeData: DataSourceType[] = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
placeName: '北京',
|
||||||
|
subsidyPerDay: 100,
|
||||||
|
baseExisted: true,
|
||||||
|
}, {
|
||||||
|
id: 1,
|
||||||
|
placeName: '上海',
|
||||||
|
subsidyPerDay: 100,
|
||||||
|
baseExisted: true,
|
||||||
|
}, {
|
||||||
|
id: 2,
|
||||||
|
placeName: '广州',
|
||||||
|
subsidyPerDay: 100,
|
||||||
|
baseExisted: false,
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CityConfig;
|
export default CityConfig;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,74 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import {Button, Col, Form, InputNumber, Row, Switch, Table} from "antd";
|
||||||
|
import {ActionType} from "@ant-design/pro-components";
|
||||||
|
import {FormInstance} from "antd/es/form";
|
||||||
|
import Column from "antd/es/table/Column";
|
||||||
|
import RedoOutlined from "@ant-design/icons/lib/icons/RedoOutlined";
|
||||||
|
class OtherConfig extends React.Component<any, any> {
|
||||||
|
|
||||||
|
refresh = () => {
|
||||||
|
//TODO: refresh
|
||||||
|
this.setState({forced: true, limit: 0})
|
||||||
|
}
|
||||||
|
submit = () => {
|
||||||
|
//TODO: submit
|
||||||
|
|
||||||
|
this.refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(props: any) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
activated: props.activate,
|
||||||
|
limit: 0,
|
||||||
|
forced: true,
|
||||||
|
refresh: this.refresh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDerivedStateFromProps(props: any, state: any) {
|
||||||
|
if (props.activate !== state.activated && typeof state.refresh === "function")
|
||||||
|
state.refresh()
|
||||||
|
return {activated: props.activate};
|
||||||
|
}
|
||||||
|
|
||||||
class OtherConfig extends React.Component<any,any> {
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div style={{paddingTop: 50,paddingLeft:50}}>
|
||||||
<h1>Other Config</h1>
|
<Row>
|
||||||
|
{"强制总经理审批:"}
|
||||||
|
<Switch checked={this.state.forced} onChange={(e) => {
|
||||||
|
this.setState({forced: e, limit: 0})
|
||||||
|
}}/>
|
||||||
|
</Row>
|
||||||
|
<Row style={{marginTop: 30, alignContent: "center"}}>
|
||||||
|
{"总经理审批阈值:"}
|
||||||
|
<InputNumber prefix={"¥"} controls={false}
|
||||||
|
min={0} max={100000} defaultValue={500}
|
||||||
|
disabled={this.state.forced} value={this.state.limit}
|
||||||
|
onChange={(value) => {
|
||||||
|
if (isNaN(value)||Number(value) < 0) {
|
||||||
|
this.setState({limit: 0})
|
||||||
|
} else if (value.toString().split(".").length === 1) {
|
||||||
|
this.setState({limit: Number(value)})
|
||||||
|
} else if (value.toString().split(".")[1].length <= 2) {
|
||||||
|
this.setState({limit: Number(value)})
|
||||||
|
} else {
|
||||||
|
this.setState({limit: Number(value).toFixed(2)})
|
||||||
|
}
|
||||||
|
}}/>
|
||||||
|
</Row>
|
||||||
|
<Row style={{marginTop: 30,paddingBottom:30}}>
|
||||||
|
<Button style={{marginLeft: 30}} type={"default"} onClick={() => {
|
||||||
|
this.refresh()
|
||||||
|
}}><RedoOutlined /></Button>
|
||||||
|
<Button style={{marginLeft: 60}} type={"default"} onClick={() => {
|
||||||
|
|
||||||
|
}}>应用</Button>
|
||||||
|
</Row>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default OtherConfig;
|
export default OtherConfig;
|
|
@ -135,15 +135,14 @@ class ReimbursementCreate extends React.Component<any, any> {
|
||||||
};
|
};
|
||||||
|
|
||||||
submitCheck = () => {
|
submitCheck = () => {
|
||||||
//TODO: check
|
|
||||||
let msgContent:string = ""
|
let msgContent:string = ""
|
||||||
if(this.state.departureName == "" ) {
|
if(this.state.departureName === "" ) {
|
||||||
msgContent = "未填写出发地"
|
msgContent = "未填写出发地"
|
||||||
} else if(this.state.destinationName == "") {
|
} else if(this.state.destinationName === "") {
|
||||||
msgContent = "未填写目的地"
|
msgContent = "未填写目的地"
|
||||||
} else if(this.state.departureInvoice == null) {
|
} else if(this.state.departureInvoice === null) {
|
||||||
msgContent = "未上传出发票据"
|
msgContent = "未上传出发票据"
|
||||||
} else if(this.state.selectedDepartment == null || this.state.selectedDepartment.isEmpty()) {
|
} else if(this.state.selectedDepartment === null) {
|
||||||
msgContent = "未选择报销部门"
|
msgContent = "未选择报销部门"
|
||||||
} else {
|
} else {
|
||||||
return {ok: true, msg: ""}
|
return {ok: true, msg: ""}
|
||||||
|
|
Loading…
Reference in New Issue