/// <summary>
        /// 驳回报销单
        /// </summary>
        /// <param name="reimburse"></param>
        private void reject(TravelApply travelApply, WxHelper wx, string opinion, User user)
        {
            travelApply.Status = "已拒绝";
            travelApply.Level  = travelApply.Level + 1;
            _unitWork.Update(travelApply);

            // 发通知给提交人 审批被拒绝
            WxTextCardMessage msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                                          $"你的差旅申请已被{user.UserName}审批,审批结果为拒绝,审批理由为{opinion}!", "http://yelioa.top:8080/#/travel_apply/mine", "");

            msg.touser = travelApply.WechatUserId;
            wx.SendWxTextCardMessage(msg);
        }
        /// <summary>
        /// 同意报销单
        /// </summary>
        /// <param name="reimburse"></param>
        /// <param name="docCode"></param>
        private void agree(TravelApply travelApply, string docCode, WxHelper wx, User user)
        {
            // 判断是否流程结束
            var totalStep = _unitWork
                            .Find <ApprovalApprover>(u => u.DocCode.Equals(docCode) && u.DocumentTableName.Equals("差旅申请")).ToList()
                            .Count;

            if (totalStep == travelApply.Level + 1)
            {
                // 流程结束
                travelApply.Status = "已审批";
                _unitWork.Update(travelApply);

                // 发通知给提交人 已被审批
                WxTextCardMessage msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                                              $"你的差旅申请已被{user.UserName}审批,审批结果为同意!", "http://yelioa.top:8080/#/travel_apply/mine", "");
                msg.touser = travelApply.WechatUserId;
                wx.SendWxTextCardMessage(msg);

                // 发通知给提交人审批流程结束
                msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                            "你的差旅申请已经审批通过!", "http://yelioa.top:8080/#/travel_apply/mine", "");
                msg.touser = travelApply.WechatUserId;
                wx.SendWxTextCardMessage(msg);
            }
            else
            {
                // 流程没结束
                travelApply.Status = "审批中";
                _unitWork.Update(travelApply);

                // 发通知给提交人 已被审批
                WxTextCardMessage msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                                              $"你的差旅申请已被{user.UserName}审批,审批结果为同意!", "http://yelioa.top:8080/#/travel_apply/mine", "");
                msg.touser = travelApply.WechatUserId;
                wx.SendWxTextCardMessage(msg);

                // 发通知给下一级审批人
                msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                            "你有一笔差旅申请待审批!", "http://yelioa.top:8080/#/travel_apply/pending", "");
                msg.touser = _unitWork.FindSingle <ApprovalApprover>(u =>
                                                                     u.DocCode.Equals(travelApply.DocCode) && u.DocumentTableName.Equals("差旅申请") &&
                                                                     u.Level == travelApply.Level + 1).WechatUserId;
                wx.SendWxTextCardMessage(msg);
            }

            travelApply.Level = travelApply.Level + 1;
            _unitWork.Update(travelApply);
        }
        /// <summary>
        /// 差旅申请 新增或保存草稿
        /// </summary>
        /// <param name="travelApply"></param>
        /// <returns></returns>
        public TravelApply addOrDraft(TravelApply travelApply, JArray approverJArray, User userInfo, WxHelper wx)
        {
            if (string.IsNullOrEmpty(travelApply.DocCode))
            {
                travelApply.DocCode = Encrypt.GenerateDocCode();
            }

            travelApply.WechatUserId = userInfo.WechatUserId;
            travelApply.UserName     = userInfo.UserName;

            // 找部门id
            if (!string.IsNullOrEmpty(travelApply.DepartmentName))
            {
                travelApply.DepartmentId =
                    _unitWork.FindSingle <Department>(u => u.Name.Equals(travelApply.DepartmentName)).Id;
            }

            // 处理总金额
            travelApply.TotalMoney = travelApply.AccomodationFee + travelApply.TicketFee + travelApply.TollFee +
                                     travelApply.TravelAllowance;

            if (!_unitWork.IsExist <TravelApply>(u => u.DocCode.Equals(travelApply.DocCode)))
            {
                _unitWork.Add(travelApply);
            }
            else
            {
                _unitWork.Update(travelApply);
            }

            if (travelApply.Status.Equals("已提交"))
            {
                // 新增记录到审批人表
                var approverList = new List <ApprovalApprover>();
                foreach (var jarray in approverJArray)
                {
                    var approver = new ApprovalApprover
                    {
                        DocumentTableName = "差旅申请",
                        DocCode           = travelApply.DocCode,
                        Level             = int.Parse(jarray["level"].ToString()),
                        WechatUserId      = jarray["wechatUserId"].ToString()
                    };
                    approverList.Add(approver);
                }

                ;
                _unitWork.BatchAdd(approverList.ToArray());

                // 新增记录到审批记录表
                var record = new ApprovalRecord
                {
                    DocumentTableName = "差旅申请",
                    DocCode           = travelApply.DocCode,
                    Level             = 0,
                    WechatUserId      = userInfo.WechatUserId,
                    ApprovalResult    = "单据提交",
                    ApprovalOpinions  = "单据提交"
                };
                _unitWork.Add(record);

                // 给下级审批人发消息
                WxTextCardMessage msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                                              "你有一笔差旅申请待审批!", "http://yelioa.top:8080/#/travel_apply/pending", "");
                msg.touser = _unitWork.FindSingle <ApprovalApprover>(u =>
                                                                     u.DocCode.Equals(travelApply.DocCode) && u.DocumentTableName.Equals("差旅申请") &&
                                                                     u.Level == travelApply.Level + 1).WechatUserId;
                wx.SendWxTextCardMessage(msg);

                // 给提交人发消息
                msg = new WxTextCardMessage(Convert.ToInt32(wx.AgentId), "审批通知",
                                            $"你的差旅申请已提交,请耐心等待审批!", "http://yelioa.top:8080/#/travel_apply/mine", "");
                msg.touser = travelApply.WechatUserId;
                wx.SendWxTextCardMessage(msg);
            }

            _unitWork.Save();

            return(travelApply);
        }