index.tsx 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2023-01-03 14:20:22
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-05-30 10:42:29
  6. * @FilePath: /BudgetManaSystem/src/pages/budgetMana/personnelSalaryBudget/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import BMSPagecontainer from '@/components/BMSPageContainer'
  10. import { BMSTable } from '@/components/BMSTable';
  11. import { getComputeDate } from '@/pages/Home/service';
  12. import { createFromIconfontCN } from '@ant-design/icons';
  13. import { ActionType, ProColumns } from '@ant-design/pro-components';
  14. import { Input, InputNumber, message, Modal } from 'antd';
  15. import React, { useEffect, useRef, useState } from 'react'
  16. import { caculate, checkRequest, generate, getCurrentCheckStatus, getData } from './service';
  17. import './style.less';
  18. import '../../../utils/zhongtaiB'
  19. const IconFont = createFromIconfontCN({
  20. scriptUrl: '',
  21. });
  22. const PersonnelSalaryBudget = () => {
  23. const [auditType, set_auditType] = useState('0');
  24. const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
  25. const [pageData,set_pageData] = useState({
  26. rate:0,income:0,personalCost:0,cost:0
  27. });
  28. const tableRef = useRef<ActionType>();
  29. const [loading,set_loading] = useState(false);
  30. const tableColumn = [
  31. {
  32. title: '职类',
  33. dataIndex: 'unitTypeName',
  34. key: 'unitTypeName',
  35. },
  36. {
  37. title: '合理编制比例',
  38. dataIndex: 'staffRate',
  39. key: 'staffRate',
  40. },
  41. {
  42. title: '合理人均薪酬系数',
  43. dataIndex: 'averageSalary',
  44. key: 'averageSalary',
  45. },
  46. {
  47. title: '人事成本占比',
  48. dataIndex: 'percent',
  49. key: 'percent',
  50. },
  51. {
  52. title: '人事成本',
  53. dataIndex: 'cost',
  54. key: 'cost',
  55. },
  56. {
  57. title: '固定工资',
  58. dataIndex: 'salary',
  59. key: 'salary',
  60. },
  61. {
  62. title: '专项补助',
  63. dataIndex: 'subsidies',
  64. key: 'subsidies',
  65. },
  66. {
  67. title: '变动薪酬',
  68. dataIndex: 'variableCompensation',
  69. key: 'variableCompensation',
  70. },
  71. {
  72. title: '考核奖金',
  73. dataIndex: 'assessmentBonus',
  74. key: 'assessmentBonus',
  75. },
  76. ]
  77. const getPageData = async (currentComputeDate:string, params: any, sort: any, filter: any) => {
  78. const resp = await getData(currentComputeDate);
  79. if(resp){
  80. set_pageData({
  81. rate:resp.rate,
  82. income:resp.income,
  83. personalCost:resp.personalCost,
  84. cost:resp.cost
  85. });
  86. return {
  87. data: resp.detail,
  88. success: true,
  89. }
  90. }
  91. return []
  92. }
  93. const checkHandle = async (type: string) => {
  94. const resp = await checkRequest({
  95. computeDate: currentComputeDate as string,
  96. auditType: type == '0' ? '1' : '0', //审核类型 1审核 0取消审核
  97. });
  98. if (resp) {
  99. if (type == '0') {
  100. message.success('审核提交成功!');
  101. set_auditType('1');
  102. }
  103. if (type == '1') {
  104. message.success('取消审核提交成功!');
  105. set_auditType('0');
  106. }
  107. }
  108. }
  109. const getCurrentComputeDate = async () => {
  110. const resp = await getComputeDate();
  111. set_currentComputeDate(resp);
  112. }
  113. const getCheckStatus = async (computeDate: string) => {
  114. const resp = await getCurrentCheckStatus(computeDate);
  115. if (resp) {
  116. set_auditType(`${resp}`); //0 未审核 1 已审核
  117. }
  118. }
  119. // const generateFunc =async (computeDate:string) => {
  120. // const resp = await generate(computeDate);
  121. // }
  122. const confirmGenerateHandle = async (index:number)=>{
  123. if(index == 1){
  124. const resp = await generate(currentComputeDate as string);
  125. if(resp){
  126. message.success('生成完成!');
  127. tableRef.current?.reload();
  128. }
  129. }
  130. if(index == 2){
  131. const resp = await caculate({
  132. computeDate:currentComputeDate as string,
  133. ...pageData
  134. });
  135. if(resp){
  136. message.success('计算完成!');
  137. tableRef.current?.reload();
  138. }
  139. }
  140. }
  141. const generateFunc = (index: number) => {
  142. /**
  143. * index == 1 生成 2 计算
  144. *
  145. */
  146. if(auditType == '1'){
  147. Modal.confirm({
  148. title: '注意',
  149. cancelText: '',
  150. closable: true,
  151. content: '当前处于审核状态无法操作!',
  152. });
  153. return;
  154. }
  155. Modal.confirm({
  156. title: '注意',
  157. cancelText: '',
  158. closable: true,
  159. content: index == 1 ? '生成后需重新计算数据,确定要进行生成操作?' : '计算会覆盖原有数据,确定要继续计算操作?',
  160. onOk: () => {set_loading(true); confirmGenerateHandle(index) }
  161. });
  162. }
  163. useEffect(()=>{
  164. currentComputeDate&&getCheckStatus(currentComputeDate);
  165. },[currentComputeDate]);
  166. useEffect(() => {
  167. getCurrentComputeDate();
  168. }, []);
  169. return (
  170. <BMSPagecontainer className='PersonnelSalaryBudget' title={`核算年月:${currentComputeDate}`} ghost>
  171. <div className='checkBtn' onClick={() => checkHandle(`${auditType}`)}>{auditType == '0' ? '审核' : '取消审核'}</div>
  172. <div className='paramsWrap'>
  173. <div className='cardWrap'>
  174. <div className='card'>
  175. <span>收入</span>
  176. <div className='count'>{pageData.income}</div>
  177. </div>
  178. <div className='card'>
  179. <span>成本</span>
  180. <div className='count'>{pageData.cost}</div>
  181. </div>
  182. <div className='card'>
  183. <span>合理人事成本比例系数</span>
  184. <div className='count'>{pageData.rate}</div>
  185. </div>
  186. </div>
  187. <div className='func'>
  188. <div className='title'>
  189. <span className='a'>全院人事成本(D=(A-B)*C)</span>
  190. <span className='btn' onClick={()=>generateFunc(1)}> <IconFont style={{color:'#3376FE'}} type='iconzhongxin' /> 重新生成</span>
  191. </div>
  192. <InputNumber className='input' size='large' min={-10000000} value={pageData.personalCost} placeholder='请输入'
  193. disabled={auditType == '1'}
  194. onChange={(value)=>set_pageData({...pageData,personalCost:value as number})} />
  195. </div>
  196. {/* <div className='midLine'>
  197. <span>手动计算</span>
  198. 根据手动填写的全院人事成本计算出各职系的
  199. </div> */}
  200. </div>
  201. <div className='countBtn' onClick={()=>generateFunc(2)}>计算</div>
  202. <div className='b'>计算结果</div>
  203. {currentComputeDate&&<BMSTable actionRef={tableRef} pagination={false} rowKey='unitType' columns={tableColumn as ProColumns[]} request={(params, sort, filter) => getPageData(currentComputeDate,params, sort, filter)} />}
  204. </BMSPagecontainer>
  205. )
  206. }
  207. export default PersonnelSalaryBudget;