java+mysql+ssm开发的公司财务管理系统

MoneyManager
财务管理系统简介
Bootstrap前端框架, 后端用的是ssm,数据库持久化部分是自己写的

代码已经上传github,下载地址: https://github.com/21503882/companyfinancial-

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

java+mysql+ssm开发的公司财务管理系统

 

 

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

import com.google.gson.Gson;
import com.ming.entity.BillForOut;


import com.ming.entity.Message;
import com.ming.entity.User;
import com.ming.service.BillForInService;
import com.ming.service.BillForOutService;
import com.ming.service.IBillForInService;
import com.ming.service.IBillForOutService;
import com.ming.service.IMessageService;
import com.ming.service.IUserService;
import com.ming.service.MessageService;
import com.ming.service.UserService;
import com.ming.util.Condition;
import com.ming.util.DataUtil;
import com.ming.util.KaptchaUtil;
import com.ming.util.MailUtil;


import com.ming.util.Permission;
import com.ming.util.WebUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class BillForOutAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    
    private static final Gson GSON = new Gson();
    private static final IBillForOutService billForOutService = new BillForOutService();
    private static final IMessageService messageService = new MessageService();
    private static final IUserService userService = new UserService();
    private static final IBillForInService billForInService = new BillForInService();
    
    /* 开始配置数据接收 */
    private String id;
    private String billForOut;
    private int curPage;
    private int limit;
    private String condition;
    private String validCode;
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getBillForOut() {
        return billForOut;
    }

    public void setBillForOut(String billForOut) {
        this.billForOut = billForOut;
    }

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public String getCondition() {
        return condition;
    }

    public void setCondition(String condition) {
        this.condition = condition;
    }

    public String getValidCode() {
        return validCode;
    }

    public void setValidCode(String validCode) {
        this.validCode = validCode;
    }
    /* 结束配置数据接收 */

    /**
     * 读取多条数据
     */
    @Permission
    public void load() {
        try {
            List<Map<String, Object>> datas = billForOutService.loadSpecial(conditionString(), curPage, limit);
            if (datas != null) {
                String json = GSON.toJson(datas);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 获取数据条数
     */
    @Permission
    public void count() {
        try {
            int length = billForOutService.countSpecial(conditionString());
            if (length != -1) {
                String json = "{\"count\":" + length + "}";
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 读取一条数据
     */
    @Permission
    public void loadOne() {
        try {
            String[] params = new String[] {"id", "date", "event", "amount", "payId", "status", "recordId", "createDate", "remark"};
            
            Map<String, Object> data = billForOutService.loadOne(params, "id = '" + id + "'");
            if (data != null) {
                String json = GSON.toJson(data);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 保存一条数据
     */
    @Permission
    public void save() {
        try {
            BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
            billForOutObject.setId(DataUtil.getUUID());
            billForOutObject.setCreateDate(Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMdd")));
            
            boolean isSucceed = billForOutService.save(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 修改一条数据
     */
    @Permission
    public void edit() {
        try {
            BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
            
            boolean isSucceed = billForOutService.update(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 删除一条数据
     */
    @Permission
    public void delete() {
        try {
            BillForOut billForOutObject = new BillForOut(id);
            
            boolean isSucceed = billForOutService.delete(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 组合条件
     * @return 条件SQL语句
     */
    private String conditionString() {
        try {
            if (condition != null) {
                Condition conditionObject = GSON.fromJson(condition, Condition.class);
                
                String conditionString = "";
                if (conditionObject.getPayName() != null)
                    conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
                if (conditionObject.getStatus() != null)
                    conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
                
                if (conditionString.length() > 5)
                    conditionString = conditionString.substring(0, conditionString.length() - 5);
                
                return conditionString;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 读取个人报账数据
     */
    @Permission
    public void loadMine() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            List<Map<String, Object>> datas = billForOutService.loadMineSpecial(userId, conditionMineString(), curPage, limit);
            if (datas != null) {
                String json = GSON.toJson(datas);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 获取个人报账数据条数
     */
    @Permission
    public void countMine() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            int length = billForOutService.countMineSpecial(userId, conditionMineString());
            if (length != -1) {
                String json = "{\"count\":" + length + "}";
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 个人报账数据组合条件
     * @return 条件SQL语句
     */
    private String conditionMineString() {
        try {
            if (condition != null) {
                Condition conditionObject = GSON.fromJson(condition, Condition.class);
                
                String conditionString = "";
                if (conditionObject.getStatus() != null)
                    conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
                
                if (conditionString.length() > 5)
                    conditionString = conditionString.substring(0, conditionString.length() - 5);
                
                return conditionString;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 读取多条报账数据
     */
    @Permission
    public void loadReview() {
        try {
            List<Map<String, Object>> datas = billForOutService.loadReviewSpecial(conditionReviewString(), curPage, limit);
            if (datas != null) {
                String json = GSON.toJson(datas);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 获取报账数据条数
     */
    @Permission
    public void countReview() {
        try {
            int length = billForOutService.countReviewSpecial(conditionReviewString());
            if (length != -1) {
                String json = "{\"count\":" + length + "}";
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 读取一条报账数据
     */
    @Permission
    public void loadOneReview() {
        try {
            Map<String, Object> data = billForOutService.loadOneReviewSpecial("id = '" + id + "'");
            if (data != null) {
                String json = GSON.toJson(data);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 组合报账条件
     * @return 条件SQL语句
     */
    private String conditionReviewString() {
        try {
            if (condition != null) {
                Condition conditionObject = GSON.fromJson(condition, Condition.class);
                
                String conditionString = "";
                if (conditionObject.getPayName() != null)
                    conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
                
                if (conditionString.length() > 5)
                    conditionString = conditionString.substring(0, conditionString.length() - 5);
                
                return conditionString;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 审核通过
     */
    @Permission
    public void reviewOk() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            String userName = (String) session.get("userName");
            
            BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
            billForOutObject.setPayId(null);
            billForOutObject.setRecordId(userId);
            billForOutObject.setCreateDate(null);
            
            if (billForOutObject.getStatus() == BillForOut.STATUS_PAID) {
                double amount = billForOutObject.getAmount();
                double money = billForInService.sumUpMoney();
                if (amount > money) {
                    WebUtil.writeJson("{\"result\":\"记录更新失败,财务余额不足\"}");
                    return;
                }
            }
            
            boolean isSucceed = billForOutService.update(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
            
            String[] params = new String[] {"payId", "createDate"};
            Map<String, Object> data = billForOutService.loadOne(params, "id = '" + billForOutObject.getId() + "'");
            String payId = (String) data.get("payId");
            Double createDate = (Double) data.get("createDate");
            
            /* 生成消息 */
            String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账申请经" + userName + "审核已通过";
            double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
            Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
            String payUserUserName = (String) payUserData.get("userName");
            String payUserEmail = (String) payUserData.get("email");
            
            /* 向支付人发送一条消息 */
            Message messageObject = new Message();
            messageObject.setId(DataUtil.getUUID());
            messageObject.setType(Message.TYPE_INFO);
            messageObject.setContent(messageContent);
            messageObject.setCreateTime(messageDate);
            messageObject.setUserId(payId);
            messageService.save(messageObject);
            
            /* 向支付人发送一条邮件 */
            MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 审核不通过
     */
    @Permission
    public void reviewNo() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            String userName = (String) session.get("userName");
            
            BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
            billForOutObject.setPayId(null);
            billForOutObject.setRecordId(userId);
            billForOutObject.setCreateDate(null);
            billForOutObject.setStatus(BillForOut.STATUS_FAILED);
            
            boolean isSucceed = billForOutService.update(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
            
            String[] params = new String[] {"payId", "createDate"};
            Map<String, Object> data = billForOutService.loadOne(params, "id = '" + billForOutObject.getId() + "'");
            String payId = (String) data.get("payId");
            Double createDate = (Double) data.get("createDate");
            
            /* 生成消息 */
            String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账申请经" + userName + "审核不通过";
            double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
            Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
            String payUserUserName = (String) payUserData.get("userName");
            String payUserEmail = (String) payUserData.get("email");
            
            /* 向支付人发送一条消息 */
            Message messageObject = new Message();
            messageObject.setId(DataUtil.getUUID());
            messageObject.setType(Message.TYPE_DANGER);
            messageObject.setContent(messageContent);
            messageObject.setCreateTime(messageDate);
            messageObject.setUserId(payId);
            messageService.save(messageObject);
            
            /* 向支付人发送一条邮件 */
            MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 个人报账
     */
    @Permission
    public void apply() {
        try {
            if (!KaptchaUtil.checkCode(validCode)) {
                WebUtil.writeJson(WebUtil.JSON_WRONG_VALIDCODE);
                return;
            }
            
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            String userName = (String) session.get("userName");
            
            BillForOut billForOutObject = GSON.fromJson(billForOut, BillForOut.class);
            billForOutObject.setId(DataUtil.getUUID());
            billForOutObject.setPayId(userId);
            billForOutObject.setStatus(2); // 2表示待审核
            billForOutObject.setRecordId(null);
            billForOutObject.setCreateDate(Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMdd")));
            
            boolean isSucceed = billForOutService.save(billForOutObject);
            if (isSucceed) {
                WebUtil.writeJson(WebUtil.JSON_SUCCESS);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
            
            String[] params = new String[] {"id", "userName", "email"};
            List<Map<String, Object>> datas = userService.load(params, "roleId = '" + User.ROLEID_SUPER_MANAGER + "'");
            
            /* 生成消息 */
            String messageContent = userName + "报账,等待您的审核";
            double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
            
            /* 向所有超级管理员发送一条消息 */
            Message messageObject = new Message();
            messageObject.setId(DataUtil.getUUID());
            messageObject.setType(Message.TYPE_WARNING);
            messageObject.setContent(messageContent);
            messageObject.setCreateTime(messageDate);
            for (int i = 0, length = datas.size(); i < length; i++) {
                String currentUserId = (String) datas.get(i).get("id");
                String currentUserName = (String) datas.get(i).get("userName");
                String currentUserEmail = (String) datas.get(i).get("email");
                messageObject.setUserId(currentUserId);
                messageService.save(messageObject);
                
                /* 向所有超级管理员发送一条邮件 */
                MailUtil.sendInBackground(currentUserEmail, "财务管理系统", "<p>尊敬的" + currentUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 读取个人报账数据
     */
    @Permission
    public void loadPay() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            List<Map<String, Object>> datas = billForOutService.loadPaySpecial(userId, conditionPayString(), curPage, limit);
            if (datas != null) {
                String json = GSON.toJson(datas);
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 获取个人报账数据条数
     */
    @Permission
    public void countPay() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            int length = billForOutService.countPaySpecial(userId, conditionPayString());
            if (length != -1) {
                String json = "{\"count\":" + length + "}";
                WebUtil.writeJson(json);
            } else {
                WebUtil.writeJson(WebUtil.JSON_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 个人报账数据组合条件
     * @return 条件SQL语句
     */
    private String conditionPayString() {
        try {
            if (condition != null) {
                Condition conditionObject = GSON.fromJson(condition, Condition.class);
                
                String conditionString = "";
                if (conditionObject.getPayName() != null)
                    conditionString += "payName LIKE '%" + conditionObject.getPayName() + "%' AND ";
                if (conditionObject.getStatus() != null)
                    conditionString += "status = '" + conditionObject.getStatus() + "' AND ";
                
                if (conditionString.length() > 5)
                    conditionString = conditionString.substring(0, conditionString.length() - 5);
                
                return conditionString;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 更改状态为已支付
     */
    @Permission
    public void paid() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            String userName = (String) session.get("userName");
            
            String[] params = new String[] {"amount", "payId", "createDate"};
            Map<String, Object> data = billForOutService.loadOne(params, "id = '" + id + "' AND recordId = '" + userId + "'");
            if (data != null) {
                double amount = (Double) data.get("amount");
                double money = billForInService.sumUpMoney();
                if (amount > money) {
                    WebUtil.writeJson("{\"result\":\"记录更新失败,财务余额不足\"}");
                    return;
                }
                
                BillForOut billForOutObject = new BillForOut(id);
                billForOutObject.setStatus(BillForOut.STATUS_PAID);
                
                boolean isSucceed = billForOutService.update(billForOutObject);
                if (isSucceed) {
                    WebUtil.writeJson(WebUtil.JSON_SUCCESS);
                } else {
                    WebUtil.writeJson(WebUtil.JSON_ERROR);
                }
                
                String payId = (String) data.get("payId");
                Double createDate = (Double) data.get("createDate");
                
                /* 生成消息 */
                String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账记录被" + userName + "标记为已支付";
                double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
                Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
                String payUserUserName = (String) payUserData.get("userName");
                String payUserEmail = (String) payUserData.get("email");
                
                /* 向支付人发送一条消息 */
                Message messageObject = new Message();
                messageObject.setId(DataUtil.getUUID());
                messageObject.setType(Message.TYPE_SUCCESS);
                messageObject.setContent(messageContent);
                messageObject.setCreateTime(messageDate);
                messageObject.setUserId(payId);
                messageService.save(messageObject);
                
                /* 向支付人发送一条邮件 */
                MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
            } else {
                WebUtil.writeJson("{\"result\":\"非法注入\"}");
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 更改状态为未支付
     */
    @Permission
    public void unpaid() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            String userName = (String) session.get("userName");
            
            Map<String, Object> data = billForOutService.loadOne("id = '" + id + "' AND recordId = '" + userId + "'");
            if (data != null) {
                BillForOut billForOutObject = new BillForOut(id);
                billForOutObject.setStatus(BillForOut.STATUS_UNPAID);
                
                boolean isSucceed = billForOutService.update(billForOutObject);
                if (isSucceed) {
                    WebUtil.writeJson(WebUtil.JSON_SUCCESS);
                } else {
                    WebUtil.writeJson(WebUtil.JSON_ERROR);
                }
                
                String payId = (String) data.get("payId");
                Double createDate = (Double) data.get("createDate");
                
                /* 生成消息 */
                String messageContent = "您在" + DataUtil.dateFormat(createDate) + "提交的报账记录被" + userName + "标记为未支付";
                double messageDate = Double.parseDouble(DataUtil.getDateString(new Date(), "yyyyMMddHHmmss"));
                Map<String, Object> payUserData = userService.loadOne(new String[] {"userName", "email"}, "id = '" + payId + "'");
                String payUserUserName = (String) payUserData.get("userName");
                String payUserEmail = (String) payUserData.get("email");
                
                /* 向支付人发送一条消息 */
                Message messageObject = new Message();
                messageObject.setId(DataUtil.getUUID());
                messageObject.setType(Message.TYPE_WARNING);
                messageObject.setContent(messageContent);
                messageObject.setCreateTime(messageDate);
                messageObject.setUserId(payId);
                messageService.save(messageObject);
                
                /* 向支付人发送一条邮件 */
                MailUtil.sendInBackground(payUserEmail, "财务管理系统", "<p>尊敬的" + payUserUserName + ":</p><p>" + messageContent + "</p><p>" + DataUtil.dateTimeFormat(messageDate) + "</p>");
            } else {
                WebUtil.writeJson("{\"result\":\"非法注入\"}");
            }
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 支出金额统计
     */
    @Permission
    public void sumUp() {
        try {
            double sum = billForOutService.sumUp(conditionString());
            String json = "{\"amount\":" + sum + "}";
            WebUtil.writeJson(json);
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 个人报账金额统计
     */
    @Permission
    public void sumUpMine() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            double sum = billForOutService.sumUpMine(userId, conditionMineString());
            String json = "{\"amount\":" + sum + "}";
            WebUtil.writeJson(json);
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 报账金额统计
     */
    @Permission
    public void sumUpReview() {
        try {
            double sum = billForOutService.sumUpReview(conditionMineString());
            String json = "{\"amount\":" + sum + "}";
            WebUtil.writeJson(json);
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 支付金额统计
     */
    @Permission
    public void sumUpPay() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            double sum = billForOutService.sumUpPay(userId, conditionMineString());
            String json = "{\"amount\":" + sum + "}";
            WebUtil.writeJson(json);
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
    
    /**
     * 支付管理查看还需金额
     */
    @Permission
    public void sumUpNeed() {
        try {
            Map<String, Object> session = ActionContext.getContext().getSession();
            String userId = (String) session.get("userId");
            
            double leftMoney = billForInService.sumUpMoney();
            double unpaidMoney = billForOutService.sumUpPay(userId, "status = " + BillForOut.STATUS_UNPAID);
            if (unpaidMoney > leftMoney)
                WebUtil.writeJson("{\"amount\":" + (unpaidMoney - leftMoney) + "}");
            else
                WebUtil.writeJson("{\"amount\":null}");
        } catch (Exception e) {
            e.printStackTrace();
            WebUtil.writeJson(WebUtil.JSON_ERROR);
        }
    }
}
 

<!DOCTYPE html>
<html lang="zh-CN" ng-app="app">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
        <title>财务管理系统</title>
        <link rel="stylesheet" type="text/css" href="plugins/bootstrap-3.3.2/css/bootstrap.min.css" />
        <link rel="stylesheet" type="text/css" href="css/common/custom.css" />
        <link rel="stylesheet" type="text/css" href="css/main.css" />
    </head>

    <body ng-controller="mainController">
        <nav class="navbar navbar-default navbar-fixed-top">
            <div class="container-fluid">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                        <span class="sr-only">切换导航</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#/"><span class="glyphicon glyphicon-piggy-bank"></span> 财务管理系统</a>
                </div>
                <div class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                        <li ng-class="{true:'active'}['/'+menu.href==currentPage]" ng-repeat="menu in menus"><a href="#/{{menu.href}}" ng-bind="menu.name"></a></li>
                    </ul>
                    <div class="navbar-right">
                        <div class="btn-group" role="group">
                            <button type="button" class="btn btn-default navbar-btn" title="报账" data-toggle="modal" data-target="#apply-modal" ng-click="resetBillForOut()">
                                <span class="glyphicon glyphicon-pencil"></span>
                            </button>
                            <button class="btn btn-default navbar-btn" title="消息中心" data-toggle="modal" data-target="#message-modal" ng-click="loadMessages()">
                                <span class="glyphicon glyphicon-comment"></span> <span ng-bind="messageNumber"></span>
                            </button>
                            <button class="btn btn-default navbar-btn" title="个人中心" data-toggle="modal" data-target="#self-modal" ng-click="loadSelf()">
                                <span class="glyphicon glyphicon-user"></span>
                            </button>
                            <button class="btn btn-default navbar-btn" title="注销" ng-click="logout()">
                                <span class="glyphicon glyphicon-log-out"></span>
                            </button>
                        </div>
                    </div>
                </div>
            </div>
        </nav>

        <div class="container" id="main">
            <!-- <div class="alert" id="message-alert" style="display:none;"></div> -->

            <div ng-view></div>
        </div>

        <footer class="footer">
            <div class="container">
                <p class="text-center text-muted">财务管理系统&nbsp;&copy;&nbsp;2015</p>
            </div>
        </footer>

        <div class="modal fade" id="apply-modal" tabindex="-1" role="dialog" aria-labelledby="报账模态框">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title" id="applyModalTitle">报账</h4>
                    </div>
                    <div class="modal-body">
                        <form class="form" name="applyForm">
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.date.$invalid]">
                                <label for="dateApply">日期</label>
                                <input type="date" class="form-control" id="dateApply" name="date" required ng-model="apply.date" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.date.$invalid]"></span>
                                <p class="help-block" ng-show="applyForm.date.$invalid">必填项</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.event.$invalid]">
                                <label for="eventApply">事项</label>
                                <input type="text" class="form-control" id="eventApply" name="event" maxlength="127" required ng-model="apply.event" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.event.$invalid]"></span>
                                <p class="help-block" ng-show="applyForm.event.$invalid">必填项</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.amount.$invalid]">
                                <label for="amountApply">金额(元)</label>
                                <input type="number" class="form-control" id="amountApply" name="amount" maxlength="10" required ng-model="apply.amount" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.amount.$invalid]"></span>
                                <p class="help-block" ng-show="applyForm.amount.$invalid">必填项,只允许数值</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[applyForm.remark.$invalid]">
                                <label for="remarkApply">备注</label>
                                <input type="text" class="form-control" id="remarkApply" name="remark" placeholder="选填项" maxlength="127" ng-model="apply.remark" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[applyForm.remark.$invalid]"></span>
                                <p class="help-block" ng-show="applyForm.remark.$invalid">选填项</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error'}[applyForm.validCode.$invalid]">
                                <label for="validCodeApply">验证码</label>
                                <div class="input-group">
                                    <input type="text" class="form-control" id="validCodeApply" name="validCode" maxlength="5" minlength="5" required ng-model="apply.validCode" />
                                    <div class="input-group-addon" title="看不清,换一张" ng-click="changeValidCode()">
                                        <img src="kaptcha.jpg?timestamp={{timestamp}}" alt="验证码" width="80" height="20" />
                                    </div>
                                </div>
                                <p class="help-block" ng-show="applyForm.validCode.$invalid">必填项,请输入5位验证码</p>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-primary" ng-disabled="applyForm.$invalid" ng-click="applyBillForOut()">提交</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    </div>
                </div>
            </div>
        </div>

        <div class="modal fade" id="message-modal" tabindex="-1" role="dialog" aria-labelledby="消息中心模态框">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title" id="messageModalTitle">消息中心</h4>
                    </div>
                    <div class="modal-body">
                        <div class="alert fade in" ng-class="alertType(message.type)" ng-repeat="message in messages">
                            <button type="button" class="close" data-dismiss="alert" aria-label="删除" title="删除" ng-click="deleteMessage(message.id)">
                                <span aria-hidden="true">&times;</span>
                            </button>
                            <p><span ng-bind="dateTimeFormat(message.createTime)"></span> <strong ng-bind="message.content"></strong></p>
                        </div>
                        <p class="text-center text-muted" ng-show="messages&&messages.length==0">无未读信息</p>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    </div>
                </div>
            </div>
        </div>

        <div class="modal fade" id="self-modal" tabindex="-1" role="dialog" aria-labelledby="个人中心模态框">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title" id="selfModalTitle">个人中心</h4>
                    </div>
                    <div class="modal-body">
                        <form class="form" name="selfForm">
                            <div class="form-group">
                                <label for="userNameSelf">用户名</label>
                                <input type="text" class="form-control" id="userNameSelf" disabled ng-model="self.userName" />
                            </div>
                            <div class="form-group">
                                <label for="sexSelf">性别</label>
                                <select class="form-control" id="sexSelf" name="sex" ng-model="self.sex">
                                    <option value="0">男</option>
                                    <option value="1">女</option>
                                </select>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.birthday.$invalid]">
                                <label for="birthdaySelf">生日</label>
                                <input type="date" class="form-control" id="birthdaySelf" name="birthday" required ng-model="self.birthday" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.birthday.$invalid]"></span>
                                <p class="help-block" ng-show="selfForm.birthday.$invalid">必填项</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.email.$invalid]">
                                <label for="emailSelf">Email</label>
                                <input type="email" class="form-control" id="emailSelf" name="email" maxlength="127" required ng-model="self.email" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.email.$invalid]"></span>
                                <p class="help-block" ng-show="selfForm.email.$invalid">必填项,注意Email格式</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.qq.$invalid]">
                                <label for="qqSelf">QQ</label>
                                <input type="text" class="form-control" id="qqSelf" name="qq" placeholder="选填项" maxlength="25" ng-pattern="/[1-9][0-9]{4,}/" ng-model="self.qq" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.qq.$invalid]"></span>
                                <p class="help-block" ng-show="selfForm.qq.$invalid">选填项,注意QQ格式</p>
                            </div>
                            <div class="form-group">
                                <label for="roleIdSelf">用户角色</label>
                                <select class="form-control" id="roleIdSelf" disabled ng-options="role.roleId as role.roleName for role in roles" ng-model="self.roleId"></select>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.oldPassword.$invalid]" ng-show="changePassword">
                                <label for="oldPasswordSelf">旧密码</label>
                                <input type="password" class="form-control" id="oldPasswordSelf" name="oldPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.oldPassword" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.oldPassword.$invalid]"></span>
                                <p class="help-block" ng-show="selfForm.oldPassword.$invalid">必填项,只允许数字、英文和下划线</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.newPassword.$invalid]" ng-show="changePassword">
                                <label for="newPasswordSelf">新密码</label>
                                <input type="password" class="form-control" id="newPasswordSelf" name="newPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.newPassword" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.newPassword.$invalid]"></span>
                                <p class="help-block" ng-show="selfForm.newPassword.$invalid">必填项,只允许数字、英文和下划线</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error',false:'has-success'}[selfForm.againPassword.$invalid||self.newPassword!=self.againPassword]" ng-show="changePassword">
                                <label for="againPasswordSelf">确认密码</label>
                                <input type="password" class="form-control" id="againPasswordSelf" name="againPassword" maxlength="16" ng-required="changePassword" ng-pattern="/^\w+$/" ng-model="self.againPassword" />
                                <span class="glyphicon form-control-feedback" ng-class="{true:'glyphicon-remove',false:'glyphicon-ok'}[selfForm.againPassword.$invalid||self.newPassword!=self.againPassword]"></span>
                                <p class="help-block" ng-show="selfForm.againPassword.$invalid||self.newPassword!=self.againPassword">必填项,注意要与新密码一致</p>
                            </div>
                            <div class="form-group has-feedback" ng-class="{true:'has-error'}[selfForm.validCode.$invalid]">
                                <label for="validCodeSelf">验证码</label>
                                <div class="input-group">
                                    <input type="text" class="form-control" id="validCodeSelf" name="validCode" maxlength="5" minlength="5" required ng-model="self.validCode" />
                                    <div class="input-group-addon" title="看不清,换一张" ng-click="changeValidCode()">
                                        <img src="kaptcha.jpg?timestamp={{timestamp}}" alt="验证码" width="80" height="20" />
                                    </div>
                                </div>
                                <p class="help-block" ng-show="selfForm.validCode.$invalid">必填项,请输入5位验证码</p>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-warning" ng-show="changePassword" ng-click="toggleChangePassword()">取消修改密码</button>
                        <button type="button" class="btn btn-danger" ng-hide="changePassword" ng-click="toggleChangePassword()">修改密码</button>
                        <button type="button" class="btn btn-primary" ng-disabled="selfForm.$invalid" ng-click="saveSelf()">保存</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    </div>
                </div>
            </div>
        </div>

        <script type="text/javascript" src="plugins/angularjs/angular.min.js"></script>
        <script type="text/javascript" src="plugins/angularjs/angular-route.min.js"></script>
        <script type="text/javascript" src="plugins/jquery/jquery-1.11.3.min.js"></script>
        <script type="text/javascript" src="plugins/bootstrap-3.3.2/js/bootstrap.min.js"></script>
        <script type="text/javascript" src="plugins/security/md5.js"></script>
        <script type="text/javascript" src="js/main.js"></script>
        <script type="text/javascript" src="js/view/welcome.js"></script>
        <script type="text/javascript" src="js/view/user.js"></script>
        <script type="text/javascript" src="js/view/billforin.js"></script>
        <script type="text/javascript" src="js/view/billforout.js"></script>
        <script type="text/javascript" src="js/view/apply.js"></script>
        <script type="text/javascript" src="js/view/review.js"></script>
        <script type="text/javascript" src="js/view/pay.js"></script>
        <script type="text/javascript" src="js/view/about.js"></script>
    </body>
</html>