747 lines
14 KiB
JavaScript
747 lines
14 KiB
JavaScript
import {
|
||
observable,
|
||
action,
|
||
computed,
|
||
reaction,
|
||
} from 'mobx';
|
||
import {
|
||
WeaTableNew,
|
||
} from 'comsMobx';
|
||
import {
|
||
WeaMoreButton,
|
||
WeaPopoverHrm,
|
||
WeaLocaleProvider,
|
||
} from 'ecCom';
|
||
import {
|
||
message,
|
||
} from 'antd';
|
||
import {
|
||
fetch,
|
||
getTopButtons,
|
||
getDropMenuDatas,
|
||
getMenusCreationConfig,
|
||
componentReset,
|
||
exportExcel,
|
||
} from '../util/save-time-util.js';
|
||
import {
|
||
jumpToHrmSubCompany,
|
||
jumpToHrmDept,
|
||
jumpToHrmPost,
|
||
} from '../util/pure-util.js';
|
||
import CheckboxGroup from '../components/vacationBalanceReportCopy/CheckboxGroup';
|
||
import * as asyncFetch from '../apis/vacationBalanceReport';
|
||
import{addContentPath}from '../util/index.js';
|
||
const getLabel = WeaLocaleProvider.getLabel;
|
||
const {
|
||
TableStore
|
||
} = WeaTableNew;
|
||
|
||
class HrmVacationBalanceReportCopy {
|
||
//************权限*************
|
||
@observable pageAccessPermission = {
|
||
hasRight: false,
|
||
loading: true,
|
||
}
|
||
|
||
@action getPermissionInfo = () => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getHasRight',
|
||
logic: (cb) => {
|
||
const {
|
||
hasRight
|
||
} = cb;
|
||
|
||
if (hasRight) {
|
||
this.pageAccessPermission.hasRight = true;
|
||
}
|
||
this.pageAccessPermission.loading = false;
|
||
}
|
||
});
|
||
}
|
||
|
||
//*************头部**************
|
||
topComponentStaticProps = {
|
||
icon: <i className='icon-coms-hrm'/>,
|
||
iconBgcolor: '#217346',
|
||
showDropIcon: true,
|
||
};
|
||
|
||
@observable isNoAccountShow = false;
|
||
|
||
@observable top = {
|
||
btnMenu: [],
|
||
}
|
||
|
||
excel = () => {
|
||
if (this.table.datas.length === 0) {
|
||
message.warning(getLabel('503890', '暂无数据导出'));
|
||
return
|
||
}
|
||
|
||
const downloadUrl = addContentPath('/api/kq/balanceofleaverp/exportExcel');
|
||
|
||
const params = {
|
||
...this.tableAsyncFetchParams,
|
||
displayColumn: this.checkedItems.toString()
|
||
};
|
||
|
||
exportExcel(params, downloadUrl);
|
||
}
|
||
|
||
log = () => {
|
||
window.setLogViewProps({logSmallType:3074});
|
||
}
|
||
|
||
@action clickIcon = (next) => {
|
||
this.isNoAccountShow = !this.isNoAccountShow;
|
||
|
||
next && next();
|
||
}
|
||
|
||
@action getRightMenu = () => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getRightMenu',
|
||
logic: (cb) => {
|
||
const {
|
||
btnMenu,
|
||
} = cb;
|
||
|
||
this.top.btnMenu = btnMenu;
|
||
}
|
||
});
|
||
}
|
||
|
||
@computed get menusCreationConfig() {
|
||
const {
|
||
btnMenu
|
||
} = this.top;
|
||
|
||
return getMenusCreationConfig(btnMenu);
|
||
}
|
||
|
||
get topButtons() {
|
||
const {
|
||
topMenu
|
||
} = this.menusCreationConfig;
|
||
|
||
return getTopButtons.call(this, {
|
||
datas: topMenu,
|
||
disabled: this.getMenusState(),
|
||
})
|
||
}
|
||
|
||
get dropMenuDatas() {
|
||
const {
|
||
rightMenu
|
||
} = this.menusCreationConfig;
|
||
|
||
return getDropMenuDatas.call(this, {
|
||
datas: rightMenu,
|
||
disabled: this.getMenusState(),
|
||
});
|
||
|
||
}
|
||
|
||
getMenusState = () => {
|
||
const {
|
||
loading
|
||
} = this.table;
|
||
|
||
return [loading];
|
||
}
|
||
|
||
//***************单选组合(RadioGroup)*****************
|
||
@observable checkedItems = [];
|
||
@observable checkboxConfig = [];
|
||
|
||
@observable radioGroup = {
|
||
config: [],
|
||
activeParams: '',
|
||
height: 189,
|
||
}
|
||
|
||
@action getRadioGroupConfig = (next) => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getSearchCondition',
|
||
logic: (cb) => {
|
||
const {
|
||
condition,
|
||
value,
|
||
option,
|
||
} = cb;
|
||
|
||
this.checkboxConfig = option;
|
||
|
||
this.checkedItems = value.split(',');
|
||
|
||
if (this.isAllVacationChecked) {
|
||
this.checkedItems.push('all')
|
||
}
|
||
|
||
this.processCondition(condition);
|
||
|
||
this.radioGroup.config = condition[0].items;
|
||
|
||
next && next();
|
||
}
|
||
});
|
||
}
|
||
|
||
processCondition = (condition) => {
|
||
const com = <CheckboxGroup ecId={`${this && this.props && this.props.ecId || ''}_CheckboxGroup@ekimrr`} />;
|
||
|
||
const item = {
|
||
com,
|
||
label: getLabel('390081', "展示列"),
|
||
labelcol: 4,
|
||
fieldcol: 20,
|
||
}
|
||
|
||
condition[0].items.unshift(item);
|
||
}
|
||
|
||
//收集选中假期的key值
|
||
@action collectCheckedItem = (val, key) => {
|
||
const keys = this.checkedItems;
|
||
|
||
const add = (key) => {
|
||
keys.push(key);
|
||
};
|
||
|
||
const del = (key) => {
|
||
const targetIndex = keys.findIndex(_key => _key === key);
|
||
if (targetIndex > -1) keys.splice(targetIndex, 1);
|
||
};
|
||
|
||
(val === '1') ? add(key): del(key);
|
||
|
||
this.checkedItems = keys;
|
||
|
||
this.handleCkClick(val, key);
|
||
}
|
||
|
||
//checkbox框的回调函数
|
||
handleCkClick = (val, key) => {
|
||
if (key === 'all') {
|
||
if (val === '1') {
|
||
this.allVacationKeys.map(key => {
|
||
if (!this.checkedItems.includes(key)) this.checkedItems.push(key);
|
||
});
|
||
} else {
|
||
this.allVacationKeys.map(key => {
|
||
const targetIndex = this.checkedItems.findIndex(item => item === key);
|
||
if (targetIndex > -1) this.checkedItems.splice(targetIndex, 1);
|
||
});
|
||
}
|
||
}
|
||
|
||
if (key !== 'all' && !['subcom', 'dept', 'jobtitle','workcode'].includes(key)) {
|
||
if (val === '0') {
|
||
const targetIndex = this.checkedItems.findIndex(item => item === 'all');
|
||
if (targetIndex > -1) this.checkedItems.splice(targetIndex, 1);
|
||
} else {
|
||
if (this.isAllVacationChecked) this.checkedItems.push('all');
|
||
}
|
||
}
|
||
}
|
||
|
||
//判断所有的假期是否都选中
|
||
@computed get isAllVacationChecked() {
|
||
for (let i = 0; i < this.allVacationKeys.length; i++) {
|
||
const key = this.allVacationKeys[i];
|
||
|
||
if (!this.checkedItems.includes(key)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//收集所有假期的key值
|
||
@computed get allVacationKeys() {
|
||
const items = this.checkboxConfig.length > 0 ? this.checkboxConfig[1] : this.checkboxConfig;
|
||
|
||
const collector = [];
|
||
|
||
items.map(item => {
|
||
const key = item.key;
|
||
if (key === 'all') return
|
||
collector.push(key);
|
||
});
|
||
|
||
return collector;
|
||
}
|
||
|
||
setRef = (ref, type) => {
|
||
this[type] = ref;
|
||
}
|
||
|
||
@action exportActiveParams = (params) => {
|
||
this.radioGroup.activeParams = params;
|
||
|
||
this.chainCall();
|
||
}
|
||
|
||
@computed get isEmpty() {
|
||
const {
|
||
activeParams
|
||
} = this.radioGroup, {
|
||
dateScope,
|
||
selectedYear,
|
||
dataScope,
|
||
subcomId,
|
||
deptId,
|
||
resourceId,
|
||
} = activeParams;
|
||
|
||
//指定日期范围未填写
|
||
if (dateScope === '6' && !selectedYear) {
|
||
return true;
|
||
}
|
||
//分部未填写
|
||
if (dataScope === '1' && !subcomId) {
|
||
return true;
|
||
}
|
||
//部门未填写
|
||
if (dataScope === '2' && !deptId) {
|
||
return true;
|
||
}
|
||
//人员未填写
|
||
if (dataScope === '3' && !resourceId) {
|
||
return true;
|
||
}
|
||
|
||
return false
|
||
}
|
||
|
||
@computed get rgCallbackParamsCollector() {
|
||
const {
|
||
activeParams,
|
||
} = this.radioGroup;
|
||
|
||
const callback = {
|
||
...activeParams,
|
||
};
|
||
|
||
return callback;
|
||
}
|
||
|
||
@computed get columns() {
|
||
const afterColumns = this.table.columns.filter(column => column.key === 'lastName' || this.checkedItems.includes(column.key));
|
||
|
||
afterColumns.map(column => {
|
||
const dataIndex = column.dataIndex;
|
||
column.render = (text, record, index) => {
|
||
const {
|
||
id,
|
||
deptId,
|
||
jobtitleId,
|
||
subcomId,
|
||
lastName,
|
||
workcode,
|
||
} = record;
|
||
|
||
switch (dataIndex) {
|
||
case 'lastName':
|
||
return (<div>
|
||
<WeaPopoverHrm ecId={`${this && this.props && this.props.ecId || ''}_WeaPopoverHrm@l13jxm@${column.dataIndex}`} />
|
||
<a href={`javaScript:openhrm(${id})`} onClick={e => window.pointerXY(e)} title={lastName} ><span dangerouslySetInnerHTML={{__html:lastName}} /></a>
|
||
</div>);
|
||
break;
|
||
case 'workcode':
|
||
return (<div>
|
||
<WeaPopoverHrm ecId={`${this && this.props && this.props.ecId || ''}_WeaPopoverHrm@442v8m@${column.dataIndex}`} />
|
||
<a href={`javaScript:openhrm(${id})`} onClick={e => window.pointerXY(e)} title={workcode} >
|
||
{workcode}
|
||
</a>
|
||
</div>);
|
||
break;
|
||
case 'subcom':
|
||
return <a onClick={() => jumpToHrmSubCompany(subcomId)} target='_blank'>{text}</a>
|
||
break;
|
||
case 'dept':
|
||
return <a onClick={() => jumpToHrmDept(deptId)} target='_blank'>{text}</a>;
|
||
break;
|
||
case 'jobtitle':
|
||
return <a onClick={() => jumpToHrmPost(jobtitleId)} target='_blank'>{text}</a>;
|
||
break;
|
||
default:
|
||
if (text === '-1') {
|
||
return '/'
|
||
} else {
|
||
return <a onClick={() => this.handleHrefClick({id,lastName,key:dataIndex})}>{text}</a>
|
||
}
|
||
|
||
}
|
||
}
|
||
});
|
||
|
||
return afterColumns;
|
||
}
|
||
|
||
handleHrefClick = (params) => {
|
||
const {
|
||
id,
|
||
lastName,
|
||
key
|
||
} = params;
|
||
|
||
|
||
this.dialogTitle = `${lastName} ${getLabel('505716',"的")}${getLabel('505717',"假期使用记录")}`
|
||
|
||
this.resourceId = id;
|
||
|
||
this.dialogTab.selectedKey = key;
|
||
|
||
this.openDialog();
|
||
}
|
||
|
||
@action setRgHeight = (height) => {
|
||
this.radioGroup.height = height !== null ? height : 180;
|
||
}
|
||
|
||
//***************列表*****************
|
||
@observable resourceId = '';
|
||
|
||
@observable table = {
|
||
columns: [],
|
||
datas: [],
|
||
pageSize: 10,
|
||
total: 0,
|
||
loading: false,
|
||
current: 1,
|
||
}
|
||
|
||
showTotal = (total) => {
|
||
return `${getLabel('18609',"共")} ${total} ${getLabel('18256',"条")}`;
|
||
}
|
||
|
||
@observable winHeight = (window.innerHeight || document.documentElement.clientHeight);
|
||
|
||
@action calculateHeight = () => {
|
||
this.winHeight = (window.innerHeight || document.documentElement.clientHeight);
|
||
}
|
||
|
||
@computed get paginationCallbackParamsCollector() {
|
||
const {
|
||
current,
|
||
pageSize
|
||
} = this.table;
|
||
|
||
const callback = {
|
||
pageSize,
|
||
currentPage: current,
|
||
};
|
||
|
||
return callback;
|
||
}
|
||
|
||
@computed get tableAsyncFetchParams() {
|
||
const params = {
|
||
...this.paginationAsyncFetchParams,
|
||
...this.paginationCallbackParamsCollector,
|
||
};
|
||
|
||
return params;
|
||
}
|
||
|
||
@observable loading = false;
|
||
|
||
@action getSearchList = () => {
|
||
if (this.isEmpty) return;
|
||
this.loading = true;
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getSearchList',
|
||
fetchParams: this.tableAsyncFetchParams,
|
||
logic: (cb) => {
|
||
const {
|
||
columns,
|
||
datas
|
||
} = cb;
|
||
|
||
const _columns = [...columns];
|
||
|
||
_columns.forEach(c => {
|
||
c.width = 100
|
||
})
|
||
|
||
this.table.columns = _columns;
|
||
this.table.datas = datas;
|
||
this.loading = false;
|
||
}
|
||
});
|
||
}
|
||
|
||
@computed get paginationAsyncFetchParams() {
|
||
const params = {
|
||
...this.rgCallbackParamsCollector,
|
||
isNoAccount: this.isNoAccountShow,
|
||
}
|
||
|
||
return params;
|
||
}
|
||
|
||
@action getPageInfo = (next) => {
|
||
if (this.isEmpty) return;
|
||
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getPageInfo',
|
||
fetchParams: this.paginationAsyncFetchParams,
|
||
logic: (cb) => {
|
||
['pageSize', 'total'].map(v => {
|
||
this.table[v] = cb[v];
|
||
});
|
||
|
||
this.table.current = 1;
|
||
|
||
next && next();
|
||
}
|
||
});
|
||
}
|
||
|
||
@action setCurrentPage = (current, property, next) => {
|
||
this[property].current = current;
|
||
|
||
next && next();
|
||
}
|
||
|
||
@action setSizePerPage = (pageSize, property, next,current) => {
|
||
this[property].pageSize = pageSize;
|
||
this[property].current = current;
|
||
|
||
next && next();
|
||
}
|
||
|
||
@computed get tableScrollHeight() {
|
||
return this.winHeight - 340
|
||
}
|
||
|
||
//***************弹框*****************
|
||
dialogProps = {
|
||
icon: 'icon-coms-hrm',
|
||
iconBgcolor: '#217346',
|
||
hasScroll: true,
|
||
style: {
|
||
width: 700,
|
||
height: 650,
|
||
},
|
||
onCancel: () => this.closeDialog(),
|
||
buttons: [<WeaMoreButton ecId={`${this && this.props && this.props.ecId || ''}_WeaMoreButton@7ei8ph`} />],
|
||
};
|
||
|
||
@observable dialog = {
|
||
visible: false,
|
||
loading: true,
|
||
bottomTips: '',
|
||
}
|
||
|
||
@action openDialog = () => {
|
||
this.dialog.visible = true;
|
||
}
|
||
|
||
@action closeDialog = () => {
|
||
this.dialog.visible = false;
|
||
}
|
||
|
||
dialogSelectDisposer = reaction(() => this.dialog.visible, visible => {
|
||
if (visible) {
|
||
this.getChangeType();
|
||
this.dialogChainCall();
|
||
} else {
|
||
this.dialogSelect.value = 'All'
|
||
}
|
||
})
|
||
|
||
//***************弹框内的页签*****************
|
||
dialogTabStaticProps = {
|
||
keyParam: 'key',
|
||
onChange: key => this.setDialogTabKey(key, this.dialogPartChainCall),
|
||
}
|
||
|
||
@observable dialogTab = {
|
||
datas: [],
|
||
selectedKey: '',
|
||
}
|
||
|
||
@action setDialogTabKey = (key, next) => {
|
||
this.dialogTab.selectedKey = key;
|
||
next && next();
|
||
}
|
||
|
||
@computed get dialogTabAsyncFetchParams() {
|
||
const params = {
|
||
resourceId: this.resourceId,
|
||
}
|
||
|
||
return params;
|
||
}
|
||
|
||
@action getDialogTab = (next) => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getTab',
|
||
fetchParams: this.dialogTabAsyncFetchParams,
|
||
logic: (cb) => {
|
||
const {
|
||
tab
|
||
} = cb;
|
||
|
||
this.dialogTab.datas = tab;
|
||
|
||
next && next();
|
||
}
|
||
});
|
||
}
|
||
|
||
@computed get vacationName() {
|
||
const {
|
||
datas,
|
||
selectedKey
|
||
} = this.dialogTab;
|
||
|
||
const targetData = datas.find(data => data.key === selectedKey);
|
||
|
||
if (targetData) return targetData.title
|
||
}
|
||
|
||
//***************弹框内的下拉框*****************
|
||
@observable dialogSelect = {
|
||
options: [],
|
||
value: 'All',
|
||
};
|
||
|
||
@action getChangeType = () => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getChangeType',
|
||
logic: (cb) => {
|
||
const {
|
||
condition
|
||
} = cb;
|
||
|
||
this.dialogSelect.options = condition[0].items[0].options;
|
||
}
|
||
});
|
||
}
|
||
|
||
@action handleSelectChange = (value, next) => {
|
||
this.dialogSelect.value = value;
|
||
|
||
next && next();
|
||
}
|
||
|
||
//***************弹框内的分页*****************
|
||
@observable dialogPagination = {
|
||
current: 1,
|
||
pageSize: 10,
|
||
total: 0
|
||
};
|
||
|
||
@computed get dialogPaginationAsyncFetchParams() {
|
||
const params = {
|
||
ruleId: this.dialogTab.selectedKey,
|
||
changeType: this.dialogSelect.value,
|
||
resourceId: this.resourceId,
|
||
};
|
||
|
||
return params;
|
||
}
|
||
|
||
@action getDetailPageInfo = (next) => {
|
||
this.dialog.loading = true;
|
||
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getDetailPageInfo',
|
||
fetchParams: this.dialogPaginationAsyncFetchParams,
|
||
logic: (cb) => {
|
||
['total', 'pageSize'].map(v => {
|
||
this.dialogPagination[v] = cb[v];
|
||
});
|
||
|
||
if (cb.total === 0) {
|
||
this.dialog.loading = false
|
||
}
|
||
|
||
this.dialogPagination.current = 1;
|
||
|
||
next && next();
|
||
}
|
||
});
|
||
}
|
||
|
||
//***************弹框内的时间线*****************
|
||
@observable dialogTimeline = {
|
||
dataDetail: [],
|
||
topTips: '',
|
||
balanceEnable: 1,
|
||
}
|
||
|
||
@computed get timelineAsyncFetchParams() {
|
||
const {
|
||
current,
|
||
pageSize
|
||
} = this.dialogPagination;
|
||
|
||
const params = {
|
||
...this.dialogPaginationAsyncFetchParams,
|
||
pageSize,
|
||
currentPage: current,
|
||
}
|
||
|
||
return params;
|
||
}
|
||
|
||
@action getUsageRecordDetail = () => {
|
||
fetch({
|
||
asyncFetch,
|
||
name: 'getUsageRecordDetail',
|
||
fetchParams: this.timelineAsyncFetchParams,
|
||
logic: (cb) => {
|
||
['dataDetail', 'topTips', 'balanceEnable'].map(v => {
|
||
this.dialogTimeline[v] = cb[v];
|
||
});
|
||
|
||
this.dialog.bottomTips = cb.bottomTips;
|
||
|
||
this.dialog.loading = false;
|
||
}
|
||
});
|
||
}
|
||
|
||
//***************其他*****************
|
||
cwm = () => {
|
||
this.resetDatas();
|
||
}
|
||
|
||
cwr = () => {
|
||
this.resetDatas();
|
||
this.getRadioGroupConfig(this.chainCall);
|
||
}
|
||
|
||
resetDatas = () => {
|
||
this.isNoAccountShow = false;
|
||
this.radioGroup.config = [];
|
||
['columns', 'datas'].map(v => {
|
||
this.table[v] = [];
|
||
});
|
||
}
|
||
|
||
chainCall = () => this.getPageInfo(() => this.getSearchList());
|
||
|
||
dialogPartChainCall = () => this.getDetailPageInfo(() => this.getUsageRecordDetail())
|
||
|
||
dialogChainCall = () => this.getDialogTab(this.dialogPartChainCall);
|
||
|
||
|
||
}
|
||
|
||
const hrmVacationBalanceReportCopy = new HrmVacationBalanceReportCopy;
|
||
export {
|
||
hrmVacationBalanceReportCopy
|
||
} |