using JiepeiWMS.IServices; using JiepeiWMS.Model.Models; using JiepeiWMS.Services.BASE; using JiepeiWMS.IRepository.Base; using JiepeiWMS.Model.ViewModels; using JiepeiWMS.Common.Enums; using System; using System.Linq; using System.Threading.Tasks; using JiepeiWMS.Common.Helper; using JiepeiWMS.Common; using JiepeiWMS.Extends; using JiepeiWMS.Common.HttpRestSharp; using JiepeiWMS.Model.BllModels; using System.Collections.Generic; using JiepeiWMS.IRepository.UnitOfWork; using JiepeiWMS.IRepository; using System.Linq.Expressions; using SqlSugar; using JiepeiWMS.Repository; using JiepeiWMS.Model.Result; using System.Threading; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace JiepeiWMS.Services { public class WMQuoteInfoServices : BaseServices, IWMQuoteInfoServices { private readonly IWMPurchaseQuoteDetailRepository _BllWMPurchaseQuoteDetail; private readonly IWMQuoteInfoLogRepository _BllWMQuoteInfoLog; private readonly IWMCheckInfoRepository _BLLWMCheckInfo; private readonly IWMPurchaseInfoRepository _BllWMPurchaseInfo; private readonly IWMPurchaseInfoLogRepository _BllWMPurchaseInfoLog; private readonly IBaseRepository _BllSysUser; private readonly IBaseRepository _dal; private readonly IUnitOfWork _DB; private readonly IBaseRepository _BllWMSupplier; private readonly IBaseRepository _BllWMProductList; private readonly IBaseRepository _BllWMProductInfo; private readonly IBaseRepository _BllWMStockLog; private readonly ILogger _logger; public WMQuoteInfoServices( IBaseRepository dal, IWMPurchaseQuoteDetailRepository BllWMPurchaseQuoteDetail, IWMQuoteInfoLogRepository BllWMQuoteInfoLog, IWMCheckInfoRepository BLLWMCheckInfo, IWMPurchaseInfoRepository BllWMPurchaseInfo, IWMPurchaseInfoLogRepository BllWMPurchaseInfoLog, IBaseRepository BllSysUser, IUnitOfWork DB, IBaseRepository BllWMSupplier, IBaseRepository BllWMProductList, IBaseRepository BllWMProductInfo, IBaseRepository BllWMStockLog, ILogger logger ) { this._dal = dal; base.BaseDal = dal; _BllWMPurchaseQuoteDetail = BllWMPurchaseQuoteDetail; _BllWMQuoteInfoLog = BllWMQuoteInfoLog; _BLLWMCheckInfo = BLLWMCheckInfo; _BllWMPurchaseInfo = BllWMPurchaseInfo; _BllWMPurchaseInfoLog = BllWMPurchaseInfoLog; _BllSysUser = BllSysUser; _DB = DB; _BllWMSupplier = BllWMSupplier; _BllWMProductList = BllWMProductList; _BllWMProductInfo = BllWMProductInfo; _BllWMStockLog = BllWMStockLog; _logger = logger; } private string puorderUrl = "/uapws/rest/pu/manage/puorder/add"; private string invoiceUrl = "/uapws/rest/pu/manage/invoice/add"; public async Task EditInfo(VMWMQuoteInfo VModel, int UserId) { var msg = string.Empty; if (VModel.ListDetail.Any(t => (t.Price ?? 0) <= 0 || (t.CheckNum ?? 0) <= 0)) { msg = "每个采购商品数量和单价不能小于等于0元"; goto ErrorResult; } var detailstatusCheckedPass = EnumWMPurchaseDetailStatus.CheckedPass.GetHashCode(); if (VModel.ListDetail.Any(t => t.Status != detailstatusCheckedPass)) { msg = "每个采购商品状态必须为已审核"; goto ErrorResult; } var totalAmount = 0m; #region 报价价格更新 if (VModel.ListDetail != null) { var lstdetail = await _BllWMPurchaseQuoteDetail.QueryByIDs(VModel.ListDetail.Select(t => (object)t.Id).ToArray()); foreach (var item in VModel.ListDetail) { var detail = lstdetail.FirstOrDefault(t => t.Id == item.Id); if (!item.Discount.HasValue || item.Discount.Value <= 0) { item.Discount = 100; } detail.CheckNum = item.CheckNum ?? 0; detail.Price = item.Price ?? 0; detail.Discount = item.Discount; detail.Remark = item.Remark; detail.PurchaseUnit = item.PurchaseUnit; detail.DiscountPrice = detail.Price.Value * detail.Discount.Value / 100m; detail.DisAmount = detail.Discount.Value * item.CheckNum.Value * item.Price.Value / 100m; detail.Amount = detail.DisAmount.Value; detail.Status = EnumWMPurchaseDetailStatus.CheckedPass.GetHashCode(); var did = await _BllWMPurchaseQuoteDetail.Update(detail); totalAmount += detail.Amount.Value; } } #endregion var model = await QueryById(VModel.Id); model.Bank = VModel.Bank; model.BankAccount = VModel.BankAccount; model.ExpectedArrivalTime = VModel.ExpectedArrivalTime; model.FileUrl = VModel.FileUrl; model.Payee = VModel.Payee; model.PayPic = VModel.PayPic; model.PayType = VModel.PayType; model.QuoteCode = VModel.QuoteCode; model.SettlementAmount = VModel.SettlementAmount; model.SupplierId = VModel.SupplierId; model.SysOrgId = VModel.SysOrgId; model.UpdateTime = DateTime.Now; model.Remark = VModel.Remark; model.ActualAmount = totalAmount; model.Status = EnumWMPurchaseDetailStatus.WaitCheck.GetHashCode(); var ok = await Update(model); if (!ok) { msg = "修改数据失败"; goto ErrorResult; } //报价订单日志 var log = new WMQuoteInfoLog(); log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "修改报价完成" + ((EnumWMPurchaseDetailStatus)model.Status)._GetDescriptionByEnumValue(); await _BllWMQuoteInfoLog.Add(log); return string.Empty; ErrorResult: return msg; } /// /// 创建报价单 /// /// /// /// public async Task AddInfo(VMWMQuoteInfo VModel, int UserId) { var msg = string.Empty; if (VModel.ListDetail.Any(t => (t.Price ?? 0) <= 0 || (t.CheckNum ?? 0) <= 0)) { msg = "每个采购商品数量和单价不能小于等于0元"; goto ErrorResult; } var statusCheckedPass = EnumWMPurchaseDetailStatus.CheckedPass.GetHashCode(); if (VModel.ListDetail.Any(t => t.Status != statusCheckedPass)) { msg = "每个采购商品状态必须为已审核"; goto ErrorResult; } var totalAmount = 0m; var WMCheckPrice = Appsettings.app("AppSettings", "WMCheckPrice")._ToDecimal(); var checkinfokey = totalAmount > WMCheckPrice ? "BJ2" : "BJ"; var checkinfo = (await _BLLWMCheckInfo.QuerySql("select * from WMCheckInfo where [Key]='" + checkinfokey + "'")).FirstOrDefault(); if (checkinfo == null) { msg = "找不到审批流"; goto ErrorResult; } var details = VModel.ListDetail; _DB.BeginTran(); try { var statusQuoteWaitCheck = EnumWMPurchaseDetailStatus.QuoteWaitCheck.GetHashCode(); #region 报价单创建 var model = new WMQuoteInfo(); model.CheckKey = checkinfo.Key; var rankList = JsonHelper.DeserializeObject(checkinfo.Json); var tb = await _dal.QueryTable("select isnull((select max(Id) from WMQuoteInfo),0)"); int MaxId = tb.Rows[0][0].ToString()._ToInt32(); string code = "BAO" + MaxId; model.ExpectedArrivalTime = VModel.ExpectedArrivalTime; model.PayType = VModel.PayType; model.SupplierId = VModel.SupplierId; model.Remark = VModel.Remark; model.SysOrgId = VModel.SysOrgId; model.QuoteCode = CreateCode(3, code); var checkrank = rankList.checkRankList.Where(w => w.CheckRank == 1).FirstOrDefault(); if (checkrank != null) { model.CheckAdminId = checkrank.AdminId; model.CheckRank = checkrank.CheckRank; } model.Status = statusQuoteWaitCheck; model.ActualAmount = totalAmount; model.UpdateTime = DateTime.Now; model.CreateTime = DateTime.Now; model.EmployeeId = UserId; var id = await Add(model); var ok = id > 0; if (!ok) { _DB.RollbackTran(); msg = "写入数据失败"; goto ErrorResult; } //报价订单日志 var log = new WMQuoteInfoLog(); log.OrderId = id; log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "【创建报价】完成" + ((EnumWMPurchaseDetailStatus)model.Status)._GetDescriptionByEnumValue(); await _BllWMQuoteInfoLog.Add(log); #endregion #region 详细更新 if (details != null) { var lstdetail = await _BllWMPurchaseQuoteDetail.QueryByIDs(VModel.ListDetail.Select(t => (object)t.Id).ToArray()); foreach (var item in VModel.ListDetail) { var detail = lstdetail.FirstOrDefault(t => t.Id == item.Id); if (!item.Discount.HasValue || item.Discount.Value <= 0) { item.Discount = 100; } detail.QuoteId = id; detail.CheckNum = item.CheckNum ?? 0; detail.Price = item.Price ?? 0; detail.Discount = item.Discount; detail.Remark = item.Remark; detail.PurchaseUnit = item.PurchaseUnit; detail.DiscountPrice = detail.Price.Value * detail.Discount.Value / 100m; detail.DisAmount = detail.Discount.Value * item.CheckNum.Value * item.Price.Value / 100m; detail.Amount = detail.DisAmount.Value; detail.Status = statusQuoteWaitCheck; var did = await _BllWMPurchaseQuoteDetail.Update(detail); totalAmount += detail.Amount.Value; } } tb = await _dal.QueryTable("update WMQuoteInfo set ActualAmount=" + totalAmount + " where Id=" + id); #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); return ex.ToString(); } return string.Empty; ErrorResult: return msg; } /// /// 确认报价信息(会变更状态为报价中) /// /// /// /// public async Task ConfirmQuoteInfo(VMWMQuoteInfo VModel, int UserId) { var msg = string.Empty; if (VModel.ListDetail.Any(t => (t.Price ?? 0) <= 0 || (t.CheckNum ?? 0) <= 0)) { return "每个采购商品数量和单价不能小于等于0元"; } var statusQuoteWaitCheck = EnumWMPurchaseDetailStatus.QuoteWaitCheck.GetHashCode();//报价待审核 if (VModel.ListDetail.Any(t => t.Status != statusQuoteWaitCheck)) { return "每个采购商品状态必须为已审核"; } _DB.BeginTran(); try { var totalAmount = 0m; bool ok; var statusQuoteChecking = EnumWMPurchaseDetailStatus.QuoteChecking.GetHashCode();//报价审核中 #region 详细信息更新 List lstdetail = null; if (VModel.ListDetail != null) { //原数据 lstdetail = await _BllWMPurchaseQuoteDetail.QueryByIDs(VModel.ListDetail.Select(t => (object)t.Id).ToArray()); //产品 var lstproduct = await QueryTable("SELECT pg.Id,pg.Name,ps.Name Name2 FROM [dbo].[WMProductList] pg left join WMProductSpec ps on pg.SpecIds=ps.Id where pg.Id in (" + string.Join(",", lstdetail.Select(t => t.ProductId)) + ")"); var lsttproduct = lstproduct.Rows._Select(t => new { Id = (int)t["Id"], Name = t["Name"]._ToDbStr(), Name2 = t["Name2"]._ToDbStr() }); //更新 foreach (var item in VModel.ListDetail) { var detail = lstdetail.FirstOrDefault(t => t.Id == item.Id); var product = lsttproduct.FirstOrDefault(t => t.Id == item.ProductId); if (!item.Discount.HasValue || item.Discount.Value <= 0) { item.Discount = 100; } detail.CheckNum = item.CheckNum ?? 0; detail.Price = item.Price ?? 0; detail.Discount = item.Discount; detail.Remark = item.Remark; detail.PurchaseUnit = item.PurchaseUnit; detail.DiscountPrice = detail.Price.Value * detail.Discount.Value / 100m; detail.DisAmount = detail.Discount.Value * item.CheckNum.Value * item.Price.Value / 100m; detail.Amount = detail.DisAmount.Value; detail.Status = statusQuoteChecking; detail.ProductName = product.Name; detail.ProductSpec = product.Name2; totalAmount += detail.Amount.Value; //商品关联表 var _productInfo = await _BllWMProductInfo.GetModel(w => w.ProductListId == detail.ProductId && w.WareHouseId == detail.WareHouseId); if (_productInfo != null) { detail.StockNum = _productInfo.Quantity != null ? _productInfo.Quantity.Value : 0; //detail.StockNum = item.StockNum; var sqlWeek = string.Format(@" select isnull((SELECT SUM(Quantity) FROM dbo.WMStockLog WHERE ProductListId = {0} AND ProductId = {1} AND Type = {2} AND CreateTime >= CONVERT(VARCHAR(10),GETDATE() - {3},120)),0) " , detail.ProductId, _productInfo.Id, 7, 1); var dt = await _BllWMStockLog.QueryTable(sqlWeek.ToString()); //周用量 detail.WeekNum = (decimal)dt.Rows[0][0]; var sqlMonth = string.Format(@" select isnull((SELECT SUM(Quantity) FROM dbo.WMStockLog WHERE ProductListId = {0} AND ProductId = {1} AND Type = {2} AND CreateTime >= CONVERT(VARCHAR(10),GETDATE() - {3},120)),0) " , detail.ProductId, _productInfo.Id, 30, 1); var dt2 = await _BllWMStockLog.QueryTable(sqlMonth.ToString()); //月用量 detail.MonthNum = (decimal)dt2.Rows[0][0]; detail.ProductCode = item.ProductCode; } } ok = await _BllWMPurchaseQuoteDetail.Update(lstdetail); if (!ok) { _DB.RollbackTran(); return "更新详细失败"; } } #endregion #region 报价信息更新 var model = await QueryById(VModel.Id); model.Bank = VModel.Bank; model.BankAccount = VModel.BankAccount; model.ExpectedArrivalTime = VModel.ExpectedArrivalTime; model.FileUrl = VModel.FileUrl; model.Payee = VModel.Payee; model.PayPic = VModel.PayPic; model.PayType = VModel.PayType; model.QuoteCode = VModel.QuoteCode; model.SettlementAmount = VModel.SettlementAmount; model.SupplierId = VModel.SupplierId; var user = await _BllSysUser.GetModel(t => t.uID == UserId); model.SysOrgId = user.SysOrgId; model.UpdateTime = DateTime.Now; model.Remark = VModel.Remark; model.ActualAmount = totalAmount; model.Status = statusQuoteChecking; ok = await Update(model); if (!ok) { _DB.RollbackTran(); return "修改报价失败"; } //加入日志 var log = new WMQuoteInfoLog(); log.OrderId = VModel.Id; log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "【确认报价单】设置" + ((EnumWMPurchaseDetailStatus)model.Status)._GetDescriptionByEnumValue(); await _BllWMQuoteInfoLog.Add(log); #endregion #region 同步到财务系统(仅报价阶段) var lstuser = await QueryTable("select Name from Department where Id=" + user.SysOrgId); var Modelsupplier = await _BllWMSupplier.QueryById(model.SupplierId); var sysorgname = lstuser.Rows._Select(t => t["Name"]._ToDbStr()).FirstOrDefault(); var apioahost = Appsettings.app("AppSettings", "ApiOAHost"); var rst = HttpHelper.PostApi(apioahost + "/api/Production/PurchaseofgoodsList", new { appsecret = "kw3j5k32ur38rnerkKJHk83", timestamp = DateTime.Now._ToTimestamp(), SourceType = 2,//来源类型 1OA 2生产 WorkNo = user.JobNo,//申请人(工号) PurchaseNumber = model.QuoteCode,//采购编号 ApprovalProject = sysorgname,//主体 NeedTime = model.ExpectedArrivalTime,//需用时间 ApprovalReason = "仓库物品采购" + (string.IsNullOrEmpty(model.Remark) ? ":" : string.Empty) + model.Remark,//申请事由 ApprovalMoney = model.ActualAmount,//申请金额 GoodsImg = model.FileUrl,//物品详情,合同 GoodsImgName = "合同",//物品附件名称 SupplierId = Modelsupplier.OASupplierId,//供应商id SupplierName = Modelsupplier.Name,//供应商名称 Payment = ((EnumPayType)model.PayType)._GetDescriptionByEnumValue(),//支付方式(网银、电汇、承兑、现金、微信、支付宝、PAYPAL) RepulseType = model.RepulseType,//是否打回类型 Son = lstdetail == null ? new object[] { } : lstdetail.Select(t => new { GoodName = t.ProductName,//物品名称 Specifications = t.ProductSpec,//规格 UnitPrice = t.Price,//单价, Number = t.CheckNum,//数量 TotalPrice = t.Amount,//总金额 GoodCode = t.ProductCode,//产品编码 GoodUnit = t.PurchaseUnit,//单位 GoodStock = t.StockNum,//物料库存 WeekConsumption = t.WeekNum,//周用量 MonthConsumption = t.MonthNum,//月用量 Remark = t.Remark//备注 }).ToArray() }); if (rst == null || rst.Code != 200) { _DB.RollbackTran(); return rst == null || string.IsNullOrEmpty(rst.Message) ? "请求财务接口失败" : rst.Message; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); #region 加入日志 var log = new WMQuoteInfoLog(); log.OrderId = VModel.Id; log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "【确认报价单】操作失败," + ex.ToString(); await _BllWMQuoteInfoLog.Add(log); #endregion return ex.ToString(); } return string.Empty; } /// /// 确认请款银行等信息(会变更状态为请款中) /// /// /// /// public async Task ConfirmPayInfo(VMWMQuoteInfo VModel, int UserId) { var msg = string.Empty; var statusQuotePass = EnumWMPurchaseDetailStatus.QuotePass.GetHashCode(); if (VModel.ListDetail.Any(t => t.Status != statusQuotePass)) { return "每个采购商品状态必须为报价通过"; } _DB.BeginTran(); try { bool ok; var statusPayChecking = EnumWMPurchaseDetailStatus.PayChecking.GetHashCode();//请款审核中 #region 详细信息更新 List lstdetail = null; if (VModel.ListDetail != null) { lstdetail = await _BllWMPurchaseQuoteDetail.QueryByIDs(VModel.ListDetail.Select(t => (object)t.Id).ToArray()); var lstproduct = await QueryTable("SELECT pg.Id,pg.Name,ps.Name Name2 FROM [dbo].[WMProductList] pg left join WMProductSpec ps on pg.SpecIds=ps.Id where pg.Id in (" + string.Join(",", lstdetail.Select(t => t.ProductId)) + ")"); var lsttproduct = lstproduct.Rows._Select(t => new { Id = (int)t["Id"], Name = t["Name"]._ToDbStr(), Name2 = t["Name2"]._ToDbStr() }); foreach (var item in VModel.ListDetail) { var detail = lstdetail.FirstOrDefault(t => t.Id == item.Id); var product = lsttproduct.FirstOrDefault(t => t.Id == item.ProductId); detail.Status = statusPayChecking; detail.ProductName = product.Name; detail.ProductSpec = product.Name2; } ok = await _BllWMPurchaseQuoteDetail.Update(lstdetail); if (!ok) { _DB.RollbackTran(); return "更新详细失败"; } } #endregion #region 报价信息更新 var model = await QueryById(VModel.Id); model.Bank = VModel.Bank; model.BankAccount = VModel.BankAccount; model.ExpectedArrivalTime = VModel.ExpectedArrivalTime; model.FileUrl = VModel.FileUrl; model.Payee = VModel.Payee; model.PayPic = VModel.PayPic; model.PayType = VModel.PayType; model.QuoteCode = VModel.QuoteCode; model.SettlementAmount = VModel.SettlementAmount; model.SupplierId = VModel.SupplierId; var user = await _BllSysUser.GetModel(t => t.uID == UserId); model.SysOrgId = user.SysOrgId; model.SupplierId = VModel.SupplierId; model.UpdateTime = DateTime.Now; model.Remark = VModel.Remark; model.Status = statusPayChecking; ok = await Update(model); if (!ok) { _DB.RollbackTran(); return "修改信息失败"; } //加入日志 var log = new WMQuoteInfoLog(); log.OrderId = VModel.Id; log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "【确认请款单】设置" + ((EnumWMPurchaseDetailStatus)model.Status)._GetDescriptionByEnumValue(); await _BllWMQuoteInfoLog.Add(log); #endregion #region 同步到财务系统(仅请款阶段) var lstuser = await QueryTable("select Name from Department where Id=" + user.SysOrgId); var sysorgname = lstuser.Rows._Select(t => t["Name"]._ToDbStr()).FirstOrDefault(); var modelsupplier = await _BllWMSupplier.QueryById(model.SupplierId); var apioahost = Appsettings.app("AppSettings", "ApiOAHost"); var rst = HttpHelper.PostApi(apioahost + "/api/Production/PayList", new { appsecret = "kw3j5k32ur38rnerkKJHk83", timestamp = DateTime.Now._ToTimestamp(), SourceType = 2,//来源类型 1OA 2生产 PurchaseNumber = model.QuoteCode,//采购编号 WorkNo = user.JobNo,//申请人(工号) DepartmentId = user.DepartmentId,//部门编号 OptionName = 2,//选项(1采购及加工2支付费用) Remark = "仓库物品采购" + (string.IsNullOrEmpty(model.Remark) ? ":" : string.Empty) + model.Remark,//申请事由 PayCompany = sysorgname,//主体名称 Payee = model.Payee,//收款人 BankName = model.Bank,//开户支行 BankNumber = model.BankAccount,//帐号 PayDate = model.ExpectedArrivalTime,//付款日期 Currency = 1,//币种(1人民币、2美元) Payment = ((EnumPayType)model.PayType)._GetDescriptionByEnumValue(),//支付方式(网银、电汇、承兑、现金、微信、支付宝、PAYPAL) HaveInvoice = 1,//发票是否取的(1是,0否) InvoiceAmount = model.ActualAmount,//申请金额 HaveInvoiceDate = model.ExpectedArrivalTime,//预计取得发票日期 ActualAmount = model.ActualAmount,//实际金额 Attachs = model.FileUrl,//附件 AttachsName = "合同",//物品附件名称 SupplierId = modelsupplier.OASupplierId,//供应商id SupplierName = modelsupplier.Name,//供应商名称 RepulseType = model.RepulseType,//是否打回类型 }); if (rst == null || rst.Code != 200) { _DB.RollbackTran(); return rst == null || string.IsNullOrEmpty(rst.Message) ? "请求财务接口失败" : rst.Message; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); #region 加入日志 var log = new WMQuoteInfoLog(); log.OrderId = VModel.Id; log.AdminId = UserId; log.CreateTime = DateTime.Now; log.Content = "【确认请款单】操作失败," + ex.ToString(); await _BllWMQuoteInfoLog.Add(log); #endregion return ex.ToString(); } return string.Empty; } /// /// 创建单号 /// /// /// /// string CreateCode(int SubLength, string Str) { var WMInvoicingFIG = Appsettings.app("AppSettings", "WMInvoicingFIG")._ToDecimal(); string code = ""; //从第四位后截取字符 string tmp = Str.Substring(SubLength); //截取前四个字符 string bb = Str.Substring(0, SubLength); for (int i = 1; i <= 1; i++) { string num = Convert.ToString(Convert.ToInt32(tmp) + i); int len = Convert.ToInt32(WMInvoicingFIG); //详情见同目录 PadLeft,填充 num = num.PadLeft(len, '0'); code = bb + num; } return code; } /// /// 财务审批报价回调 /// /// 报价单号 /// 是否通过 /// 信息 /// 拒绝类型 0 通过 1临时 2永久 /// public async Task SetCheckQuoteIsPass(string QuoteCode, bool IsPass, string Msg, int RejectType) { if (string.IsNullOrWhiteSpace(QuoteCode)) { return "找不到采购单"; } //报价信息 var quoteinfo = (await Query(t => t.QuoteCode == QuoteCode)).FirstOrDefault(); if (quoteinfo == null) { return "找不到采购单"; } var statusQuoteChecking = EnumWMPurchaseDetailStatus.QuoteChecking.GetHashCode();//报价审核中 var statusQuoteWaitCheck = EnumWMPurchaseDetailStatus.QuoteWaitCheck.GetHashCode();//报价待审核 if (quoteinfo.Status != statusQuoteChecking) { return "采购单状态必须是报价中"; } var statusQuoteNoPass = EnumWMPurchaseDetailStatus.QuoteNoPass.GetHashCode();//报价不通过 var statusQuotePass = EnumWMPurchaseDetailStatus.QuotePass.GetHashCode();//报价通过 var statusWiatPurchase = EnumWMPurchaseDetailStatus.WiatPurchase.GetHashCode();//待采购(即待下单) var details = await _BllWMPurchaseQuoteDetail.Query(t => t.QuoteId == quoteinfo.Id && t.Status == statusQuoteChecking); _DB.BeginTran(); try { var PurchaseQuoteDetailList = new List(); #region 详细信息更新 //报价单详细信息状态更新 foreach (var mod in details) { if (IsPass)//是否通过审核 { if (quoteinfo.PayType == EnumPayType.现金.GetHashCode() || quoteinfo.PayType == EnumPayType.承兑.GetHashCode() || quoteinfo.PayType == EnumPayType.电汇.GetHashCode()) { mod.Status = statusQuotePass; } else { mod.Status = statusWiatPurchase; } } else { //通过RejectType判断拒绝类型 0 通过 1临时 2永久 if (RejectType == 2) { mod.Status = statusQuoteNoPass; } else if (RejectType == 1) { mod.Status = statusQuoteWaitCheck;//报价待审核 } } PurchaseQuoteDetailList.Add(mod); } var PuorderResult = new Tuple("", false); //根据配置是否调用NC接口 var NCInterfaceSecret = Appsettings.app("AppSettings", "NCInterfaceSecret").ToString(); if (NCInterfaceSecret == "True") //调NC采购订单接口 PuorderResult = await BeginPuorderInNC(quoteinfo, PurchaseQuoteDetailList); if (!PuorderResult.Item2 && !string.IsNullOrWhiteSpace(PuorderResult.Item1)) { _DB.RollbackTran(); return PuorderResult.Item1; } var ok = await _BllWMPurchaseQuoteDetail.Update(details); if (!ok) { _DB.RollbackTran(); return "详细信息更新失败"; } #endregion #region 报价单信息更新 if (IsPass)//是否通过审核 { if (quoteinfo.PayType == EnumPayType.现金.GetHashCode() || quoteinfo.PayType == EnumPayType.承兑.GetHashCode() || quoteinfo.PayType == EnumPayType.电汇.GetHashCode()) { quoteinfo.Status = statusQuotePass; quoteinfo.RepulseType = 0;//用于调OA报价审核接口使用 } else { quoteinfo.Status = statusWiatPurchase; quoteinfo.RepulseType = 0;//用于调OA报价审核接口使用 } } else { //通过RejectType判断拒绝类型 0 通过 1临时 2永久 if (RejectType == 2) { quoteinfo.Status = statusQuoteNoPass; } else if (RejectType == 1)//类型临时的话返回上一步操作的状态 { quoteinfo.Status = statusQuoteWaitCheck;//报价待审核 quoteinfo.RepulseType = 2;//用于调OA报价审核接口使用 } } ok = await Update(quoteinfo); if (!ok) { _DB.RollbackTran(); return "报价单更新失败"; } //报价订单日志 var _quoteinfolog = new WMQuoteInfoLog(); _quoteinfolog.OrderId = quoteinfo.Id; _quoteinfolog.AdminId = 0; _quoteinfolog.Content = "【报价" + (IsPass ? "" : "不") + "通过】设置状态为" + ((EnumWMPurchaseDetailStatus)quoteinfo.Status)._GetDescriptionByEnumValue() + (string.IsNullOrEmpty(Msg) ? string.Empty : ",原因:" + Msg); _quoteinfolog.CreateTime = DateTime.Now; var id = await _BllWMQuoteInfoLog.Add(_quoteinfolog); if (id <= 0) { _DB.RollbackTran(); return "添加日志失败"; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); #region 加入日志 var log = new WMQuoteInfoLog(); log.OrderId = quoteinfo.Id; log.AdminId = 0; log.CreateTime = DateTime.Now; log.Content = "【报价审批结果】回调失败," + ex.ToString(); await _BllWMQuoteInfoLog.Add(log); #endregion return ex.ToString(); } return string.Empty; } /// /// 财务审批请款回调 /// /// 报价单号 /// 是否通过 /// 信息 /// 拒绝类型 0 通过 1临时 2永久 /// public async Task SetCheckPayIsPass(string QuoteCode, bool IsPass, string Msg, int RejectType) { if (string.IsNullOrWhiteSpace(QuoteCode)) { return "找不到采购单"; } //报价信息 var quoteinfo = (await Query(t => t.QuoteCode == QuoteCode)).FirstOrDefault(); if (quoteinfo == null) { return "找不到采购单"; } var statusPayChecking = EnumWMPurchaseDetailStatus.PayChecking.GetHashCode();//请款审核中 if (quoteinfo.Status != statusPayChecking) { return "采购单状态必须是请款中"; } var statusQuotePass = EnumWMPurchaseDetailStatus.QuotePass.GetHashCode();//报价通过 var statusPayNoPass = EnumWMPurchaseDetailStatus.PayNoPass.GetHashCode();//请款不通过 var statusPayPass = EnumWMPurchaseDetailStatus.PayPass.GetHashCode();//请款通过 var statusWiatPurchase = EnumWMPurchaseDetailStatus.WiatPurchase.GetHashCode();//待采购(即待下单) var details = await _BllWMPurchaseQuoteDetail.Query(t => t.QuoteId == quoteinfo.Id && t.Status == statusPayChecking); _DB.BeginTran(); try { #region 详细信息更新 //报价单详细信息状态更新 foreach (var mod in details) { if (IsPass)//是否通过审核 { mod.Status = statusWiatPurchase; } else { //通过RejectType判断拒绝类型 0 通过 1临时 2永久 if (RejectType == 2) { mod.Status = statusPayNoPass; } else if (RejectType == 1)//类型临时的话返回上一步操作的状态 { mod.Status = statusQuotePass;//报价通过 } } } var InvoiceResult = new Tuple("", true); //根据配置是否调用NC接口 var NCInterfaceSecret = Appsettings.app("AppSettings", "NCInterfaceSecret").ToString(); if (NCInterfaceSecret == "True") //调NC采购发票接口 InvoiceResult = await BeginInvoiceInNC(quoteinfo, details); if (!InvoiceResult.Item2 && !string.IsNullOrWhiteSpace(InvoiceResult.Item1)) { _DB.RollbackTran(); return InvoiceResult.Item1; } var ok = await _BllWMPurchaseQuoteDetail.Update(details); if (!ok) { _DB.RollbackTran(); return "详细信息更新失败"; } #endregion #region 请款单信息更新 if (IsPass)//是否通过审核 { quoteinfo.Status = statusWiatPurchase; quoteinfo.RepulseType = 0;//用于调OA报价审核接口使用 } else { //通过RejectType判断拒绝类型 0 通过 1临时 2永久 if (RejectType == 2) { quoteinfo.Status = statusPayNoPass; } else if (RejectType == 1) //类型临时的话返回上一步操作的状态 { quoteinfo.Status = statusQuotePass;//报价通过 quoteinfo.RepulseType = 2;//用于调OA报价审核接口使用 } } ok = await Update(quoteinfo); if (!ok) { _DB.RollbackTran(); return "请款单更新失败"; } //报价订单日志 var _quoteinfolog = new WMQuoteInfoLog(); _quoteinfolog.OrderId = quoteinfo.Id; _quoteinfolog.AdminId = 0; _quoteinfolog.Content = "【请款" + (IsPass ? "" : "不") + "通过】设置状态为" + ((EnumWMPurchaseDetailStatus)quoteinfo.Status)._GetDescriptionByEnumValue() + (string.IsNullOrEmpty(Msg) ? string.Empty : ",原因:" + Msg); _quoteinfolog.CreateTime = DateTime.Now; var id = await _BllWMQuoteInfoLog.Add(_quoteinfolog); if (id <= 0) { _DB.RollbackTran(); return "添加日志失败"; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); #region 加入日志 var log = new WMQuoteInfoLog(); log.OrderId = quoteinfo.Id; log.AdminId = 0; log.CreateTime = DateTime.Now; log.Content = "【请款审批结果】回调失败," + ex.ToString(); await _BllWMQuoteInfoLog.Add(log); #endregion return ex.ToString(); } return string.Empty; } /// /// 采购下单 /// /// 采购编号 /// /// public async Task Purchase(int Id, int UserId) { if (Id <= 0) { return "找不到采购单"; } var quoteinfo = await GetModel(t => t.Id == Id); if (quoteinfo == null) { return "找不到采购单"; } var statusWiatPurchase = EnumWMPurchaseDetailStatus.WiatPurchase.GetHashCode();//待采购(即待下单) if (quoteinfo.Status != statusWiatPurchase) { return "报价单必需为待采购状态"; } //详情状态修改 var details = await _BllWMPurchaseQuoteDetail.Query(t => t.QuoteId == quoteinfo.Id && t.Status == statusWiatPurchase); _DB.BeginTran(); try { var statusPurchasing = EnumWMPurchaseDetailStatus.Purchasing.GetHashCode();//采购中 #region 详细信息更新 foreach (var mod in details) { mod.Status = statusPurchasing; } var ok = await _BllWMPurchaseQuoteDetail.Update(details); if (!ok) { _DB.RollbackTran(); return "详细信息更新失败"; } #endregion #region 报价单更新 quoteinfo.Status = statusPurchasing; ok = await Update(quoteinfo); if (!ok) { _DB.RollbackTran(); return "报价单更新失败"; } //报价订单日志 var _quoteinfolog = new WMQuoteInfoLog(); _quoteinfolog.OrderId = quoteinfo.Id; _quoteinfolog.AdminId = UserId; _quoteinfolog.Content = "【采购下单】设置状态为" + ((EnumWMPurchaseDetailStatus)quoteinfo.Status)._GetDescriptionByEnumValue(); _quoteinfolog.CreateTime = DateTime.Now; ok = await _BllWMQuoteInfoLog.Add(_quoteinfolog) > 0; if (!ok) { _DB.RollbackTran(); return "写入日志失败"; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); #region 加入日志 var log = new WMQuoteInfoLog(); log.OrderId = quoteinfo.Id; log.AdminId = 0; log.CreateTime = DateTime.Now; log.Content = "【采购下单】操作失败," + ex.ToString(); await _BllWMQuoteInfoLog.Add(log); #endregion return ex.ToString(); } return string.Empty; } /// /// 完成交易 /// /// 采购编号 /// 当前用户 /// public async Task Done(int Id, int UserId) { if (Id <= 0) { return "找不到采购单"; } var quoteinfo = await GetModel(t => t.Id == Id); if (quoteinfo == null) { return "找不到采购单"; } var statusStorageing = EnumWMPurchaseDetailStatus.Storageing.GetHashCode();//入库中 if (quoteinfo.Status != statusStorageing) { return "报价单必需为入库中状态"; } //详情状态修改 var details = await _BllWMPurchaseQuoteDetail.Query(t => t.QuoteId == quoteinfo.Id); _DB.BeginTran(); try { #region 详细信息更新 foreach (var mod in details) { mod.Status = EnumWMPurchaseDetailStatus.Finish.GetHashCode(); } var ok = await _BllWMPurchaseQuoteDetail.Update(details); if (!ok) { _DB.RollbackTran(); return "详细信息更新失败"; } #endregion var statusFinish = EnumWMPurchaseDetailStatus.Finish.GetHashCode();//交易完成 #region 报价单更新 quoteinfo.Status = statusFinish; ok = await Update(quoteinfo); if (!ok) { _DB.RollbackTran(); return "报价单更新失败"; } //报价订单日志 var _quoteinfolog = new WMQuoteInfoLog(); _quoteinfolog.OrderId = quoteinfo.Id; _quoteinfolog.AdminId = UserId; _quoteinfolog.Content = "【交易完成】设置状态为" + ((EnumWMPurchaseDetailStatus)quoteinfo.Status)._GetDescriptionByEnumValue(); _quoteinfolog.CreateTime = DateTime.Now; ok = await _BllWMQuoteInfoLog.Add(_quoteinfolog) > 0; if (!ok) { _DB.RollbackTran(); return "写入日志失败"; } #endregion _DB.CommitTran(); } catch (Exception ex) { _DB.RollbackTran(); return ex.ToString(); } return string.Empty; } /// /// 调用友采购订单接口 /// /// public async Task> BeginPuorderInNC(WMQuoteInfo infoModel, List detailList) { try { #region NCPuorderViewModels pos = new NCPuorderViewModels(); NCPuorderViewModels.Ufinterface uface = new NCPuorderViewModels.Ufinterface(); NCPuorderViewModels.Bill bill = new NCPuorderViewModels.Bill(); NCPuorderViewModels.Billhead head = new NCPuorderViewModels.Billhead(); NCPuorderViewModels.PKOrderB pkorderb = new NCPuorderViewModels.PKOrderB(); List item = new List(); var UnitCode = ""; var SupplierUnifiedCode = ""; var SupplierTaxRate = ""; decimal TaxRate = 0.13m; var SupplierModel = new WMSupplier(); var ProductListModel = new WMProductList(); if (infoModel != null && infoModel.SupplierId > 0) { SupplierModel = await _BllWMSupplier.QueryById(infoModel.SupplierId); if (SupplierModel != null && !string.IsNullOrWhiteSpace(SupplierModel.UnifiedCode)) { SupplierUnifiedCode = SupplierModel.UnifiedCode; SupplierTaxRate = SupplierModel.TaxRate; } } //赋uface uface.account = "JPKJ"; uface.billtype = "21";//采购订单 uface.groupcode = "JPKJ"; uface.isexchange = "Y"; uface.replace = "Y"; uface.sender = "JPKJ001"; //赋bill bill.id = infoModel.Id; //赋head head.pk_group = "JPKJ"; head.pk_org = "1001"; head.pk_org_v = "1001"; head.dbilldate = infoModel.CreateTime.ObjToString(); head.pk_supplier = SupplierUnifiedCode; head.pk_dept = "99001"; head.vtrantypecode = "21-01"; head.pk_invcsupllier = SupplierUnifiedCode; head.bislatest = "Y"; head.bcooptoso = "N"; head.bsocooptome = "N"; head.ntotalastnum = ""; head.ntotalorigmny = ""; head.bfrozen = "N"; head.pk_busitype = "CGRK"; head.fhtaxtypeflag = "1"; head.corigcurrencyid = "CNY"; head.brefwhenreturn = "N"; head.ntotalweight = "0"; head.ntotalvolume = "0"; head.ntotalpiece = "0"; head.bfinalclose = "N"; head.pk_dept_v = "99001"; head.ctrantypeid = "21-01"; //赋item foreach (var detailItem in detailList) { if (detailItem.ProductId > 0) { ProductListModel = await _BllWMProductList.QueryById(detailItem.ProductId); if (ProductListModel != null && ProductListModel.SpecIds > 0) { var qt = await QueryTable("select UnitCode from WMProductUnit where id=" + ProductListModel.Unit); UnitCode = qt.Rows._Select(t => t["UnitCode"]._ToDbStr()).FirstOrDefault(); } } if (!string.IsNullOrWhiteSpace(SupplierTaxRate)) { var Number = StringHelper.GetNumberInt(SupplierTaxRate); if (Number > 0) TaxRate = Number / 100; } //算法 decimal danjia = detailItem.Price ?? 0;//含税单价 decimal jine = detailItem.Amount ?? 0;//含税金额 decimal wsdanjia = Math.Round(danjia - (danjia * TaxRate), 4);//无税单价=含税单价*税率(一般13%) decimal wsjine = wsdanjia * detailItem.inputNum;//无税金额=无税单价*实收数量 decimal shuie = jine - wsjine;//税额=含税金额-无税金额 //本币算法 decimal bbdanjia = detailItem.Price ?? 0;//本币含税单价 decimal bbjine = detailItem.Amount ?? 0;//本币含税金额 decimal bbwsdanjia = Math.Round(bbdanjia - (bbdanjia * TaxRate), 4);//本币无税单价=本币含税单价*税率(一般13%) decimal bbwsjine = bbwsdanjia * detailItem.inputNum;//本币无税金额=本币无税单价*实收数量 decimal bbshuie = bbjine - bbwsjine;//本币税额=本币含税金额-本币无税金额 var ItemModel = new NCPuorderViewModels.Item(); ItemModel.pk_group = "JPKJ"; ItemModel.pk_org = "1001"; ItemModel.pk_org_v = "1001"; ItemModel.pk_reqcorp = "1001"; ItemModel.pk_reqstoorg = "1001"; ItemModel.pk_reqstoorg_v = "1001"; ItemModel.pk_arrvstoorg = "1001"; ItemModel.pk_arrvstoorg_v = "1001"; ItemModel.crowno = "1"; ItemModel.pk_material = ProductListModel.Code; ItemModel.pk_srcmaterial = ProductListModel.Code; ItemModel.cunitid = UnitCode; ItemModel.nnum = detailItem.Quantity.ObjToString();//主数量 ItemModel.castunitid = UnitCode; ItemModel.nastnum = detailItem.Quantity.ObjToString();//数量 ItemModel.vchangerate = "1.00/1.00"; ItemModel.cqtunitid = UnitCode; ItemModel.nqtunitnum = detailItem.Quantity.ObjToString();//报价数量 ItemModel.vqtunitrate = "1.00/1.00"; ItemModel.nqtorigprice = wsdanjia.ToString();//无税单价 ItemModel.nqtorigtaxprice = danjia.ToString();//含税单价 ItemModel.nqtorignetprice = wsdanjia.ToString();//无税净价 ItemModel.nqtorigtaxnetprc = danjia.ToString();//含税净价 ItemModel.nqtnetprice = bbwsdanjia.ToString();//本币无税净价 ItemModel.nqttaxnetprice = bbdanjia.ToString();//本币含税净价 ItemModel.nitemdiscountrate = (detailItem.Discount ?? 0).ObjToString();//折扣 ItemModel.norigmny = wsjine.ToString();//无税金额 ItemModel.norigtaxmny = jine.ToString();//价税合计 ItemModel.nmny = bbwsjine.ToString();//本币无税金额 ItemModel.ntaxmny = bbjine.ToString();//本币价税合计 ItemModel.ntax = bbshuie.ToString();//本币税额 ItemModel.norigprice = wsdanjia.ToString();//主无税单价 ItemModel.norigtaxprice = danjia.ToString();//主含税单价 ItemModel.norignetprice = wsdanjia.ToString();//主无税净价 ItemModel.norigtaxnetprice = danjia.ToString();//主含税净价 ItemModel.nnetprice = bbwsdanjia.ToString();//主本币无税净价 ItemModel.ntaxnetprice = bbdanjia.ToString();//主本币含税净价 ItemModel.fisactive = "0";//激活 ItemModel.breceiveplan = "N"; ItemModel.blargess = jine == 0 ? "Y" : "N"; ItemModel.btransclosed = "N"; ItemModel.nfeemny = "0";//费用累计开票金额 ItemModel.pk_psfinanceorg = "1001"; ItemModel.pk_psfinanceorg_v = "1001"; ItemModel.pk_apfinanceorg = "1001"; ItemModel.pk_apfinanceorg_v = "1001"; ItemModel.bborrowpur = "N"; ItemModel.naccuminvoicemny = "0";//累计本币开票金额 ItemModel.nacccancelinvmny = "0";//累计已核销本币开票金额 ItemModel.nweight = "0";//重量 ItemModel.bstockclose = "N"; ItemModel.binvoiceclose = "N"; ItemModel.barriveclose = "N"; ItemModel.bpayclose = "N"; ItemModel.ftaxtypeflag = "1";//扣税类别 ItemModel.ntaxrate = TaxRate.ToString();//税率 ItemModel.ccurrencyid = "CNY"; ItemModel.nexchangerate = "1";//折本汇率 ItemModel.pk_supplier = SupplierUnifiedCode; ItemModel.corigcurrencyid = "CNY"; ItemModel.nqtprice = bbwsdanjia.ToString();//报价本币无税单价 ItemModel.nqttaxprice = bbdanjia.ToString();//报价本币含税单价 ItemModel.nprice = bbwsdanjia.ToString();//主本币无税单价 ItemModel.ntaxprice = bbdanjia.ToString();//主本币含税单价 ItemModel.csendcountryid = "CN"; ItemModel.crececountryid = "CN"; ItemModel.ctaxcountryid = "CN"; ItemModel.fbuysellflag = "2"; ItemModel.btriatradeflag = "N"; ItemModel.ctaxcodeid = "CN01"; ItemModel.nnosubtaxrate = TaxRate.ToString();//不可抵扣税率 ItemModel.nnosubtax = shuie.ToString();//不可抵扣税额 ItemModel.ncaltaxmny = jine.ToString();//计税金额 ItemModel.ncalcostmny = jine.ToString();//计成本金额 item.Add(ItemModel); } //所有集合赋值 pkorderb.item = item; head.pk_order_b = pkorderb; bill.billhead = head; uface.bill = bill; pos.ufinterface = uface; var json = JsonConvert.SerializeObject(pos); //采购订单接口 var apinchost = Appsettings.app("AppSettings", "ApiNCHost"); NCJsonResult jsonResult = HttpHelper.PostApi(apinchost + puorderUrl, pos); Thread.Sleep(300); #endregion var resultdescription = jsonResult.data.ufinterface.sendresult[0].resultdescription; if (jsonResult.data != null && jsonResult.data.ufinterface.successful == "Y") { return new Tuple("用友采购订单接口成功", true); } else { string[] strArray = resultdescription.Split("异常信息:"); return new Tuple("用友采购订单接口失败:" + strArray[1], false); } } catch (Exception ex) { _logger.LogError(ex, ex.ToString()); return new Tuple(ex.ToString(), false); } } /// /// 调用友采购发票接口 /// /// public async Task> BeginInvoiceInNC(WMQuoteInfo infoModel, List detailList) { try { #region NCInvoiceViewModels pos = new NCInvoiceViewModels(); NCInvoiceViewModels.Ufinterface uface = new NCInvoiceViewModels.Ufinterface(); NCInvoiceViewModels.Bill bill = new NCInvoiceViewModels.Bill(); NCInvoiceViewModels.Billhead head = new NCInvoiceViewModels.Billhead(); NCInvoiceViewModels.Invoicebody invoicebody = new NCInvoiceViewModels.Invoicebody(); List item = new List(); var UnitCode = ""; var SupplierUnifiedCode = ""; var SupplierTaxRate = ""; decimal TaxRate = 1.3m; var SupplierModel = new WMSupplier(); var ProductListModel = new WMProductList(); if (infoModel != null && infoModel.SupplierId > 0) { SupplierModel = await _BllWMSupplier.QueryById(infoModel.SupplierId); if (SupplierModel != null && !string.IsNullOrWhiteSpace(SupplierModel.UnifiedCode)) { SupplierUnifiedCode = SupplierModel.UnifiedCode; SupplierTaxRate = SupplierModel.TaxRate; } } //赋uface uface.account = "01"; uface.billtype = "25";//采购发票 uface.isexchange = "Y"; uface.replace = "Y"; uface.sender = "JPKJ001"; uface.groupcode = "JPKJ"; //赋bill bill.id = 1; //赋head head.pk_group = "JPKJ"; head.pk_org = "1001"; head.dbilldate = DateTime.Now.ObjToString();//发票日期 head.darrivedate = infoModel.ExpectedArrivalTime.ObjToString();//票到日期 head.vtrantypecode = "25-01"; head.ctrantypeid = "25-01"; head.pk_busitype = "CGRK";//业务流程 head.pk_stockorg = "100102";//库存组织(OID) head.pk_stockorg_v = "100102";//库存组织(VID) head.pk_supplier = SupplierUnifiedCode;//供应商 head.corigcurrencyid = "CNY"; head.nexchangerate = "1";//汇率 head.ccurrencyid = "CNY"; head.csendcountryid = "CN"; head.crececountryid = "CN"; head.ctaxcountryid = "CN"; //赋item foreach (var detailItem in detailList) { if (detailItem.ProductId > 0) { ProductListModel = await _BllWMProductList.QueryById(detailItem.ProductId); if (ProductListModel != null) { var qt = await QueryTable("select UnitCode from WMProductUnit where id=" + ProductListModel.Unit); UnitCode = qt.Rows._Select(t => t["UnitCode"]._ToDbStr()).FirstOrDefault(); } } if (!string.IsNullOrWhiteSpace(SupplierTaxRate)) { var Number = StringHelper.GetNumberInt(SupplierTaxRate); if (Number > 0) TaxRate = Number / 100; } //本币算法 decimal bbdanjia = detailItem.Price ?? 0;//本币含税单价 decimal bbjine = detailItem.Amount ?? 0;//本币含税金额 decimal bbwsdanjia = Math.Round(bbdanjia - (bbdanjia * TaxRate), 4);//本币无税单价=本币含税单价*税率(一般13%) decimal bbwsjine = bbwsdanjia * detailItem.inputNum;//本币无税金额=本币无税单价*实收数量 decimal bbshuie = bbjine - bbwsjine;//本币税额=本币含税金额-本币无税金额 var ItemModel = new NCInvoiceViewModels.Item(); ItemModel.pk_group = "JPKJ"; ItemModel.pk_org = "1001"; ItemModel.nprice = bbwsdanjia.ToString();//主本币无税单价 ItemModel.nmny = bbwsjine.ToString();//本币无税金额 ItemModel.ntax = bbshuie.ToString();//本币税额 ItemModel.ntaxmny = bbjine.ToString();//本币价税合计 ItemModel.ntaxprice = bbdanjia.ToString();//主本币含税单价 ItemModel.castunitid = UnitCode;//单位 ItemModel.ctaxcodeid = "CN01";//税码 item.Add(ItemModel); } //所有集合赋值 invoicebody.item = item; head.invoicebody = invoicebody; bill.billhead = head; uface.bill = bill; pos.ufinterface = uface; var json = JsonConvert.SerializeObject(pos); //采购发票接口 var apinchost = Appsettings.app("AppSettings", "ApiNCHost"); NCJsonResult jsonResult = HttpHelper.PostApi(apinchost + invoiceUrl, pos); Thread.Sleep(300); #endregion var resultdescription = jsonResult.data.ufinterface.sendresult[0].resultdescription; if (jsonResult.data != null && jsonResult.data.ufinterface.successful == "Y") { return new Tuple("用友采购发票接口成功", true); } else { string[] strArray = resultdescription.Split("异常信息:"); return new Tuple("用友采购发票接口失败:" + strArray[1], false); } } catch (Exception ex) { _logger.LogError(ex, ex.ToString()); return new Tuple(ex.ToString(), false); } } } }