财务管理系统|基于Springboot开发实现公司财务管理系统

Posted 编程指南针

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了财务管理系统|基于Springboot开发实现公司财务管理系统相关的知识,希望对你有一定的参考价值。

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-XX-169

2022年疫情期间带队开发的一套企业财务管理系统,成功交付,下面展示一下系统的相关功能说明与实现。

一,项目简介

当今社会,随着软硬件技术的急速发展,计算机在我们生活中的方方面面都发挥着越来越重要的作用。企业的管理模式也随着科技进步逐渐智能化,人性化。随着企业规模越来越庞大,部门越来越多,公司财务的管理越来越复杂,以前古老的人工财务管理已经远远无法满足现代企业的财务管理的需求,财务审核各种报销审批,工资结算时效率低下,还特别容易出错,同时很多账目都难以查询,而且纸质账目容易丢失损坏,对于账目的保存也特别麻烦。而作为财务管理工作的核心就是最简单的资金流通,如果想要在资金的流通与使用过程中更好的应用并且合理的调配是离不开一个好的财务管理系统的。

本次设计的公司财务系统不仅可以管理资金,它还能进行企业财务帐目、企业资金帐户、企业收支状况等方面的管理。各部门领导也可通过此系统提交部门年度预算,审核员工的报销,更好的把公司各个部门的资金流动贯穿起来,使资金流动更加透明,更加容易查询。通过各部门的严格审批,也同时防止了资金的去向不明等情况的发生,使公司能更快更平稳的发展。

本系统是基于SpringBoot的公司财务系统,初步分为四个部分。管理员,财务,部门领导以及普通员工。系统有着完备的用户角色权限管理功能,可以自主分配用户角色和功能,具体功能权限可以具体到菜单级别的CRUD操作。

财务:

报销管理:财务可修改报销种类供员工报销,当部门领导审核普通员工报销后,财务进行二审,财务可根据实际情况通过或驳回报销请求。报销审核通过后,可通过报销号添加报销凭证。

员工工资管理:财务可以通过员工工资管理界面查看员工工资明细,确认情况属实后可发放员工工资。

收支管理:财务可以添加每天的收入和支出详情。

预算管理:财务可以通过审批界面查看各部门领导的部门年度预算,财务可根据实际情况通过或驳回预算请求。 

各部门领导:

提交部门年度预算:部门领导通过对该部门一年规划的研究,制定了年度预算的方案,提交年度的部门预算,财务审核通过后方能提交成功。

审核员工报销:员工提交的各种报销需要其部门领导审核,部门领导可根据实际情况通过或驳回该员工的报销,审核成功后交给财务二审,财务通过后即可给员工报销。

普通员工:

查看系统公告:员工登录后可查看系统公告。

提交报销:员工关于公司的各种花销都可提交报销单,等待部门领导和财务进行审核,审核成功后方可报销。

管理员:

(1)用户管理:管理所有用户,可为所有用户分配角色,设置权限,当用户离职时也可以删除用户,忘记密码时管理员也可以重置密码。

(2)权限管理:管理员可管理所有用户的权限。

(3)部门管理:管理员可以增加,修改,删除部门信息。

(4)登录日志:查看所有用户的登录日志,方便查看。

(5)系统公告:管理员可以添加和编辑系统公告,供用户查看。

 

二,环境介绍

语言环境:Java:  jdk1.8

数据库:mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前端开发技术:Layui+Jquery+html

三,系统展示

后台管理主菜单

 

工资管理:财务可以通过员工工资管理界面查看员工工资明细,情况属实后可发放员工工资

 报销种类管理:添加各类报销种类信息供员工选择

 报销审核:当部门领导一审通过后,由财务最终审核报销申请

 添加凭证:当审核通过时,财务可为该报销添加凭证

预算审核:当部门领导提交部门年度预算时,由财务审核

 

 收支管理:财务添加公司收入和支出的详细信息

统计报表:由财务的收入和支出详情生成收支统计对比表

 

 部门管理:管理员可管理公司部门信息,删除部门时必须无子部门或没有用户在该部门

 

 

权限管理:管理员可以管理用户所有功能权限

角色管理:管理员可为用户添加新角色,可为每个角色分配权限

 

 用户管理:管理所有用户,可为所有用户分配角色,设置权限,当用户离职时也可以删除用户,忘记密码时管理员也可以重置密码

四,核心代码展示

package com.test.base.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 跳转
 *
 */
@Controller
@RequestMapping("/bus")
public class BusinessController 

	/**
	 * 跳转到 工资条
	 */
	@RequestMapping("toCustomerManager")
	public String toCustomerManager() 
		return "business/customer/customerManager";
	
	/**
	 * 跳转到 报销种类
	 */
	@RequestMapping("toProviderManager")
	public String toProviderManager() 
		return "business/provider/providerManager";
	
	/**
	 * 跳转到申请报销
	 */
	@RequestMapping("toGoodsManager")
	public String toGoodsManager() 
		return "business/goods/goodsManager";
	

	/**
	 * 跳转到申请审核
	 */
	@RequestMapping("toVerify")
	public String toVerify() 
		return "business/verify/verify";
	

	/**
	 * 跳转到凭证
	 * @return
	 */
	@RequestMapping("toPinzheng")
	public String toPinzheng() 
		return "business/pinzheng/pinzheng";
	

	@RequestMapping("toAccount")
	public String toAccount() 
		return "business/account/account";
	

	/**
	 * 跳转到报销申请
	 */
	@RequestMapping("toBudgetManager")
	public String toBudgetManager() 
		return "business/budget/budgetManager";
	

	/**
	 * 跳转到审核报销
	 */
	@RequestMapping("toBudgetVerify")
	public String toBudgetVerify() 
		return "business/verify/budgetVerify";
	

	/**
	 * 跳转到收入详情
	 */
	@RequestMapping("toInCome")
	public String toInCome() 
		return "business/crmt/income";
	

	/**
	 * 跳转到支出详情
	 */
	@RequestMapping("toPay")
	public String toPay() 
		return "business/crmt/pay";
	

	/**
	 * 跳转到统计详情
	 */
	@RequestMapping("toEcharts")
	public String toEcharts() 
		return "business/echarts/shan";
	

package com.test.base.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.base.domain.Customer;
import com.test.base.service.CustomerService;
import com.test.base.vo.CustomerVo;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;

/**
 * 员工 工资条 管理
 */
@RestController
@RequestMapping("/customer")
public class CustomerController 

	@Autowired
	private CustomerService customerService;

	/**
	 * 查询  工资条
	 */
	@RequiresPermissions(value = "customer:view")
	@RequestMapping("loadAllCustomer")
	public DataGridView loadAllCustomer(CustomerVo customerVo) 
		IPage<Customer> page = new Page<>(customerVo.getPage(), customerVo.getLimit());
		QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
		queryWrapper.like(StringUtils.isNotBlank(customerVo.getCustomername()), "customername",
				customerVo.getCustomername());
		queryWrapper.like(StringUtils.isNotBlank(customerVo.getPhone()), "phone", customerVo.getPhone());
		queryWrapper.like(StringUtils.isNotBlank(customerVo.getConnectionperson()), "connectionperson",
				customerVo.getConnectionperson());
		this.customerService.page(page, queryWrapper);
		return new DataGridView(page.getTotal(), page.getRecords());
	

	/**
	 * 添加
	 */
	@RequiresPermissions(value = "customer:create")
	@RequestMapping("addCustomer")
	public ResultObj addCustomer(CustomerVo customerVo) 
		try 
			this.customerService.save(customerVo);
			return ResultObj.ADD_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.ADD_ERROR;
		
	

	/**
	 * 修改
	 */
	@RequiresPermissions(value = "customer:update")
	@RequestMapping("updateCustomer")
	public ResultObj updateCustomer(CustomerVo customerVo) 
		try 
			this.customerService.updateById(customerVo);
			return ResultObj.UPDATE_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.UPDATE_ERROR;
		
	

	/**
	 * 删除
	 */
	@RequiresPermissions(value = "customer:delete")
	@RequestMapping("deleteCustomer")
	public ResultObj deleteCustomer(Integer id) 
		try 
			this.customerService.removeById(id);
			return ResultObj.DELETE_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.DELETE_ERROR;
		
	

	/**
	 * 批量删除
	 */
	@RequiresPermissions(value = "customer:batchdelete")
	@RequestMapping("batchDeleteCustomer")
	public ResultObj batchDeleteCustomer(CustomerVo customerVo) 
		try 
			Collection<Serializable> idList = new ArrayList<Serializable>();
			for (Integer id : customerVo.getIds()) 
				idList.add(id);
			
			this.customerService.removeByIds(idList);
			return ResultObj.DELETE_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.DELETE_ERROR;
		
	

package com.test.base.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.base.domain.InCome;
import com.test.base.service.IncomeService;
import com.test.base.vo.*;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.Serializable;
import java.util.*;

/**
 * 收入详情
 */
@RestController
@RequestMapping("/income")
public class IncomeController 

    @Autowired
    private IncomeService incomeService;

    /**
     * 查询
     */
    @RequestMapping("loadAllIncome")
    public DataGridView loadAllIncome(IncomeVo incomeVo) 
        IPage<InCome> page = new Page<>(incomeVo.getPage(), incomeVo.getLimit());
        QueryWrapper<InCome> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(incomeVo.getTitle()), "title", incomeVo.getTitle());
        queryWrapper.like(StringUtils.isNotBlank(incomeVo.getPayway()), "payway", incomeVo.getPayway());
        this.incomeService.page(page, queryWrapper);
        List<InCome> records = page.getRecords();
        return new DataGridView(page.getTotal(), records);
    

    /**
     * 添加
     */
    @RequestMapping("addIncome")
    public ResultObj addIncome(IncomeVo incomeVo) 
        try 
            incomeVo.setTime(new Date());
            this.incomeService.save(incomeVo);
            return ResultObj.ADD_SUCCESS;
         catch (Exception e) 
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        
    

    /**
     * 修改
     */
    @RequestMapping("updateIncome")
    public ResultObj updateIncome(IncomeVo incomeVo) 
        try 
            incomeVo.setTime(new Date());//更新时间字段否则该字段为空,会报错
            this.incomeService.updateById(incomeVo);
            return ResultObj.UPDATE_SUCCESS;
         catch (Exception e) 
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        
    

    /**
     * 删除
     */
    @RequestMapping("deleteIncome")
    public ResultObj deleteIncome(Integer id) 
        try 
            this.incomeService.removeById(id);
            return ResultObj.DELETE_SUCCESS;
         catch (Exception e) 
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        
    

    /**
     * 批量删除
     * @return
     */
    @RequestMapping("batchDeleteIncome")
    public ResultObj batchDeleteCustomer(IncomeVo incomeVo) 
        try 
            Collection<Serializable> idList = new ArrayList<Serializable>();
            for (Integer id : incomeVo.getIds()) 
                idList.add(id);
            
            this.incomeService.removeByIds(idList);
            return ResultObj.DELETE_SUCCESS;
         catch (Exception e) 
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        
    

    /**
     * 收入统计
     * @return
     */
    @RequestMapping("/sumIncome")
    @ResponseBody
    public Double[] sumIncome()
        List<String> list = Arrays.asList("2022-01","2022-02","2022-03","2022-04","2022-05","2022-06","2022-07","2022-08","2022-09","2022-10","2022-11","2022-12");
        Double[] inter = new Double[12];
        for (int i = 0;i < list.size(); i++)
            QueryWrapper<InCome> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("IFNULL( sum(money),0) as sumIncome");
            queryWrapper.like(StringUtils.isNotBlank(list.get(i)), "time", list.get(i));
            InCome income = incomeService.getOne(queryWrapper);
            Double sum = income.getSumIncome();
            if(sum==null)
                inter[i] = 0.0;
            else
                inter[i] = sum;
            
        
        return inter;
    

package com.test.sys.controller;


import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.test.base.domain.Provider;
import com.test.sys.common.Constast;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;
import com.test.sys.common.TreeNode;
import com.test.sys.domain.Dept;
import com.test.sys.service.DeptService;
import com.test.sys.vo.DeptVo;

@RestController
@RequestMapping("/dept")
public class DeptController 

	@Autowired
	private DeptService deptService;
	/**
	 * 加载部门管理左边的部门树的json
	 */
	@RequestMapping("loadDeptManagerLeftTreeJson")
	public DataGridView loadDeptManagerLeftTreeJson(DeptVo deptVo) 
		List<Dept> list = this.deptService.list();
		List<TreeNode> treeNodes=new ArrayList<>();
		for (Dept dept : list) 
			Boolean spread=dept.getOpen()==1?true:false;
			treeNodes.add(new TreeNode(dept.getId(), dept.getPid(), dept.getTitle(), spread));
		
		return new DataGridView(treeNodes);
	

	/**
	 * 查询
	 */
	@RequiresPermissions(value = "dept:view")
	@RequestMapping("loadAllDept")
	public DataGridView loadAllDept(DeptVo deptVo) 
		IPage<Dept> page=new Page<>(deptVo.getPage(), deptVo.getLimit());
		QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
		queryWrapper.like(StringUtils.isNotBlank(deptVo.getTitle()), "title", deptVo.getTitle());
		queryWrapper.like(StringUtils.isNotBlank(deptVo.getAddress()), "address", deptVo.getAddress());
		queryWrapper.like(StringUtils.isNotBlank(deptVo.getRemark()), "remark", deptVo.getRemark());
		queryWrapper.eq(deptVo.getId()!=null, "id", deptVo.getId()).or().eq(deptVo.getId()!=null,"pid", deptVo.getId());
		queryWrapper.orderByAsc("ordernum");
		this.deptService.page(page, queryWrapper);
		return new DataGridView(page.getTotal(), page.getRecords());
	

	/**
	 * 加载最大的排序码
	 */
	@RequestMapping("loadDeptMaxOrderNum")
	public Map<String,Object> loadDeptMaxOrderNum()
		Map<String, Object> map=new HashMap<String, Object>();

		QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
		queryWrapper.orderByDesc("ordernum");
		IPage<Dept> page=new Page<>(1, 1);
		List<Dept> list = this.deptService.page(page, queryWrapper).getRecords();
		if(list.size()>0) 
			map.put("value", list.get(0).getOrdernum()+1);
		else 
			map.put("value", 1);
		
		return map;
	
	/**
	 * 添加
	 * @param deptVo
	 * @return
	 */
	@RequiresPermissions(value = "dept:create")
	@RequestMapping("addDept")
	public ResultObj addDept(DeptVo deptVo) 
		try 
			deptVo.setCreatetime(new Date());
			this.deptService.save(deptVo);
			return ResultObj.ADD_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.ADD_ERROR;
		
	


	/**
	 * 修改
	 * @param deptVo
	 * @return
	 */
	@RequiresPermissions(value = "dept:update")
	@RequestMapping("updateDept")
	public ResultObj updateDept(DeptVo deptVo) 
		try 
			this.deptService.updateById(deptVo);
			return ResultObj.UPDATE_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.UPDATE_ERROR;
		
	


	/**
	 * 查询当前的ID的部门有没有子部门
	 */
	@RequestMapping("checkDeptHasChildrenNode")
	public Map<String,Object> checkDeptHasChildrenNode(DeptVo deptVo)
		Map<String, Object> map=new HashMap<String, Object>();

		QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
		queryWrapper.eq("pid", deptVo.getId());
		List<Dept> list = this.deptService.list(queryWrapper);
		if(list.size()>0) 
			map.put("value", true);
		else 
			map.put("value", false);
		
		return map;
	

	/**
	 * 删除
	 * @param deptVo
	 * @return
	 */
	@RequiresPermissions(value = "dept:delete")
	@RequestMapping("deleteDept")
	public ResultObj deleteDept(DeptVo deptVo) 
		try 
			this.deptService.removeById(deptVo.getId());
			return ResultObj.DELETE_SUCCESS;
		 catch (Exception e) 
			e.printStackTrace();
			return ResultObj.DELETE_ERROR;
		
	

	/**
	 * 加载所有可用的部门
	 */
	@RequestMapping("loadAllDeptForSelect")
	public DataGridView loadAllDeptForSelect() 
		QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
		queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
		List<Dept> list = this.deptService.list(queryWrapper);
		return new DataGridView(list);
	


五,项目总结

财务管理系统正是财务信息化的系统,它不仅对企业的财务计划,财务控制方面有一定作用,在企业的财务运用、财务监督方面也起了很大作用,每个单位里都少不了一个这样的信息化管理系统。一个企业发展的成功与否,同企业内部财务管理的好坏有关。现今,在企业的现实运作中,资金运转贯穿在企业的整个生产经营过程,所以在企业的各项工作中财务管理同样贯穿其中。通过加强企业内部核算,节支降耗才可能实现。财务管理系统是企业信息管理的有效延伸,能更好的把个性化、规范化服务有机的融入到财务管理中去,能推动企业发展。财务管理系统大大方便了企业对财务整理和评估,提高了公司的效率。鉴于体系结构的各种优势,所以此次对企业财务管理系统的开发是十分合适并且有帮助的。同时,该系统的设计思想以经济学的观点作为需求指导,将经济知识和软件开发技术进行有机的结合,它使用方便,方便管理,在数据整合和账目管理方面尤为出色,减轻了财务系统人员的工作负担,也可以在一定程度上帮助公司节省人手,加快工作效率,减少开支。

以上是关于财务管理系统|基于Springboot开发实现公司财务管理系统的主要内容,如果未能解决你的问题,请参考以下文章

「开源」基于SpringBoot+Ant Design Vue开发的物流仓储系统

计算机毕业设计springboot+vue+elementUI公司财务固定资产管理系统

计算机毕业设计springboot+vue大学生个人财务管理系统

基于Javaweb实现企业财务管理系统

计算机毕业设计之java+springboot基于vue的财务管理系统

基于Springboot+Mybatis实现个人理财系统