312 lines
8.8 KiB
JavaScript
312 lines
8.8 KiB
JavaScript
|
|
import React,{useEffect,useState,useMemo,useRef} from 'react';
|
|||
|
|
import { Form, Button, Input, Row,Table, Col, Popconfirm, InputNumber,Image,Modal,Typography, message} from 'antd';
|
|||
|
|
import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons';
|
|||
|
|
import { formItemLayout, btnItemLayout } from '../../../../components/crud/FormLayoutProps';
|
|||
|
|
import { httpget2, httppost2,xyt_httpget2 } from '../../../../utils/request';
|
|||
|
|
import apiurl from '../../../../service/apiurl';
|
|||
|
|
import NormalSelect from '../../../../components/Form/NormalSelect';
|
|||
|
|
import ZbForm from "./Zbform";
|
|||
|
|
import moment from 'moment';
|
|||
|
|
import {handleData} from "../../../../utils/tools"
|
|||
|
|
|
|||
|
|
|
|||
|
|
const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
|
|||
|
|
|
|||
|
|
console.log("record",record);
|
|||
|
|
|
|||
|
|
const columns = [
|
|||
|
|
{
|
|||
|
|
title: "考核类目",
|
|||
|
|
dataIndex: "name",
|
|||
|
|
key:"name",
|
|||
|
|
width: 150,
|
|||
|
|
align: "center",
|
|||
|
|
onCell: (row) => ({ rowSpan: row.rowSpan || 0 })
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
title: '指标名称',
|
|||
|
|
key: 'indicatorName',
|
|||
|
|
dataIndex: 'indicatorName',
|
|||
|
|
width: 250,
|
|||
|
|
align: "center",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
title: '标准分数',
|
|||
|
|
key: 'standardScore',
|
|||
|
|
dataIndex: 'standardScore',
|
|||
|
|
width: 100,
|
|||
|
|
align: "center",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
title: '操作', key: 'operation1', width: 240, fixed: 'right', align: 'center',
|
|||
|
|
render: (_, record) => {
|
|||
|
|
return (
|
|||
|
|
<div>
|
|||
|
|
<Popconfirm
|
|||
|
|
title="确定要删除?"
|
|||
|
|
onConfirm={() => handleDelete(record.id)}
|
|||
|
|
>
|
|||
|
|
<a>删除</a>
|
|||
|
|
</Popconfirm>
|
|||
|
|
</div>
|
|||
|
|
)
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
const templateFreqOptions = [
|
|||
|
|
{
|
|||
|
|
label: "年度",
|
|||
|
|
value:1
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: "季度",
|
|||
|
|
value:2
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: "月度",
|
|||
|
|
value:3
|
|||
|
|
},
|
|||
|
|
]
|
|||
|
|
const [form] = Form.useForm();
|
|||
|
|
const [standardScore1, setStandardScore] = useState('')
|
|||
|
|
const [zbOpen, setZbOpen] = useState(false)
|
|||
|
|
const [tableData, setTableData] = useState([])
|
|||
|
|
const [selectKeys, setSelectKeys] = useState([])
|
|||
|
|
const tableDataRef = useRef(null)
|
|||
|
|
tableDataRef.current = tableData;
|
|||
|
|
const newColumns = useMemo(() => {
|
|||
|
|
let data = columns;
|
|||
|
|
if (mode == "view") {
|
|||
|
|
data.pop();
|
|||
|
|
return data
|
|||
|
|
} else {
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
}, [mode])
|
|||
|
|
const handleAddRow = () => {
|
|||
|
|
setZbOpen(true)
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
const handleDelete = (key) => {
|
|||
|
|
const newData = tableDataRef.current.filter((item) => item.id !== key);
|
|||
|
|
newData.forEach(item => {
|
|||
|
|
if (item.rowSpan) delete item.rowSpan;
|
|||
|
|
})
|
|||
|
|
const result = handleData(newData, "name")
|
|||
|
|
setTableData(result)
|
|||
|
|
setSelectKeys(newData.map(item => item.id))
|
|||
|
|
let total = newData.reduce((total,cur) => total + Number(cur.standardScore),0)
|
|||
|
|
setStandardScore(total)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
const onfinish = (values) => {
|
|||
|
|
// 校验等级划分
|
|||
|
|
if (values.excellentScore == undefined) {
|
|||
|
|
message.error("优秀分数不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if (values.goodScore == undefined) {
|
|||
|
|
message.error("良好分数不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if (values.passScore == undefined) {
|
|||
|
|
message.error("合格分数不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
const userId = localStorage.getItem('userId')
|
|||
|
|
const userName = localStorage.getItem('userName')
|
|||
|
|
values.indicatorIds = selectKeys;
|
|||
|
|
values.standardScore = standardScore1;
|
|||
|
|
values.createUserId = userId
|
|||
|
|
values.createUserName = userName
|
|||
|
|
if (mode === 'edit') {
|
|||
|
|
onEdit(apiurl.rcgl.jdkh.khmbgl.edit,{...record,...values})
|
|||
|
|
}
|
|||
|
|
if (mode === 'save') {
|
|||
|
|
onSave(apiurl.rcgl.jdkh.khmbgl.save,values)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
const onSubmit = (data) => {
|
|||
|
|
setZbOpen(false)
|
|||
|
|
// 重新对数据做处理
|
|||
|
|
data.data.forEach(item => {
|
|||
|
|
if (item.rowSpan) delete item.rowSpan;
|
|||
|
|
})
|
|||
|
|
const result = handleData(data.data, "name")
|
|||
|
|
let total = data.data.reduce((total,cur) => total + Number(cur.standardScore),0)
|
|||
|
|
setStandardScore(total)
|
|||
|
|
setTableData(result)
|
|||
|
|
setSelectKeys(data.keys)
|
|||
|
|
// 自动填充等级划分
|
|||
|
|
form.setFieldValue("excellentScore",(total * 0.92).toFixed(2))
|
|||
|
|
form.setFieldValue("goodScore",(total * 0.85).toFixed(2))
|
|||
|
|
form.setFieldValue("passScore",(total * 0.70).toFixed(2))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const getZbTableData = async(id) => {
|
|||
|
|
try {
|
|||
|
|
const res = await httpget2(apiurl.rcgl.jdkh.khmbgl.info + `/${id}`)
|
|||
|
|
if (res.code == 200) {
|
|||
|
|
let total = res.data.reduce((total,cur) => total + Number(cur.standardScore),0)
|
|||
|
|
setStandardScore(total)
|
|||
|
|
setSelectKeys(res.data.map(item => item.id))
|
|||
|
|
res.data.forEach(item => {
|
|||
|
|
if (item.rowSpan) delete item.rowSpan;
|
|||
|
|
})
|
|||
|
|
const result = handleData(res.data, "name")
|
|||
|
|
setTableData(result)
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
console.log(error);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
useEffect(() => {
|
|||
|
|
if (mode !== "save") {
|
|||
|
|
getZbTableData(record.id)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}, [record,mode])
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<>
|
|||
|
|
<Form
|
|||
|
|
form={form}
|
|||
|
|
{...formItemLayout}
|
|||
|
|
onFinish={onfinish}
|
|||
|
|
initialValues={record}
|
|||
|
|
>
|
|||
|
|
<Row>
|
|||
|
|
<Col span={12}>
|
|||
|
|
<Form.Item
|
|||
|
|
label="模板名称"
|
|||
|
|
name="templateName"
|
|||
|
|
rules={[
|
|||
|
|
{
|
|||
|
|
required: true,
|
|||
|
|
},
|
|||
|
|
]}
|
|||
|
|
>
|
|||
|
|
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
<Col span={12}>
|
|||
|
|
<Form.Item
|
|||
|
|
label="考核频次"
|
|||
|
|
name="templateFreq"
|
|||
|
|
>
|
|||
|
|
<NormalSelect disabled={mode==='view'} style={{ width: '100%' }} allowClear options={templateFreqOptions} />
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
</Row>
|
|||
|
|
|
|||
|
|
<Row>
|
|||
|
|
<Col span={12}>
|
|||
|
|
<Form.Item
|
|||
|
|
label="考核内容"
|
|||
|
|
>
|
|||
|
|
<Button
|
|||
|
|
type="primary"
|
|||
|
|
disabled={mode == "view"}
|
|||
|
|
onClick={handleAddRow}
|
|||
|
|
style={{ width: '30%' }}>添加指标</Button>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
</Row>
|
|||
|
|
<div style={{display:"flex",justifyContent:"space-between"}}>
|
|||
|
|
<span style={{ marginLeft: "auto" }}>标准分数:{ standardScore1}</span>
|
|||
|
|
</div>
|
|||
|
|
<Table
|
|||
|
|
rowKey="id"
|
|||
|
|
columns={newColumns}
|
|||
|
|
dataSource={tableData}
|
|||
|
|
scroll={{ y: "calc( 100vh - 400px )"}}
|
|||
|
|
pagination={false}
|
|||
|
|
/>
|
|||
|
|
<Row style={{marginTop:20}}>
|
|||
|
|
<Col span={8}>
|
|||
|
|
<Form.Item label="等级划分" >
|
|||
|
|
<Form.Item label={<span style={{fontWeight:"bold"}}>优秀</span>} required colon={false}>
|
|||
|
|
<Form.Item name="excellentScore" noStyle>
|
|||
|
|
<InputNumber
|
|||
|
|
min={0}
|
|||
|
|
max={standardScore1}
|
|||
|
|
style={{ width: "45%" }}
|
|||
|
|
disabled={mode == "view"}
|
|||
|
|
/>
|
|||
|
|
</Form.Item>
|
|||
|
|
<span className="ant-form-text"> 分及以上</span>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
<Col span={8}>
|
|||
|
|
<Form.Item >
|
|||
|
|
<Form.Item label={<span style={{fontWeight:"bold"}}>良好</span>} required colon={false}>
|
|||
|
|
<Form.Item name="goodScore" noStyle >
|
|||
|
|
<InputNumber
|
|||
|
|
min={0}
|
|||
|
|
max={standardScore1}
|
|||
|
|
style={{ width: "45%" }}
|
|||
|
|
disabled={mode == "view"}
|
|||
|
|
/>
|
|||
|
|
</Form.Item>
|
|||
|
|
<span className="ant-form-text"> 分及以上</span>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
<Col span={8}>
|
|||
|
|
<Form.Item >
|
|||
|
|
<Form.Item label={<span style={{fontWeight:"bold"}}>合格</span>} required colon={false}>
|
|||
|
|
<Form.Item name="passScore" noStyle >
|
|||
|
|
<InputNumber
|
|||
|
|
min={0}
|
|||
|
|
max={standardScore1}
|
|||
|
|
style={{ width: "45%" }}
|
|||
|
|
disabled={mode == "view"}
|
|||
|
|
/>
|
|||
|
|
</Form.Item>
|
|||
|
|
<span className="ant-form-text"> 分及以上</span>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Form.Item>
|
|||
|
|
</Col>
|
|||
|
|
</Row>
|
|||
|
|
{
|
|||
|
|
mode==='view'?null:(
|
|||
|
|
|
|||
|
|
<Form.Item wrapperCol={{span:2,offset:22}}>
|
|||
|
|
<Button type="primary" htmlType="submit" >
|
|||
|
|
{mode === 'save' ? '保存' :
|
|||
|
|
'修改'}
|
|||
|
|
</Button>
|
|||
|
|
</Form.Item>
|
|||
|
|
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
</Form>
|
|||
|
|
|
|||
|
|
<Modal
|
|||
|
|
open={zbOpen}
|
|||
|
|
width={1000}
|
|||
|
|
destroyOnClose
|
|||
|
|
footer={null}
|
|||
|
|
onCancel={() => {
|
|||
|
|
setZbOpen(false)
|
|||
|
|
}}
|
|||
|
|
title="选择指标"
|
|||
|
|
>
|
|||
|
|
<ZbForm onSubmit={onSubmit} selectKeys={selectKeys} />
|
|||
|
|
</Modal>
|
|||
|
|
</>
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export default ModalForm;
|