123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- /*
- * @Author: code4eat awesomedema@gmail.com
- * @Date: 2023-01-03 14:20:22
- * @LastEditors: code4eat awesomedema@gmail.com
- * @LastEditTime: 2023-08-03 10:02:42
- * @FilePath: /BudgetManaSystem/src/pages/budgetMana/personnelSalaryBudget/index.tsx
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
- */
- import BMSPagecontainer from '@/components/BMSPageContainer'
- import { BMSTable } from '@/components/BMSTable';
- import { getComputeDate } from '@/pages/Home/service';
- import { createFromIconfontCN } from '@ant-design/icons';
- import { ActionType, ProColumns } from '@ant-design/pro-components';
- import { Input, InputNumber, message, Modal } from 'antd';
- import React, { useEffect, useRef, useState } from 'react'
- import { caculate, checkRequest, editAssessmentBonus, generate, getCurrentCheckStatus, getData } from './service';
- import editIcon from '../../../../static/editIcon.png';
- import conformIcon from '../../../../static/confirmIcon.png';
- import './style.less';
- import '../../../utils/zhongtaiB'
- import { formatMoneyNumber } from '@/utils/format';
- import { getJiezhuanStatus } from '../monthlySet/service';
- import { getParams } from '../monthlyInfoCheck/service';
- const IconFont = createFromIconfontCN({
- scriptUrl: '',
- });
- const PersonnelSalaryBudget = () => {
- const [auditType, set_auditType] = useState('0');
- const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
- const [pageData, set_pageData] = useState({
- rate: 0, income: 0, personalCost: 0, cost: 0
- });
- const [editTableCellId, set_editTableCellId] = useState<number | undefined>(undefined);
- const [inputSalaryNum, set_inputSalaryNum] = useState(0);
- const tableRef = useRef<ActionType>();
- const [loading, set_loading] = useState(false);
- const [ifBanAllAction, set_ifBanAllAction] = useState(true); //是否掩藏所有操作
- const [ifEditTable,set_ifEditTable] = useState(true);
- const [ifEditIncome,set_ifEditIncome] = useState(false);
- const [ifEditCost,set_ifEditCost] = useState(false);
- const [ifEditRate,set_ifEditRate] = useState(false);
- const tableColumn: ProColumns[] = [
- {
- title: '职类',
- dataIndex: 'unitTypeName',
- key: 'unitTypeName',
- fixed:'left'
- },
- {
- title: '合理编制比例',
- dataIndex: 'staffRate',
- key: 'staffRate',
- },
- {
- title: '合理人均薪酬系数',
- dataIndex: 'averageSalary',
- key: 'averageSalary',
- },
- {
- title: '人事成本占比',
- dataIndex: 'percent',
- key: 'percent',
- },
- {
- title: '人事成本',
- dataIndex: 'cost',
- key: 'cost',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '基金',
- dataIndex: 'fundBonus',
- key: 'fundBonus',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '固定工资',
- dataIndex: 'salary',
- key: 'salary',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '专项补助',
- dataIndex: 'subsidies',
- key: 'subsidies',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '变动薪酬',
- dataIndex: 'variableCompensation',
- key: 'variableCompensation',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '不参与考核奖金',
- dataIndex: 'noAssessmentBonus',
- key: 'noAssessmentBonus',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- },
- {
- title: '合理化考核奖金',
- dataIndex: 'rationalizeBonus',
- key: 'rationalizeBonus',
- renderText(num, record, index, action) {
- return formatMoneyNumber(num)
- },
- }
- ]
- const getPageData = async (currentComputeDate: string, params: any, sort: any, filter: any) => {
- const resp = await getData(currentComputeDate);
- if (resp) {
- set_pageData({
- rate: resp.rate,
- income: resp.income,
- personalCost: resp.personalCost,
- cost: resp.cost
- });
- return {
- data: resp.detail,
- success: true,
- }
- }
- return []
- }
- const checkHandle = async (type: string) => {
- const resp = await checkRequest({
- computeDate: currentComputeDate as string,
- auditType: type == '0' ? '1' : '0', //审核类型 1审核 0取消审核
- });
- if (resp) {
- if (type == '0') {
- message.success('审核提交成功!');
- set_auditType('1');
- }
- if (type == '1') {
- message.success('取消审核提交成功!');
- set_auditType('0');
- }
- }
- }
- const getCurrentComputeDate = async () => {
- const resp = await getComputeDate();
- set_currentComputeDate(resp);
- }
- const getCheckStatus = async (computeDate: string) => {
- const resp = await getCurrentCheckStatus(computeDate);
- if (resp) {
- set_auditType(`${resp}`); //0 未审核 1 已审核
- }
- }
- const editHandle = async (record: any) => {
- const { id } = record;
- if (id == editTableCellId) {
- //保存
- if (inputSalaryNum) {
- const resp = await editAssessmentBonus({
- assessmentBonus: inputSalaryNum,
- id
- });
- if (resp) {
- tableRef.current?.reload();
- }
- }
- set_editTableCellId(undefined);
- } else {
- //编辑
- set_editTableCellId(id);
- }
- }
- const confirmGenerateHandle = async (index: number) => {
- if (index == 1) {
- const resp = await generate(currentComputeDate as string);
- if (resp) {
- message.success('生成完成!');
- tableRef.current?.reload();
- }
- }
- if (index == 2) {
- const resp = await caculate({
- computeDate: currentComputeDate as string,
- ...pageData
- });
- if (resp) {
- message.success('计算完成!');
- tableRef.current?.reload();
- }
- }
- }
- const generateFunc = (index: number) => {
- /**
- * index == 1 生成 2 计算
- *
- */
- if (auditType == '1') {
- Modal.confirm({
- title: '注意',
- okText: '确定',
- cancelText: '',
- closable: true,
- content: '当前处于审核状态无法操作!',
- });
- return;
- }
- Modal.confirm({
- title: '注意',
- okText: '确定',
- cancelText: '',
- closable: true,
- content: index == 1 ? '生成后需重新计算数据,确定要进行生成操作?' : '计算会覆盖原有数据,确定要继续计算操作?',
- onOk: () => { set_loading(true); confirmGenerateHandle(index) }
- });
- }
- const getJiezhuanStatusHandle =async () => {
- const resp = await getJiezhuanStatus(currentComputeDate as string);
- if(resp == 2){
- set_ifBanAllAction(true);
- }else{
- set_ifBanAllAction(false);
- }
- }
-
- const setPageType = async () => {
- const resp = await getParams();
- if(resp){
- const needItems = resp.list.filter((a:any)=>a.code =='1686657454764597248' );
- if(needItems.length>0){
- if(needItems[0].value == '2'){
- set_ifEditTable(true);
- }else{
- set_ifEditTable(false);
- }
- }
- }
- }
- useEffect(() => {
- currentComputeDate && getCheckStatus(currentComputeDate);
- currentComputeDate && getJiezhuanStatusHandle();
- }, [currentComputeDate]);
- useEffect(() => {
- getCurrentComputeDate();
- setPageType();
- }, []);
- return (
- <BMSPagecontainer className='PersonnelSalaryBudget' title={`核算年月:${currentComputeDate}`} ghost>
- {!ifBanAllAction&&<div className='checkBtn' onClick={() => checkHandle(`${auditType}`)}>{auditType == '0' ? '审核' : '取消审核'}</div>}
- <div className='paramsWrap'>
- <div className='cardWrap'>
- <div className='card'>
- <span>收入</span>
- <div className='count'>
- {!ifEditIncome&&pageData.income}
- {(ifEditIncome&&ifEditTable)&&<Input style={{width:160}} autoFocus defaultValue={pageData.income} onBlur={()=>{
- set_ifEditIncome(false);
- }} />}
- {(!ifEditIncome&&ifEditTable)&&<div className='editBtn' onClick={()=>set_ifEditIncome(true)}><img src={editIcon} alt="" /></div>}
- </div>
- </div>
- <div className='card'>
- <span>成本</span>
- <div className='count'>
- {!ifEditCost&&pageData.cost}
- {(ifEditCost&&ifEditTable)&&<Input style={{width:160}} autoFocus defaultValue={pageData.cost} onBlur={()=>{
- set_ifEditCost(false);
- }} />}
- {(!ifEditCost&&ifEditTable)&&<div className='editBtn' onClick={()=>set_ifEditCost(true)}><img src={editIcon} alt="" /></div>}
- </div>
- </div>
- <div className='card'>
- <span>合理人事成本比例系数</span>
- <div className='count'>
- {!ifEditRate&&pageData.rate}
- {(ifEditRate&&ifEditTable)&&<Input style={{width:160}} autoFocus defaultValue={pageData.rate} onBlur={()=>{
- set_ifEditRate(false);
- }} />}
- {(!ifEditRate&&ifEditTable)&&<div className='editBtn' onClick={()=>set_ifEditRate(true)}><img src={editIcon} alt="" /></div>}
- </div>
- </div>
- </div>
- <div className='func'>
- <div className='title'>
- <span className='a'>全院人事成本(D=(A-B)*C)</span>
- {!ifBanAllAction&&<span className='btn' onClick={() => generateFunc(1)}> <IconFont style={{ color: '#3376FE' }} type='iconzhongxin' /> 重新生成</span>}
- </div>
- <InputNumber className={ifEditTable?'input borderUpper':'input'} size='large' min={-10000000} value={pageData.personalCost} placeholder='请输入'
- disabled={auditType == '1'}
- onChange={(value) => set_pageData({ ...pageData, personalCost: value as number })} />
- </div>
- {/* <div className='midLine'>
- <span>手动计算</span>
- 根据手动填写的全院人事成本计算出各职系的
- </div> */}
- </div>
- {!ifBanAllAction&&<div className='countBtn' onClick={() => generateFunc(2)}>计算</div>}
- <div className='b'>计算结果</div>
- {currentComputeDate && <BMSTable actionRef={tableRef} pagination={false} rowKey='unitType' scroll={{ x: 140 * 11 }} columns={[...tableColumn, {
- title: '可分配考核奖金',
- dataIndex: 'assessmentBonus',
- key: 'assessmentBonus',
- fixed: 'right',
- render: (text: any, record: any) => {
- if(ifBanAllAction)return text
- return (
- <div style={{ display: 'flex', flexDirection: 'row', width: '100%', justifyContent:'flex-start', alignItems: 'center' }}>
- <div style={{ height: 16, display: 'flex', flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }}>
- {
- editTableCellId == record.id ? <Input size='small' defaultValue={record.assessmentBonus} width={80} placeholder='请输入' onChange={(e) => { set_inputSalaryNum(Number(e.target.value)) }} style={{ width: '80px' }} /> : <span>{formatMoneyNumber(text)}</span>
- }
- </div>
- {auditType == '0' && <img onClick={() => editHandle(record)} style={{ width: 16, height: 16, cursor: 'pointer', marginLeft: 8 }} src={editTableCellId == record.id ? conformIcon : editIcon} alt="" />}
- </div>
- )
- }
- },]} request={(params, sort, filter) => getPageData(currentComputeDate, params, sort, filter)} />}
- </BMSPagecontainer>
- )
- }
- export default PersonnelSalaryBudget;
|