基于Java+SpringBoot+Vue企业资源规划系统设计与实现

news2024/9/23 9:24:51

 

博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌

博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
✨【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)

目录

一、前言

二、系统设计

1、系统运行环境

2、系统架构设计​编辑

四、数据库设计

1、实体E-R图

1.1、供应商

1.2、用户

1.3、产品

2、数据库表逻辑结构设计

2.1、供应商

2.2、用户

2.3、产品

五、功能截图

1、零售管理模块

1.1、零售出库

1.2、零售退货

2、采购管理模块

2.1、采购订单

2.2、采购入库

2.3、采购退货

3、销售管理模块

3.1、销售订单

3.2、销售出库

3.3、销售退货

4、仓库管理

4.1、组装单编辑界面

5、财务管理

5.1、收入单详情

6、报表查询

6.1、账户统计流水窗口

7、商品管理

7.1、计量单位

8、基本资料

8.1、经手人管理

9、系统管理

9.1、角色管理

六、实现代码

1、用户控制器

2、账户控制器

七、获取源码


一、前言

    企业资源规划系统是一种商业战略,它集成了制造、财务和分销职能,以便实现动态的平衡和优化企业的资源。 企业资源规划系统是一种集成的应用软件包,可以用于平衡制造、分销和财务功能。企业资源规划系统是基于关系型数据库管理系统(relational database management system, RDBMS)、计算机辅助软件工程(computer-aided software engineering, CASE)、第四代程序和客户机/服务器体系架等技术从制造资源计划(manufacturing resource planning, MRP II)演变过来的。当成功地实施了完整的企业资源规划系统之后, 企业资源规划系统允许企业优化业务流程、执行各项必要的管理分析以及快速有地提供决策支持。随着技术的不断进步, 企业资源规划系统不断增强了应对市场变化的能力。

    从系统的角度来看,企业资源规划系统是一个有着自己的目标、组成部分和边界的有机统一的 系统。只有当企业资源规划系统的各个组成部分的运行达到协调一致时,企业资源规划系统才能真正地发 挥出效能。

1企业资源规划系统的目标是改进和流线化企业的内部业务流程,然后 在此基础上提高企业的管理水平、降低成本以及增加效益。一般情况下,在实施企业资源规划系 统时,需要对企业的当前业务流程进行再造

2、企业资源规划系统包括 4 个组成部分:企业资源规划软件、流线化的业务流程、终端用户以及支持企业资源规划软件的硬件和操作系统。

企业资源规划系统的核心是企业资源规划软件企业资源规划软件是一种基于模块的应用程序。每一个软件模块都自动化企业内部 的某个职能领域的业务活动。一般情况下,企业资源规划软件涉及产品计划、零部件采购、库存管 理、产品分销、订单跟踪以及财务管理和人力资源管理等职能。

②流线化的业务流程。管 理学家 Anthony 把企业中的业务流程划分为 3 个层次,即战略计划层、管理控制层和业务 操作层。企业资源规划软件作为一种企业级的管理解决方案,应该支持企业各个层次业务流程的流 线化。实践证明,许多成功的企业资源规划系统正是因为集成了跨职能部门的业务流程而达到了 预期的目标。

③终端用户。企业资源规划系统的终端用户是企业中各个层次的员工,既包括企业 底层的业务人员,也包括企业高层的决策人员和中层的管理人员。

④支持企业资源规划软件的硬件和操作系统。据统计,UNIX 操作系统由于具有高的安全性、可靠的稳定性和强大的网 络功能而成为当前运行企业资源规划软件的主要操作系统。除此之外,Windows 操作系统和 Linux 操作系统也是运行企业资源规划软件的比较常用的操作系统。

3、企业资源规划系统的边界。一般认为,企业资源规划系统的边界小于实施该企业资源规划系统的企业的 边界。相对来说,供应链管理系统、客户关系管理系统和电子商务系统的边界扩展到实施 了这些系统的企业的供应商、合作伙伴和客户。在实践中,如果企业资源规划系统的实施涉及与 企业外部信息系统的集成,那么意味着这种实施内容包括企业资源规划系统和其他系统。

二、系统设计

1、系统运行环境

开发系统:Windows10

架构模式:MVC/前后端分离

JDK版本:Java JDK1.8

开发工具:IDEA

数据库版本: mysql5.7

数据库可视化工具: SQL yog或Navicat for MySQL

服务器:SpringBoot自带 apache tomcat

主要技术:Java、SpringBoot、MyBatis-plus、MySQL、Redis、Html、Vue、Elementui等

2、系统架构设计

 

四、数据库设计

1、实体E-R图

1.1、供应商

 

1.2、用户

 

1.3、产品

 

2、数据库表逻辑结构设计

2.1、供应商

主键、供应商名称、联系人、联系电话、电子邮箱 、备注、是否系统自带 0==系统 1==非系统 、类型 、启用、预收款、期初应收、期初应付、累计应收、累计应付、传真、手机、地址、纳税人识别号、开户行、账号、税率、排序、租户id、删除标记、0未删除、1删除、创建时间、创建人、修改时间、修改人

2.2、用户

主键、用户姓名--例如张三、登录用户名、登陆密码、职位、所属部门、电子邮箱、手机号码、是否为管理者、是否系统自带数据、状态、描述、备注、租户id、创建时间、创建人、修改时间、修改人                                                           

2.3、产品

型号、规格、颜色、单位-单个、备注、图片名称、计量单位Id、保质期天数、基础重量(kg)  、启用、是否开启序列号(0否,1是)、是否开启批号(0否,1是)、租户id、逻辑删除(0未删除,1删除 )、创建时间、创建人、修改时间、修改人     

五、功能截图

1、零售管理模块

1.1、零售出库

1)列表界面

 

2)编辑界面

 

1.2、零售退货

 

2、采购管理模块

2.1、采购订单

 

2.2、采购入库

1)列表

2)编辑界面

 

2.3、采购退货

 

3、销售管理模块

3.1、销售订单

1)列表

 2)详情

 

3.2、销售出库

1)列表

 2)编辑窗口

 

3.3、销售退货

 

4、仓库管理

4.1、组装单编辑界面

 

5、财务管理

5.1、收入单详情

 

6、报表查询

6.1、账户统计流水窗口

7、商品管理

7.1、计量单位

8、基本资料

8.1、经手人管理

 

9、系统管理

9.1、角色管理

1)列表

 2)分配功能

 

六、实现代码

1、用户控制器

@RestController
@RequestMapping(value = "/user")
@Api(tags = {"用户管理"})
public class UserController {
    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @Value("${manage.roleId}")
    private Integer manageRoleId;

    @Resource
    private UserService userService;

    @Resource
    private RoleService roleService;

    @Resource
    private TenantService tenantService;

    @Resource
    private LogService logService;

    @Resource
    private RedisService redisService;

    private static final String TEST_USER = "jsh";
    private static String SUCCESS = "操作成功";
    private static String ERROR = "操作失败";
    private static final String HTTP = "http://";
    private static final String CODE_OK = "200";
    private static final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";

    @PostMapping(value = "/login")
    @ApiOperation(value = "登录")
    public BaseResponseInfo login(@RequestBody User userParam,
                        HttpServletRequest request)throws Exception {
        logger.info("============用户登录 login 方法调用开始==============");
        String msgTip = "";
        User user=null;
        BaseResponseInfo res = new BaseResponseInfo();
        try {

            String loginName = userParam.getLoginName().trim();
            String password = userParam.getPassword().trim();
            //判断用户是否已经登录过,登录过不再处理
            Object userId = redisService.getObjectFromSessionByKey(request,"userId");
            if (userId != null) {
                logger.info("====用户已经登录过, login 方法调用结束====");
                msgTip = "user already login";
            }
            //获取用户状态
            int userStatus = -1;
            try {
                redisService.deleteObjectBySession(request,"userId");
                userStatus = userService.validateUser(loginName, password);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(">>>>>>>>>>>>>用户  " + loginName + " 登录 login 方法 访问服务层异常====", e);
                msgTip = "access service exception";
            }
            String token = UUID.randomUUID().toString().replaceAll("-", "") + "";
            switch (userStatus) {
                case ExceptionCodeConstants.UserExceptionCode.USER_NOT_EXIST:
                    msgTip = "user is not exist";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.USER_PASSWORD_ERROR:
                    msgTip = "user password error";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.BLACK_USER:
                    msgTip = "user is black";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.USER_ACCESS_EXCEPTION:
                    msgTip = "access service error";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.BLACK_TENANT:
                    msgTip = "tenant is black";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.EXPIRE_TENANT:
                    msgTip = "tenant is expire";
                    break;
                case ExceptionCodeConstants.UserExceptionCode.USER_CONDITION_FIT:
                    msgTip = "user can login";
                    //验证通过 ,可以登录,放入session,记录登录日志
                    user = userService.getUserByLoginName(loginName);
                    if(user.getTenantId()!=null) {
                        token = token + "_" + user.getTenantId();
                    }
                    redisService.storageObjectBySession(token,"userId",user.getId());
                    if(user.getTenantId()!=null) {
                        Tenant tenant = tenantService.getTenantByTenantId(user.getTenantId());
                        if(tenant!=null) {
                            Long tenantId = tenant.getTenantId();
                            Integer userNumLimit = tenant.getUserNumLimit();
                            if(tenantId!=null) {
                                redisService.storageObjectBySession(token,"userNumLimit",userNumLimit); //用户限制数
                            }
                        }
                    }
                    break;
                default:
                    break;
            }
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("msgTip", msgTip);
            if(user!=null){
                String roleType = userService.getRoleTypeByUserId(user.getId()).getType(); //角色类型
                redisService.storageObjectBySession(token,"roleType",roleType);
                redisService.storageObjectBySession(token,"clientIp", Tools.getLocalIp(request));
                logService.insertLogWithUserId(user.getId(), user.getTenantId(), "用户",
                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_LOGIN).append(user.getLoginName()).toString(),
                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
                JSONArray btnStrArr = userService.getBtnStrArrById(user.getId());
                data.put("token", token);
                data.put("user", user);
                //用户的按钮权限
                if(!"admin".equals(user.getLoginName())){
                    data.put("userBtn", btnStrArr);
                }
                data.put("roleType", roleType);
            }
            res.code = 200;
            res.data = data;
            logger.info("===============用户登录 login 方法调用结束===============");
        } catch(Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
            res.code = 500;
            res.data = "用户登录失败";
        }
        return res;
    }

    @GetMapping(value = "/getUserSession")
    @ApiOperation(value = "获取用户信息")
    public BaseResponseInfo getSessionUser(HttpServletRequest request)throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<>();
            Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
            User user = userService.getUser(userId);
            user.setPassword(null);
            data.put("user", user);
            res.code = 200;
            res.data = data;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取session失败";
        }
        return res;
    }

    @GetMapping(value = "/logout")
    @ApiOperation(value = "退出")
    public BaseResponseInfo logout(HttpServletRequest request, HttpServletResponse response)throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            redisService.deleteObjectBySession(request,"userId");
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "退出失败";
        }
        return res;
    }

    @PostMapping(value = "/resetPwd")
    @ApiOperation(value = "重置密码")
    public String resetPwd(@RequestBody JSONObject jsonObject,
                                     HttpServletRequest request) throws Exception {
        Map<String, Object> objectMap = new HashMap<>();
        Long id = jsonObject.getLong("id");
        String password = "123456";
        String md5Pwd = Tools.md5Encryp(password);
        int update = userService.resetPwd(md5Pwd, id);
        if(update > 0) {
            return returnJson(objectMap, SUCCESS, ErpInfo.OK.code);
        } else {
            return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
        }
    }

    @PutMapping(value = "/updatePwd")
    @ApiOperation(value = "更新密码")
    public String updatePwd(@RequestBody JSONObject jsonObject, HttpServletRequest request)throws Exception {
        Integer flag = 0;
        Map<String, Object> objectMap = new HashMap<String, Object>();
        try {
            String info = "";
            Long userId = jsonObject.getLong("userId");
            String oldpwd = jsonObject.getString("oldpassword");
            String password = jsonObject.getString("password");
            User user = userService.getUser(userId);
            //必须和原始密码一致才可以更新密码
            if (oldpwd.equalsIgnoreCase(user.getPassword())) {
                user.setPassword(password);
                flag = userService.updateUserByObj(user); //1-成功
                info = "修改成功";
            } else {
                flag = 2; //原始密码输入错误
                info = "原始密码输入错误";
            }
            objectMap.put("status", flag);
            if(flag > 0) {
                return returnJson(objectMap, info, ErpInfo.OK.code);
            } else {
                return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
            }
        } catch (Exception e) {
            logger.error(">>>>>>>>>>>>>修改用户ID为 : " + jsonObject.getLong("userId") + "密码信息失败", e);
            flag = 3;
            objectMap.put("status", flag);
            return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
        }
    }

    /**
     * 获取全部用户数据列表
     * @param request
     * @return
     */
    @GetMapping(value = "/getAllList")
    @ApiOperation(value = "获取全部用户数据列表")
    public BaseResponseInfo getAllList(HttpServletRequest request)throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<String, Object>();
            List<User> dataList = userService.getUser();
            if(dataList!=null) {
                data.put("userList", dataList);
            }
            res.code = 200;
            res.data = data;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取失败";
        }
        return res;
    }

    /**
     * 用户列表,用于用户下拉框
     * @param request
     * @return
     * @throws Exception
     */
    @GetMapping(value = "/getUserList")
    @ApiOperation(value = "用户列表")
    public JSONArray getUserList(HttpServletRequest request)throws Exception {
        JSONArray dataArray = new JSONArray();
        try {
            List<User> dataList = userService.getUser();
            if (null != dataList) {
                for (User user : dataList) {
                    JSONObject item = new JSONObject();
                    item.put("id", user.getId());
                    item.put("userName", user.getUsername());
                    dataArray.add(item);
                }
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        return dataArray;
    }

    /**
     * 
     * description:
     *  新增用户及机构和用户关系
     * @Param: beanJson
     * @return java.lang.Object
     */
    @PostMapping("/addUser")
    @ApiOperation(value = "新增用户")
    @ResponseBody
    public Object addUser(@RequestBody JSONObject obj, HttpServletRequest request)throws Exception{
        JSONObject result = ExceptionConstants.standardSuccess();
        Long userNumLimit = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userNumLimit").toString());
        Long count = userService.countUser(null,null);
        if(count>= userNumLimit) {
            throw new BusinessParamCheckingException(ExceptionConstants.USER_OVER_LIMIT_FAILED_CODE,
                    ExceptionConstants.USER_OVER_LIMIT_FAILED_MSG);
        } else {
            UserEx ue= JSONObject.parseObject(obj.toJSONString(), UserEx.class);
            userService.addUserAndOrgUserRel(ue, request);
        }
        return result;
    }

    /**
     * 
     * description:
     *  修改用户及机构和用户关系
     * @Param: beanJson
     * @return java.lang.Object
     */
    @PutMapping("/updateUser")
    @ApiOperation(value = "修改用户")
    @ResponseBody
    public Object updateUser(@RequestBody JSONObject obj, HttpServletRequest request)throws Exception{
        JSONObject result = ExceptionConstants.standardSuccess();
        UserEx ue= JSONObject.parseObject(obj.toJSONString(), UserEx.class);
        userService.updateUserAndOrgUserRel(ue, request);
        return result;
    }

    /**
     * 注册用户
     * @param ue
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/registerUser")
    @ApiOperation(value = "注册用户")
    public Object registerUser(@RequestBody UserEx ue,
                               HttpServletRequest request)throws Exception{
        JSONObject result = ExceptionConstants.standardSuccess();
        ue.setUsername(ue.getLoginName());
        userService.checkUserNameAndLoginName(ue); //检查用户名和登录名
        ue = userService.registerUser(ue,manageRoleId,request);
        return result;
    }

    /**
     * 获取机构用户树
     * @return
     * @throws Exception
     */
    @RequestMapping("/getOrganizationUserTree")
    @ApiOperation(value = "获取机构用户树")
    public JSONArray getOrganizationUserTree()throws Exception{
        JSONArray arr=new JSONArray();
        List<TreeNodeEx> organizationUserTree= userService.getOrganizationUserTree();
        if(organizationUserTree!=null&&organizationUserTree.size()>0){
            for(TreeNodeEx node:organizationUserTree){
                String str=JSON.toJSONString(node);
                JSONObject obj=JSON.parseObject(str);
                arr.add(obj) ;
            }
        }
        return arr;
    }

    @GetMapping(value = "/getCurrentPriceLimit")
    @ApiOperation(value = "查询当前用户的价格屏蔽")
    public BaseResponseInfo getCurrentPriceLimit(HttpServletRequest request)throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<>();
            String priceLimit = roleService.getCurrentPriceLimit(request);
            data.put("priceLimit", priceLimit);
            res.code = 200;
            res.data = data;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取session失败";
        }
        return res;
    }

    /**
     * 获取当前用户的角色类型
     * @param request
     * @return
     */
    @GetMapping("/getRoleTypeByCurrentUser")
    @ApiOperation(value = "获取当前用户的角色类型")
    public BaseResponseInfo getRoleTypeByCurrentUser(HttpServletRequest request) {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<String, Object>();
            String roleType = redisService.getObjectFromSessionByKey(request,"roleType").toString();
            data.put("roleType", roleType);
            res.code = 200;
            res.data = data;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取失败";
        }
        return res;
    }

    /**
     * 获取随机校验码
     * @param response
     * @param key
     * @return
     */
    @GetMapping(value = "/randomImage/{key}")
    @ApiOperation(value = "获取随机校验码")
    public BaseResponseInfo randomImage(HttpServletResponse response,@PathVariable String key){
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<>();
            String codeNum = Tools.getCharAndNum(4);
            String base64 = RandImageUtil.generate(codeNum);
            data.put("codeNum", codeNum);
            data.put("base64", base64);
            res.code = 200;
            res.data = data;
        } catch (Exception e) {
            e.printStackTrace();
            res.code = 500;
            res.data = "获取失败";
        }
        return res;
    }

    /**
     * 批量设置状态-启用或者禁用
     * @param jsonObject
     * @param request
     * @return
     */
    @PostMapping(value = "/batchSetStatus")
    @ApiOperation(value = "批量设置状态")
    public String batchSetStatus(@RequestBody JSONObject jsonObject,
                                 HttpServletRequest request)throws Exception {
        Byte status = jsonObject.getByte("status");
        String ids = jsonObject.getString("ids");
        Map<String, Object> objectMap = new HashMap<>();
        int res = userService.batchSetStatus(status, ids, request);
        if(res > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        } else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 获取当前用户的用户数量和租户信息
     * @param request
     * @return
     */
    @GetMapping(value = "/infoWithTenant")
    @ApiOperation(value = "获取当前用户的用户数量和租户信息")
    public BaseResponseInfo randomImage(HttpServletRequest request){
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> data = new HashMap<>();
            Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
            User user = userService.getUser(userId);
            //获取当前用户数
            int userCurrentNum = userService.getUser().size();
            Tenant tenant = tenantService.getTenantByTenantId(user.getTenantId());
            data.put("type", tenant.getType()); //租户类型,0免费租户,1付费租户
            data.put("expireTime", Tools.parseDateToStr(tenant.getExpireTime()));
            data.put("userCurrentNum", userCurrentNum);
            data.put("userNumLimit", tenant.getUserNumLimit());
            res.code = 200;
            res.data = data;
        } catch (Exception e) {
            e.printStackTrace();
            res.code = 500;
            res.data = "获取失败";
        }
        return res;
    }
}

2、账户控制器

/**
 * @author CeaM
 */
@RestController
@RequestMapping(value = "/account")
@Api(tags = {"账户管理"})
public class AccountController {
    private Logger logger = LoggerFactory.getLogger(AccountController.class);

    @Resource
    private AccountService accountService;

    /**
     * 查找结算账户信息-下拉框
     * @param request request
     * @return String
     */
    @GetMapping(value = "/findBySelect")
    @ApiOperation(value = "查找结算账户信息-下拉框")
    public String findBySelect(HttpServletRequest request) throws Exception {
        String res = null;
        try {
            List<Account> dataList = accountService.findBySelect();
            //存放数据json数组
            JSONArray dataArray = new JSONArray();
            if (null != dataList) {
                for (Account account : dataList) {
                    JSONObject item = new JSONObject();
                    item.put("Id", account.getId());
                    //结算账户名称
                    item.put("AccountName", account.getName());
                    dataArray.add(item);
                }
            }
            res = dataArray.toJSONString();
        } catch(Exception e){
            e.printStackTrace();
            res = "获取数据失败";
        }
        return res;
    }

    /**
     * 获取所有结算账户
     * @param request request
     * @return BaseResponseInfo
     */
    @GetMapping(value = "/getAccount")
    @ApiOperation(value = "获取所有结算账户")
    public BaseResponseInfo getAccount(HttpServletRequest request) throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            List<Account> accountList = accountService.getAccount();
            map.put("accountList", accountList);
            res.code = 200;
            res.data = map;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取数据失败";
        }
        return res;
    }

    /**
     * 账户流水信息
     * @param currentPage currentPage
     * @param pageSize pageSize
     * @param accountId accountId
     * @param initialAmount initialAmount
     * @param request request
     * @return BaseResponseInfo
     */
    @GetMapping(value = "/findAccountInOutList")
    @ApiOperation(value = "账户流水信息")
    public BaseResponseInfo findAccountInOutList(@RequestParam("currentPage") Integer currentPage,
                                                 @RequestParam("pageSize") Integer pageSize,
                                                 @RequestParam("accountId") Long accountId,
                                                 @RequestParam("initialAmount") BigDecimal initialAmount,
                                                 HttpServletRequest request) throws Exception{
        BaseResponseInfo res = new BaseResponseInfo();
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            List<AccountVo4InOutList> dataList = accountService.findAccountInOutList(accountId, (currentPage-1)*pageSize, pageSize);
            int total = accountService.findAccountInOutListCount(accountId);
            map.put("total", total);
            //存放数据json数组
            JSONArray dataArray = new JSONArray();
            if (null != dataList) {
                for (AccountVo4InOutList aEx : dataList) {
                    String type = aEx.getType().replace("其它", "");
                    aEx.setType(type);
                    String timeStr = aEx.getOperTime().toString();
                    BigDecimal balance = accountService.getAccountSum(accountId, timeStr, "date").add(accountService.getAccountSumByHead(accountId, timeStr, "date"))
                            .add(accountService.getAccountSumByDetail(accountId, timeStr, "date")).add(accountService.getManyAccountSum(accountId, timeStr, "date")).add(initialAmount);
                    aEx.setBalance(balance);
                    aEx.setAccountId(accountId);
                    dataArray.add(aEx);
                }
            }
            map.put("rows", dataArray);
            res.code = 200;
            res.data = map;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取数据失败";
        }
        return res;
    }

    /**
     * 更新默认账户
     * @param object object
     * @param request request
     * @return String
     * @throws Exception Exception
     */
    @PostMapping(value = "/updateIsDefault")
    @ApiOperation(value = "更新默认账户")
    public String updateIsDefault(@RequestBody JSONObject object,
                                       HttpServletRequest request) throws Exception{
        Long accountId = object.getLong("id");
        Map<String, Object> objectMap = new HashMap<>();
        int res = accountService.updateIsDefault(accountId);
        if(res > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        } else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 结算账户的统计
     * @param request request
     * @return BaseResponseInfo
     */
    @GetMapping(value = "/getStatistics")
    @ApiOperation(value = "结算账户的统计")
    public BaseResponseInfo getStatistics(@RequestParam("name") String name,
                                          @RequestParam("serialNo") String serialNo,
                                          HttpServletRequest request) throws Exception {
        BaseResponseInfo res = new BaseResponseInfo();
        try {
            Map<String, Object> map = accountService.getStatistics(name, serialNo);
            res.code = 200;
            res.data = map;
        } catch(Exception e){
            e.printStackTrace();
            res.code = 500;
            res.data = "获取数据失败";
        }
        return res;
    }

    /**
     * 批量设置状态-启用或者禁用
     * @param jsonObject jsonObject
     * @param request request
     * @return String
     */
    @PostMapping(value = "/batchSetStatus")
    @ApiOperation(value = "批量设置状态")
    public String batchSetStatus(@RequestBody JSONObject jsonObject,
                                 HttpServletRequest request)throws Exception {
        Boolean status = jsonObject.getBoolean("status");
        String ids = jsonObject.getString("ids");
        Map<String, Object> objectMap = new HashMap<>();
        int res = accountService.batchSetStatus(status, ids);
        if(res > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        } else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }
}

七、获取源码

 大家点赞收藏关注评论啦 、关注下方公众号获取联系方式👇🏻👇🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源项目介绍

文章目录简介经验casdoorkeycloaklatexopenMP简介 不经常见的开源项目&#xff0c;第一次接触。 经验 如果是已经开源的软件&#xff0c;使用起来非常的平稳&#xff0c;问题也少。原因是已经经过了多年的历练&#xff0c;已经稳当下来&#xff0c;该发现的问题已经解决的差…

unplugin-vue-components 不能识别组件的自动导入的类型 (pnpm)

引言 unplugin-vue-components 是一款能帮助组件自动导入的库&#xff0c;简单点的说&#xff0c;你不需要使用import xx from xxx.vue 这行语句也能实现导入的效果。 <script setup lang"ts"> import ScreenAdpter from compontents/ScreenAdpter/index.vue i…

[前端笔记——多媒体与嵌入] 6.HTML 中的图片+视频+音频内容

[前端笔记——HTML介绍] 6.HTML 中的图片1.HTML中的图片1.1怎样将一幅图片放到网页上&#xff1f;1.2备选文本1.3宽度和高度1.4.Image titles 图片标题1.5通过为图片搭配说明文字的方式来解说图片1.6CSS背景图片2.视频和音频内容2.1Web中的视频和音频2.1.1<video>元素2.1…

在linux中部署SpringBoot+Vue前后端分离应用

最近有任务需求&#xff0c;自己在linux中通过docker虚拟环境的方式部署了SpringBoot和Vue前后端分离的项目&#xff0c;现在做点总结&#xff0c;给需要的小伙伴分享。不足之处多多指正。关于在linux中安装docker&#xff0c;可以查看博主前几篇博客按照步骤进行安装&#xff…

【JUC系列】ReentrantLock实现本地锁的源码分析

使用场景 public class ReentrantLockTest {private static ReentrantLock lock new ReentrantLock();public static void main(String[] args) {new Thread(()->{lock.lock();// do somethingSystem.out.println("111");try {Thread.sleep(Integer.MAX_VALUE);…

[ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择

前几天看到一个问答帖&#xff0c;我回答完了才发现这个帖子居然是去年的也没人回复&#xff0c;其中他问了一些华为云的问题&#xff0c;对于其中的一些概念&#xff0c;这里来总结讲解一下&#xff0c;希望对学习华为云的小伙伴有所帮助。 文章目录区域&#xff08;Region&am…

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划

岁末年初&#xff0c;在开源领域刚埋下一颗生机勃勃的种子的 Tapdata&#xff0c;想和正在关注我们的开发者&#xff0c;聊聊这一年的进展和新一年的共建计划。 2022年4月&#xff0c;Tapdata 宣布开源 PDK&#xff08;Plugin Development Kit&#xff09;&#xff0c;将自身的…

前端js实现文件多次添加累加上传和选择删除(django+js)- 添加累加文件上传 (一)

前言 原本的多文件上传功能在选择文件时&#xff0c;只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件&#xff0c;这样选择文件很不灵活&#xff0c;而且在确定之后如果漏选了文件&#xff0c;再次点击上传按钮时会清空表单里的文件信息&#xff0c;只能重复之前的操…

数据库mysql调优

问题描述: mysql dba在mysql服务端启用了连接在空闲一定时间 (10分钟) 后&#xff0c;就自动关闭连接(连接失效)的功能&#xff0c;导致java端连接池在空闲一段时间后&#xff0c;连接被自动关闭(自动失效)。为了避免这种情况出现&#xff0c;可以在dbcp上配置空闲的时候检测连…

PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?

搞硬件或通信的“攻城狮”们&#xff0c;免不了要和各种通信协议及接口打交道。比如&#xff0c;我们经常接触PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2(NGFF)、Add-in Card这些概念&#xff0c;作为“攻城狮”队伍中的一员&#xff0c;你搞清楚它们之间的关系了吗&…

Python爬虫教你爬取csdn作者排行榜

(一)两种爬取方式介绍 1.自动化测试工具 安装好驱动(以前的selenium文章有教程),然后进行元素定位&#xff0c;最后数据提取&#xff0c;用xls表格进行持久化存储 2.requests库 利用基本方法发起请求&#xff0c;获得json数据进行持久化存储 本篇文章先讲解第二种&#xf…

洛谷——树与图dp与状压dp

文章目录[NOIP1996 提高组] 挖地雷题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码最大食物链计数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码[ZJOI2006]三色二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #…

浅说 INSERT/块参照/BlockReference

在AutoCAD中使用INSERT命令插入一个块时&#xff0c;生成块参照实体&#xff0c;也叫INSERT实体&#xff0c;在ObjectARX中&#xff0c;对应类AcDbBlockReference。反正就这么一个东西&#xff0c;名儿还挺多&#xff0c;我家乡有句话叫“二嫚她婆婆俩名”&#xff0c;莫非这是…

数据结构(5) treap

活动 - AcWing 参考—《算法竞赛进阶指南》-lyd 目录 一、概述 二、具体操作详解 1.常见操作 2.结构定义 3.操作基础函数 &#xff08;1&#xff09;pushup &#xff08;2&#xff09; 获得一个新节点 &#xff08;3&#xff09;左旋右旋 &#xff08;4&#xff09;建…

centos上面用docker 安装nacos 1.4.1

方式一&#xff1a; 下载nacos本地文件 1. 去官网下载GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.2.上传到Linux服务器中cd /usr/uploadtar -zxvf nacos-serv…

二、QML工程之初始工程代码分析

接着上一讲&#xff0c;当建立完工程之后&#xff0c;IDE 会呈现如下的界面下面的代码是main.cpp&#xff0c;工程起始运行的代码段&#xff0c;具体的函数说明都在代码段里面进行了标注。#include <QGuiApplication> //主要是ui进程运行头函数&#xff0c;包含事件循环&…

【云原生】k8s图形化管理工具之rancher

内容预知 前言 1. Rancher的相关知识 1.1 Rancher的简介 1.2 Rancher与k8s的关系及区别 1.3 Rancher具有的优势 2. Rancher的安装部署 2.1 实验环境与部署图分配 2.2 具体的部署操作 &#xff08;1&#xff09;在 rancher 节点下载 rancher 镜像 &#xff08;2&#xff…

【Spring(七)】详细了解Spring的核心容器

文章目录前言容器总结前言 前面我们完成bean以及依赖注入的相关学习&#xff0c;现在我们进入到核心容器的最后一块内容了&#xff0c;也就是与容器相关操作的学习&#x1f388;&#x1f388;。 容器 前边我们获取容器是这样获取的&#x1f447;&#x1f447;。 这只是获取容器…

Vue CLI脚手架

1、Vue的开发模式 目前我们使用vue的过程都是在html文件中&#xff0c;通过template编写自己的模板、脚本逻辑、样式等。 但是随着项目越来越复杂&#xff0c;我们会采用组件化的方式来进行开发&#xff1a; 这就意味着每个组件都会有自己的模板、脚本逻辑、样式等&#xff…

凌恩生物报告升级,科研美图助力群落互作机制研究

2022年&#xff0c;在多位技术支持与生信工程师的通力合作下凌恩生物报告升级重磅升级&#xff01;扩增子分析流程项目从60到120&#xff0c;可谓是加量不加价的超值更新了&#xff01;结题报告的结果图片可直接用于文章发表&#xff0c;快一起来看看&#xff01;小小的举个例子…