import React, {PureComponent} from 'react'; import {connect} from 'dva'; import store from "store"; import style from "styled-components"; import {Select, Input, Button, DatePicker, Icon, Popover, Radio, message, Upload, Drawer} from 'antd'; import {Link} from 'dva/router'; import * as api from "../../../services/api"; import PTable from "../../../components/Pro/PTable"; // import Drawer from 'react-motion-drawer'; import * as request from "../../../utils/request.js"; import bcx_utils from "../../../common/bcx_utils"; import moment from "moment"; const Option = Select.Option; const {MonthPicker} = DatePicker; const RadioGroup = Radio.Group; @connect(state => ({ global: state.global })) @connect(state => ({ monitor: state.monitor, })) export default class ReportGet extends PureComponent { constructor(props, context) { super(props, context); this.state = { type: this.props.match.params.type || "1",//2为查看月报表,1为查看普遍// 报表 reportId: this.props.match.params.reportId, columns: [],//动态表头 pageParm: { reportId: this.props.match.params.reportId, reportMonth: "", pageNumber: "1", pageSize: "10", },//分页请求参数 forceUpdate: false, ifDrawerReport: false, ifDrawerExport: false, radioValue: 1, updataData: {//即将更新的 input 框内容 fieldCode: "", fieldValue: "", id: "" }, uploadResponse: [],//上传文件 提示内容 shouldMoney: "",//应发工资 reportSet: { reportType:"1", reportName: "", remark: "", isSumSalary: "1" },//报表设置 }; } /******************************生命周期******************************/ //查看报表有2种模式,分别为查看月报表,查看普通报表 componentDidMount = () => { this.init(); }; componentWillUnmount = () => { if (this.timeInput) clearTimeout(this.timeInput); }; init = () => { //判断是哪种模式 if (this.state.type === "2") { const {pageParm} = this.state; pageParm.reportMonth = moment().format().slice(0, 7); this.setState({pageParm}, () => this.allAjax()); } else if (this.state.type === "1") { this.allAjax(); } }; allAjax = () => { const {reportId} = this.state; this.enterpriseSalaryComReportReportDetail(reportId); this.enterpriseSalaryComReportReport(reportId); this.enterpriseSalaryComReportSumActualWage(); }; /******************************ajax请求******************************/ // 根据报表id获得报表表头 enterpriseSalaryComReportReportDetail = (reportId) => { api.enterpriseSalaryComReportReportDetail({reportId}).then((data) => { //table 中 input 修改记录保存 const Content = ({record, fieldCode, column, index}) => ( this[`input${column}${index}`] = ref}/>
修改
放弃
); const columns = data.data.map((val, key) => { //判断是否可编辑 Popover设置动态 visible if (val.isEdit === "1") { return { title: val.fieldName, dataIndex: val.fieldCode, key, render: (text, record, index) => ( } visible={this.state[`visible${key}${index}`]} onVisibleChange={this.handleVisibleChange.bind(this, key, index)} >
{text}
) } } else { return { title: val.fieldName, dataIndex: val.fieldCode, key, } } }); this.setState({columns}); }, (err) => { console.log(err); }); }; //修改单条报表数据中的单项 enterpriseSalaryComReportUpdateReportInfo = (column, index) => { const {updataData} = this.state; bcx_utils.preventRepeatAsync((callback) => callback((resolve) => { if (updataData.fieldValue.trim() === "") { message.error("不能为空", 1.5, () => resolve(false)); return; } else { api.enterpriseSalaryComReportUpdateReportInfo(updataData).then((data) => { resolve(false); this.setState({forceUpdate: true}, () => { this.setState({forceUpdate: false}); }); this.inputCancel(column, index); }, (err) => { resolve(false); this.setState({forceUpdate: true}); // this.inputCancel(); }); } })) }; // 修改报表 enterpriseSalaryComReportUpdateCompanyReport = () => { const {reportSet, reportId} = this.state; bcx_utils.preventRepeatAsync((callback) => callback((resolve) => { if (reportSet.reportName == "") { message.error("报表名字不能为空", 1.5, () => resolve(false)); resolve(false); return; } if (reportSet.remark == "") { message.error("报表说明不能为空", 1.5, () => resolve(false)); resolve(false); return; } let ajaxData = {...reportSet, payReportId: reportId}; api.enterpriseSalaryComReportUpdateCompanyReport(ajaxData).then((data) => { //message.success(data.msg); this.setState({ ifDrawerExport:false }); this.init(); resolve(false); }, (err) => { message.error(err.msg); resolve(false); }); })) }; // 获得实发工资总额 enterpriseSalaryComReportSumActualWage = () => { let ajaxData = { reportId: this.state.reportId, reportMonth: this.state.pageParm.reportMonth }; api.enterpriseSalaryComReportSumActualWage(ajaxData).then((data) => { this.setState({shouldMoney: data.data}); }, (err) => { console.log(err); }); }; //根据报表id获得报表设置 enterpriseSalaryComReportReport = (reportId) => { api.enterpriseSalaryComReportReport({reportId}).then( (data) => { let {reportName, remark, isSumSalary,reportType} = data.data; this.setState({ reportSet: { reportName, remark, isSumSalary, reportType } }); }, (err) => { console.log(err); } ); }; /******************************相关事件******************************/ onMonthPickerChange = (date, dateString) => { if (dateString === "") return; let pageParm = {...this.state.pageParm}; pageParm.reportMonth = dateString; this.setState({pageParm}, () => { this.enterpriseSalaryComReportSumActualWage(); }); }; //table表格 change,这里设置 Popover初始化参数 dateTableChange = (data) => { let arr = data.data; let colum = this.state.columns; colum.map((v, key) => { arr.map((val, index) => { this.setState({ [`visible${key}${index}`]: false }); }) }); }; //table 中 input 修改记录保存 inputChange = (record = {}, fieldCode = "", e) => { const updataData = {...this.state.updataData}; if (!fieldCode) { return; } else { updataData.fieldValue = e.target.value; updataData.fieldCode = fieldCode; updataData.id = record.comPayReportInfoId; this.setState({updataData}); } }; //table 中 input 修改记录取消 inputCancel = (key, index) => { this.setState({ updataData: { fieldCode: "", fieldValue: "", id: "" }, [`visible${key}${index}`]: false, }); this[`input${key}${index}`].input.value = ""; }; //Popover打开 handleVisibleChange = (key, index, visible) => { this.setState({ [`visible${key}${index}`]: visible }); this.timeInput = setInterval(() => { if (this[`input${key}${index}`]) { clearTimeout(this.timeInput); this[`input${key}${index}`].focus(); } }, 200); }; drawerReportOnChange = (ifDrawerReport) => { this.setState({ifDrawerReport}); }; drawerExportOnChange = (ifDrawerExport) => { this.setState({ifDrawerExport}); }; //报表设置输入框 reportSet = (e) => { const reportSet = {...this.state.reportSet}; reportSet[e.target.name] = e.target.value.trim(); this.setState({reportSet}); }; //报表设置radio onRadioChange = (e) => { this.setState({ value: e.target.value, }); }; //下载 excel downExcel = () => { window.open(`${request.getHostByPath('/enterprise')}/enterprise/salary/com-report/export-report?reportId=${this.state.reportId}`, "_self"); }; /******************************render******************************/ renderTable = () => { const columns = [...this.state.columns]; let newProp = {}; if (columns.length > 10) { columns[0].fixed = "left"; columns[0].width = 80; newProp = { scroll: {x: 1400} }; } if (columns.length > 14) { newProp = { scroll: {x: 1600} }; } if (columns.length > 20) { newProp = { scroll: {x: 2000} }; } return ( ); }; //文件上传 renderUploadExcel = () => { const uploadExcel = { name: 'xfile', action: request.getHostByPath('/enterprise') + '/enterprise/salary/com-report/import-report-info?comId=' + this.props.global.companyInfo.comId, headers: { authorization: store.get("saas")["access_token"], Accesstoken: store.get('saas')['access_token']|| sessionStorage.userV5Token, }, data: { reportId: this.state.reportId, reportMonth: this.state.pageParm.reportMonth, }, }; const beforeUpload = file => { let ifError = true; if (file.name.indexOf("xls") == -1 && file.name.indexOf("xlsx") == -1) { message.error('请上传xls或xlsx文件!'); ifError = false; } return ifError; }; //上传文件 const UploadChange = info => { if (info.file.status === 'uploading') { this.setState({loading: true}); return; } if (info.file.status === 'done') { this.setState({uploadResponse: info.file.response.data}); if (info.file.response.retType == 0) { message.success(info.file.response.msg); this.setState({forceUpdate: true}, () => { this.setState({forceUpdate: false}); }); } } }; return (
支持扩展名:.xls/.xlsx
); }; render() { const {type, shouldMoney, reportSet, uploadResponse} = this.state; const reportMonth = this.state.pageParm.reportMonth; const year = reportMonth.slice(0, 4); const month = reportMonth.slice(5, 7); let yearAndMonth; let yearAndMonthSplit; if (reportSet.reportType === "2") { yearAndMonth = `${year}年${month}月`; yearAndMonthSplit = `|`; } return (
{/* 搜索条件面板 */}
{type === "2" &&
报表时间:
} {/**/}
{reportSet.isSumSalary === "1" && ( {!shouldMoney && "暂无相关数据"} {shouldMoney && ( <div> {yearAndMonth}<span className="split">{yearAndMonthSplit}</span> 实发工资总计<span className="value"> {shouldMoney}元</span> </div> )} )} {this.state.columns.length !== 0 && this.renderTable()}
{ this.setState({ ifDrawerReport:false }); }} >
导入说明:

请下载导入模板并根据模板格式填充所需数据。

注意:如导入数据前当前表格已有数据,导入数据将替换之前的数据,请谨慎操作!

下载导入模板

选择导入文件:
{this.renderUploadExcel()} {!!uploadResponse && uploadResponse.map((val, key) => { return (

{`${key + 1}、${val}.`}

); })}
{/*
确定
*/}
{ this.setState({ ifDrawerExport:false }); }} >
修改报表名称:
修改报表说明:
是否显示薪资总计:
); } } /************************样式************************/ const Content = style.div`{ font-size: 14px; color: rgba(0,0,0,0.65); padding:22px 24px; .searchpanel{ margin-bottom:16px; } .split{ margin:0 8px; } .value{ color: #0F71FF; margin-left: 4px; } }`; const Opton = style.span`{ font-size: 12px; color: #0F71FF; cursor:pointer; margin-right:8px; }`; const Title = style.div`{ border: 1px solid #D9D9D9; border-radius: 4px; height:51px; line-height:51px; padding:0 16px; margin-bottom:16px; }`; const Export = style.div`{ .title{ font-size: 18px; color: #333333; line-height: 21px; padding:19px; border:1px solid #E9E9E9; } .item{ margin-bottom:24px; &.small{ } .l{ width:168px; display:inline-block; text-align:right; margin-right:8px; vertical-align: top; } .r{ width:392px; display: inline-block; &.first{ height:96px; } .p1{ line-heigth:17px; margin-bottom:8px; } .p2{ font-size: 12px; color: #999999; >span{ width:372px; } >p{ margin-top:13px; font-size: 14px; color: #0F71FF; cursor:pointer; text-decoration: underline; } } } } }`; const InputChange = style.div`{ width:211px; height:93px; padding:16px; .btn{ font-size: 12px; float:right; border: 1px solid #D9D9D9; border-radius: 4px; width:44px; height:22px; line-height:22px; margin:9px 0 0 8px; text-align:center; cursor:pointer; &:nth-child(2){ background: #0F71FF; color:#fff; } } }`; const BottomButton = style.div`{ position: absolute; bottom: 0; width: 100%; border-top: 1px solid #e8e8e8; padding: 10px 16px; text-align: right; left: 0; background: #fff; border-radius: 0 0 4px 4px; }`;