weaver_trunk_cli/pc4mobx/hrmAttendance/stores/vacationBalanceReportCopy.js

804 lines
16 KiB
JavaScript
Raw Normal View History

2024-12-11 15:32:14 +08:00
import {
observable,
action,
computed,
reaction,
} from 'mobx';
import {
WeaTableNew,
} from 'comsMobx';
import {
WeaTools,
WeaMoreButton,
WeaPopoverHrm,
WeaLocaleProvider,
} from 'ecCom';
import {
message,
Modal
} 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 _showVacRadioGroup = true;
@computed get showVacRadioGroup(){return this._showVacRadioGroup}
set showVacRadioGroup(v){
this._showVacRadioGroup = v;
setTimeout(() => {
this.reCalculateTableHeight = new Date().getTime();
}, 0)
}
domRef = {};
@observable _reCalculateTableHeight = new Date().getTime();
@computed get reCalculateTableHeight(){return this._reCalculateTableHeight}
set reCalculateTableHeight(v){this._reCalculateTableHeight = v}
@computed get tableHeihgt(){
this.reCalculateTableHeight;
const topHeight = this.domRef.top && this.domRef.top.refs.content ? this.domRef.top.refs.content.clientHeight : 0;
const tabHeight = this.domRef.tab ? $(this.domRef.tab)[0].clientHeight : 0;
const h = topHeight - tabHeight;
return h <= 0 ? 0 : h;
}
@action setDomRef = (dom, type) => {
dom && Object.assign(this.domRef, {[type]: dom}) && setTimeout(() => this.reCalculateTableHeight = new Date().getTime(), 500);
}
//************权限*************
@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(),
reportType:'kqReport'
};
// exportExcel(params, downloadUrl);
asyncFetch.exportExcel({
...params
}).then(data => {
if (data.api_status ==true ){
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);
Modal.confirm({
title: getLabel(558,'提示') ,
content: getLabel('导出成功'),
});
}else if(data.api_status ==false){
Modal.confirm({
title: getLabel(558,'提示') ,
content: data.api_errormsg,
});
}
}, error => {
})
}
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.isNoAccountShow = ((['4', '5', '6', '7', '9'].indexOf(params.status || '')) > -1);
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
}