import ReactDOM from 'react-dom';
import {
observable,
action,
reaction,
} from "mobx";
import HrmBaseStore from "./baseStore";
import {
message,
Button,
Menu,
Dropdown,
Modal
} from 'antd';
import {
WeaSelect,
WeaBrowser,
WeaLocaleProvider,
WeaTools
} from 'ecCom';
import {
WeaTableNew
} from "comsMobx";
import * as api from "../apis/monthReport";
import find from 'lodash/find';
import findIndex from 'lodash/findIndex';
import filter from 'lodash/filter';
import flattenDeep from 'lodash/flattenDeep';
import remove from 'lodash/remove';
import {
i18n
} from '../public/i18n';
import {IEVersion} from '../util/pure-util';
import {addContentPath} from '../util/index.js'
const {
TableStore
} = WeaTableNew;
const getLabel = WeaLocaleProvider.getLabel;
const shiftBrowserProps = {
browserModalProps: {
closable: true,
},
closable: true,
checkStrictly: true,
completeParams: {},
conditionDataParams: {},
dataParams: {},
destDataParams: {},
expandfirstnode: false,
hasAddBtn: false,
hasAdvanceSerach: true,
hasBorder: false,
hideVirtualOrg: false,
icon: "icon-coms-hrm",
iconBgcolor: "#217346",
idSeparator: ",",
isAutoComplete: 1,
isDetail: 0,
isMultCheckbox: false,
isSingle: false,
linkUrl: "",
pageSize: 10,
quickSearchName: "serial",
showCheckStrictly: true,
title: "班次",
type: "mkqshift",
viewAttr: 2,
customized: true,
memorise: true
}
export class HrmAttendanceMonthReport extends HrmBaseStore {
/********************* unobservable list *********************/
shortWeekdays = this.getLocale().lang.format.veryShortWeekdays;
conditionData;
radioGroupVal = {}
// showColumns = [null, null];
displayColumnsDef = [];
selectedSerial = '';
detailTableInfo;
selectRefs = [];
detailParams = {};
tableRef;
/********************* unobservable list *********************/
/********************* dialog info setting *********************/
/********************* dialog info setting *********************/
/********************* observable list *********************/
@observable rightMenus = [];
@observable showColumns = [null, null];
@observable spinning = false;
@observable spinTip = '';
@observable pageIndex = 1;
@observable pageSize = 10;
@observable total = 0;
@observable radioGroupConfig = [];
@observable table = {
columns: [],
datas: []
}
@observable displayColumns = [];
@observable showHasNotAccount = false;
@observable replaceDatas = [];
@observable holidays = [];
@observable dialogParams = {
moduleName: 'hrm',
visible: false,
style: {
width: 1000,
height: 600
},
onCancel: () => {
this.dialogParams.visible = false;
this.detailParams = {};
}
};
@observable detailTable = new TableStore();
@observable tabConfig = {
tabs: [],
keyParam: "viewCondition",
activeTabKey: "1",
tabChangeHandle: key => this.setActiveTab(key, this.tabConfig.resourceId)
};
/********************* observable list *********************/
/********************* computed list *********************/
/********************* computed list *********************/
/********************* action list *********************/
@action clearData = () => {
this.pageIndex = 1;
this.pageSize = 10;
this.total = 0;
this.radioGroupVal = {};
this.showColumns = [null, null];
this.showHasNotAccount = false;
this.displayColumns = [];
this.replaceDatas.length = 0;
this.clearSerial();
};
@action clearSerial = () => {
this.selectedSerial = '';
}
@action getQueryParams = (pageIndex, pageSize) => {
this.pageIndex = pageIndex || 1;
const params = {
pageIndex: this.pageIndex,
...this.radioGroupVal,
isNoAccount: this.showHasNotAccount ? '1' : '0',
attendanceSerial: this.selectedSerial || ''
}
pageSize && Object.assign(params, {pageSize});
return params;
}
getShowColumns = () => {
return filter(this.toJS(this.showColumns), d => d != null).join(',');
}
@action init = () => {
this.clearData()
this.containerInitFinished.authorized = true;
this.containerInitFinished.init = true;
api.init().then(rs => {
rs.map((data, index) => {
if (data.status === "1" || data.status == null) {
switch (index) {
case 0:
this.conditionData = data;
this.displayColumnsDef = flattenDeep(data.showColumns);
this.generateRadioGroupConfig(data);
break;
case 1:
this.rightMenus = data.btnMenu;
break;
}
}
});
},
error => {})
}
@action replaceDisplayColumnsCondition = () => {
let tmp = this.toJS(this.showColumns);
const obj = {
label: getLabel('390081', '展示列'),
labelcol: 3,
fieldcol: 21,
com: (
{
this.conditionData.showColumns.map((c, i) => {
c.map((op, index) => {
const t = op.showname;
if(op.key === 'attendanceSerial'){
op.showname = (
{t}
this.setBrowser(dom)}
{...shiftBrowserProps}
title={getLabel('24803','班次')}
inputStyle={{ width: 200 }}
onChange={this.onBrowserChange}
>
{getLabel('500494','选择显示班次')}
)
}
});
if(tmp[i] == null){
if(c.length > 1){
tmp[i] = c.reduce((pre, cur) => {
if(Array.isArray(pre)){
cur.selected && pre.push(cur.key);
return pre;
}else{
let arr = [];
pre.selected && arr.push(pre.key);
cur.selected && arr.push(cur.key);
return arr;
}
}).join(',');
}else{
c[0].selected && arr.push(c[0].key);
}
this.showColumns[i] = tmp[i];
}
return (
this.setSelectRef(dom, i)}
options={c}
detailtype='2'
value={this.showColumns[i]}
onChange={(v, showname, key) => this.onSelectChange(v, key[0], i)}
/>
)
})
}
)
}
this.setDisplayColumns();
return obj;
}
@action generateRadioGroupConfig = (data) => {
let config = [];
config.push(this.replaceDisplayColumnsCondition());
config = config.concat(data.conditions);
this.radioGroupConfig = config;
}
@action onSelectChange = (v, key, i) => {
this.showColumns[i] = v;
if (i == 0) {
if (key == 'attendanceSerial') {
if (this.showColumns[i].indexOf('attendanceSerial') < 0) {
this.clearSerial();
this.setDisplayColumns();
} else {
this.browser.openModal();
}
} else {
this.setDisplayColumns();
}
} else {
this.setDisplayColumns();
}
}
@action setDisplayColumns = () => {
let arr = [];
this.toJS(this.showColumns).map(g => arr = arr.concat(g.split(',')));
let displayColumns = [];
this.displayColumnsDef.map(cf => {
const selected = (arr.indexOf(cf.key) > -1);
displayColumns.push({
key: cf.key,
selected
});
cf.cascadekey != null && cf.cascadekey != '' && cf.cascadekey.split(',').map(k => {
displayColumns.push({
key: k,
selected
});
})
})
this.displayColumns = displayColumns;
this.refreshTableColumns();
}
@action setSelectRef = (dom, i) => {
this.selectRefs[i] = dom;
}
@action setBrowser = dom => {
this.browser = dom;
}
@action onBrowserChange = (ids, names, datas) => {
let arr = [];
datas.map(d => arr.push({
id: d.id,
name: d.name
}));
this.replaceDatas = arr;
this.selectedSerial = ids;
let array = this.toJS(this.showColumns[0]).split(','),
value = '';
if (arr.length == 0) {
remove(array, v => v == 'attendanceSerial');
value = array.join(',');
} else {
findIndex(array, 'attendanceSerial') < 0 && array.push('attendanceSerial');
value = array.join(',');
}
this.showColumns[0] = value;
this.setDisplayColumns();
this.selectRefs[0].setState({
value
});
this.getKQReport(this.getQueryParams());
}
@action getDropDownMenu = () => (
)
@action getTopProps = () => {
let buttons = [
,
];
let menus = [];
menus.push({
key: '0',
content: buttons[0].props.title,
icon: ,
onClick: () => this.showAll()
});
this.toJS(this.rightMenus).map((menu, index) => {
index > 0 && menus.push({
key: index.toString(),
content: menu.menuName,
icon: ,
onClick: () => {
switch (menu.type) {
case "BTN_Export_Excel":
this.exportExcel();
break;
case "BTN_KQ_REPORT_FORMAT":
this.formatData(menu.menuName);
break;
}
}
});
});
menus.push({
key: menus.length.toString(),
content: getLabel(354, '刷新'),
icon: ,
onClick: () => this.getKQReport(this.getQueryParams())
});
buttons.push((
));
return {
buttons,
menus: [
...menus,
// ...this.getBasicMenus("HRM_ENGINE_HRM_ANNUAL_MANAGER_SET")
]
};
};
@action checkDisplay = key => {
const v = (find(this.toJS(this.displayColumns), {key}) || {}).selected;
if(v == null)
return true;
return v;
}
@action refreshTableColumns = () => {
//TODO
// const columns = this.toJS(this.table.columns);
// this.table.columns = this.convertColumns(columns);
}
@action renderCol = column => {
column.children && column.children.map(c => {
const {
title,
unit,
dataIndex
} = c;
const date = this.moment(dataIndex, 'YYYY-MM-DD');
if (c.isCalendar == '1') {
const weekDay = date.day();
const holidayInfo = find(this.toJS(this.holidays), {
date: date.format('YYYY-MM-DD')
});
c.title = (
{this.shortWeekdays[weekDay]}
{date.date()}
{
holidayInfo != null &&
)
-1 ? 'rest' : 'work'}.png`)} />
}
);
} else if (unit != null && unit != '') {
c.title = (
)
}
c.render = (text, record, index) => {
let rs = text;
if (typeof(text) == 'object') {
rs = text.text;
}
const {
dataIndex
} = c, {
resourceId
} = record;
if (c.isCalendar == '1')
return this.showSignDetail({resourceId,kqDate:dataIndex})} title={this.removeBrTags(rs)}>{rs}
return c.showDetial == '1' ? this.showDetail(record.resourceId, c.dataIndex, c.type, record[c.dataIndex], c.isCalendar)} title={this.removeBrTags(rs)}>{rs}
: {rs}
;
}
this.renderCol(c);
})
}
removeBrTags = (str) => {
return str.replace(/
/gi, ' ');
}
@action convertColumns = (columns) => {
columns.map((c, i) => {
// if (IEVersion() == -1 && ['lastname', 'subcompany', 'department'].indexOf(c.dataIndex) > -1 && this.checkDisplay(c.dataIndex))
if (['lastname', 'subcompany', 'department'].indexOf(c.dataIndex) > -1 && this.checkDisplay(c.dataIndex))
c.fixed = 'left';
else
c.fixed = null;
const {
title,
unit
} = c;
if (unit != null && unit != '') {
c.title = (
)
}
c.render = (text, record, index) => {
if (c.dataIndex == 'lastname') {
return window.pointerXY(e)} title={text}>{text}
;
} else if (c.dataIndex == 'subcompany') {
return window.open(`/spa/hrm/engine.html#/hrmengine/organization?showTree=false&isView=1&type=subcompany&id=${record.subcompanyId}`)} title={text}>{text}
;
} else if (c.dataIndex == 'department') {
return window.open(`/spa/hrm/engine.html#/hrmengine/organization?showTree=false&isView=1&type=department&id=${record.departmentId}`)} title={text}>{text}
;
} else if (c.dataIndex == 'jobtitle') {
return window.open(`/spa/hrm/engine.html#/hrmengine/posts?id=${record.jobtitleId}`)} title={text}>{text}
;
} else if (c.dataIndex == 'workcode') {
return window.pointerXY(e)} title={text}>{text}
;
} else
return c.showDetial == '1' ? this.showDetail(record.resourceId, c.dataIndex, c.type, record[c.dataIndex])} title={this.removeBrTags(text) }>{text}
: {text}
;
}
this.renderCol(c);
});
return columns;
}
@action getKQReport = params => {
if (this.spinning)
return;
this.spinning = true;
api.getKQReport({
data: JSON.stringify(params)
}).then(data => {
if (data.status === '1' || data.status == null) {
this.holidays = data.holidays;
this.table.columns = this.convertColumns(data.columns);
this.table.datas = [...data.datas];
this.pageIndex = data.pageindex;
this.pageSize = data.pagesize || 10;
this.total = data.count;
this.resetScroll();
} else {
message.error(data.message);
}
this.spinning = false;
}, error => this.spinning = false);
}
@action onRadioGroupChange = params => {
this.radioGroupVal = params;
if (params.typeselect === '6' && (params.fromDate === '' || params.toDate === ''))
return;
switch (params.viewScope) {
case '1':
if (params.subCompanyId == null || params.subCompanyId == '') {
return;
}
break;
case '2':
if (params.departmentId == null || params.departmentId == '') {
return;
}
break;
case '3':
if (params.resourceId == null || params.resourceId == '') {
return;
}
break;
}
this.getKQReport(this.getQueryParams(1));
}
@action showAll = () => {
this.showHasNotAccount = !this.showHasNotAccount;
this.getKQReport(this.getQueryParams());
}
@action exportExcel = () => {
if (this.spinning)
return;
this.spinning = true;
this.spinTip = getLabel('500702', '导出数据中,请稍候');
const params = {
...this.getQueryParams(),
showColumns: this.getShowColumns()
};
api.exportExcel({
data: JSON.stringify(params)
}).then(data => {
this.spinning = false;
this.spinTip = '';
if (data.status === '1' && data.url != null && data.url.trim().length > 0){
WeaTools.downloadFile(addContentPath(data.url), "GET");
Modal.confirm({
title: getLabel(558,'提示') ,
content: getLabel('导出成功'),
});
}else if(data.status === '-1'){
Modal.confirm({
title: getLabel(558,'提示') ,
content: data.message,
});
}
}, error => {
this.spinning = false;
this.spinTip = '';
})
}
@action setActiveTab = (key, resourceId) => {
// const tabIndex = this.getTabIndex(this.toJS(this.tabConfig.tabs), key);
// if (tabIndex < 0) return;
this.tabConfig.activeTabKey = key || this.tabConfig.tabs[0].viewCondition;
this.detailParams.tabKey = this.tabConfig.activeTabKey;
this.callDetail(resourceId);
};
@action showDetail = (resourceId, dataIndex, columnType, source, isCalendar) => {
this.detailTableInfo = {};
let params = {
...this.radioGroupVal,
isNoAccount: this.showHasNotAccount ? '1' : '0',
attendanceSerial: this.selectedSerial || ''
};
if (resourceId != null)
params.resourceId = resourceId;
if (isCalendar) {
params = {
type: source.type,
date: dataIndex
};
} else {
params = { ...params,
type: dataIndex
};
}
this.detailParams = params;
api.getTabs({
type: params.type
}).then(data => {
if (data.status === '1') {
const {
tabs: tabArr
} = data;
let tabs = [],
activeIndex = '1';
if (tabArr != null && tabArr.length > 0) {
tabArr.map((tab, index) => {
let tabInfo = {
color: "#000000",
groupId: `g${index}`,
title: tab.title,
viewCondition: tab.key
};
tabs.push(tabInfo);
if (tab.selected)
activeIndex = tab.key;
});
}
this.tabConfig.tabs = tabs;
this.tabConfig.resourceId = resourceId;
this.setActiveTab(activeIndex, resourceId);
} else {
}
}, error => {})
}
disposer = reaction(() => this.dialogParams.visible, visible => {
if (!visible) this.iskqCalendarDialog = false;
})
@observable iskqCalendarDialog = false;
@observable detail = {
userInfo: {},
signInfo: '',
columns: [],
datas: [],
}
@action showSignDetail = (params) => {
this.iskqCalendarDialog = true;
api.getKQReportSignDetial(params).then(data => {
if (data.status === '1') {
const {
userInfo,
signInfo,
table,
dialogTitle
} = data;
Object.assign(this.detail.userInfo, userInfo);
this.detail.signInfo = signInfo.signInfo;
['columns', 'datas'].map(v => {
this.detail[v] = table[v];
});
this.dialogParams.title = dialogTitle;
this.dialogParams.visible = true;
} else {
message.error(data.message);
}
}, error => {})
}
@action callDetail = (resourceId) => {
let params = { ...this.detailParams
};
if (resourceId != null)
params.resourceId = resourceId;
api.getKQReportDetial(params).then(data => {
if (data.status === '1') {
const {
dialogTitle,
sessionkey
} = data;
this.dialogParams.title = dialogTitle;
this.detailTable = new TableStore();
this.detailTable.getDatas(sessionkey);
this.dialogParams.visible = true;
} else {
message.error(data.message);
}
}, error => {})
}
@action formatData = content => {
if(this.spinning)
return;
this.confirmInfo({
content:getLabel('510381', '重新计算时会以当前用户所在考勤组重新计算考勤情况,如果期间有用户调整过所在考勤组,可能会造成历史数据错误,请谨慎操作!'),
onOk: () => {
this.spinning = true;
api.formatData({
data: JSON.stringify(this.getQueryParams())
}).then(data => {
message.success(i18n.message.opSuccess());
this.getKQReport(this.getQueryParams());
this.spinning = false;
}, error => {this.spinning = false})
}
});
}
/********************* action list *********************/
@observable scrollY = 510;
@action setScrollY = (height) => {
this.dialogParams.style.height = height;
this.scrollY = height - 90;
}
@action resetScroll = () => {
let dom, d;
if(this.tableRef){
dom = ReactDOM.findDOMNode(this.tableRef);
if(dom){
try{
d = $(dom).find('.ant-table-scroll').find('.ant-table-body');
d.scrollTop(0) && d.scrollLeft(0);
}catch(e){
}
}
}
}
}
export const hrmAttendanceMonthReport = new HrmAttendanceMonthReport();