using EmitMapper; using FineUIPro; using MiniExcelLibs; using Model; using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace BLL { public static class PhtglInvoiceService { /// /// 已导入 /// public static int StateDataIn = -1; /// /// 已创建入库订单 /// public static int StateCreate = 0; /// /// 入库审核 /// public static int StateInPutApprove = 1; /// /// 入库审核拒绝 /// public static int StateInPutApproveRefuse = 2; /// /// 入库审核成功 /// public static int StateInPutApproveSuccess = 3; /// /// 出库审核中 /// public static int StateOutPutApprove = 4; /// /// 出库审核拒绝 /// public static int StateOutPutApproveRefuse = 5; /// /// 出库审核成功 /// public static int StateOutPutApproveSuccess = 6; public static string GetState(object invoiceId) { string result = ""; if (invoiceId != null && !string.IsNullOrEmpty(invoiceId.ToString())) { var InvoiceId = invoiceId.ToString(); var model = GetPHTGL_InvoiceById(InvoiceId); var approveModel = PHTGL_ApproveService.GetPHTGL_ApproveByContractId(InvoiceId); switch (model.State) { case -1: result = "已导入"; break; case 0: result = "已创建入库订单"; break; case 1: result = "入库审核中" + ",当前节点-" + BLL.Person_PersonsService.getPersonsNamesPersonIds(string.Join(",", approveModel.Select(x => x.ApproveMan))); break; case 2: result = "入库审核拒绝"; break; case 3: result = "入库审核成功"; break; case 4: result = "出库审核中" + ",当前节点-" + BLL.Person_PersonsService.getPersonsNamesPersonIds(string.Join(",", approveModel.Select(x => x.ApproveMan))); break; case 5: result = "出库审核拒绝"; break; case 6: result = "出库审核成功"; break; } } return result; } #region 获取列表 /// /// 记录数 /// public static int Count { get; set; } public static IEnumerable GetPHTGL_InvoiceByModle(Model.PHTGL_Invoice table) { var q = from x in Funs.DB.PHTGL_Invoice where (string.IsNullOrEmpty(table.InvoiceId) || x.InvoiceId.Contains(table.InvoiceId)) && (string.IsNullOrEmpty(table.ProjectId) || x.ProjectId.Contains(table.ProjectId)) && (string.IsNullOrEmpty(table.ContractId) || x.ContractId.Contains(table.ContractId)) && (string.IsNullOrEmpty(table.InvoiceCode) || x.InvoiceCode.Contains(table.InvoiceCode)) && (string.IsNullOrEmpty(table.InvoiceNumber) || x.InvoiceNumber.Contains(table.InvoiceNumber)) && (string.IsNullOrEmpty(table.SellerName) || x.SellerName.Contains(table.SellerName)) && (string.IsNullOrEmpty(table.InvoiceDate) || x.InvoiceDate.Contains(table.InvoiceDate)) && (string.IsNullOrEmpty(table.Remark) || x.Remark.Contains(table.Remark)) && (string.IsNullOrEmpty(table.ImagePath) || x.ImagePath.Contains(table.ImagePath)) && (string.IsNullOrEmpty(table.SellerTaxNumber) || x.SellerTaxNumber.Contains(table.SellerTaxNumber)) && (string.IsNullOrEmpty(table.ApproveManJson) || x.ApproveManJson.Contains(table.ApproveManJson)) && (string.IsNullOrEmpty(table.CreateUser) || x.CreateUser.Contains(table.CreateUser)) && (table.State == null || x.State == table.State) select x ; return q.ToList(); } /// /// 获取分页列表 /// /// /// /// public static IEnumerable GetListData(Model.PHTGL_Invoice table, Grid grid1) { var q = GetPHTGL_InvoiceByModle(table); Count = q.Count(); if (Count == 0) { return null; } q = q.Skip(grid1.PageSize * grid1.PageIndex).Take(grid1.PageSize).ToList(); // q = SortConditionHelper.SortingAndPaging(q, Grid1.SortField, Grid1.SortDirection, Grid1.PageIndex, Grid1.PageSize); return (from x in q join y in Funs.DB.PHTGL_Contract on x.ContractId equals y.ContractId into g from c in g.DefaultIfEmpty() select new { c?.ContractName, c?.ContractNum, c?.Parties, c?.ContractAmount, x.InvoiceId, x.ProjectId, x.ContractId, x.State, x.InvoiceCode, x.InvoiceNumber, x.SellerName, x.InvoiceDate, x.AmountExcludingTax, x.TotalTax, x.Remark, x.ImagePath, x.SellerTaxNumber, x.InvoiceAmount, x.ApproveManJson, x.CreateDate, x.CreateUser, x.OrderInDate, x.OrderOutDate, x.OrderCode, x.MaterialRequisitionUnit }); } public static IEnumerable GetOrderInListData(Model.PHTGL_Invoice table, Grid grid1, string state) { var q = GetPHTGL_InvoiceByModle(table); switch (state) { case "0": q = q.Where(x => x.State > StateDataIn); //全部 break; case "1": q = q.Where(x => x.State > StateDataIn && x.State < StateInPutApproveSuccess); //未入库 break; case "2": q = q.Where(x => x.State >= StateInPutApproveSuccess); //已入库 break; case "3": q = q.Where(x => x.State >= StateInPutApproveSuccess && x.State < StateOutPutApproveSuccess);//未出库 break; case "4": q = q.Where(x => x.State == StateOutPutApproveSuccess);//已出库 break; } Count = q.Count(); if (Count == 0) { return null; } q = q.Skip(grid1.PageSize * grid1.PageIndex).Take(grid1.PageSize).ToList(); // q = SortConditionHelper.SortingAndPaging(q, Grid1.SortField, Grid1.SortDirection, Grid1.PageIndex, Grid1.PageSize); return (from x in q join y in Funs.DB.PHTGL_Contract on x.ContractId equals y.ContractId into g from c in g.DefaultIfEmpty() where x.State > StateDataIn select new { c?.ContractName, c?.ContractNum, c?.Parties, c?.ContractAmount, x.InvoiceId, x.ProjectId, x.ContractId, x.State, x.InvoiceCode, x.InvoiceNumber, x.SellerName, x.InvoiceDate, x.AmountExcludingTax, x.TotalTax, x.Remark, x.ImagePath, x.SellerTaxNumber, x.InvoiceAmount, x.ApproveManJson, x.CreateDate, x.CreateUser, x.OrderInDate, x.OrderOutDate, x.OrderCode, x.MaterialRequisitionUnit }).ToList(); } #endregion public static Model.PHTGL_Invoice GetPHTGL_InvoiceById(string InvoiceId) { return Funs.DB.PHTGL_Invoice.FirstOrDefault(x => x.InvoiceId == InvoiceId); } public static PHTGL_InvoicePrintModel GetPHTGL_InvoicePrintModel(string InvoiceId) { var result = new PHTGL_InvoicePrintModel(); Order order = new Order(); List orderDetails = new List(); OrderApproveIn orderApproveIn = new OrderApproveIn(); OrderApproveOut orderApproveOut = new OrderApproveOut(); var invoiceModel = GetPHTGL_InvoiceById(InvoiceId); var invoiceDetail = PhtglInvoicedetailService.GetPHTGL_InvoiceDetailByInvoiceId(InvoiceId); var approveManModels = GetInvoiceApproveManEntity(InvoiceId); //将invoiceModel 映射到order var mapper = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper(); order = mapper.Map(invoiceModel); order.ProjectName = ProjectService.GetProjectNameByProjectId(invoiceModel.ProjectId); order.ContractCode = ContractService.GetContractById(invoiceModel.ContractId)?.ContractNum; //invoiceDetail 映射到orderDetails var mapper2 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper, List>(); orderDetails = mapper2.Map(invoiceDetail); orderDetails = orderDetails.Select(x => new OrderDetail { GoodsOrServicesName = x.GoodsOrServicesName, SpecificationModel = x.SpecificationModel, Unit = x.Unit, Quantity = x.Quantity, UnitPrice = x.UnitPrice, NoTaxPrice = x.Amount - x.Tax, TaxRate = string.Format("{0:P0}", Convert.ToDecimal(x.TaxRate)), Tax = x.Tax, Amount = x.Amount, }).ToList(); if (approveManModels != null) { orderApproveIn.ProjectManager = !string.IsNullOrEmpty(approveManModels.InputApproveMan.ProjectManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.InputApproveMan.ProjectManager) : ""; orderApproveIn.ControlManager = !string.IsNullOrEmpty(approveManModels.InputApproveMan.ControlManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.InputApproveMan.ControlManager) : ""; orderApproveIn.ConstructionManager = !string.IsNullOrEmpty(approveManModels.InputApproveMan.ConstructionManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.InputApproveMan.ConstructionManager) : ""; orderApproveIn.ProfessionalEngineer = !string.IsNullOrEmpty(approveManModels.InputApproveMan.ProfessionalEngineer) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.InputApproveMan.ProfessionalEngineer) : ""; orderApproveOut.ProjectManager = !string.IsNullOrEmpty(approveManModels.OutputApproveMan.ProjectManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.OutputApproveMan.ProjectManager) : ""; orderApproveOut.ControlManager = !string.IsNullOrEmpty(approveManModels.OutputApproveMan.ControlManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.OutputApproveMan.ControlManager) : ""; orderApproveOut.PurchasingMan = !string.IsNullOrEmpty(approveManModels.OutputApproveMan.PurchasingMan) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.OutputApproveMan.PurchasingMan) : ""; orderApproveOut.ConUnitMaterialOfficer = !string.IsNullOrEmpty(approveManModels.OutputApproveMan.ConUnitMaterialOfficer) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.OutputApproveMan.ConUnitMaterialOfficer) : ""; orderApproveOut.ConUnitProjectManager = !string.IsNullOrEmpty(approveManModels.OutputApproveMan.ConUnitProjectManager) ? BLL.Person_PersonsService.getSignatureUrl(approveManModels.OutputApproveMan.ConUnitProjectManager) : ""; } result.Order = order; result.Data = orderDetails; result.ApproveIn = orderApproveIn; result.ApproveOut = orderApproveOut; return result; } /// /// 添加实体 /// /// public static void AddPHTGL_Invoice(Model.PHTGL_Invoice newtable) { Model.PHTGL_Invoice table = new Model.PHTGL_Invoice { InvoiceId = newtable.InvoiceId, ProjectId = newtable.ProjectId, ContractId = newtable.ContractId, State = newtable.State, InvoiceCode = newtable.InvoiceCode, InvoiceNumber = newtable.InvoiceNumber, SellerName = newtable.SellerName, InvoiceDate = newtable.InvoiceDate, AmountExcludingTax = newtable.AmountExcludingTax, TotalTax = newtable.TotalTax, Remark = newtable.Remark, ImagePath = newtable.ImagePath, SellerTaxNumber = newtable.SellerTaxNumber, InvoiceAmount = newtable.InvoiceAmount, ApproveManJson = newtable.ApproveManJson, CreateDate = newtable.CreateDate, CreateUser = newtable.CreateUser, OrderInDate = newtable.OrderInDate, OrderCode = newtable.OrderCode, OrderOutDate = newtable.OrderOutDate, MaterialRequisitionUnit = newtable.MaterialRequisitionUnit, }; Funs.DB.PHTGL_Invoice.InsertOnSubmit(table); Funs.DB.SubmitChanges(); } /// /// 修改实体 /// /// public static void UpdatePHTGL_Invoice(Model.PHTGL_Invoice newtable) { Model.PHTGL_Invoice table = Funs.DB.PHTGL_Invoice.FirstOrDefault(x => x.InvoiceId == newtable.InvoiceId); if (table != null) { table.InvoiceId = newtable.InvoiceId; table.ProjectId = newtable.ProjectId; table.ContractId = newtable.ContractId; table.State = newtable.State; table.InvoiceCode = newtable.InvoiceCode; table.InvoiceNumber = newtable.InvoiceNumber; table.SellerName = newtable.SellerName; table.InvoiceDate = newtable.InvoiceDate; table.AmountExcludingTax = newtable.AmountExcludingTax; table.TotalTax = newtable.TotalTax; table.Remark = newtable.Remark; table.ImagePath = newtable.ImagePath; table.SellerTaxNumber = newtable.SellerTaxNumber; table.InvoiceAmount = newtable.InvoiceAmount; table.ApproveManJson = newtable.ApproveManJson; table.CreateDate = newtable.CreateDate; table.CreateUser = newtable.CreateUser; table.OrderInDate = newtable.OrderInDate; table.OrderCode = newtable.OrderCode; table.OrderOutDate = newtable.OrderOutDate; table.MaterialRequisitionUnit = newtable.MaterialRequisitionUnit; Funs.DB.SubmitChanges(); } } /// /// 删除实体 /// /// public static void DeletePHTGL_InvoiceById(string InvoiceId) { Model.PHTGL_Invoice table = Funs.DB.PHTGL_Invoice.FirstOrDefault(x => x.InvoiceId == InvoiceId); if (table != null) { Funs.DB.PHTGL_Invoice.DeleteOnSubmit(table); Funs.DB.SubmitChanges(); } } /// /// 根据主键获取审批人实体 /// /// /// public static Model.PHTGL_InvoiceApproveManEntity GetInvoiceApproveManEntity(string InvoiceId) { Model.PHTGL_InvoiceApproveManEntity list = new Model.PHTGL_InvoiceApproveManEntity(); Model.PHTGL_Invoice data = Funs.DB.PHTGL_Invoice.FirstOrDefault(e => e.InvoiceId == InvoiceId); if (data != null && !string.IsNullOrEmpty(data.ApproveManJson)) { list = Newtonsoft.Json.JsonConvert.DeserializeObject(data.ApproveManJson); } return list; } /// /// 将状态改为已创建 /// /// public static void ChangeStateToCreate(string invoiceId) { var model = GetPHTGL_InvoiceById(invoiceId); model.State = StateCreate; UpdatePHTGL_Invoice(model); } /// /// 保存入库审批人实体 /// /// /// public static void SaveInputApproveManEntity(string invoiceId, Inputapproveman inputapproveman) { var table = GetInvoiceApproveManEntity(invoiceId); table.InputApproveMan = inputapproveman; var json = Newtonsoft.Json.JsonConvert.SerializeObject(table); var data = Funs.DB.PHTGL_Invoice.FirstOrDefault(e => e.InvoiceId == invoiceId); if (data != null) { data.ApproveManJson = json; Funs.DB.SubmitChanges(); } } /// /// 保存出库审批人实体 /// /// /// public static void SaveOutputApproveManEntity(string invoiceId, Outputapproveman outputapproveman) { var table = GetInvoiceApproveManEntity(invoiceId); table.OutputApproveMan = outputapproveman; var json = Newtonsoft.Json.JsonConvert.SerializeObject(table); var data = Funs.DB.PHTGL_Invoice.FirstOrDefault(e => e.InvoiceId == invoiceId); if (data != null) { data.ApproveManJson = json; Funs.DB.SubmitChanges(); } } /// /// 导入数据 /// /// 文件地址 /// 项目id /// 创建人id /// public static ResponeData ImportData(string path, string projectid, string creatUserId) { var responeData = new ResponeData(); List temeplateDtoIns; try { temeplateDtoIns = MiniExcel.Query(path, startCell: "A2").ToList(); } catch (Exception ex) { responeData.code = 0; responeData.message = "模板错误:" + ex.ToString(); return responeData; } //数据校验 if (temeplateDtoIns.Count == 0) { responeData.code = 0; responeData.message = "导入数据为空!"; return responeData; } var invoiceCodeList = temeplateDtoIns.Select(x => x.InvoiceCode).Distinct().ToList(); //获取所有发票代码 //根据发票代码分组插入数据 foreach (var invoiceCode in invoiceCodeList) { var invoiceCodeDtoIns = temeplateDtoIns.Where(x => x.InvoiceCode == invoiceCode).ToList(); var mapper = ObjectMapperManager.DefaultInstance.GetMapper, List>(); var mapperDetail = ObjectMapperManager.DefaultInstance.GetMapper, List>(); //通过映射实体赋值 var invoiceModel = mapper.Map(invoiceCodeDtoIns).FirstOrDefault(); var invoceDetailList = mapperDetail.Map(invoiceCodeDtoIns.Where(x => !string.IsNullOrEmpty(x.GoodsOrServicesName) && !string.IsNullOrEmpty(x.SpecificationModel)).ToList()); var queryModel = new PHTGL_Invoice { InvoiceCode = invoiceCode, ProjectId = projectid }; var queryresult = GetPHTGL_InvoiceByModle(queryModel).FirstOrDefault();//查询该发票代码是否存在 if (queryresult != null) { if (queryresult.State != StateDataIn) { continue; } invoiceModel.State = StateDataIn; invoiceModel.ProjectId = projectid; invoiceModel.InvoiceId = queryresult.InvoiceId; invoiceModel.CreateUser = creatUserId; invoiceModel.CreateDate = DateTime.Now; UpdatePHTGL_Invoice(invoiceModel); } else { invoiceModel.InvoiceId = SQLHelper.GetNewID(); invoiceModel.State = StateDataIn; invoiceModel.ProjectId = projectid; invoiceModel.CreateUser = creatUserId; invoiceModel.CreateDate = DateTime.Now; AddPHTGL_Invoice(invoiceModel); } PhtglInvoicedetailService.DeletePHTGL_InvoiceDetailByInvoiceId(invoiceModel.InvoiceId); PhtglInvoicedetailService.BatchAddPHTGL_InvoiveDetail(invoceDetailList, invoiceModel.InvoiceId); //插入发票明细 } return responeData; } /// /// 获取审批人员 /// /// 主键id /// 0 入库 1出库 /// public static List GetApproveManModels(string invoiceId, int type) { List approveManModels = new List(); var table = GetInvoiceApproveManEntity(invoiceId); if (type == 0) //入库 { approveManModels.Add(new ApproveManModel { Number = 1, userid = table.InputApproveMan.ProfessionalEngineer, Rolename = "专业工程师" }); approveManModels.Add(new ApproveManModel { Number = 2, userid = table.InputApproveMan.ConstructionManager, Rolename = "施工经理" }); approveManModels.Add(new ApproveManModel { Number = 3, userid = table.InputApproveMan.ControlManager, Rolename = "控制经理" }); approveManModels.Add(new ApproveManModel { Number = 4, userid = table.InputApproveMan.ProjectManager, Rolename = "项目经理" }); } else { approveManModels.Add(new ApproveManModel { Number = 5, userid = table.OutputApproveMan.PurchasingMan, Rolename = "采购员" }); approveManModels.Add(new ApproveManModel { Number = 6, userid = table.OutputApproveMan.ControlManager, Rolename = "控制经理" }); approveManModels.Add(new ApproveManModel { Number = 7, userid = table.OutputApproveMan.ProjectManager, Rolename = "项目经理" }); approveManModels.Add(new ApproveManModel { Number = 8, userid = table.OutputApproveMan.ConUnitMaterialOfficer, Rolename = "施工单位材料经理" }); approveManModels.Add(new ApproveManModel { Number = 9, userid = table.OutputApproveMan.ConUnitProjectManager, Rolename = "施工单位项目经理" }); } return approveManModels; } /// /// 开启审批流程 /// /// public static void StartApprovalProcess(string invoiceId) { var model = GetPHTGL_InvoiceById(invoiceId); if (model.State == StateCreate || model.State == StateInPutApproveRefuse) { CreateFirstApprove(invoiceId, 0); model.State = StateInPutApprove; UpdatePHTGL_Invoice(model); } else if (model.State == StateInPutApproveSuccess || model.State == StateOutPutApproveRefuse) { CreateFirstApprove(invoiceId, 1); model.State = StateOutPutApprove; UpdatePHTGL_Invoice(model); } } /// /// 创建第一个审批流程 /// /// 主键 /// 0 入库 1出库 public static void CreateFirstApprove(string invoiceId, int type) { var approveManModels = GetApproveManModels(invoiceId, type).OrderBy(x => x.Number).FirstOrDefault(); Model.PHTGL_Approve _Approve = new Model.PHTGL_Approve(); _Approve.ApproveId = SQLHelper.GetNewID(typeof(Model.PHTGL_Approve)); _Approve.ContractId = invoiceId; _Approve.ApproveMan = approveManModels.userid; _Approve.ApproveDate = ""; _Approve.State = 0; _Approve.IsAgree = 0; _Approve.ApproveIdea = ""; _Approve.IsPushOa = 0; _Approve.ApproveType = approveManModels.Rolename; _Approve.ApproveForm = (type == 0 ? "Invoice_Input" : "Invoice_Output"); BLL.PHTGL_ApproveService.AddPHTGL_Approve(_Approve); } /// /// 审批 /// /// /// /// /// /// 0 入库 1出库 public static void Approve(string invoiceId, int type, string userid, bool isAgree, string idea) { var approveManModels = GetApproveManModels(invoiceId, type); //获取审批人员 var thisApprovemodel = PHTGL_ApproveService.GetPHTGL_ApproveByUserId(invoiceId, userid);//获取当前人员正在审批的信息 if (thisApprovemodel == null) { return; } var thisApproveTypeNumber = approveManModels.Find(x => x.userid == userid && x.Rolename == thisApprovemodel.ApproveType).Number; //当前审批人员序号 int nextApproveTypeNumber = thisApproveTypeNumber + 1; //下一个审批人员序号 int maxApproveTypeNumber = approveManModels.Max(x => x.Number); //最大审批人员序号 thisApprovemodel.ApproveDate = Funs.GetNewDateTimeOrNow("").ToString(); thisApprovemodel.IsAgree = isAgree ? 2 : 1; thisApprovemodel.ApproveIdea = idea; thisApprovemodel.State = 1; PHTGL_ApproveService.UpdatePHTGL_Approve(thisApprovemodel); if (isAgree) { if (PHTGL_ApproveService.GetPHTGL_ApproveByContractId(invoiceId).Count == 0) //当前节点是否全部审批结束 { if (thisApproveTypeNumber < maxApproveTypeNumber) //是否最末节点 { Model.PHTGL_Approve _Approve = new Model.PHTGL_Approve(); _Approve.ContractId = thisApprovemodel.ContractId; _Approve.ApproveMan = approveManModels.Find(e => e.Number == nextApproveTypeNumber).userid; _Approve.ApproveDate = ""; _Approve.State = 0; _Approve.IsAgree = 0; _Approve.ApproveIdea = ""; _Approve.ApproveType = approveManModels.Find(e => e.Number == nextApproveTypeNumber).Rolename; _Approve.IsPushOa = 0; _Approve.ApproveForm = (type == 0 ? "Invoice_Input" : "Invoice_Output"); _Approve.ApproveId = SQLHelper.GetNewID(typeof(Model.PHTGL_Approve)); BLL.PHTGL_ApproveService.AddPHTGL_Approve(_Approve); } else { //流程走完结束 var model = GetPHTGL_InvoiceById(invoiceId); model.State = (type == 0 ? StateInPutApproveSuccess : StateOutPutApproveSuccess); UpdatePHTGL_Invoice(model); } } } else { //审批拒绝-流程结束 var model = GetPHTGL_InvoiceById(invoiceId); model.State = (type == 0 ? StateInPutApproveRefuse : StateOutPutApproveRefuse); UpdatePHTGL_Invoice(model); } OAWebSevice.Pushoa(); OAWebSevice.DoneRequest(thisApprovemodel.ApproveId); } } }