weaver_trunk_cli/pc4mobx/hrm/stores/tax.js

1135 lines
23 KiB
JavaScript
Raw Normal View History

2024-12-11 15:32:14 +08:00
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();