498 lines
15 KiB
JavaScript
498 lines
15 KiB
JavaScript
|
|
import {
|
||
|
|
observable,
|
||
|
|
action
|
||
|
|
} from "mobx";
|
||
|
|
import HrmBaseStore from "./baseStore";
|
||
|
|
import {
|
||
|
|
message,
|
||
|
|
Button
|
||
|
|
} from 'antd';
|
||
|
|
import {
|
||
|
|
WeaSelect,
|
||
|
|
WeaLocaleProvider,
|
||
|
|
WeaTools
|
||
|
|
} from 'ecCom';
|
||
|
|
import {
|
||
|
|
WeaTableNew
|
||
|
|
} from "comsMobx";
|
||
|
|
import * as api from "../apis/dailyReport";
|
||
|
|
import find from 'lodash/find';
|
||
|
|
import filter from 'lodash/filter';
|
||
|
|
import flattenDeep from 'lodash/flattenDeep';
|
||
|
|
import {addContentPath} from '../util/index.js'
|
||
|
|
const {
|
||
|
|
TableStore
|
||
|
|
} = WeaTableNew;
|
||
|
|
const getLabel = WeaLocaleProvider.getLabel;
|
||
|
|
|
||
|
|
export class HrmAttendanceDailyReport extends HrmBaseStore {
|
||
|
|
/********************* unobservable list *********************/
|
||
|
|
weekdays = this.getLocale().lang.format.weekdays;
|
||
|
|
radioGroupVal = {}
|
||
|
|
displayColumnsDef = [];
|
||
|
|
selectedSerial = '';
|
||
|
|
/********************* unobservable list *********************/
|
||
|
|
|
||
|
|
/********************* dialog info setting *********************/
|
||
|
|
|
||
|
|
/********************* dialog info setting *********************/
|
||
|
|
|
||
|
|
/********************* observable list *********************/
|
||
|
|
@observable spinning = false;
|
||
|
|
@observable spinTip = '';
|
||
|
|
@observable pageIndex = 1;
|
||
|
|
@observable pageSize = 10;
|
||
|
|
@observable total = 0;
|
||
|
|
@observable radioGroupConfig = [];
|
||
|
|
@observable table = {
|
||
|
|
columns: [],
|
||
|
|
datas: []
|
||
|
|
}
|
||
|
|
@observable showColumns = [null, null];
|
||
|
|
@observable displayColumns = [];
|
||
|
|
@observable holidays = [];
|
||
|
|
@observable showHasNotAccount = false;
|
||
|
|
@observable detailInfo = {};
|
||
|
|
@observable detailTable = new TableStore();
|
||
|
|
@observable dialogParams = {
|
||
|
|
moduleName: 'hrm',
|
||
|
|
visible: false,
|
||
|
|
style: {
|
||
|
|
width: 700,
|
||
|
|
height: 452
|
||
|
|
},
|
||
|
|
title: '',
|
||
|
|
onCancel: () => this.dialogParams.visible = false
|
||
|
|
};
|
||
|
|
@observable hasOnlyTable = false; //判断是否只包含列表
|
||
|
|
/********************* observable list *********************/
|
||
|
|
|
||
|
|
/********************* computed list *********************/
|
||
|
|
/********************* computed list *********************/
|
||
|
|
|
||
|
|
/********************* action list *********************/
|
||
|
|
clearData = () => {
|
||
|
|
this.pageIndex = 1;
|
||
|
|
this.pageSize = 10;
|
||
|
|
this.total = 0;
|
||
|
|
this.radioGroupVal = {};
|
||
|
|
this.showHasNotAccount = false;
|
||
|
|
this.displayColumns = [];
|
||
|
|
this.showColumns = [null, null];
|
||
|
|
};
|
||
|
|
|
||
|
|
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.getSearchCondition().then(data => {
|
||
|
|
if (data.status === '1') {
|
||
|
|
this.displayColumnsDef = flattenDeep(data.showColumns);
|
||
|
|
this.generateRadioGroupConfig(data);
|
||
|
|
} else {
|
||
|
|
message.error(data.message);
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
@action generateRadioGroupConfig = (data) => {
|
||
|
|
let tmp = this.toJS(this.showColumns);
|
||
|
|
let config = [];
|
||
|
|
data.showColumns && data.showColumns.length > 0 && config.push({
|
||
|
|
label: getLabel('390081', '展示列'),
|
||
|
|
labelcol: 3,
|
||
|
|
fieldcol: 21,
|
||
|
|
com: (
|
||
|
|
<div>
|
||
|
|
{
|
||
|
|
data.showColumns.map((c, i) => {
|
||
|
|
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 (
|
||
|
|
<div>
|
||
|
|
<WeaSelect ecId={`${this && this.props && this.props.ecId || ''}_WeaSelect@ss3hj4@${i}`}
|
||
|
|
options={c}
|
||
|
|
detailtype='2'
|
||
|
|
value={this.showColumns[i]}
|
||
|
|
onChange={v => this.onSelectChange(v, i)}
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
)
|
||
|
|
})
|
||
|
|
}
|
||
|
|
</div>
|
||
|
|
)
|
||
|
|
});
|
||
|
|
this.setDisplayColumns();
|
||
|
|
config = config.concat(data.conditions);
|
||
|
|
this.radioGroupConfig = config;
|
||
|
|
}
|
||
|
|
|
||
|
|
@action onSelectChange = (v, i) => {
|
||
|
|
this.showColumns[i] = v;
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
|
||
|
|
@action getTopProps = () => {
|
||
|
|
let buttons = [
|
||
|
|
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@ik1pqn`} op='setting' size="small" style={{ height: '28px' }} onClick={this.showAll} title={this.showHasNotAccount ? getLabel('31504','显示无账号人员') : getLabel('500013','不显示无账号人员')}>
|
||
|
|
<span>
|
||
|
|
{
|
||
|
|
this.showHasNotAccount ?
|
||
|
|
<i className='icon-coms-ShowNoAccount' style={{ color: '#2DB7F5' }} />
|
||
|
|
:
|
||
|
|
<i className='icon-coms-NoAccountNoDisplay' style={{ color: '#8A8A8A' }} />
|
||
|
|
}
|
||
|
|
</span>
|
||
|
|
</Button>,
|
||
|
|
<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@qgpksl`} type='primary' op='export' onClick={this.exportExcel}>{getLabel(28343, '导出Excel')}</Button>
|
||
|
|
];
|
||
|
|
let menus = [];
|
||
|
|
buttons.map((btn, index) => {
|
||
|
|
const {
|
||
|
|
props
|
||
|
|
} = btn;
|
||
|
|
let content;
|
||
|
|
if (index == 0)
|
||
|
|
content = props.title;
|
||
|
|
menus.push({
|
||
|
|
key: index.toString(),
|
||
|
|
content: content || props.children,
|
||
|
|
icon: <i className={this.menuIconCollection[props.op]}/>,
|
||
|
|
onClick: props.onClick,
|
||
|
|
disabled: props.disabled || false
|
||
|
|
});
|
||
|
|
})
|
||
|
|
return {
|
||
|
|
buttons,
|
||
|
|
menus: [
|
||
|
|
...menus,
|
||
|
|
// ...this.getBasicMenus("HRM_ENGINE_HRM_ANNUAL_MANAGER_SET")
|
||
|
|
]
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
@action renderCol = column => {
|
||
|
|
column.children && column.children.map(c => {
|
||
|
|
const {
|
||
|
|
title,
|
||
|
|
unit,
|
||
|
|
dataIndex,
|
||
|
|
isdaily
|
||
|
|
} = c;
|
||
|
|
if (unit != null && unit != '') {
|
||
|
|
c.title = (
|
||
|
|
<div className='rSpan1' title={`${title}(${unit})`}>
|
||
|
|
<div className='title'>{title}</div>
|
||
|
|
<div className='unit'>({unit})</div>
|
||
|
|
</div>
|
||
|
|
)
|
||
|
|
}
|
||
|
|
c.render = (text, record, index) => {
|
||
|
|
const params = this.getParams(c, record, isdaily);
|
||
|
|
if (['signinstatus', 'signoutstatus'].some(v => dataIndex.indexOf(v) > -1)) {
|
||
|
|
return <a onClick={() => this.showDetail(params,isdaily)} title={text}><div className='text-elli'><div dangerouslySetInnerHTML={{ __html: text }} /></div></a>;
|
||
|
|
}
|
||
|
|
return c.showDetial === '1' ? <a onClick={() => this.showDetail(params,isdaily)} title={text}><div className='text-elli'><div dangerouslySetInnerHTML={{ __html: text }} /></div></a> : <div dangerouslySetInnerHTML={{ __html: text }} />;
|
||
|
|
}
|
||
|
|
this.renderCol(c);
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
@action convertColumns = (columns) => {
|
||
|
|
columns.map((c, i) => {
|
||
|
|
const {
|
||
|
|
title,
|
||
|
|
unit,
|
||
|
|
isdaily
|
||
|
|
} = c;
|
||
|
|
if (unit != null && unit != '') {
|
||
|
|
c.title = (
|
||
|
|
<div className='rSpan2' title={`${title}(${unit})`}>
|
||
|
|
<div className='title'>{title}</div>
|
||
|
|
<div className='unit'>({unit})</div>
|
||
|
|
</div>
|
||
|
|
)
|
||
|
|
}
|
||
|
|
c.render = (text, record, index) => {
|
||
|
|
let rs = text;
|
||
|
|
if (c.dataIndex === 'kqdate') {
|
||
|
|
const date = this.moment(text);
|
||
|
|
if (date.isValid()) {
|
||
|
|
const weekDay = date.day();
|
||
|
|
rs = `${date.format('MM-DD')} ${this.weekdays[weekDay]}`;
|
||
|
|
const holidayInfo = find(this.toJS(this.holidays), {
|
||
|
|
date: date.format('YYYY-MM-DD')
|
||
|
|
});
|
||
|
|
return <div title={date.format('YYYY-MM-DD')} style={{ color: ((weekDay == 6 || weekDay == 0 || holidayInfo) ? "red" : "#000") }} title={rs}><div className='text-elli'>{rs}</div></div>
|
||
|
|
}
|
||
|
|
} else if (c.dataIndex == 'lastname') {
|
||
|
|
return <a href={`javaScript:openhrm(${record.resourceId});`} onClick={e => window.pointerXY(e)} title={text}><div className='text-elli'>{text}</div></a>;
|
||
|
|
} else if (c.dataIndex == 'subcompany') {
|
||
|
|
return <a onClick={() => window.open(`/spa/hrm/engine.html#/hrmengine/organization?showTree=false&isView=1&type=subcompany&id=${record.subcompanyId}`)} title={text}><div className='text-elli'>{text}</div></a>;
|
||
|
|
} else if (c.dataIndex == 'department') {
|
||
|
|
return <a onClick={() => window.open(`/spa/hrm/engine.html#/hrmengine/organization?showTree=false&isView=1&type=department&id=${record.departmentId}`)} title={text}><div className='text-elli'>{text}</div></a>;
|
||
|
|
} else if (c.dataIndex == 'jobtitle') {
|
||
|
|
return <a onClick={() => window.open(`/spa/hrm/engine.html#/hrmengine/posts?id=${record.jobtitleId}`)} title={text}><div className='text-elli'>{text}</div></a>;
|
||
|
|
} else if (c.dataIndex == 'workcode') {
|
||
|
|
return <a href={`javaScript:openhrm(${record.resourceId});`} onClick={e => window.pointerXY(e)} title={text}><div className='text-elli'>{text}</div></a>;
|
||
|
|
} else {
|
||
|
|
const params = this.getParams(c, record, isdaily);
|
||
|
|
return c.showDetial === '1' ? <a onClick={() => this.showDetail(params,isdaily)} title={text}><div className='text-elli'><div dangerouslySetInnerHTML={{ __html: text }} /></div></a> : <div dangerouslySetInnerHTML={{ __html: text }} />;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.renderCol(c);
|
||
|
|
});
|
||
|
|
|
||
|
|
return columns;
|
||
|
|
}
|
||
|
|
|
||
|
|
getParams = (column, record, isdaily) => {
|
||
|
|
const {
|
||
|
|
resourceId,
|
||
|
|
kqdate
|
||
|
|
} = record;
|
||
|
|
|
||
|
|
const {
|
||
|
|
dataIndex
|
||
|
|
} = column;
|
||
|
|
let params;
|
||
|
|
|
||
|
|
if (isdaily === '1') {
|
||
|
|
params = {
|
||
|
|
resourceId,
|
||
|
|
dataIndex: dataIndex,
|
||
|
|
kqDate: kqdate
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
params = {
|
||
|
|
resourceId,
|
||
|
|
typeselect: 6,
|
||
|
|
viewScope: 0,
|
||
|
|
fromDate: kqdate,
|
||
|
|
toDate: kqdate,
|
||
|
|
type: dataIndex,
|
||
|
|
tabKey: 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return params;
|
||
|
|
}
|
||
|
|
|
||
|
|
@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;
|
||
|
|
} 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");
|
||
|
|
}, error => {
|
||
|
|
this.spinning = false;
|
||
|
|
this.spinTip = '';
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
@observable detail = {
|
||
|
|
userInfo: {},
|
||
|
|
signInfo: '',
|
||
|
|
columns: [],
|
||
|
|
datas: [],
|
||
|
|
tableStore: new TableStore,
|
||
|
|
tabDatas:[],
|
||
|
|
selectedKey:'',
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
@action showDetail = (params, isdaily) => {
|
||
|
|
this.hasOnlyTable = (isdaily !== '1') ? true : false;
|
||
|
|
|
||
|
|
if (isdaily === '1') {
|
||
|
|
Object.assign(this.dialogParams.style, {
|
||
|
|
width: 700,
|
||
|
|
height: 452
|
||
|
|
})
|
||
|
|
api.getKQReportDetial(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 => {})
|
||
|
|
} else {
|
||
|
|
Object.assign(this.dialogParams.style, {
|
||
|
|
width: 1000,
|
||
|
|
height: 600
|
||
|
|
})
|
||
|
|
api.getTabs({type:params.type}).then(datas=>{
|
||
|
|
const{tabs}=datas;
|
||
|
|
|
||
|
|
this.detail.tabDatas = tabs;
|
||
|
|
this.detail.selectedKey = (tabs.length>0)&& tabs.find( (tab,index)=>tab.selected || (tab.selected === undefined && index === 0)).key
|
||
|
|
|
||
|
|
this.KQReportDetialProParams = params;
|
||
|
|
this.getKQReportDetialPro();
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
getKQReportDetialPro=()=>{
|
||
|
|
const params = this.KQReportDetialProParams;
|
||
|
|
if (this.detail.selectedKey) {
|
||
|
|
Object.assign(params, {
|
||
|
|
tabKey: this.detail.selectedKey
|
||
|
|
})
|
||
|
|
}
|
||
|
|
api.getKQReportDetialPro(params).then(data => {
|
||
|
|
if (data.status === '1') {
|
||
|
|
const {
|
||
|
|
sessionkey,
|
||
|
|
dialogTitle
|
||
|
|
} = data;
|
||
|
|
|
||
|
|
this.detail.tableStore.getDatas(sessionkey, 1);
|
||
|
|
this.dialogParams.title = dialogTitle;
|
||
|
|
this.dialogParams.visible = true;
|
||
|
|
} else {
|
||
|
|
message.error(data.message);
|
||
|
|
}
|
||
|
|
}, error => {})
|
||
|
|
}
|
||
|
|
|
||
|
|
handleDetailTabChange = (key)=>{
|
||
|
|
this.detail.selectedKey = key;
|
||
|
|
this.getKQReportDetialPro()
|
||
|
|
}
|
||
|
|
/********************* action list *********************/
|
||
|
|
}
|
||
|
|
|
||
|
|
export const hrmAttendanceDailyReport = new HrmAttendanceDailyReport();
|