1302 lines
44 KiB
JavaScript
1302 lines
44 KiB
JavaScript
import React from "react";
|
||
import { inject, observer } from "mobx-react";
|
||
import {
|
||
WeaTop,
|
||
WeaTab,
|
||
WeaOrgTree,
|
||
WeaLeftRightLayout,
|
||
WeaEchart,
|
||
WeaYear,
|
||
WeaDialog,
|
||
WeaPopoverHrm,
|
||
WeaRightMenu,
|
||
WeaTools,
|
||
WeaErrorPage,
|
||
WeaAlertPage,
|
||
WeaDatePicker,
|
||
WeaBrowser,
|
||
WeaNewScroll,
|
||
WeaInputNumber,
|
||
WeaDropdown,
|
||
} from "ecCom";
|
||
import { WeaTableNew } from "comsMobx";
|
||
const WeaTable = WeaTableNew.WeaTable;
|
||
import {
|
||
Modal,
|
||
Row,
|
||
Col,
|
||
Button,
|
||
Spin,
|
||
Icon,
|
||
Calendar,
|
||
Tooltip,
|
||
Timeline,
|
||
} from "antd";
|
||
import "../style/newChecking.less";
|
||
import * as mobx from "mobx";
|
||
import isEmpty from "lodash/isEmpty";
|
||
import cloneDeep from "lodash/cloneDeep";
|
||
import toString from "lodash/toString";
|
||
import moment from "moment";
|
||
import debounce from "lodash/debounce";
|
||
import * as Util from "../util/index";
|
||
import { win32 } from "path";
|
||
import { i18n } from "../public/i18n";
|
||
import { WeaLocaleProvider } from "ecCom";
|
||
import AbsenceDialog from "./absenceDetail/Dialog";
|
||
const getLabel = WeaLocaleProvider.getLabel;
|
||
const toJS = mobx.toJS;
|
||
let __this;
|
||
const ButtonGroup = Button.Group;
|
||
const { ButtonSelect } = WeaDropdown;
|
||
|
||
const WorkInfo = (props) => {
|
||
const { groupitem, onStsClick } = props;
|
||
|
||
return (
|
||
<div className="work work-padding">
|
||
<div>
|
||
{groupitem &&
|
||
groupitem.map((item) => {
|
||
const { icon, value, title, color } = item;
|
||
return (
|
||
<div className="item">
|
||
<div className="icon" style={{ backgroundColor: color }}>
|
||
<i className={icon} />
|
||
</div>
|
||
<div className="info">
|
||
<div className="value" onClick={() => onStsClick(item)}>
|
||
{value}
|
||
</div>
|
||
<div className="title" title={title}>
|
||
{title}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
})}
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
const LeaveInfo = (props) => {
|
||
const { groupitem, onStsClick, hasBorder } = props;
|
||
|
||
const datasLen = groupitem.length;
|
||
let width;
|
||
if (datasLen === 1) {
|
||
width = "100%";
|
||
} else if (datasLen === 2) {
|
||
width = "50%";
|
||
} else {
|
||
width = "33.3%";
|
||
}
|
||
|
||
return (
|
||
<div
|
||
className="leave-info-content"
|
||
style={{ justifyContent: datasLen < 4 ? "space-around" : "flex-start" }}
|
||
>
|
||
{groupitem &&
|
||
groupitem.map((item, index) => {
|
||
const { value, title } = item;
|
||
return (
|
||
<div
|
||
key={index}
|
||
className="item"
|
||
style={{ width, textAlign: datasLen < 4 && "center" }}
|
||
>
|
||
<span onClick={() => onStsClick(item)}>{value}</span>
|
||
<span title={title}>{title}</span>
|
||
</div>
|
||
);
|
||
})}
|
||
</div>
|
||
);
|
||
};
|
||
|
||
const SignInfo = (props) => {
|
||
const { groupitem, onStsClick } = props;
|
||
|
||
return (
|
||
<div className="sign">
|
||
{groupitem &&
|
||
groupitem.map((d) => {
|
||
const { value, title } = d;
|
||
|
||
return (
|
||
<div className="cursor-pointer" onClick={() => onStsClick(d)}>
|
||
<span className="sign-value abnormal-font">{value}</span>
|
||
<span className="sign-title hrm-over-flow" title={title}>
|
||
{title}
|
||
</span>
|
||
</div>
|
||
);
|
||
})}
|
||
</div>
|
||
);
|
||
};
|
||
|
||
const NoData = (props) => {
|
||
const { tip, loading } = props;
|
||
|
||
if (loading) {
|
||
return null;
|
||
}
|
||
|
||
return (
|
||
<div className="no-data">
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@o3bfwq`}
|
||
type="flex"
|
||
justify="space-around"
|
||
align="middle"
|
||
className="outterow"
|
||
>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@faje8e`} span={24} style={{ textAlign: "center" }}>
|
||
<i className="icon-coms-NoData f28" />
|
||
<span
|
||
style={{ verticalAlign: "super", marginLeft: 5 }}
|
||
className="wea-f14"
|
||
title={tip}
|
||
>
|
||
{tip}
|
||
</span>
|
||
</Col>
|
||
</Row>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
@inject("hrmChecking")
|
||
@observer
|
||
class main extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.state = {
|
||
iWidth: window.innerWidth,
|
||
oHeight: 300,
|
||
};
|
||
if (window.innerHeight > 850) {
|
||
this.state.oHeight = 450;
|
||
} else if (window.innerHeight > 600) {
|
||
this.state.oHeight = window.innerHeight / 2 - 100;
|
||
} else {
|
||
this.state.oHeight = 200;
|
||
}
|
||
this.onStsClick.bind(this);
|
||
__this = this;
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.init();
|
||
}
|
||
componentDidMount() {
|
||
const { hrmChecking, hrmCard } = this.props;
|
||
hrmChecking.hrmId = this.props.params.hrmId || "";
|
||
this.getData();
|
||
hrmChecking.getHrmNewWorkflwList();
|
||
hrmChecking.getwfinfo();
|
||
if(hrmCard){
|
||
hrmCard.setTopButtons(this.getTopButtons.bind(this));
|
||
hrmCard.setTopRightMenus(this.getRightMenu.bind(this));
|
||
hrmCard.setTopShowDropIcon(true);
|
||
}
|
||
//document.title = hrmChecking.title;
|
||
}
|
||
componentWillReceiveProps(nextProps) {
|
||
const { hrmChecking } = this.props;
|
||
if (this.props.location.key !== nextProps.location.key) {
|
||
hrmChecking.init();
|
||
this.getData();
|
||
}
|
||
}
|
||
getData() {
|
||
const { hrmChecking } = this.props;
|
||
const { tabkey } = hrmChecking;
|
||
hrmChecking.getData(() => {
|
||
tabkey == 1 && this.refs.chart && this.refs.chart.paint();
|
||
});
|
||
}
|
||
|
||
componentDidUpdate() {
|
||
this.props.setParentRightMenu &&
|
||
this.props.setParentRightMenu(this.getRightMenu());
|
||
}
|
||
|
||
getRightMenu() {
|
||
const { hrmChecking } = this.props;
|
||
let btns = [];
|
||
btns.push({
|
||
key: "add",
|
||
icon: <i className="icon-coms-workflow" />,
|
||
content: getLabel("385037", "新建考勤流程"),
|
||
onClick: (key) => {
|
||
this.addChecking();
|
||
},
|
||
});
|
||
return btns;
|
||
}
|
||
addChecking() {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.updateNewVisible(true);
|
||
}
|
||
getTopButtons() {
|
||
const { hrmChecking } = this.props;
|
||
let btns = [];
|
||
btns.push(
|
||
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@pvyiyy@topBtn`} type="primary" onClick={() => this.addChecking()}>
|
||
{getLabel("385037", "新建考勤流程")}
|
||
</Button>
|
||
);
|
||
return btns;
|
||
}
|
||
chooseUser(e) {
|
||
const { hrmChecking } = this.props;
|
||
let hrmId = "",
|
||
hrmName = undefined;
|
||
if (e.selected) {
|
||
hrmId = e.node.props.id;
|
||
hrmName = e.node.props.name;
|
||
}
|
||
if (hrmId) {
|
||
hrmChecking.updateHrmId(hrmId);
|
||
if (hrmName) hrmChecking.updateHrmName(hrmName);
|
||
this.getData();
|
||
}
|
||
}
|
||
changeUserRoot(ids, names, datas) {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.updateUserRoot(datas);
|
||
}
|
||
resetUserRoot() {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.updateUserRoot();
|
||
hrmChecking.updateHrmId();
|
||
hrmChecking.updateHrmName();
|
||
this.getData();
|
||
}
|
||
changeTab(key) {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.changeTabHandler(key);
|
||
this.getData();
|
||
}
|
||
changeDateTab(key) {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.changeDateTabHandler(key);
|
||
this.getData();
|
||
}
|
||
reFresh() {
|
||
const { hrmChecking } = this.props;
|
||
this.getData();
|
||
}
|
||
changeDate(v) {
|
||
const { hrmChecking } = this.props;
|
||
const { dateTabkey } = hrmChecking;
|
||
if (dateTabkey == "2") {
|
||
v = new moment(v).format("YYYY-MM");
|
||
} else {
|
||
v = new moment(v).format("YYYY");
|
||
}
|
||
hrmChecking.changeDateHandler(v);
|
||
this.getData();
|
||
}
|
||
handlerStatusClick(item) {
|
||
const { hrmChecking } = this.props;
|
||
hrmChecking.handlerStatusClick(item.type);
|
||
}
|
||
renderLeft() {
|
||
const { hrmChecking } = this.props;
|
||
const { oHeight } = this.state;
|
||
let { tabkey, leftTitle, userRoot } = hrmChecking;
|
||
userRoot = toJS(userRoot);
|
||
const hrmId = this.props.params.hrmId || "";
|
||
let org = (
|
||
<WeaOrgTree ecId={`${this && this.props && this.props.ecId || ''}_WeaOrgTree@novss4`}
|
||
dataUrl="/api/hrm/base/getHrmResourceTree"
|
||
rootKey="rootManager"
|
||
treeNodeClick={this.chooseUser.bind(this)}
|
||
params={
|
||
Array.isArray(userRoot) && userRoot[0]
|
||
? { rootid: userRoot[0].id }
|
||
: { rootid: hrmId }
|
||
}
|
||
/>
|
||
);
|
||
return (
|
||
<div
|
||
className="attendence-checking-left"
|
||
style={{ height: window.innerHeight - 125 }}
|
||
>
|
||
<div className="left-header">
|
||
<div className="header-title bb align-center">
|
||
{getLabel("32997", "人员组织")}
|
||
</div>
|
||
</div>
|
||
<div className="left-body">
|
||
<WeaBrowser ecId={`${this && this.props && this.props.ecId || ''}_WeaBrowser@7otf28`}
|
||
isSingle={true}
|
||
linkUrl="/hrm/resource/HrmResource.jsp?id="
|
||
title={getLabel("179", "人力资源")}
|
||
type="1"
|
||
viewAttr="2"
|
||
replaceDatas={userRoot}
|
||
customIcon="icon-coms-Reset"
|
||
addOnClick={this.resetUserRoot.bind(this)}
|
||
onChange={this.changeUserRoot.bind(this)}
|
||
/>
|
||
{tabkey === "1" ? (
|
||
<div style={{ height: window.innerHeight - 235 }}>{org}</div>
|
||
) : (
|
||
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@9fqpl0`} height={oHeight} className="left-checking">
|
||
{org}
|
||
</WeaNewScroll>
|
||
)}
|
||
{tabkey === "2" && this.renderDetail()}
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|
||
// 截取很magic的a标签数据
|
||
sliceA(str) {
|
||
if (str.indexOf("a>") > -1 && str.indexOf("<a") > -1) {
|
||
str = str.match(/\>(.+)</)[1];
|
||
}
|
||
return str;
|
||
}
|
||
getNavbarHeight = () => {
|
||
return $('.e9theme-layout2-navbar').height()
|
||
}
|
||
|
||
renderDetail() {
|
||
const { hrmChecking } = this.props;
|
||
const { oHeight } = this.state;
|
||
let { calendarCheckedDay, sData } = hrmChecking;
|
||
if (calendarCheckedDay) {
|
||
return (
|
||
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@l51d0b`}
|
||
height={window.innerHeight - 200 - oHeight - this.getNavbarHeight()}
|
||
className="bt"
|
||
>
|
||
<div className="detail-wrapper">
|
||
<strong className="detail-header">
|
||
<i className="icon-coms-New-schedule" />
|
||
{sData.date} {getLabel("20080", "考勤情况")}
|
||
</strong>
|
||
{isEmpty(sData.signInfo) && (
|
||
<div className="empty align-center">
|
||
{getLabel("386472", "当天没有考勤数据")}
|
||
</div>
|
||
)}
|
||
{!isEmpty(sData.signInfo) && (
|
||
<Timeline ecId={`${this && this.props && this.props.ecId || ''}_Timeline@07qho9`}>
|
||
{sData.signInfo.map((i, index) => {
|
||
return (
|
||
<Timeline.Item ecId={`${this && this.props && this.props.ecId || ''}_undefined@jdhzs1@${index}`}>
|
||
{i.item &&
|
||
i.item.map((d) => {
|
||
return (
|
||
<div className="item">
|
||
<span className="title">{d.title}</span>
|
||
:
|
||
<span className="value">
|
||
{this.sliceA(d.value)}
|
||
</span>
|
||
</div>
|
||
);
|
||
})}
|
||
</Timeline.Item>
|
||
);
|
||
})}
|
||
</Timeline>
|
||
)}
|
||
</div>
|
||
</WeaNewScroll>
|
||
);
|
||
}
|
||
return (
|
||
<div className="detail-wrapper align-center bt">
|
||
<span>{getLabel("386473", "点击日历查看每天考勤情况")}</span>
|
||
</div>
|
||
);
|
||
}
|
||
|
||
getLocale() {
|
||
return {
|
||
firstDayOfWeek: 0,
|
||
lang: {
|
||
format: {
|
||
eras: [getLabel(383357, "公元前"), getLabel(383358, "公元")],
|
||
months: [
|
||
getLabel(1492, "一月"),
|
||
getLabel(1493, "二月"),
|
||
getLabel(383385, "三月"),
|
||
getLabel(383387, "四月"),
|
||
getLabel(1496, "五月"),
|
||
getLabel(383392, "六月"),
|
||
getLabel(383393, "七月"),
|
||
getLabel(383394, "八月"),
|
||
getLabel(383395, "九月"),
|
||
getLabel(383396, "十月"),
|
||
getLabel(383397, "十一月"),
|
||
getLabel(383398, "十二月"),
|
||
],
|
||
shortMonths: [
|
||
getLabel(1492, "一月"),
|
||
getLabel(1493, "二月"),
|
||
getLabel(383385, "三月"),
|
||
getLabel(383387, "四月"),
|
||
getLabel(1496, "五月"),
|
||
getLabel(383392, "六月"),
|
||
getLabel(383393, "七月"),
|
||
getLabel(383394, "八月"),
|
||
getLabel(383395, "九月"),
|
||
getLabel(383396, "十月"),
|
||
getLabel(383397, "十一月"),
|
||
getLabel(383398, "十二月"),
|
||
],
|
||
weekdays: [
|
||
getLabel(24626, "星期天"),
|
||
getLabel(383399, "星期一"),
|
||
getLabel(383400, "星期二"),
|
||
getLabel(383402, "星期三"),
|
||
getLabel(383403, "星期四"),
|
||
getLabel(383404, "星期五"),
|
||
getLabel(383405, "星期六"),
|
||
],
|
||
shortWeekdays: [
|
||
getLabel(16106, "周日"),
|
||
getLabel(16100, "周一"),
|
||
getLabel(16101, "周二"),
|
||
getLabel(16102, "周三"),
|
||
getLabel(16103, "周四"),
|
||
getLabel(16104, "周五"),
|
||
getLabel(16105, "周六"),
|
||
],
|
||
veryShortWeekdays: [
|
||
getLabel(16106, "周日"),
|
||
getLabel(16100, "周一"),
|
||
getLabel(16101, "周二"),
|
||
getLabel(16102, "周三"),
|
||
getLabel(16103, "周四"),
|
||
getLabel(16104, "周五"),
|
||
getLabel(16105, "周六"),
|
||
],
|
||
ampms: [getLabel(383408, "上午"), getLabel(383409, "下午")],
|
||
datePatterns: [
|
||
`yyyy'${getLabel(383372, "年")}'M'${getLabel(
|
||
383373,
|
||
"月"
|
||
)}'d'${getLabel(383374, "日")}' EEEE`,
|
||
`yyyy'${getLabel(383372, "年")}'M'${getLabel(
|
||
383373,
|
||
"月"
|
||
)}'d'${getLabel(383374, "日")}'`,
|
||
"yyyy-M-d",
|
||
"yy-M-d",
|
||
],
|
||
timePatterns: [
|
||
`ahh'${getLabel(383411, "时")}'mm'${getLabel(
|
||
383412,
|
||
"分"
|
||
)}'ss'${getLabel(383414, "秒")}' 'GMT'Z`,
|
||
`ahh'${getLabel(383411, "时")}'mm'${getLabel(
|
||
383412,
|
||
"分"
|
||
)}'ss'${getLabel(383414, "秒")}'`,
|
||
"H:mm:ss",
|
||
"ah:mm",
|
||
],
|
||
dateTimePattern: "{date} {time}",
|
||
},
|
||
},
|
||
};
|
||
}
|
||
|
||
getTipText(data) {
|
||
return (
|
||
<div>
|
||
<div dangerouslySetInnerHTML={{ __html: data.title }}></div>
|
||
<div>
|
||
{getLabel("24979", "开始时间")}: {data.start}
|
||
</div>
|
||
<div>
|
||
{getLabel("743", "结束时间")}: {data.end}
|
||
</div>
|
||
{data.type && (
|
||
<div>
|
||
{getLabel("500401", "类型")}: {data.type}
|
||
</div>
|
||
)}
|
||
{/*<div>{data.workflowtype=='OVERTIME'?getLabel('132055',"时长(小时)"):getLabel('132014',"时长(天)")}: {data.count}</div>*/}
|
||
<div>
|
||
{getLabel("506048", "时长")}: {data.count}
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|
||
onMonthSelect(date) {
|
||
const { hrmChecking } = this.props;
|
||
let { dateTabkey, pDate } = hrmChecking;
|
||
let select = new moment(date.time).format("YYYY-MM");
|
||
if (pDate.slice(0, 7) == select) {
|
||
hrmChecking.updateCalendarCheckedDay(date.getDayOfMonth());
|
||
}
|
||
}
|
||
onyearMonthSelect(date) {
|
||
const { hrmChecking } = this.props;
|
||
let select = new moment(date.time).format("YYYY-MM");
|
||
hrmChecking.changeDateHandler(select);
|
||
hrmChecking.updateDateTabkey("2");
|
||
this.getData();
|
||
}
|
||
monthDateCellRender(date) {
|
||
const { hrmChecking } = this.props;
|
||
let { dateTabkey, pDate, calendarData, statusActiveType } = hrmChecking;
|
||
calendarData = toJS(calendarData);
|
||
let select = new moment(date.time).format("YYYY-MM");
|
||
if (pDate.slice(0, 7) == select) {
|
||
let day = date.getDayOfMonth();
|
||
const data = calendarData[day];
|
||
const components = [];
|
||
if (
|
||
data &&
|
||
(data.types.indexOf(statusActiveType) > -1 ||
|
||
statusActiveType == "ALL" ||
|
||
data.types.indexOf("NORMAL") > -1)
|
||
) {
|
||
components.push(
|
||
<div className="calendar-item">
|
||
<span className="icon-wrapper">
|
||
{data.types &&
|
||
data.types.map((type, idx) => {
|
||
if (idx > 4) return;
|
||
const ic = Util.getIconColor(type);
|
||
if (type == statusActiveType || statusActiveType == "ALL") {
|
||
return (
|
||
<i
|
||
className={`${ic.icon}`}
|
||
style={{ color: ic.color, marginRight: 2 }}
|
||
title={ic.name}
|
||
>
|
||
<span className="path1"></span>
|
||
<span className="path2"></span>
|
||
<span className="path3"></span>
|
||
<span className="path4"></span>
|
||
</i>
|
||
);
|
||
}
|
||
})}
|
||
</span>
|
||
<span
|
||
className="tip"
|
||
style={{ color: data.isWorkDay ? "#FF1B10" : "#1B9B12" }}
|
||
>
|
||
{data.tip}
|
||
</span>
|
||
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@eothkc`}
|
||
height={data.workflow && data.workflow.length > 0 ? 45 : 15}
|
||
>
|
||
{data.workflow &&
|
||
data.workflow.map((item, i) => {
|
||
if (
|
||
item.workflowtype == statusActiveType ||
|
||
statusActiveType == "ALL"
|
||
) {
|
||
const ic = Util.getIconColor(item.workflowtype);
|
||
return (
|
||
<Tooltip ecId={`${this && this.props && this.props.ecId || ''}_Tooltip@8kx8c0@${i}`} placement="right" title={this.getTipText(item)}>
|
||
<div
|
||
className="workflow-item"
|
||
style={{ backgroundColor: ic.bcolor }}
|
||
>
|
||
<div
|
||
className="text-overflow"
|
||
dangerouslySetInnerHTML={{ __html: item.title }}
|
||
style={{ color: ic.color }}
|
||
></div>
|
||
</div>
|
||
</Tooltip>
|
||
);
|
||
}
|
||
})}
|
||
</WeaNewScroll>
|
||
</div>
|
||
);
|
||
}
|
||
if (data && data.signInfo) {
|
||
components.push(
|
||
data.signInfo.map((info, i) => {
|
||
const { title, signTime } = info;
|
||
|
||
return (
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@wd0lvm@${i}`} className="calendar-sign-info">
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@6t3eg1@${i}`}
|
||
span={24}
|
||
className="text-overflow"
|
||
title={`${title}: ${signTime}`}
|
||
>{`${title}: ${signTime}`}</Col>
|
||
</Row>
|
||
);
|
||
})
|
||
);
|
||
}
|
||
return components;
|
||
}
|
||
}
|
||
yearDateCellRender(date) {
|
||
const { hrmChecking } = this.props;
|
||
let { dateTabkey, pDate, yearData, statusActiveType } = hrmChecking;
|
||
yearData = toJS(yearData);
|
||
const d = date.getDayOfMonth();
|
||
const m = date.getMonth() + 1;
|
||
let data = {},
|
||
ic = undefined;
|
||
if (yearData !== undefined && !isEmpty(yearData)) {
|
||
data = yearData[m][d];
|
||
try {
|
||
if (data.type !== "NORMAL") ic = Util.getIconColor(data.type);
|
||
} catch (e) {
|
||
return <div className="date-item">{d}</div>;
|
||
}
|
||
}
|
||
let content;
|
||
if (ic && (statusActiveType == data.type || statusActiveType == "ALL")) {
|
||
content = (
|
||
<span>
|
||
<i className={`${ic.icon}`} style={{ color: ic.color }}>
|
||
<span className="path1"></span>
|
||
<span className="path2"></span>
|
||
<span className="path3"></span>
|
||
<span className="path4"></span>
|
||
</i>
|
||
{data.tip && (
|
||
<span
|
||
className="tip"
|
||
style={{ color: data.isWorkDay ? "#FF1B10" : "#1B9B12" }}
|
||
>
|
||
{data.tip}
|
||
</span>
|
||
)}
|
||
</span>
|
||
);
|
||
} else {
|
||
content = (
|
||
<span>
|
||
{data.tip && (
|
||
<span
|
||
className="tip"
|
||
style={{ color: data.isWorkDay ? "#FF1B10" : "#1B9B12" }}
|
||
>
|
||
{data.tip}
|
||
</span>
|
||
)}
|
||
{d}
|
||
</span>
|
||
);
|
||
}
|
||
return <div className="date-item">{content}</div>;
|
||
}
|
||
renderCalendar() {
|
||
const { hrmChecking } = this.props;
|
||
let { dateTabkey, pDate, pDate1 } = hrmChecking;
|
||
return (
|
||
<div className="calendar-wrapper">
|
||
{dateTabkey == "2" && (
|
||
<Calendar ecId={`${this && this.props && this.props.ecId || ''}_Calendar@3ikg64`}
|
||
mode="month"
|
||
dateCellRender={this.monthDateCellRender.bind(this)}
|
||
// startOfMonth={26}
|
||
locale={this.getLocale()}
|
||
onSelect={this.onMonthSelect.bind(this)}
|
||
value={new Date(pDate)}
|
||
/>
|
||
)}
|
||
{dateTabkey == "1" && (
|
||
<WeaYear ecId={`${this && this.props && this.props.ecId || ''}_WeaYear@6cz5ay`}
|
||
value={pDate1}
|
||
dateCellRender={this.yearDateCellRender.bind(this)}
|
||
onMonthSelect={this.onyearMonthSelect.bind(this)}
|
||
/>
|
||
)}
|
||
</div>
|
||
);
|
||
}
|
||
|
||
onStsClick(item) {
|
||
const { hrmChecking } = this.props;
|
||
const { id } = item;
|
||
|
||
if (parseFloat(item.value) > 0) {
|
||
hrmChecking.updateStsType(item.type);
|
||
if (id === "leaveDays") {
|
||
hrmChecking.openAbsenceDialog();
|
||
} else {
|
||
const { type } = item;
|
||
if (type === "OVERTIME") {
|
||
hrmChecking.getOverTimeTabDatas().then(() => {
|
||
hrmChecking.getTableData();
|
||
});
|
||
} else {
|
||
hrmChecking.getTableData();
|
||
}
|
||
hrmChecking.updateVisible(true);
|
||
}
|
||
} else {
|
||
const content = getLabel("386474", "本月没有{params}数据!").replace(
|
||
"{params}",
|
||
item.title
|
||
);
|
||
Modal.warning({
|
||
title: i18n.confirm.defaultTitle(),
|
||
content,
|
||
});
|
||
}
|
||
}
|
||
renderStatistics() {
|
||
const { hrmChecking } = this.props;
|
||
const { iWidth } = this.state;
|
||
let {
|
||
chartOptions,
|
||
groupitem2,
|
||
groupitem3,
|
||
groupitem4,
|
||
groupitem5,
|
||
count,
|
||
} = hrmChecking;
|
||
chartOptions = toJS(chartOptions);
|
||
groupitem4 = toJS(groupitem4);
|
||
groupitem3 = toJS(groupitem3);
|
||
groupitem2 = toJS(groupitem2);
|
||
groupitem5 = toJS(groupitem5);
|
||
|
||
const { hasLeaveInfo, loading } = hrmChecking;
|
||
|
||
return (
|
||
<div>
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@5ubv2f`} className="statistics-wrapper" style={{ display: "block" }}>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@gevw02`} span={8} className="chart-wrapper">
|
||
<div className="chart-content">
|
||
<div className="statistics-title bb">
|
||
{getLabel("16732", "出勤统计")}
|
||
</div>
|
||
<div className="echart-item">
|
||
<WeaEchart ecId={`${this && this.props && this.props.ecId || ''}_WeaEchart@aoil9y`}
|
||
style={{ height: 160, width: 160, display: "inline-block" }}
|
||
ref="chart"
|
||
option={chartOptions}
|
||
useDefault={false}
|
||
/>
|
||
</div>
|
||
<div className="echart-count">
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@669upx`}>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@o1k7rv`}
|
||
span={12}
|
||
className="number align-center cursor-pointer"
|
||
style={{ color: chartOptions.series[0].color[1] }}
|
||
onClick={() =>
|
||
this.onStsClick(chartOptions.series[0].data[1])
|
||
}
|
||
>
|
||
{!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[1].value}{" "}
|
||
</Col>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@bn8vsg`}
|
||
span={12}
|
||
className="number align-center cursor-pointer"
|
||
style={{ color: chartOptions.series[0].color[0] }}
|
||
onClick={() => {
|
||
this.onStsClick(chartOptions.series[0].data[0]);
|
||
}}
|
||
>
|
||
{!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[0].value}{" "}
|
||
</Col>
|
||
</Row>
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@wui1pj`}>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@q7ghoh`} span={12} className="align-center hrm-over-flow">
|
||
<span
|
||
className="dot mr15"
|
||
style={{
|
||
backgroundColor: chartOptions.series[0].color[1],
|
||
}}
|
||
></span>
|
||
<span
|
||
className=""
|
||
title={`${
|
||
!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[1].name
|
||
}`}
|
||
>
|
||
{!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[1].name}
|
||
({i18n.label.day()})
|
||
</span>
|
||
</Col>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@z5wjc8`} span={12} className="align-center hrm-over-flow">
|
||
<span
|
||
className="dot mr15"
|
||
style={{
|
||
backgroundColor: chartOptions.series[0].color[0],
|
||
}}
|
||
></span>
|
||
<span
|
||
className=""
|
||
title={`${
|
||
!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[0].name
|
||
}`}
|
||
>
|
||
{!isEmpty(chartOptions.series[0].data) &&
|
||
chartOptions.series[0].data[0].name}
|
||
({i18n.label.day()})
|
||
</span>
|
||
</Col>
|
||
</Row>
|
||
</div>
|
||
</div>
|
||
</Col>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@wy2082`} span={16} className="abnormal-wrapper">
|
||
<div className="statistics-title bb">
|
||
{getLabel("132057", "异常考勤汇总")}
|
||
</div>
|
||
<div
|
||
className="abnormal-wrapper-left"
|
||
style={{
|
||
width:
|
||
jQuery(".attendence-checking").innerWidth() < 1300 && "74%",
|
||
}}
|
||
>
|
||
<WorkInfo ecId={`${this && this.props && this.props.ecId || ''}_WorkInfo@4cv3pc`}
|
||
groupitem={groupitem2}
|
||
onStsClick={(d) => this.onStsClick(d)}
|
||
/>
|
||
<div style={{ height: "50%" }}>
|
||
<div className="leave-info-header">
|
||
<span className="icon">
|
||
<i className="icon-coms-content-o" />
|
||
</span>
|
||
<span className="title">
|
||
{getLabel("503887", "请假信息")}
|
||
</span>
|
||
</div>
|
||
{hasLeaveInfo ? (
|
||
<LeaveInfo ecId={`${this && this.props && this.props.ecId || ''}_LeaveInfo@fluc6j`}
|
||
groupitem={groupitem5}
|
||
onStsClick={(d) => this.onStsClick(d)}
|
||
/>
|
||
) : (
|
||
<NoData ecId={`${this && this.props && this.props.ecId || ''}_NoData@kyb7ks`}
|
||
tip={getLabel("503888", "暂无请假信息")}
|
||
loading={loading}
|
||
/>
|
||
)}
|
||
</div>
|
||
</div>
|
||
<div
|
||
className="abnormal-wrapper-right"
|
||
style={{
|
||
width:
|
||
jQuery(".attendence-checking").innerWidth() < 1300 && "26%",
|
||
}}
|
||
>
|
||
<SignInfo ecId={`${this && this.props && this.props.ecId || ''}_SignInfo@5d92ur`}
|
||
groupitem={groupitem3}
|
||
onStsClick={(d) => this.onStsClick(d)}
|
||
hasBorder
|
||
/>
|
||
</div>
|
||
</Col>
|
||
</Row>
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@ypl2t2`} gutter={36} className="detail">
|
||
{groupitem4 &&
|
||
groupitem4.map((d, i) => {
|
||
return (
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@1xe7eq@${i}`} span={8} style={{ marginBottom: 20 }}>
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@1vptry@${i}`} className="detail-title" title={d.title}>
|
||
{d.title}
|
||
</Row>
|
||
<div className="detail-body">
|
||
{d.item.map((i, index) => {
|
||
return (
|
||
<Row ecId={`${this && this.props && this.props.ecId || ''}_Row@46bdcd@${index}`}>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@ufjixx@${index}`}
|
||
span={20}
|
||
className="hrm-over-flow"
|
||
title={i.title}
|
||
>
|
||
{i.title}
|
||
</Col>
|
||
<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@rukup9@${index}`} span={4} title={i.value}>
|
||
{i.value}
|
||
</Col>
|
||
</Row>
|
||
);
|
||
})}
|
||
</div>
|
||
</Col>
|
||
);
|
||
})}
|
||
</Row>
|
||
</div>
|
||
);
|
||
}
|
||
onOperatesClick = (record, index, operate, flag, argumentString) => {
|
||
if (toJS(operate) && toJS(operate).href.indexOf("addChecking") > -1) {
|
||
__this.addChecking();
|
||
}
|
||
};
|
||
|
||
getBtns() {
|
||
let btns = [
|
||
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@i6dog7`} onClick={() => console.log("more")}>{i18n.button.more()}</Button>,
|
||
];
|
||
return btns;
|
||
}
|
||
|
||
handleInputChange = (value) => {
|
||
this.props.hrmChecking.setInputValue(value);
|
||
};
|
||
|
||
handleButtonGroupClick = (bool) => {
|
||
this.props.hrmChecking.setIsDay(bool);
|
||
};
|
||
|
||
render() {
|
||
const { hrmChecking } = this.props;
|
||
const {
|
||
getStatusList,
|
||
statusActiveType,
|
||
tabDatas,
|
||
tabkey,
|
||
dateTabDatas,
|
||
dateTabkey,
|
||
pDate,
|
||
hasRight,
|
||
leftTitle,
|
||
hrmName,
|
||
loading,
|
||
newVisible,
|
||
visible,
|
||
table,
|
||
setDialogHeight,
|
||
kqDetailDialogHeight,
|
||
stsType,
|
||
|
||
overTimeTabDatas,
|
||
overTimeTabkey,
|
||
handleOverTimeTabClick,
|
||
tofirstUpperCase,
|
||
groupwfinfo
|
||
} = hrmChecking;
|
||
let { newWorklist } = hrmChecking;
|
||
newWorklist = toJS(newWorklist);
|
||
const statusList = getStatusList();
|
||
const { query } = this.props.location;
|
||
|
||
const getMsg = (name) => {
|
||
const content = getLabel(
|
||
"386475",
|
||
"您无权查看 {params} 的考勤数据!"
|
||
).replace("{params}", name);
|
||
return content;
|
||
};
|
||
|
||
let e9headerHeight = $(".e9header-right").height() || 80;
|
||
|
||
let coms = [
|
||
<div style={query.fromcard ? { display: "none" } : { display: "" }}>
|
||
<WeaTop ecId={`${this && this.props && this.props.ecId || ''}_WeaTop@8mum9v@1`}
|
||
title={`${hrmName || `'${getLabel("130758", "我")}'`}${getLabel(
|
||
"125404",
|
||
"的考勤"
|
||
)}`}
|
||
icon={<i className="icon-coms-hrm" />}
|
||
iconBgcolor="#217346"
|
||
buttons={this.getTopButtons()}
|
||
buttonSpace={10}
|
||
showDropIcon={true}
|
||
dropMenuDatas={this.getRightMenu()}
|
||
/>
|
||
</div>,
|
||
this.renderLeft(),
|
||
<div style={{ width: "100%", paddingLeft: 221 }}>
|
||
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@qhy0lw@1`}
|
||
selectedKey={tabkey}
|
||
keyParam="key"
|
||
datas={[
|
||
{
|
||
title:
|
||
window.e9_locale.userLanguage == "8"
|
||
? "Attendence Report"
|
||
: getLabel("16558", "考勤统计"),
|
||
key: "1",
|
||
},
|
||
{ title: getLabel("386476", "考勤日历"), key: "2" },
|
||
]}
|
||
onChange={this.changeTab.bind(this)}
|
||
/>
|
||
<div className="picker-wrapper checking icon-cls">
|
||
<div
|
||
style={{ width: 140, paddingLeft: 10, display: "none" }}
|
||
className="text-overflow"
|
||
title={hrmName}
|
||
>
|
||
{leftTitle} : {hrmName}
|
||
</div>
|
||
{[
|
||
{
|
||
title:
|
||
window.e9_locale.userLanguage == "8"
|
||
? "Year"
|
||
: i18n.label.year(),
|
||
key: "1",
|
||
},
|
||
{ title: i18n.label.month(), key: "2" },
|
||
].map((item, i) => {
|
||
return (
|
||
<div
|
||
span={1}
|
||
onClick={this.changeDateTab.bind(this, item.key)}
|
||
style={
|
||
i > 0 && window.e9_locale.userLanguage == "8"
|
||
? { margin: "0 10px" }
|
||
: {}
|
||
}
|
||
className={`cursor-pointer date-item ${
|
||
item.key === dateTabkey ? "active" : ""
|
||
}`}
|
||
>
|
||
{item.title}
|
||
</div>
|
||
);
|
||
})}
|
||
<div
|
||
style={{
|
||
marginLeft: window.e9_locale.userLanguage == "8" && 10,
|
||
}}
|
||
>
|
||
<WeaDatePicker ecId={`${this && this.props && this.props.ecId || ''}_WeaDatePicker@dl0cdi@datepicker`}
|
||
arrow
|
||
type={dateTabkey == "1" ? "year" : "month"}
|
||
date={pDate}
|
||
onChange={this.changeDate.bind(this)}
|
||
/>
|
||
</div>
|
||
<span
|
||
className="icon-coms-Refresh cursor-pointer"
|
||
style={{ marginLeft: 5 }}
|
||
onClick={this.reFresh.bind(this)}
|
||
/>
|
||
{tabkey == "2" && (
|
||
<div
|
||
className="status-info clearfix"
|
||
style={{
|
||
maxWidth:
|
||
tabkey == 2
|
||
? window.innerWidth - 700
|
||
: window.innerWidth - 900,
|
||
float: "right",
|
||
}}
|
||
>
|
||
{window.e9_locale.userLanguage != "8"
|
||
? statusList &&
|
||
statusList.map((item) => {
|
||
return (
|
||
<span
|
||
className={`item cursor-pointer ${
|
||
item.type == statusActiveType ? "active" : ""
|
||
}`}
|
||
onClick={() => this.handlerStatusClick(item)}
|
||
title={item.title}
|
||
>
|
||
<i
|
||
className={`${item.icon}`}
|
||
style={{ color: item.color }}
|
||
>
|
||
<span className="path1"></span>
|
||
<span className="path2"></span>
|
||
<span className="path3"></span>
|
||
<span className="path4"></span>
|
||
</i>
|
||
<span className="name" title={item.name}>
|
||
{item.name}
|
||
</span>
|
||
</span>
|
||
);
|
||
})
|
||
: statusList && (
|
||
<ButtonSelect ecId={`${this && this.props && this.props.ecId || ''}_ButtonSelect@ssaf6p`}
|
||
type="small"
|
||
btnProps={{
|
||
style: {
|
||
padding: 0,
|
||
background: "transparent",
|
||
border: "none",
|
||
color: "#000",
|
||
fontSize: 14,
|
||
},
|
||
}}
|
||
datas={statusList.reverse().map((item) => {
|
||
return {
|
||
key: item.type,
|
||
text: (
|
||
<span>
|
||
<i
|
||
className={`${item.icon}`}
|
||
style={{ color: item.color }}
|
||
>
|
||
<span className="path1"></span>
|
||
<span className="path2"></span>
|
||
<span className="path3"></span>
|
||
<span className="path4"></span>
|
||
</i>
|
||
<span
|
||
style={{ marginLeft: 10 }}
|
||
title={item.name}
|
||
>
|
||
{item.name}
|
||
</span>
|
||
</span>
|
||
),
|
||
show: (
|
||
<span>
|
||
<i
|
||
className={`${item.icon}`}
|
||
style={{ color: item.color }}
|
||
>
|
||
<span className="path1"></span>
|
||
<span className="path2"></span>
|
||
<span className="path3"></span>
|
||
<span className="path4"></span>
|
||
</i>
|
||
<span
|
||
style={{ marginLeft: 10 }}
|
||
title={item.name}
|
||
>
|
||
{item.name}
|
||
</span>
|
||
</span>
|
||
),
|
||
};
|
||
})}
|
||
menuOnClick={(key, e) =>
|
||
this.handlerStatusClick({ type: key })
|
||
}
|
||
/>
|
||
)}
|
||
</div>
|
||
)}
|
||
</div>
|
||
<WeaNewScroll ecId={`${this && this.props && this.props.ecId || ''}_WeaNewScroll@873va8@scroll`}
|
||
height={window.innerHeight - e9headerHeight - 10 - $(".wea-new-top-wapper").height() - $(".wea-tab").height() - $(".picker-wrapper").height() - 10 - $(".pt-menu-horizontal").height()}
|
||
className="bt"
|
||
>
|
||
{!hasRight && (
|
||
<WeaAlertPage ecId={`${this && this.props && this.props.ecId || ''}_WeaAlertPage@trut6v`}>
|
||
<div>{getMsg(hrmName)}</div>
|
||
</WeaAlertPage>
|
||
)}
|
||
{hasRight && (
|
||
<div className="hrm-checking-content icon-cls">
|
||
{tabkey == "1" && this.renderStatistics()}
|
||
{tabkey == "2" && this.renderCalendar()}
|
||
</div>
|
||
)}
|
||
</WeaNewScroll>
|
||
</div>
|
||
];
|
||
|
||
if(!query.fromcard){
|
||
coms = (
|
||
<WeaRightMenu ecId={`${this && this.props && this.props.ecId || ''}_WeaRightMenu@7asvpr`} datas={this.getRightMenu()}>
|
||
{coms}
|
||
</WeaRightMenu>
|
||
)
|
||
}
|
||
|
||
return (
|
||
<div className="attendence-checking">
|
||
<WeaPopoverHrm ecId={`${this && this.props && this.props.ecId || ''}_WeaPopoverHrm@vlriwi`} />
|
||
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@1owcla`}
|
||
visible={visible}
|
||
onCancel={() => hrmChecking.updateVisible(false)}
|
||
closable
|
||
style={{ width: 900, height: 500 }}
|
||
title={getLabel("386477", "考勤明细")}
|
||
icon="icon-coms-hrm"
|
||
iconBgcolor="#217346"
|
||
moreBtn={{ datas: [] }}
|
||
onChangeHeight={(h) => setDialogHeight(h)}
|
||
>
|
||
{stsType === "OVERTIME" && (
|
||
<WeaTab ecId={`${this && this.props && this.props.ecId || ''}_WeaTab@2qwfys`}
|
||
datas={overTimeTabDatas}
|
||
selectedKey={overTimeTabkey}
|
||
keyParam="key"
|
||
onChange={handleOverTimeTabClick}
|
||
/>
|
||
)}
|
||
<WeaTable ecId={`${this && this.props && this.props.ecId || ''}_WeaTable@xg1n6d`}
|
||
comsWeaTableStore={table}
|
||
hasOrder={true}
|
||
needScroll={true}
|
||
scroll={{ y: kqDetailDialogHeight - 80 }}
|
||
onOperatesClick={this.onOperatesClick.bind(this)}
|
||
/>
|
||
</WeaDialog>
|
||
<WeaDialog ecId={`${this && this.props && this.props.ecId || ''}_WeaDialog@hegaeo`}
|
||
visible={newVisible}
|
||
className="new-hrm-workflow"
|
||
onCancel={() => hrmChecking.updateNewVisible(false)}
|
||
closable
|
||
style={{ width: 600, height: 400 }}
|
||
title={getLabel("385037", "新建考勤流程")}
|
||
icon="icon-portal-workflow"
|
||
iconBgcolor="#0079de"
|
||
hasScroll
|
||
>
|
||
<div className="new-hrm-workflow-body">
|
||
{
|
||
groupwfinfo && groupwfinfo.map(info => {
|
||
const { img, color, typeName, wfs } = info;
|
||
return (
|
||
<div className="new-hrm-workflow-wrapper" style={{borderTop:`3px solid ${color}`}}>
|
||
<div className="hearder">
|
||
<span>
|
||
<i className={img} style={{color}}/>
|
||
</span>
|
||
<span >
|
||
{ `${typeName}(${wfs.length})` }
|
||
</span>
|
||
</div>
|
||
<div>
|
||
{
|
||
wfs.map(item => {
|
||
return <div className="cursor-pointer item" onClick={()=> {hrmChecking.handlerNewWorkflow(item)}}>{item.title}</div>
|
||
})
|
||
}
|
||
</div>
|
||
</div>
|
||
)
|
||
})
|
||
}
|
||
</div>
|
||
</WeaDialog>
|
||
<Spin ecId={`${this && this.props && this.props.ecId || ''}_Spin@rp9oef`} spining={loading}>
|
||
{coms}
|
||
</Spin>
|
||
<AbsenceDialog ecId={`${this && this.props && this.props.ecId || ''}_AbsenceDialog@hkyys7`} store={hrmChecking} />
|
||
</div>
|
||
);
|
||
}
|
||
}
|
||
|
||
//窗口大小变化
|
||
jQuery(window).resize(function () {
|
||
if (__this) {
|
||
__this.setState({
|
||
iWidth: window.innerWidth,
|
||
});
|
||
}
|
||
});
|
||
export default main;
|