import React, { Component } from 'react';
import { connect } from 'dva';
import {
Form,
Button,
Steps,
Icon,
Divider,
TreeSelect,
Table,
Breadcrumb,
Modal,
Alert,
message,
Spin,
Input
} from 'antd';
import st from 'styled-components';
import { Link } from 'dva/router';
import { gup, checkMember } from '../../utils/utils';
import $perModal from '../../utils/modal/perModal';
import PartmentButton from '../../components/PartmentButton';
import {
getTreeperBydepart, //部门人员
taskAttendanceComAttendGroupFindAttendGroupByPerIdStr, //新增内勤组-设置考勤人员-检查多个人员是否存在于其他内勤组
taskAttendanceComAttendGroupInThirdStepAttendGroup, //进入内勤组设置-第三步页面
taskAttendanceComAttendGroupSaveThirdStepAttendGroup, //新增或者修改内勤组-第三步-设置考勤人员并保存
taskAttendanceComAttendGroupCheckAttendPer //新增或者修改内勤组-设置考勤人员-检查人员是否存在于其他内勤组
} from '../../services/api';
import './ThiftManagement.less';
const { confirm } = Modal;
const FormItem = Form.Item;
const { Step } = Steps;
@connect(state => ({
global: state.global,
currentuser: state.user
}))
@Form.create()
export default class SettingUpAttendance extends Component {
constructor(props, context) {
super(props, context);
this.state = {
perId: [], // 所有人员的id
perIdList: [], //不包含没有权限的人员的id
perNoIdList: [], //只有没有权限的人员的id
perIdStr: [],
chargePerIdStr: '',
chargePerIdList: [],
attendGroupId: gup('attendGroupId') || '',
midAttendGroupId: gup('midAttendGroupId') || '',
chargePerVisible: false,
treeData: [],
arrayObj: [],
loading: false
};
}
componentDidMount() {
// this.getTreeperBydepart();
// this.taskAttendanceComAttendGroupInThirdStepAttendGroup();
}
componentWillMount() {
this.taskAttendanceComAttendGroupInThirdStepAttendGroup();
this.setState({
loading: true
});
this.getTreeperBydepart();
}
renderTable = data => {
if (data) {
data = JSON.parse(data);
} else {
return null;
}
const dataSource = data.map((val, i) => {
val.key = i;
return val;
});
const columns = [
{
title: '姓名',
dataIndex: 'name',
key: '1',
width: 80
},
{
title: '内勤组',
dataIndex: 'attendGroupName',
key: '2'
}
];
return (
调整后,该人员今日的打卡记录将会删除,需要以新的考勤规则重新打卡。
);
};
//新增内勤组-设置考勤人员-检查多个人员是否存在于其他内勤组
taskAttendanceComAttendGroupFindAttendGroupByPerIdStr = chargePerIdStr => {
taskAttendanceComAttendGroupFindAttendGroupByPerIdStr({
perIdStr: chargePerIdStr.join(',')
}).then(
response => {
if (response.data.length > 0) {
confirm({
title: '以下人员都已经有考勤任务了',
content: this.renderTable(response.data),
okText: '确认调整',
cancelText: '保持不变',
onOk: () => { },
onCancel: () => {
this.taskAttendanceComAttendGroupInThirdStepAttendGroup();
}
});
}
},
err => {
console.log(
err,
'err-新增内勤组-设置考勤人员-检查多个人员是否存在于其他内勤组-taskAttendanceComAttendGroupFindAttendGroupByPerIdStr'
);
}
);
};
//新增或者修改内勤组-设置考勤人员-检查人员是否存在于其他内勤组
taskAttendanceComAttendGroupCheckAttendPer = perIdStr => {
const { midAttendGroupId, attendGroupId } = this.state;
taskAttendanceComAttendGroupCheckAttendPer({
midAttendGroupId,
// perIdStr: perIdStr.join(","),
perIdStr,
attendGroupId
})
.then(res => {
if (res.data) {
confirm({
title: '以下人员都已经有考勤任务了',
content: this.renderTable(res.data),
okText: '确认调整',
cancelText: '保持不变',
closable: true,
onOk: () => {
const modal = confirm({
title: '请根据需求选择准确的生效时间:',
content: (
{
modal.destroy();
}}
/>
今日生效:考勤人员今日的考勤规则将按照本内勤组设置的进行变更,
若今日已有打卡数据,将会被清除。
明日生效:考勤人员今日的考勤规则及打卡数据不变,从明日起以本内勤组设置的规则进行考勤打卡。
),
okText: '明日生效',
cancelText: '今日生效',
onCancel: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'1',
'1'
);
},
onOk: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'1',
'2'
);
}
});
},
onCancel: () => {
if (res.data && JSON.parse(res.data).length === perIdStr.length) {
message.error('所有选中的人员都存在班次冲突,无法提交任务');
return;
}
const modal = confirm({
title: '选择考勤生效时间',
content: (
{
modal.destroy();
}}
/>
今日生效:考勤人员今日的考勤规则将按照本内勤组设置的进行变更,
若今日已有打卡数据,将会被清除。
明日生效:考勤人员今日的考勤规则及打卡数据不变,从明日起以本内勤组设置的规则进行考勤打卡。
),
okText: '明日生效',
cancelText: '今日生效',
onCancel: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'0',
'1'
);
},
onOk: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'0',
'2'
);
}
});
}
});
} else {
const modal = confirm({
title: '选择考勤生效时间',
content: (
{
modal.destroy();
}}
/>
今日生效:考勤人员今日的考勤规则将按照本内勤组设置的进行变更,
若今日已有打卡数据,将会被清除。
明日生效:考勤人员今日的考勤规则及打卡数据不变,从明日起以本内勤组设置的规则进行考勤打卡。
),
okText: '明日生效',
cancelText: '今日生效',
onCancel: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'0',
'1'
);
},
onOk: () => {
this.taskAttendanceComAttendGroupSaveThirdStepAttendGroup(
'0',
'2'
);
}
});
}
})
.catch(err =>
console.log(
err,
'新增或者修改内勤组-设置考勤人员-检查人员是否存在于其他内勤组-err'
)
);
};
//新增或者修改内勤组-第三步-设置考勤人员并保存
taskAttendanceComAttendGroupSaveThirdStepAttendGroup = (
isAdjust,
effectRule
) => {
const { midAttendGroupId, attendGroupId, chargePerIdList } = this.state;
const chargePerIdStr = chargePerIdList[0].perId;
taskAttendanceComAttendGroupSaveThirdStepAttendGroup({
midAttendGroupId,
attendGroupId,
isAdjust,
effectRule,
chargePerIdStr
})
.then(res => {
this.props.history.push(
`/attendancemanagement/newattendanceunit/settingcomplete`
);
})
.catch(err =>
console.log(err, '新增或者修改内勤组-第三步-设置考勤人员并保存-err')
);
};
//进入内勤组设置-第三步页面
taskAttendanceComAttendGroupInThirdStepAttendGroup = () => {
const { midAttendGroupId, attendGroupId } = this.state;
taskAttendanceComAttendGroupInThirdStepAttendGroup({
midAttendGroupId,
attendGroupId
}).then(
response => {
const { setFieldsValue } = this.props.form;
if (
!('perList' in response.data) ||
!('chargePerList' in response.data)
) {
return null;
}
const { perList, chargePerList } = response.data;
const newlist1 = perList.map(val => {
return val.perId;
});
setFieldsValue({
perIdStr: perList.map(({perId}) => perId).join(','),
perName: perList.map(({name}) => name).join(',')
});
// const newlist = perList.map(val => {
// return `${val.perId}::${val.name}`;
// });
// if (perList.length) {
// setFieldsValue({
// perIdStr: newlist
// });
// this.setState({
// perIdStr: newlist1
// });
// }
this.setState({
perId: newlist1, //里面包含的数据可能存在没有权限的,即没有在树选择器中(让后端在此加入字段判断有没有权限的进行判断)
perNoIdList: newlist1 //先给没有权限的人员列表里面是所有值,之后在减去
});
if (this.state.treeData.length > 0) {
//如果这个接口后请求完成,就这里掉用设置
const perIdList = this.removeNOpowerId(newlist1, this.state.treeData);
setFieldsValue({
perIdStr: perIdList.join(',')
});
}
if (chargePerList.length > 0) {
this.setState({
chargePerIdStr: chargePerList[0]['perId'],
chargePerIdList: [{ title: chargePerList[0]['name'] }],
arrayObj: chargePerList
});
setFieldsValue({
chargePerIdStr: chargePerList[0]
});
}
},
err => {
console.log(
err,
'err-进入内勤组设置-第三步页面taskAttendanceComAttendGroupInThirdStepAttendGroup'
);
}
);
};
gerator = data => {
return data.map(val => {
val.value = `${val.key}::${val.label}`;
if (val.treeType === '1') {
val.value = `${val.key}::${val.label}::dept`;
}
if (val.children.length > 0) {
val.children = this.gerator(val.children);
}
return val;
});
};
//部门人员
getTreeperBydepart = () => {
getTreeperBydepart().then(
response => {
const responseData = checkMember(response.data);
// response.data = this.gerator(response.data);
this.setState({ treeData: responseData });
if (this.state.perId.length > 0) {
//如果这个接口后请求完成,就这里掉用设置
const treeData = JSON.parse(JSON.stringify(responseData));
const perIdList = this.removeNOpowerId(this.state.perId, treeData);
const { setFieldsValue } = this.props.form;
setFieldsValue({
perIdStr: perIdList.join(',')
});
}
this.setState({
loading: false
});
},
err => {
this.setState({
loading: false
});
console.log(err, 'err-部门人员-getTreeperBydepart');
}
);
};
//删掉没有权限的人员id
removeNOpowerId = (perId, treeData) => {
treeData.map(item => {
if (item.children && item.children.length > 0) {
item.children = this.removeNOpowerId(perId, item.children);
}
});
if (treeData.length > 0) {
treeData.map(tdata => {
perId.filter((item, i) => {
if (item === tdata.key) {
//给的人员id有在树结构里面
this.state.perIdList.push(item);
this.state.perNoIdList.splice(i, 1);
}
});
});
}
return this.state.perIdList;
};
// //宣染参与人员
// perIdListRender = () => {
// return this.state.perIdList.map((val, i) => {
// return (
//
//
// {val.title}
//
// );
// });
// };
//宣染人员选择器
renderUserSelect = () => {
const { setFieldsValue } = this.props.form;
/* 内勤组负责人: */
return (
{
this.setState({
chargePerVisible: false,
chargePerIdStr,
chargePerIdList
});
setFieldsValue({ chargePerIdStr });
}}
type="radio"
handleCancel={() => {
this.setState({
chargePerVisible: false
});
}}
value={this.state.chargePerIdStr}
arrayObj={this.state.arrayObj}
visible={this.state.chargePerVisible}
/>
);
};
handleSubmit = e => {
e.preventDefault();
this.props.form.validateFieldsAndScroll((err, values) => {
if (!err) {
values.perIdStr = values.perIdStr.split(',');
Reflect.deleteProperty(values, 'perName');
if (values.perIdStr.length > 1000) {
message.error('参与人数不得大于1000,请重新选择!');
return;
}
this.taskAttendanceComAttendGroupCheckAttendPer(values.perIdStr);
}
});
};
onChange = value => {
this.setState({ perIdStr: value });
};
findper = perIdStr => {
clearTimeout(this.timeId);
this.timeId = window.setTimeout(() => {
this.taskAttendanceComAttendGroupFindAttendGroupByPerIdStr(perIdStr);
}, 1000);
};
render() {
const { submitting } = this.props;
const { getFieldDecorator, setFieldsValue, getFieldValue } = this.props.form;
const { treeData } = this.state;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 7 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
md: { span: 10 }
}
};
const submitFormLayout = {
wrapperCol: {
xs: { span: 24, offset: 0 },
sm: { span: 10, offset: 7 }
}
};
return (
内勤组管理
设置考勤人员
{/*
设置考勤人员
*/}
1、考勤人员:一个人员仅限归属一个内勤组,若需要变更人员的考勤规则,请新建一个内勤组,并将此人员从本内勤组中删除,在新内勤组中新增;
2、内勤组提交有今日生效
(今日的排班将以最新的规则安排,若旧排班已有打卡数据将会被清除)、
明日生效
(今日的排班及考勤数据不变,从明日以最新的规则安排考勤),请根据需求准确选择;
3、增减人说明:内勤组允许增加/减去人员。
减去人员时,若选择今日生效,则该人员当日的考勤数据将会被删除,请知悉!
}
type="warning"
showIcon
style={{ marginBottom: '15px' }}
/>
{/* 由于初始值的赋值过程在constructor这个生命周期中完成,为保证每次能拿到正确的初始值,
过采用调用后即销毁的方式使用该组件,若采用直接调用的方式则下次进入该组件不会执行到
constructor这个生命周期 */}
{this.state.chargePerVisible && this.renderUserSelect()}
);
}
}
const InputWrap = st.div`
display: flex;
align-items: center;
.count_wrap{
flex-shrink: 0;
margin-left: 8px;
}
`;