weaver_trunk_cli/pc4mobx/hrm/stores/tax.js

1135 lines
23 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
observable,
action,
computed,
} from 'mobx';
import {
WeaLocaleProvider,
} from 'ecCom';
import {
WeaForm,
WeaTableNew
} from 'comsMobx';
import {
message,
Button,
Modal,
} from 'antd';
import * as api from '../apis/tax';
const getLabel = WeaLocaleProvider.getLabel;
const confirm = Modal.confirm;
const {
TableStore
} = WeaTableNew;
class HrmTax {
@observable cPage = 'main';
TAXDEDUCTIONITEMS = ['childEducation', 'continualEducation', 'loan', 'rent', 'supportOlder']; //专项附加扣除填报
BASICINFOITEMS = ['personalInfo', 'familyMember']; //基本信息
SEARCHGROUPS = [{
title: getLabel(-1, '基本信息'),
MENUS: [{
src: '/images/tax/basic_info.png',
label: getLabel(-1, '个人信息'),
onMenuClick: () => this.handleMenuClick('personalInfo')
}, {
src: '/images/tax/basic_info.png',
label: getLabel(-1, '家庭成员'),
onMenuClick: () => this.handleMenuClick('familyMember')
}]
}, {
title: getLabel(-1, '专项附加扣除填报'),
MENUS: [{
src: '/images/tax/child_edu.png',
label: getLabel(-1, '子女教育'),
onMenuClick: () => this.handleMenuClick('childEducation')
}, {
src: '/images/tax/c_edu.png',
label: getLabel(-1, '继续教育'),
onMenuClick: () => this.handleMenuClick('continualEducation')
}, {
src: '/images/tax/loan.png',
label: getLabel(-1, '住房贷款利息'),
onMenuClick: () => this.handleMenuClick('loan')
}, {
src: '/images/tax/rent.png',
label: getLabel(-1, '住房租金'),
onMenuClick: () => this.handleMenuClick('rent')
}, {
src: '/images/tax/support.png',
label: getLabel(-1, '赡养老人'),
onMenuClick: () => this.handleMenuClick('supportOlder')
}]
}];
TOP = {
showDropIcon: true,
iconBgcolor: '#217346',
icon: <i className='icon-coms-hrm'/>,
title: getLabel(-1, '个税专项附加扣除信息填报')
}
@computed get breadcrumb() {
let a;
const f = {
name: getLabel(-1, '信息填报'),
onClick: () => {
this.cPage = 'main'
}
};
switch (this.cPage) {
case 'main':
a = [];
break;
case 'personalInfo':
const {
isEdit
} = this.personalForm;
if (isEdit === '0') {
a = [f, {
name: getLabel(-1, '个人信息'),
}]
} else {
a = [{
name: getLabel(-1, '个税专项附加扣除信息填报'),
onClick: () => {
this.cPage = 'main'
}
}, {
name: getLabel(-1, '基本信息填报'),
}]
}
break;
case 'familyMember':
a = [f, {
name: getLabel(-1, '家庭成员'),
}]
break;
case 'childEducation':
a = [f, {
name: getLabel(-1, '子女教育'),
}]
break;
case 'continualEducation':
a = [f, {
name: getLabel(-1, '继续教育'),
}]
break;
case 'loan':
a = [f, {
name: getLabel(-1, '住房贷款利息'),
}]
break;
case 'rent':
a = [f, {
name: getLabel(-1, '住房租金'),
}]
break;
case 'supportOlder':
a = [f, {
name: getLabel(-1, '赡养老人'),
}]
break;
}
return a;
}
@computed get pageLoading() {
const {
comsWeaTableStore
} = this.table;
let loading;
const hasTable = this.hasTable();
const hasPersonalForm = this.hasPersonalForm();
const hasConditionForm = this.hasConditionForm();
const tloading = comsWeaTableStore.loading;
const ploading = this.personalForm.loading;
const cloading = this.conditionForm.loading;
//页面中只包含纯列表
if (hasTable && !hasConditionForm) {
loading = tloading;
}
//页面中即包含列表,也包含条件表单
if (hasTable && hasConditionForm) {
loading = tloading || cloading;
}
//只包含个人信息表单
if (hasPersonalForm && !hasConditionForm) {
loading = ploading;
}
//不仅包含个人信息表单,也包含条件表单
if (hasPersonalForm && hasConditionForm) {
loading = ploading || cloading;
}
return loading;
}
//页面中是否包含列表
hasTable = () => {
const {
currentIndex
} = this.step;
if (this.cPage === 'familyMember') {
return true
}
if (['childEducation', 'supportOlder'].includes(this.cPage) && currentIndex === 1) {
return true
}
}
//页面中是否包含个人信息表单
hasPersonalForm = () => {
const {
currentIndex
} = this.step;
if (this.cPage === 'personalInfo') {
return true;
}
if (this.TAXDEDUCTIONITEMS.includes(this.cPage)) {
return true;
}
}
//页面中是否包含条件表单
hasConditionForm = () => {
const {
currentIndex
} = this.step;
if (this.cPage === 'loan') {
return true;
}
if (this.TAXDEDUCTIONITEMS.includes(this.cPage) && currentIndex > 0) {
return true;
}
}
@observable tConf = [];
@observable rConf = [];
@action getRightMenu = (isEdit) => {
const params = {};
if (this.cPage === 'personalInfo') {
if (isEdit !== undefined) {
Object.assign(params, {
edit: isEdit
});
}
}
if (this.TAXDEDUCTIONITEMS.includes(this.cPage)) {
Object.assign(params, {
step: this.step.currentIndex + 1
});
}
api.getRightMenu(this.cPage, params).then(data => {
const {
btnMenu
} = data;
const {
tConf,
rConf
} = this.filter(btnMenu);
this.tConf = tConf;
this.rConf = rConf;
}, error => {})
}
filter = (datas) => {
let tConf, rConf;
tConf = datas.filter(item => {
var bool = false;
['isTop', 'isBatch'].forEach(prop => {
const b = parseInt(item[prop]);
if (b) {
bool = true
}
});
return bool
})
rConf = datas;
return {
tConf,
rConf
}
}
@computed get topButtons() {
if (this.cPage !== 'main') {
return this.tConf.map((item, index) => {
const {
menuFun,
menuName
} = item;
return (
<Button
type="primary"
disabled={this.getDisabled(menuFun) }
onClick={() => this[menuFun]()}
>
{menuName}
</Button>
)
});
} else {
return [];
}
}
@computed get dropMenuDatas() {
if (this.cPage !== 'main') {
return this.rConf.map((item, index) => {
const {
menuFun,
menuName,
menuIcon
} = item;
return {
key: index.toString(),
disabled: this.getDisabled(menuFun),
icon: <i className={`${menuIcon}`} />,
content: menuName,
onClick: () => this[menuFun]()
}
});
} else {
return [];
}
}
//编辑、保存个人信息表单CALLBACK
operatePersonalForm = (isEdit) => {
this.controlUnderline(isEdit);
this.getRightMenu(isEdit);
this.formType = 'PF';
this.getForm(isEdit);
}
//编辑个人信息表单
doEdit = () => {
this.operatePersonalForm('1');
}
//保存个人信息表单
doSave = () => {
//表单验证通过后执行的逻辑
const callback = () => {
this.saveForm('personalForm', () => {
this.operatePersonalForm('0');
});
}
this.validateForm('personalForm', callback);
}
//返回
doCancel = () => {
this.operatePersonalForm('0');
}
//新建家庭成员
doCreate = () => {
this.defineDialogTitle(getLabel(-1, '新建家庭成员'));
this.callDialogForm('DG');
}
//上一步
preStep = () => {
this.changeStepComponentState(false);
this.getRightMenu();
if (this.step.currentIndex === 1) {
this.formType = 'CD';
this.getForm();
} else {
this.formType = 'PF';
this.getForm();
}
}
//下一步
nextStep = () => {
this.changeStepComponentState(true);
this.getRightMenu();
this.formType = 'CD';
this.getForm();
(this.step.currentIndex === 1) && this.getSearchList();
}
@action changeStepComponentState = (isIncrease) => {
if (isIncrease) {
this.step.currentIndex++; //切换页面时,需要重置该变量
} else {
this.step.currentIndex--;
}
const {
currentIndex,
items,
} = this.step;
items.forEach((item, index) => {
if (index < currentIndex) {
Object.assign(item, {
status: 'finish'
});
} else if (index === currentIndex) {
Object.assign(item, {
status: 'process'
});
} else {
Object.assign(item, {
status: 'wait'
});
}
});
}
//调用弹框内的表单
//接收两个参数表单的类型、当前编辑表单的ID
callDialogForm = (formType, id) => {
this.openDialog();
this.formType = formType;
this.getForm(id);
}
//批量删除
doDelete = () => {
const {
comsWeaTableStore
} = this.table, {
selectedRowKeys
} = comsWeaTableStore;
const callback = () => {
const params = {
ids: selectedRowKeys.toString(),
};
this.delLogic(params);
}
this.delConfirm(true, callback);
}
//确认是否删除
//接收两个参数:是否是批量删除、确认删除后执行的回调函数
delConfirm = (isBatch, callback) => {
let content;
if (isBatch) {
content = getLabel('385625', '确定要删除选择的记录吗?');
} else {
content = getLabel('83877', '确定要删除吗?');
}
confirm({
title: getLabel('131329', '信息确认'),
content: content,
okText: getLabel('33703', '确定'),
cancelText: getLabel('32694', '取消'),
onOk() {
callback && callback();
},
onCancel() {
return false;
},
});
}
//执行删除任务的具体逻辑
delLogic = (params) => {
api.del(this.cPage, params).then(data => {
const {
status
} = data;
if (status === '1') {
message.success(-1, '删除成功');
this.getSearchList();
} else {
message.warning(-1, '删除失败');
}
});
}
//保存表单分两种情况:保存页面表单、保存弹框内的表单
//参数formType为要保存表单的类型、 callback为这两种情况保存成功后具体执行的逻辑
saveForm = (formType, callback) => {
const {
form
} = this[formType];
//后端默认取当前登录人员的id因此这里不需要传人员id。
const params = {
...form.getFormParams(),
};
api.save(this.cPage, params).then(data => {
const {
status
} = data;
if (status === '1') {
message.success(getLabel(-1, '保存成功'));
callback && callback();
} else {
message.warning(getLabel(-1, '保存失败'));
}
}, error => {})
}
//获取顶部按钮组、右键菜单的状态(是否可点击)
getDisabled = (func) => {
const {
loading
} = this.personalForm, {
comsWeaTableStore
} = this.table;
let b;
if (['doEdit'].includes(func)) {
b = loading;
}
if (['doCreate'].includes(func)) {
b = comsWeaTableStore.loading;
}
if (['doDelete'].includes(func)) {
b = comsWeaTableStore.selectedRowKeys.length === 0;
}
return b;
}
@action handleMenuClick = (type) => {
if (this.BASICINFOITEMS.includes(type)) {
this.cPage = type;
}
if (type === 'personalInfo') {
this.operatePersonalForm('0');
}
if (type === 'familyMember') {
this.getRightMenu();
this.getSearchList();
}
if (this.TAXDEDUCTIONITEMS.includes(type)) {
this.storagePageType(type);
this.defineDialogTitle(getLabel(-1, '填报前,您需要提前准备以下材料'));
this.openDialog();
this.getPreInfo(type);
}
}
//设置即将跳转页面的类型
storagePageType = (type) => {
this.temp = type;
}
//**********************NoLinkageForm、CollapseForm**********************
formType = 'PF'; //PF: 个人信息表单 PFDG:弹框内的个人信息 DG:弹框内的表单 CD: 条件表单
callFormAPIParams = {}; //调用表单接口所需的参数
@observable personalForm = { //人员信息表单
form: new WeaForm(),
loading: false,
isEdit: '0',
}
@observable dialogForm = { //弹框内表单
form: new WeaForm(),
conditions: [],
loading: false,
}
@observable conditionForm = { //提交表单
form: new WeaForm(),
loading: false,
}
@action getForm = (val) => {
this.setParamsToCallFormAPI(val);
//判断是否调用个人信息表单
const isCallPersonalForm = this.isCallPersonalForm();
//判断是否调用弹框内表单
const isCallDialogForm = this.isCallDialogForm();
//判断是否调用条件表单
const isCallCondtionForm = this.isCallCondtionForm();
if (isCallPersonalForm) {
this.personalForm.loading = true;
}
if (isCallDialogForm) {
this.dialogForm.loading = true;
}
if (isCallCondtionForm) {
this.conditionForm.loading = true;
}
api.getForm(this.cPage, this.callFormAPIParams, this.step.currentIndex, this.formType, this.subDialog.visible).then(data => {
const {
condition
} = data;
if (isCallPersonalForm && !isCallDialogForm) {
this.initForm('personalForm', condition);
}
if (isCallDialogForm) {
//表单上有添加按钮的,在配置数据上添加回调函数。
if (this.hasAddBtn(condition)) {
this.addAddBtnEventListener(condition)
}
this.initForm('dialogForm', condition);
}
if (isCallCondtionForm) {
this.initForm('conditionForm', condition);
}
}, error => {})
}
//设置调用表单接口的参数
setParamsToCallFormAPI = (val) => {
//判断是否调用个人信息表单
const isCallPersonalForm = this.isCallPersonalForm();
//判断是否调用弹框内表单
const isCallDialogForm = this.isCallDialogForm();
//判断是否调用条件表单
const isCallCondtionForm = this.isCallCondtionForm();
if (isCallPersonalForm) {
Object.assign(this.callFormAPIParams, {
edit: val
});
this.personalForm.loading = true;
}
if (isCallDialogForm) {
if (val) {
Object.assign(this.callFormAPIParams, {
id: val
});
}
this.dialogForm.loading = true;
}
}
//判断调用的是否是个人信息表单
isCallPersonalForm = (type) => {
return ['PF', 'PFDG'].includes(this.formType)
}
isEdit = (val) => {
return val === '1'
}
isCallDialogForm = (type) => {
return ['PFDG', 'DG'].includes(this.formType);
}
isCallCondtionForm = () => {
return this.formType === 'CD'
}
hasAddBtn = (conditions) => {
let b = false;
conditions.forEach(c => {
c.items.forEach(item => {
const {
otherParams
} = item;
if (otherParams && otherParams.hasAddBtn) {
b = true;
}
})
});
return b;
}
addAddBtnEventListener = (conditions) => {
conditions.forEach(c => {
c.items.forEach(item => {
const {
otherParams
} = item;
if (otherParams && otherParams.hasAddBtn) {
item.addOnClick = () => {
this.defineDialogTitle(getLabel(-1, '新建家庭成员'));
this.openDialog();
this.formType = 'DG';
this.getForm();
}
}
});
});
}
//初始化表单
initForm = (obj, condition) => {
this[obj].form = new WeaForm();
this[obj].form.setCondition(condition);
this[obj].conditions = condition;
this[obj].loading = false;
}
@computed get isRenderCollapseForm() {
const {
conditions
} = this.dialogForm;
return conditions.length > 1;
}
//控制个人信息表单是否出现下划线
controlUnderline = (isEdit) => {
this.personalForm.isEdit = isEdit;
}
//********************Tab********************
buttonsAds = [getLabel(82529, '搜索'), getLabel(27088, '重置'), getLabel(32694, '取消')];
TAB = {
advanceHeight: 170,
hasMask: false,
keyParam: 'key',
setShowSearchAd: bool => this.setShowSearchAd(bool),
onSearch: () => this.onSearch(),
onSearchChange: val => this.onSearchChange(val),
onChange: key => this.onTabChange(key),
buttonsAd: this.buttonsAds.map((name, index) => {
const type = (index === 0) && "primary";
let callback;
if (index === 0) {
callback = () => this.onSearch();
} else if (index === 1) {
callback = () => this.tab.form.resetConditionValue();
} else {
callback = this.setShowSearchAd
}
return <Button type={type} onClick={() => callback(index === 2 && false)}>{name}</Button>
})
}
@observable tab = {
showSearchAd: false,
form: new WeaForm(),
selectedKey: '0',
value: ''
}
@observable onSearchChange = (val) => {
this.tab.value = val;
}
@action onSearch = () => {
this.getSearchList();
}
@action onTabChange = (key) => {
this.tab.selectedKey = key;
}
@action setShowSearchAd = (b) => {
this.tab.showSearchAd = b;
}
@computed get searchsBaseValue() {
if (this.cPage === 'main') {
return ''
}
if (this.cPage === 'familyMember') {
return this.tab.value;
}
}
@computed get tabDatas() {
if (this.cPage === 'main') {
return [{
key: '0',
title: getLabel(-1, '信息填报')
}, {
key: '1',
title: getLabel(-1, '填报记录查询')
}];
}
if (this.cPage === 'familyMember') {
return [];
}
}
@computed get searchType() {
let type;
if (this.cPage === 'main') {
type = ['base', 'advanced'];
}
if (this.cPage === 'familyMember') {
type = ['base'];
}
return type;
}
//*********************Table*********************
TABLE = {
hasOrder: true,
needScroll: true,
}
@observable table = {
comsWeaTableStore: new TableStore(),
}
@action getSearchList = () => {
const params = this.getParamsToCallTableAPI()
api.getRecords(this.cPage, params).then(data => {
const {
sessionkey
} = data;
this.table.comsWeaTableStore = new TableStore();
this.table.comsWeaTableStore.getDatas(sessionkey, 1);
}, error => {})
}
getParamsToCallTableAPI = () => {
const params = {};
if (this.cPage === 'familyMember') {
Object.assign(params, {
lastname: this.searchsBaseValue
});
}
if (this.cPage === 'childEducation') {
const {
form
} = this.conditionForm;
Object.assign(params, {
year: form.getFormParams().year
});
}
return params;
}
//编辑家庭成员
edit = (id) => {
this.defineDialogTitle(getLabel(-1, '编辑家庭成员'));
this.callDialogForm('DG', id);
}
//删除家庭成员
del = (id) => {
//删除确认通过后,执行的回调函数
const callback = () => {
const params = {
ids: id
};
this.delLogic(params);
}
this.delConfirm(false, callback);
}
//*********************Dialog*********************
DIALOG = {
hasScroll: true,
onCancel: () => this.closeDialog(),
}
@computed get dialogButtons() {
let btns;
if (this.cPage === 'main') {
btns = [
<Button type='primary' onClick={() => this.goToDetailPage()}>{getLabel(-1, '准备完毕,进入填报')}</Button>,
<Button onClick={() => this.closeDialog()}>{getLabel(-1, '取消')}</Button>,
];
} else {
btns = [<Button type='primary' onClick={() => this.saveDialogForm()}>{getLabel(30986, '保存')}</Button>]
}
return btns;
}
@computed get moreBtn() {
const btn = {};
if (this.cPage !== 'main') {
Object.assign(btn, {
datas: []
});
}
return btn;
}
@computed get icon() {
let icon;
if (this.cPage === 'main') {
icon = 'icon-coms-Prompt'
} else {
icon = 'icon-coms-hrm'
}
return icon;
}
@computed get iconBgcolor() {
let color;
if (this.cPage === 'main') {
color = '#FF9900'
} else {
color = '#217346'
}
return color;
}
@observable dialog = {
visible: false,
title: '',
}
@observable subDialog = {
visible: false,
title: '',
}
@computed get dialogLoading() {
return this.dialogForm.loading
}
@computed get dialogStyle() {
let style;
if (this.cPage === 'main') {
style = {
width: 560,
height: 215
}
}
if (this.cPage === 'familyMember') {
style = {
width: 600,
height: 350
}
}
if (this.cPage === 'childEducation') {
style = {
width: 600,
height: 500
};
}
return style;
}
@action openDialog = () => {
if (!this.dialog.visible) {
this.dialog.visible = true;
} else {
this.subDialog.visible = true;
}
}
@action closeDialog = () => {
if (this.subDialog.visible) {
this.subDialog.visible = false;
} else {
this.dialog.visible = false;
}
}
@action defineDialogTitle = (title) => {
if (!this.dialog.visible) {
this.dialog.title = title;
} else {
this.subDialog.title = title;
}
}
//准备完毕、进入填报
@action goToDetailPage = () => {
this.cPage = this.temp;
this.closeDialog();
this.getRightMenu();
this.getStep();
this.formType = 'PF';
this.getForm('0');
}
//**********************PreInfo**********************
@observable preInfo = [];
//获取提示信息
@action getPreInfo = (type) => {
this.dialog.loading = true;
api.getPreInfo(type).then(data => {
const {
items
} = data;
items.map((item, index) => {
Object.assign(item, {
imgSrc: this.getImgSrc(type, index)
});
});
this.preInfo = items;
this.dialog.loading = false;
}, error => {})
}
//获取提示弹框内的图片地址
getImgSrc = (type, index) => {
let src;
switch (type) {
case 'childEducation':
if (index === 0) {
src = '/images/tax/cedu_01.png'
} else {
src = '/images/tax/cedu_02.png'
}
}
return src;
}
//校验表单
//包含两个参数:当前校验表单的类型、校验通过后执行的回调函数
@action validateForm = (formType, callback) => {
this[formType].form.validateForm().then(f => {
if (f.isValid) {
callback && callback();
} else {
f.showErrors();
}
})
}
saveDialogForm = () => {
//弹框内表单校验通过后,执行的回调函数。
const callback = () => {
this.saveForm('dialogForm', () => {
this.closeDialog();
if (this.isRefreshTable()) {
this.getSearchList();
} else {
this.controlUnderline('0');
this.formType = 'PF';
this.getForm('0');
}
});
}
this.validateForm('dialogForm', callback);
}
//判断保存弹框内表单后,刷新的是列表还是表单。
isRefreshTable = () => {
const {
currentIndex
} = this.step;
//保存家庭成员
if (this.cPage === 'familyMember') {
return true
}
//添加子女教育信息、新建家庭成员
if (['childEducation', 'supportOlder'].includes(this.cPage) && currentIndex === 1) {
return true
}
}
//**********************Step**********************
@observable step = {
currentIndex: 0,
items: []
}
@action getStep = () => {
api.getStep(this.cPage).then(data => {
const {
steps
} = data;
steps.map((step, index) => {
Object.assign(step, {
status: (index === 0) ? 'process' : 'wait'
});
});
this.step.items = steps;
}, error => {})
}
//*********************Title******************
modify = () => {
this.controlUnderline('1');
this.defineDialogTitle(getLabel(-1, '修改个人信息'));
this.openDialog();
this.formType = 'PFDG';
this.getForm('1');
}
//*****************ButtonIcons*****************
buttonIcons = [{
buttonType: 'add',
type: 'primary',
onClick: () => this.addChildEducationInfo()
}, {
buttonType: 'del',
type: 'primary',
disabled: true,
onClick: () => this.delChildEducationInfo()
}];
addChildEducationInfo = () => {
this.defineDialogTitle(getLabel(-1, '添加子女教育信息'));
this.openDialog();
this.formType = 'DG';
this.getForm();
}
delChildEducationInfo = () => {
}
//********************TableUnderSearchGroup********************
childrenReduceTip = [getLabel(-1, '有子女符合以下两个条件之一:'), getLabel(-1, '扣除年度有子女满3岁且处于小学入学前阶段'), getLabel(-1, '扣除年度有子女正接受全日制学历教育。')];
@computed get searchGroupTitle() {
if (this.cPage === 'childEducation') {
return getLabel(-1, '子女教育信息');
}
if (this.cPage === 'supportOlder') {
return getLabel(-1, '被赡养人信息');
}
}
}
export const hrmTax = new HrmTax();