|
|
using System;
|
|
|
using System.Linq;
|
|
|
using System.Web.Mvc;
|
|
|
using DSWeb.Areas.Account.DAL.Chfee_Invoice_HangXin;
|
|
|
using DSWeb.Areas.Account.DAL.Chfee_Invoiceapplication;
|
|
|
using DSWeb.Areas.Account.Models.Chfee_Invoiceapplication;
|
|
|
using DSWeb.Areas.Account.Models.Chfee_Invoice_HangXin;
|
|
|
using DSWeb.Areas.Account.Models.Chfee_do_detail;
|
|
|
using DSWeb.Areas.Account.Models.BillChfeeDetail;
|
|
|
using DSWeb.MvcShipping.Helper;
|
|
|
using DSWeb.MvcShipping.Comm.Cookie;
|
|
|
using DSWeb.Areas.CommMng.DAL;
|
|
|
using System.Collections.Generic;
|
|
|
using HcUtility.Comm;
|
|
|
using HcUtility.Core;
|
|
|
using DSWeb.EntityDA;
|
|
|
using DSWeb.Areas.Account.Models.Chfee_Exrate;
|
|
|
using System.IO;
|
|
|
using Microsoft.Practices.EnterpriseLibrary.Data;
|
|
|
using System.Text;
|
|
|
using System.Data;
|
|
|
using InvokeWebService;
|
|
|
using DSWeb.Areas.Account.Models.RytInvoice;
|
|
|
using System.Xml.Serialization;
|
|
|
using System.Xml;
|
|
|
using DSWeb.MvcShipping.DAL.MsSysParamSet;
|
|
|
using DSWeb.Areas.SysMng.DAL.DBTableConn;
|
|
|
using DSWeb.Areas.SysMng.Models.DBTableConn;
|
|
|
using Spire.Pdf;
|
|
|
using Aspose.Words;
|
|
|
|
|
|
using iTextSharp.text;
|
|
|
using iTextSharp.text.pdf;
|
|
|
using DSWeb.MvcShipping.DAL.MsSysInvInterFaceSet;
|
|
|
using DSWeb.Common.Helper;
|
|
|
using DSWeb.MvcShipping.DAL.MsBaseInfoDAL;
|
|
|
using System.ServiceModel.Configuration;
|
|
|
using DSWeb.Areas.MvcShipping.Helper;
|
|
|
using DSWeb.SoftMng.Model;
|
|
|
using DSWeb.MvcShipping.DAL.MsInfoClient;
|
|
|
using System.Web.UI.WebControls;
|
|
|
using DSWeb.Areas.CommMng.Models;
|
|
|
using DSWeb.SoftMng.Filter;
|
|
|
using DSWeb.Areas.Import.DAL.ReceiptDoc;
|
|
|
using DSWeb.Areas.SysMng.DAL.SysUser;
|
|
|
using DSWeb.MvcShipping.DAL.MsSeaeOrderDAL;
|
|
|
using Renci.SshNet.Common;
|
|
|
using sun.swing;
|
|
|
using DSWeb.MvcShipping.DAL.DsSendmail;
|
|
|
using DSWeb.Areas.MvcShipping.Models.Message.VGM;
|
|
|
using DSWeb.MvcShipping.Models.MsChFee;
|
|
|
using DSWeb.Areas.Dispatch.DB;
|
|
|
using System.Net.Http;
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
namespace DSWeb.Areas.Account.Controllers
|
|
|
{
|
|
|
[JsonRequestBehavior]
|
|
|
public class Chfee_invoice_HangXinController : Controller
|
|
|
{
|
|
|
//
|
|
|
// GET:
|
|
|
public ActionResult Index()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
//
|
|
|
// GET: /
|
|
|
public ActionResult Edit()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult BLEdit()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult AppEdit()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult BookEdit()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult BookIndex()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult DetailView()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult OUTDB_P2_Index()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
public ActionResult OUTDB_P2_Edit()
|
|
|
{
|
|
|
return View();
|
|
|
}
|
|
|
|
|
|
#region Get
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetDataList(int start, int limit, string sort, string condition)
|
|
|
{
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
if (sort != null)
|
|
|
{
|
|
|
sort = sort.Replace("OPERATORNAME", "OPERATOR");
|
|
|
sort = sort.Replace("DELOPERATORNAME", "DELETEOPERATOR");
|
|
|
sort = sort.Replace("SALECORP", "SALECORPID");
|
|
|
sort = sort.Replace("INVOICECATEGORYREF", "INVOICECATEGORY");
|
|
|
sort = sort.Replace("INVOICETYPEREF", "INVOICETYPE");
|
|
|
sort = sort.Replace("APPLICANT", "(select top 1 (select ShowName from [user] where GID=ap.applicant) APPLICANT from ch_fee_invoiceapplication ap where invbillno=cm.BILLNO)");
|
|
|
}
|
|
|
var dataList = ChinvoiceDAL.GetDataList(start, limit, condition, Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
int count = ChinvoiceDAL.getTotalCount(condition, CookieConfig.GetCookie_UserId(Request), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetDataListStr(int start, int limit, string sort, string condition, int billtype)
|
|
|
{
|
|
|
var dataListStr = ChinvoiceDAL.GetDataListStr(condition, Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", data = dataListStr });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetData(string handle, string condition, bool isapp)
|
|
|
{
|
|
|
ChInvoice_HangXin head = null;
|
|
|
|
|
|
if (handle == "edit" || handle == "copyadd")
|
|
|
{
|
|
|
head = ChinvoiceDAL.GetData(condition);
|
|
|
}
|
|
|
|
|
|
if (head == null)
|
|
|
{
|
|
|
head = new ChInvoice_HangXin();
|
|
|
}
|
|
|
|
|
|
if (handle == "add")
|
|
|
{
|
|
|
head.OPERATOR = Convert.ToString(Session["USERID"]);
|
|
|
head.OPERATORNAME = Convert.ToString(Session["SHOWNAME"]);
|
|
|
head.CREATEUSER = Convert.ToString(Session["USERID"]);
|
|
|
head.PTORRED = "1";//默认为正票
|
|
|
head.SALECORPID = Session["COMPANYID"].ToString();
|
|
|
|
|
|
head.PAYEE = Convert.ToString(Session["SHOWNAME"]);
|
|
|
head.CHECKER = Convert.ToString(Session["SHOWNAME"]);
|
|
|
|
|
|
head.PUSHMOBILE = "0";
|
|
|
head.INVOICELINE = MsSysParamSetDAL.GetData("PARAMNAME='DEFAULTINVOICELINE'").PARAMVALUE;
|
|
|
|
|
|
var defaultPAYEE = MsSysParamSetDAL.GetData("PARAMNAME='INVSKR'").PARAMVALUE;
|
|
|
var defaultCHECKER = MsSysParamSetDAL.GetData("PARAMNAME='INVFHR'").PARAMVALUE;
|
|
|
var defaultINVKPR = MsSysParamSetDAL.GetData("PARAMNAME='INVKPR'").PARAMVALUE;
|
|
|
if (!string.IsNullOrEmpty(defaultPAYEE))
|
|
|
head.PAYEE = defaultPAYEE;
|
|
|
if (!string.IsNullOrEmpty(defaultCHECKER))
|
|
|
head.CHECKER = defaultCHECKER;
|
|
|
if (!string.IsNullOrEmpty(defaultINVKPR))
|
|
|
{
|
|
|
head.OPERATORNAME = defaultINVKPR;
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
var USERID = T_ALL_DA.GetStrSQL("USERID", "select top 1 USERID from VW_user where SHOWNAME='" + defaultINVKPR + "'");
|
|
|
head.OPERATOR = USERID;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isapp)
|
|
|
{
|
|
|
head.INVOICETYPE = 2;
|
|
|
head.INVOICETYPEREF = "申请发票";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
head.INVOICETYPE = 1;
|
|
|
head.INVOICETYPEREF = "自由发票";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
head.PUSHMODE = "0";
|
|
|
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", data = head });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetDetailList(string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetDetailList(condition);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetBillList(string condition, string sort)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetBodyList(condition, sort);
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetTruckBillList(string condition, string sort)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetTruckBodyList(condition, sort);
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetBillSum(string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetBodySumList(condition);
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetFeeDataList(int start, int limit, string sort, string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetFeeDataList(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
var list = dataList.Skip(start).Take(limit);
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = list.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetBillDataList(int start, int limit, string sort, string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetAddBillList(start, limit, condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
int count = ChinvoiceDAL.getAddBillTotalCount(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]));
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", totalCount = count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetTruckBillDataList(int start, int limit, string sort, string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetAddTruckBillList(start, limit, condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
int count = ChinvoiceDAL.getAddTruckBillTotalCount(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]));
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", totalCount = count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetFeeDetailList(string sort, string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetFeeDetailList(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetAddSum(string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetAddSum(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]));
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region save
|
|
|
public ContentResult Save(string opstatus, string data, string body)
|
|
|
{
|
|
|
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(data);
|
|
|
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoiceDetail>>(body);
|
|
|
|
|
|
if (opstatus == "add")
|
|
|
{
|
|
|
headData.GID = Guid.NewGuid().ToString();
|
|
|
headData.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
headData.COMPANYID = Convert.ToString(Session["COMPANYID"]);
|
|
|
|
|
|
|
|
|
var defaultPAYEE = MsSysParamSetDAL.GetData("PARAMNAME='INVSKR'").PARAMVALUE;
|
|
|
var defaultCHECKER = MsSysParamSetDAL.GetData("PARAMNAME='INVFHR'").PARAMVALUE;
|
|
|
var defaultINVKPR = MsSysParamSetDAL.GetData("PARAMNAME='INVKPR'").PARAMVALUE;
|
|
|
if (!string.IsNullOrEmpty(defaultPAYEE))
|
|
|
headData.PAYEE = defaultPAYEE;
|
|
|
if (!string.IsNullOrEmpty(defaultCHECKER))
|
|
|
headData.CHECKER = defaultCHECKER;
|
|
|
if (!string.IsNullOrEmpty(defaultINVKPR))
|
|
|
{
|
|
|
headData.OPERATORNAME = defaultINVKPR;
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
var USERID = T_ALL_DA.GetStrSQL("USERID", "select top 1 USERID from VW_user where SHOWNAME='" + defaultINVKPR + "'");
|
|
|
headData.OPERATOR = USERID;
|
|
|
|
|
|
}
|
|
|
|
|
|
headData.OPERATETIME = DateTime.Now;
|
|
|
headData.CREATEUSER = Convert.ToString(Session["USERID"]);
|
|
|
headData.CREATETIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
headData.DbOperationType = DbOperationType.DbotIns;
|
|
|
}
|
|
|
else if (opstatus == "edit")
|
|
|
{
|
|
|
headData.DbOperationType = DbOperationType.DbotUpd;
|
|
|
headData.ModelUIStatus = "E";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
headData.DbOperationType = DbOperationType.DbotDel;
|
|
|
}
|
|
|
|
|
|
//填写未指定但当前可以填写的其他信息
|
|
|
if ((!headData.ISFRINV) && (headData.INVOICECUSTNAME == "" || headData.CUSTRATENO == ""))
|
|
|
{
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
DataSet dsHSCODE = T_ALL_DA.GetAllSQL("SELECT Gid,CODENAME as CustCode,SHORTNAME as CustName,CODENAME+'-'+SHORTNAME as CodeAndName,BillRises1,INVADDRTEL,[DESCRIPTION],RmbBillRises,(select top 1 BANKNAME+' '+ACCOUNT FROM info_client_bank WHERE CURRENCY='RMB' AND LINKID=info_client.GID) Rmbbank,Rmbaccount,usdBillRises,(select top 1 BANKNAME+' '+ACCOUNT FROM info_client_bank WHERE CURRENCY='USD' AND LINKID=info_client.GID) usdbank,usdaccount,TaxNo,Addr,Tel from info_client WHERE SHORTNAME='" + headData.CUSTOMERNAME + "'");
|
|
|
if (dsHSCODE != null)
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows.Count > 0)
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["BillRises1"].ToString() != "")
|
|
|
headData.INVOICECUSTNAME = dsHSCODE.Tables[0].Rows[0]["BillRises1"].ToString();
|
|
|
else headData.INVOICECUSTNAME = dsHSCODE.Tables[0].Rows[0]["DESCRIPTION"].ToString();
|
|
|
if (headData.CUSTRATENO == "") headData.CUSTRATENO = dsHSCODE.Tables[0].Rows[0]["TaxNo"].ToString();
|
|
|
if (headData.CUSTADDRTEL == "")
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString() != "")
|
|
|
headData.CUSTADDRTEL = dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString();
|
|
|
else headData.CUSTADDRTEL = dsHSCODE.Tables[0].Rows[0]["Addr"].ToString() + " " + dsHSCODE.Tables[0].Rows[0]["Tel"].ToString();
|
|
|
}
|
|
|
if (string.IsNullOrEmpty(headData.CUSTTEL))
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["Tel"].ToString() != "")
|
|
|
headData.CUSTTEL = dsHSCODE.Tables[0].Rows[0]["Tel"].ToString();
|
|
|
}
|
|
|
if (string.IsNullOrEmpty(headData.CUSTADDR))
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["Addr"].ToString() != "")
|
|
|
headData.CUSTADDR = dsHSCODE.Tables[0].Rows[0]["Addr"].ToString();
|
|
|
}
|
|
|
|
|
|
if (headData.CUSTBANK == "")
|
|
|
{
|
|
|
if (headData.RECVCURR == "USD")
|
|
|
headData.CUSTBANK = dsHSCODE.Tables[0].Rows[0]["usdbank"].ToString();
|
|
|
else
|
|
|
headData.CUSTBANK = dsHSCODE.Tables[0].Rows[0]["Rmbbank"].ToString();
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if ((!headData.ISFRINV) && (string.IsNullOrEmpty(headData.CUSTTEL) || string.IsNullOrEmpty(headData.CUSTADDR)))
|
|
|
{
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
DataSet dsHSCODE = T_ALL_DA.GetAllSQL("SELECT Gid,CODENAME as CustCode,SHORTNAME as CustName,CODENAME+'-'+SHORTNAME as CodeAndName,BillRises1,INVADDRTEL,[DESCRIPTION],RmbBillRises,(select top 1 BANKNAME+' '+ACCOUNT FROM info_client_bank WHERE CURRENCY='RMB' AND LINKID=info_client.GID) Rmbbank,Rmbaccount,usdBillRises,usdbank,usdaccount,TaxNo,Addr,Tel from info_client WHERE SHORTNAME='" + headData.CUSTOMERNAME + "'");
|
|
|
if (dsHSCODE != null)
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows.Count > 0)
|
|
|
{
|
|
|
var custaddtel = "";
|
|
|
if (headData.CUSTADDRTEL == "")
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString() != "")
|
|
|
custaddtel = dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString();
|
|
|
else custaddtel = dsHSCODE.Tables[0].Rows[0]["Addr"].ToString() + " " + dsHSCODE.Tables[0].Rows[0]["Tel"].ToString();
|
|
|
headData.CUSTADDRTEL = custaddtel;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString() != "")
|
|
|
custaddtel = dsHSCODE.Tables[0].Rows[0]["INVADDRTEL"].ToString();
|
|
|
else custaddtel = dsHSCODE.Tables[0].Rows[0]["Addr"].ToString() + " " + dsHSCODE.Tables[0].Rows[0]["Tel"].ToString();
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrEmpty(headData.CUSTTEL) && !string.IsNullOrEmpty(custaddtel))
|
|
|
{
|
|
|
if (custaddtel.Length != 0)
|
|
|
headData.CUSTTEL = ChinvoiceDAL.GetTelephoneList(custaddtel);
|
|
|
}
|
|
|
if (string.IsNullOrEmpty(headData.CUSTADDR) && !string.IsNullOrEmpty(custaddtel.Trim()))
|
|
|
{
|
|
|
if (custaddtel.Length != 0 && !string.IsNullOrEmpty(headData.CUSTTEL))
|
|
|
headData.CUSTADDR = custaddtel.Replace(headData.CUSTTEL, "");
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (headData.CUSTBANK == null) headData.CUSTBANK = "";
|
|
|
|
|
|
if (!string.IsNullOrEmpty(headData.RECVCURR) && string.IsNullOrEmpty(headData.CUSTBANK) && !string.IsNullOrEmpty(headData.CUSTOMERNAME))
|
|
|
{
|
|
|
|
|
|
var bankList = MsInfoClientDAL.GetBankList("LINKID in (select GID FROM info_client WHERE SHORTNAME='" + headData.CUSTOMERNAME + "')");
|
|
|
if (bankList != null && bankList.Count != 0)
|
|
|
{
|
|
|
foreach (var bank in bankList)
|
|
|
{
|
|
|
if ((bank.CURRENCY == headData.RECVCURR) && (bank.ISINVDEF == "1"))
|
|
|
headData.CUSTBANK = bank.BANKNAME_ACCOUNT;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
var isPost = true;
|
|
|
var errorstr = "";
|
|
|
if (headData.INVOICENO != "")
|
|
|
{
|
|
|
var ct = ChinvoiceDAL.GetRdCount("GID<>'" + headData.GID + "' AND INVOICENO='" + headData.INVOICENO + "' and COMPANYID='" + Convert.ToString(Session["COMPANYID"]) + "'");
|
|
|
if (ct != 0)
|
|
|
{
|
|
|
isPost = false;
|
|
|
errorstr = "发票号重复";
|
|
|
}
|
|
|
}
|
|
|
//if (string.IsNullOrEmpty(headData.INVITERFACE))
|
|
|
//{
|
|
|
var INVITERFACE = MsSysInvInterFaceSetDAL.GetData($" INVOICELINE=(select enumvaluename from tSysEnumValue where EnumTypeID=80003 and EnumValueID='{headData.INVOICELINE}') ", headData.SALECORPID);
|
|
|
//if (INVITERFACE.INVITERFACE == "")
|
|
|
headData.INVITERFACE = INVITERFACE.INVITERFACE;
|
|
|
//else
|
|
|
//headData.INVITERFACE = "诺诺发票接口";
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
|
|
|
//}
|
|
|
|
|
|
if (!string.IsNullOrEmpty(headData.CUSTTEL) && (headData.CUSTTEL.Trim().Length > 20))
|
|
|
{
|
|
|
|
|
|
isPost = false;
|
|
|
errorstr = "客户电话长度不允许超过20";
|
|
|
}
|
|
|
//if (!string.IsNullOrEmpty(headData.CUSTADDR) && (headData.CUSTADDR.Trim().Length > 80))
|
|
|
//{
|
|
|
|
|
|
// isPost = false;
|
|
|
// errorstr = "客户电话长度不允许超过80";
|
|
|
//}
|
|
|
if (!string.IsNullOrEmpty(headData.SALECORPID) && !string.IsNullOrEmpty(headData.ACCOUNT))
|
|
|
{
|
|
|
|
|
|
var banklist = MsBaseInfoDAL.GetAllBANKList("LINKID='" + headData.SALECORPID + "'");
|
|
|
if (banklist.Find(x => (x.CURRENCY == headData.RECVCURR || x.CURRENCY == "") && x.BANKACCOUNT == headData.ACCOUNT) == null)
|
|
|
{
|
|
|
isPost = false;
|
|
|
errorstr = "银行及账号于收款单位和币别不一致,请检查";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isPost)
|
|
|
{
|
|
|
if (headData.INVOICEMAKETIME == "") headData.INVOICEMAKETIME = null;
|
|
|
if (headData.ETD == "") headData.ETD = null;
|
|
|
headData.CUSTRATENO = headData.CUSTRATENO.Trim();
|
|
|
headData.CUSTBANK = headData.CUSTBANK.Trim();
|
|
|
headData.REMARK = headData.REMARK.Trim();
|
|
|
headData.PUSHEMAIL = headData.PUSHEMAIL.Trim();
|
|
|
|
|
|
var BILLNO = headData.BILLNO;
|
|
|
|
|
|
//20240823 购方税号/销方税号 去除所有空格
|
|
|
if (headData.TAXCODE != null)
|
|
|
headData.TAXCODE = headData.TAXCODE.Replace(" ", "");
|
|
|
if (headData.CUSTRATENO != null)
|
|
|
headData.CUSTRATENO = headData.CUSTRATENO.Replace(" ", "");
|
|
|
|
|
|
|
|
|
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.SaveInvDetail(headData.GID, bodyList);
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
|
|
|
result = modb.Save(headData);
|
|
|
//ChinvoiceDAL.UpdateInvNoUse(headData.INVOICENO, Convert.ToString(Session["USERID"]),headData.BILLNO);
|
|
|
//if (headData.EXCHANGERATE != 0)
|
|
|
//{
|
|
|
// ChinvoiceDAL.updateFeeTax(headData.BILLNO, headData.EXCHANGERATE);
|
|
|
|
|
|
//}
|
|
|
|
|
|
};
|
|
|
|
|
|
var jsonRespose = new JsonResponse
|
|
|
{
|
|
|
Success = result.Success,
|
|
|
Message = result.Message,
|
|
|
Data = ChinvoiceDAL.GetData(" BILLNO='" + BILLNO + "'", Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]))
|
|
|
};
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = errorstr + "不允许保存!" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public ContentResult AddDetail(string bill, string data, string curr, bool islist, string GID, string invoiceno)
|
|
|
{
|
|
|
//首先判断是否有 modInvoiceImport发票引入费用 权限
|
|
|
|
|
|
//var ar = BasicDataRefDAL.GetAR("modInvoiceImport", Session["USERID"].ToString());
|
|
|
|
|
|
//if
|
|
|
|
|
|
var bodyList = JsonConvert.Deserialize<List<BillChfeeDetail>>(data);
|
|
|
var headdata = ChinvoiceDAL.GetData(" BILLNO='" + bill + "'", Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]));
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.AddDetail(bill, bodyList, curr, Convert.ToString(Session["COMPANYID"]), islist, GID, headdata);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(bill, GID); }
|
|
|
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult AddBill(string bill, string feesql, string storeCurrExrate, bool islist, string GID, bool custgroup = false)
|
|
|
{
|
|
|
//首先判断是否有 modInvoiceImport发票引入费用 权限
|
|
|
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(bill);
|
|
|
var exrateList = JsonConvert.Deserialize<List<ChFeeExrate>>(storeCurrExrate);
|
|
|
|
|
|
if ((exrateList == null) || (exrateList.Count == 0))
|
|
|
{
|
|
|
|
|
|
exrateList = ChinvoiceDAL.GetCurrExrateData(headData.CUSTOMERNAME, headData.CURRENCY, feesql, custgroup);
|
|
|
if (exrateList.Count == 0)
|
|
|
{
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.AddBill(headData, feesql, exrateList, Convert.ToString(Session["COMPANYID"]), islist, GID, Convert.ToString(Session["USERID"]), custgroup);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(headData.BILLNO, GID); }
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var jsonRespose = new JsonResponse { Success = true, Message = "查询成功", Data = exrateList.ToList() };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.AddBill(headData, feesql, exrateList, Convert.ToString(Session["COMPANYID"]), islist, GID, Convert.ToString(Session["USERID"]));
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(headData.BILLNO, GID); }
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
public ContentResult DelBill(string data, string billno, string GID)
|
|
|
{
|
|
|
//首先判断是否有 modInvoiceImport发票引入费用 权限
|
|
|
|
|
|
var bodyList = JsonConvert.Deserialize<List<Chfee_do_detail>>(data);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.DelFeeDo(bodyList, GID);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(billno, GID); }
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
public ContentResult Delete(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(data);
|
|
|
headData = ChinvoiceDAL.GetData(" cm.BILLNO='" + headData.BILLNO + "'");
|
|
|
DBResult result;
|
|
|
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
|
|
|
//20191205 防止已经获得【流水号】的发票业务被删除
|
|
|
if (!string.IsNullOrWhiteSpace(headData.INVOICESERIALNUM) && headData.INVAMOUNT > 0)
|
|
|
{
|
|
|
var jsonRespose1 = new JsonResponse { Success = false, Message = "已经获得流水号且仍包含费用的发票业务不能删除" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose1) };
|
|
|
}
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(headData.INVOICESERIALNUM) && !string.IsNullOrWhiteSpace(headData.INVOICENO))
|
|
|
{
|
|
|
var jsonRespose1 = new JsonResponse { Success = false, Message = "已经实际开出的发票业务不能删除" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose1) };
|
|
|
}
|
|
|
if (headData.EINVOICESTATEREF == "开票中")
|
|
|
{
|
|
|
var jsonRespose1 = new JsonResponse { Success = false, Message = "当前发票状态不允许删除" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose1) };
|
|
|
|
|
|
}
|
|
|
|
|
|
result = SetInvoiceFee(headData);
|
|
|
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
var modb = new ModelObjectDB();
|
|
|
modb.Delete(headData);
|
|
|
ChinvoiceDAL.UpdateInvNoCancelUse(headData.INVOICENO);
|
|
|
T_ALL_DA T_ALL_DA = new EntityDA.T_ALL_DA();
|
|
|
var blUpSQL = " insert into sys_log(GID,NAME,LOGTYPE,LOGTIME,LOGCONTENT,CREATEUSER) values(NEWID(),'" + headData.BILLNO + "','删除发票','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "','" + headData.INVOICENO + '(' + headData.CUSTOMERNAME + ')' + "','" + Convert.ToString(Session["USERID"]) + "')";
|
|
|
bool bl = T_ALL_DA.GetExecuteSqlCommand(blUpSQL);
|
|
|
|
|
|
}
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 看看USERID是否能操作这条数据的ModName功能
|
|
|
/// </summary>
|
|
|
/// <param name="head"></param>
|
|
|
/// <param name="ModName"></param>
|
|
|
/// <param name="USERID"></param>
|
|
|
/// <returns></returns>
|
|
|
private bool CanOperate(ChInvoice_HangXin head, string ModName)
|
|
|
{
|
|
|
|
|
|
var rangestr = BasicDataRefDAL.CanOperateStr_INVOICE(ModName, Session["USERID"].ToString());
|
|
|
|
|
|
var _L = ChinvoiceDAL.GetData("GID='" + head.GID + "' and " + rangestr);
|
|
|
|
|
|
if (_L.GID == head.GID)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
else return false;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 发票作废
|
|
|
/// </summary>
|
|
|
/// <param name="data"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult DeleteUp(string data)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(data);
|
|
|
|
|
|
//if (!CanOperate(headData, "modInvLock")) {
|
|
|
// var jsonRespose = new JsonResponse { Success =false, Message = "您还不具备针对这条业务的‘发票开出锁定’权限" };
|
|
|
// return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
//}
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
var strCT = T_ALL_DA.GetStrSQL("CT", "select COUNT(*) CT from ch_fee_do_payapplication where PAYBILLNO='" + headData.BILLNO + "'");
|
|
|
if (strCT != "0" && strCT != "")
|
|
|
{
|
|
|
var jsonRespose2 = new JsonResponse { Success = false, Message = "已发票结算,不允许作废" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose2) };
|
|
|
}
|
|
|
|
|
|
return DeleteUp(headData);
|
|
|
}
|
|
|
private ContentResult DeleteUp(ChInvoice_HangXin headData)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
//if (!CanOperate(headData, "modInvLock"))
|
|
|
//{
|
|
|
// var jsonRespose1 = new JsonResponse { Success = false, Message = "您还不具备针对这条业务的‘发票开出锁定’权限" };
|
|
|
// return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose1) };
|
|
|
//}
|
|
|
T_ALL_DA T_ALL_DA = new T_ALL_DA();
|
|
|
var strCT = T_ALL_DA.GetStrSQL("CT", "select COUNT(*) CT from ch_fee_do_payapplication where PAYBILLNO='" + headData.BILLNO + "'");
|
|
|
if (strCT != "0" && strCT != "")
|
|
|
{
|
|
|
var jsonRespose2 = new JsonResponse { Success = false, Message = "已发票结算,不允许作废" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose2) };
|
|
|
}
|
|
|
|
|
|
DBResult result;
|
|
|
result = SetInvoiceFee(headData);
|
|
|
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
|
|
|
ChinvoiceDAL.UpdateDelete(headData.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
//ChinvoiceDAL.UpdateInvNoDelete(headData.INVOICENO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 发票作废取消
|
|
|
/// </summary>
|
|
|
/// <param name="data"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult CancelDeleteUp(string data)
|
|
|
{
|
|
|
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(data);
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
//if (!CanOperate(headData, "modInvLock"))
|
|
|
//{
|
|
|
// var jsonRespose1 = new JsonResponse { Success = false, Message = "您还不具备针对这条业务的‘发票开出锁定’权限" };
|
|
|
// return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose1) };
|
|
|
//}
|
|
|
DBResult result;
|
|
|
result = ChinvoiceDAL.UpdateDelete(headData.BILLNO, Convert.ToString(Session["USERID"]), false);
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
ChinvoiceDAL.UpdateInvNoDelete(headData.INVOICENO, Convert.ToString(Session["USERID"]), false);
|
|
|
}
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
public ContentResult GetInvoiceNo(string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetInvoiceNo(Convert.ToString(Session["COMPANYID"]), Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
#region 发票申请添加
|
|
|
public ContentResult AddAppDetail(string bill, string data, string invoiceno, string GID)
|
|
|
{
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoiceapplication>>(data);
|
|
|
var StrGid = "";
|
|
|
if (bodyList != null)
|
|
|
{
|
|
|
foreach (var enumValue in bodyList)
|
|
|
{
|
|
|
if (StrGid == "")
|
|
|
StrGid = "'" + enumValue.GID + "'";
|
|
|
else
|
|
|
StrGid = StrGid + ",'" + enumValue.GID + "'";
|
|
|
|
|
|
}
|
|
|
}
|
|
|
if (StrGid != "")
|
|
|
{
|
|
|
StrGid = "(" + StrGid + ")";
|
|
|
var dataList = ChinvoiceapplicationDAL.GetDataInvList(" BILLSTATUS=0 and cm.GID IN " + StrGid, Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]));
|
|
|
if (dataList != null && dataList.Count != 0)
|
|
|
{
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.AddAppDetail(bill, dataList, invoiceno, Convert.ToString(Session["COMPANYID"]), GID);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(bill, GID); }
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "发票申请已生成发票,请刷新!" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "无需要添加的发票申请!" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public ContentResult DelAppBill(string data, string billno, string GID)
|
|
|
{
|
|
|
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoiceapplication>>(data);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.DelAppList(bodyList, billno);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(billno, GID); }
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult DelInvDetail(string billno, string body, string GID)
|
|
|
{
|
|
|
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoiceDetail>>(body);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.DelInvDetail(bodyList);
|
|
|
if (result.Success) { ChinvoiceDAL.p_update_Amount(billno, GID); }
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 锁定和撤销锁定
|
|
|
|
|
|
public ContentResult Lock(string bill)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.Lock(bill, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var json = JsonConvert.Serialize(result);
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult UnLock(string bill)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
DBResult result = ChinvoiceDAL.UnLock(bill, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var json = JsonConvert.Serialize(result);
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult LockList(string bills)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
DBResult result = ChinvoiceDAL.LockList(bills, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var json = JsonConvert.Serialize(result);
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult UnLockList(string bills)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
DBResult result = ChinvoiceDAL.UnLockList(bills, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var json = JsonConvert.Serialize(result);
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 保存指定发票业务list的PDF文件 将其拼合成一个dpf后返回url
|
|
|
|
|
|
public ContentResult GetONEPDF(string BILLNOS, string sort = "")
|
|
|
{
|
|
|
JsonResponse result = new JsonResponse();
|
|
|
|
|
|
try
|
|
|
{
|
|
|
|
|
|
var BILLList = new List<ChInvoice_HangXin>();
|
|
|
|
|
|
//var billnoList = BasicDataRefDAL.getStrListfromCommaStr(BILLNOS, ',');
|
|
|
|
|
|
var billnoSqlStr = "'" + BILLNOS.Replace(",", "','") + "'";
|
|
|
|
|
|
var condition = $" cm.billno in({billnoSqlStr})";
|
|
|
|
|
|
DatasetSort _sort = new DatasetSort();
|
|
|
|
|
|
var sortstr = @"[{""property"":""INVOICEMAKETIME"",""direction"":""asc""},{""property"":""INVOICENO"",""direction"":""asc""}]";
|
|
|
|
|
|
//if (!string.IsNullOrWhiteSpace(sort))
|
|
|
//{
|
|
|
// if (sort == "INVOICEMAKETIME")
|
|
|
// {
|
|
|
// //_sort.property="INVOICEMAKETIME";
|
|
|
// // _sort.direction = "asc";
|
|
|
// sortstr = @"[{""property"":""INVOICEMAKETIME"",""direction"":""asc""}]";
|
|
|
// }
|
|
|
//}
|
|
|
|
|
|
var dataList = ChinvoiceDAL.GetDataList(0, 9999, condition, Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]), sortstr);
|
|
|
|
|
|
if (dataList == null || dataList.Count == 0)
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = "没有可以打印的发票文件";
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
|
|
|
//var _h = dataList[0];
|
|
|
//if (_h.INVITERFACE == "诺诺全电发票")
|
|
|
//{
|
|
|
// //诺诺全电 保持用开票时间排序
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
|
|
|
//}
|
|
|
|
|
|
BasicDataRefDAL.ClearPath(BasicDataRefDAL.getPath("INVOICEPDF"));
|
|
|
var pdflist = new List<string>();
|
|
|
|
|
|
foreach (var invoice in dataList)
|
|
|
{
|
|
|
//var billno = bill.BILLNO;
|
|
|
|
|
|
//var invoice = ChinvoiceDAL.GetData($" BILLNO ='{billno}' ");
|
|
|
if (!string.IsNullOrWhiteSpace(invoice.INVOICEPDFURL))
|
|
|
{
|
|
|
var filename = BasicDataRefDAL.HttpDownloadFile(invoice.INVOICEPDFURL, "INVOICEPDF", invoice.INVOICENO + ".pdf");
|
|
|
pdflist.Add(filename);
|
|
|
//if (pdflist.Count == 1) {
|
|
|
// pdflist.Add(filename);
|
|
|
//}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (pdflist.Count == 0)
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = "没有可以打印的发票文件";
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//pdflist.OrderBy(o => o);
|
|
|
|
|
|
//var _h = dataList[0];
|
|
|
|
|
|
//if (_h.INVITERFACE == "诺诺全电发票")
|
|
|
//{
|
|
|
// //诺诺全电
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
|
|
|
// pdflist.Sort(delegate (string p1, string p2)
|
|
|
// {
|
|
|
// return p1.CompareTo(p2);
|
|
|
// });
|
|
|
|
|
|
//}
|
|
|
|
|
|
//20240325 原逻辑是将pdf文件根据文件名(发票号)排序,现在是查询时用开票时间排序,生成时不排序
|
|
|
}
|
|
|
|
|
|
var pdfarray = pdflist.ToArray();
|
|
|
|
|
|
SavePDF(pdfarray);
|
|
|
|
|
|
result.Success = true;
|
|
|
result.Message = "";
|
|
|
result.Data = "../../INVOICEPDF/" + Session["USERID"].ToString() + ".pdf";
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = e.Message;
|
|
|
}
|
|
|
|
|
|
|
|
|
return result.getContentReult();
|
|
|
|
|
|
}
|
|
|
|
|
|
private void SavePDF(string[] pdfarray)
|
|
|
{
|
|
|
string outputFileName = BasicDataRefDAL.getPath("INVOICEPDF") + Session["USERID"].ToString() + ".pdf";
|
|
|
|
|
|
//PdfDocumentBase doc = PdfDocument.MergeFiles(pdfarray);
|
|
|
|
|
|
//doc.Pages.Insert(0);
|
|
|
//doc.Pages.RemoveAt(0);
|
|
|
|
|
|
//doc.Save(outputFileName, FileFormat.PDF);
|
|
|
|
|
|
|
|
|
|
|
|
iTextSharp.text.Document document = new iTextSharp.text.Document(new PdfReader(pdfarray[0]).GetPageSize(1));
|
|
|
PdfCopy copy = new PdfCopy(document, new FileStream(outputFileName, FileMode.Create));
|
|
|
document.Open();
|
|
|
for (int i = 0; i < pdfarray.Length; i++)
|
|
|
{
|
|
|
PdfReader reader = new PdfReader(pdfarray[i]);
|
|
|
int n = reader.NumberOfPages;
|
|
|
for (int j = 1; j <= n; j++)
|
|
|
{
|
|
|
document.NewPage();
|
|
|
PdfImportedPage page = copy.GetImportedPage(reader, j);
|
|
|
copy.AddPage(page);
|
|
|
}
|
|
|
}
|
|
|
document.Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
//private void SavePDF_Aspose(string[] pdfarray)
|
|
|
//{
|
|
|
// string outputFileName = BasicDataRefDAL.getPath("INVOICEPDF") + Session["USERID"].ToString() + ".pdf";
|
|
|
|
|
|
// PdfDocumentBase doc = PdfDocument.MergeFiles(pdfarray);
|
|
|
|
|
|
// doc.Pages.Insert(0);
|
|
|
// doc.Pages.RemoveAt(0);
|
|
|
|
|
|
// doc.Save(outputFileName, FileFormat.PDF);
|
|
|
//}
|
|
|
#endregion
|
|
|
|
|
|
public ContentResult ExpInv(string bills)
|
|
|
{
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoice_HangXin>>(bills);
|
|
|
var path = Server.MapPath("../../EDIFiles/ExportInv");
|
|
|
if (!Directory.Exists(path))
|
|
|
{
|
|
|
Directory.CreateDirectory(path);
|
|
|
}
|
|
|
//
|
|
|
var result = new DBResult();
|
|
|
|
|
|
var filename = "";
|
|
|
filename = ChinvoiceDAL.CreateInvList(bodyList, path);
|
|
|
if (filename != "")
|
|
|
{
|
|
|
//result.Data = "../../EDIFiles/ExportInv/" + filename;
|
|
|
result.Data = filename;
|
|
|
filename = Path.GetFileName(filename);
|
|
|
result.Success = true;
|
|
|
result.Message = filename;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = "无当前匹配的导出文件!";
|
|
|
}
|
|
|
|
|
|
//
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult ExpDZInv(string bills)
|
|
|
{
|
|
|
var bodyList = JsonConvert.Deserialize<List<ChInvoice_HangXin>>(bills);
|
|
|
var path = Server.MapPath("../../EDIFiles/ExportInv");
|
|
|
if (!Directory.Exists(path))
|
|
|
{
|
|
|
Directory.CreateDirectory(path);
|
|
|
}
|
|
|
//
|
|
|
var result = new DBResult();
|
|
|
|
|
|
var filename = "";
|
|
|
filename = ChinvoiceDAL.CreateDZInvList(bodyList, path, Convert.ToString(Session["COMPANYID"]));
|
|
|
if (filename != "")
|
|
|
{
|
|
|
//result.Data = "../../EDIFiles/ExportInv/" + filename;
|
|
|
result.Data = filename;
|
|
|
filename = Path.GetFileName(filename);
|
|
|
result.Success = true;
|
|
|
result.Message = filename;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = "无当前匹配的导出文件!";
|
|
|
}
|
|
|
|
|
|
//
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
|
|
|
#region 航信接口调用
|
|
|
|
|
|
public ContentResult test(string str)
|
|
|
{
|
|
|
|
|
|
|
|
|
var result = new KPResponse();
|
|
|
|
|
|
var _s = str.Replace("\\\"", "\"");
|
|
|
|
|
|
result = DSWeb.TruckMng.Helper.JsonConvert.Deserialize<KPResponse>(_s);
|
|
|
|
|
|
var jsonRespose = new JsonResponse
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "",
|
|
|
Data = result
|
|
|
};
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
}
|
|
|
|
|
|
public ActionResult test2(string str)
|
|
|
{
|
|
|
return View(str);
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 接收诺诺平台跳回的url信息,
|
|
|
/// 20191122后已无作用
|
|
|
/// </summary>
|
|
|
/// <param name="code"></param>
|
|
|
/// <param name="taxnum"></param>
|
|
|
/// <returns></returns>
|
|
|
//public ActionResult setCustCode(string code, string taxnum)
|
|
|
//{
|
|
|
// BasicDataRefDAL.SaveLog("code="+ code+ ";taxnum="+ taxnum,"诺诺平台","认证窗口回调","接收认证数据");
|
|
|
// var hx = HangXinRequestHelper.getHelper(taxnum);
|
|
|
|
|
|
// if (hx.code != code || hx.needStart )
|
|
|
// {
|
|
|
// hx.code = code;
|
|
|
// hx.setISVToken();
|
|
|
// }
|
|
|
// return View();
|
|
|
//}
|
|
|
|
|
|
private JsonResponse checkinfo(string BILLNO, string redirecturl, string redReason = "", bool setred = false)
|
|
|
{
|
|
|
var result = new DBResult();
|
|
|
var head = new ChInvoice_HangXin();
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = true, Message = result.Message, Data = result.Data };
|
|
|
//首先判断数据完整性与合法性
|
|
|
|
|
|
head = ChinvoiceDAL.GetData("cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(head.INVOICELINE))
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "发票种类不能为空!";
|
|
|
}
|
|
|
|
|
|
if (head.BILLNO != "")
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(head.INVITERFACE))
|
|
|
{
|
|
|
var INVITERFACE = MsSysInvInterFaceSetDAL.GetData("INVOICELINE='" + head.INVOICELINEREF + "'", "");
|
|
|
if (INVITERFACE.INVITERFACE != "")
|
|
|
head.INVITERFACE = INVITERFACE.INVITERFACE;
|
|
|
else head.INVITERFACE = "诺诺发票接口";
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
if (setred)
|
|
|
{
|
|
|
if (!string.IsNullOrWhiteSpace(redReason))
|
|
|
{
|
|
|
head.redReason = redReason;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//jsonRespose.Success = false;
|
|
|
//jsonRespose.Message = "必须选择冲红理由!";
|
|
|
//return jsonRespose;
|
|
|
head.redReason = "2";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
head.DbOperationType = DbOperationType.DbotUpd;
|
|
|
head.ModelUIStatus = "E";
|
|
|
var modb = new ModelObjectDB();
|
|
|
result = modb.Save(head);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (head.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
if (setred)
|
|
|
{
|
|
|
if (!string.IsNullOrWhiteSpace(redReason))
|
|
|
{
|
|
|
head.redReason = redReason;
|
|
|
|
|
|
head.DbOperationType = DbOperationType.DbotUpd;
|
|
|
head.ModelUIStatus = "E";
|
|
|
var modb = new ModelObjectDB();
|
|
|
result = modb.Save(head);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//jsonRespose.Success = false;
|
|
|
//jsonRespose.Message = "必须选择冲红理由!";
|
|
|
//return jsonRespose;
|
|
|
|
|
|
head.redReason = "2";
|
|
|
|
|
|
head.DbOperationType = DbOperationType.DbotUpd;
|
|
|
head.ModelUIStatus = "E";
|
|
|
var modb = new ModelObjectDB();
|
|
|
result = modb.Save(head);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
//head = list[0];
|
|
|
jsonRespose.Data = head;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "没有找到可以开票的发票信息,可能是权限不足或登录信息丢失。";
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var checkcan = checkCanPost(head);
|
|
|
if (checkcan.Success == false)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = checkcan.Message;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺发票接口" || head.INVITERFACE == "")
|
|
|
{
|
|
|
//如果该税号的token需要 返回认证窗口
|
|
|
var hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
HangXinRequestHelper.redirectUri = redirecturl; //getRedirecturl(redirecturl);
|
|
|
if (hx.needStart)
|
|
|
{
|
|
|
BasicDataRefDAL.SaveLog("checkinfo;BILLNO=" + BILLNO, "", "诺诺平台", "返回认证窗口");
|
|
|
jsonRespose = TokenPage();
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
jsonRespose.Success = true;
|
|
|
jsonRespose.Message = "";
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
}
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
|
|
|
private JsonResponse TokenPage()
|
|
|
{
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = true, Message = "", Data = "" };
|
|
|
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "需要认证诺诺用户名和密码";
|
|
|
var 原诺诺第三方方式开票 = HangXinRequestHelper.getHelper("");
|
|
|
var newwindowurl = "https://open.jss.com.cn/authorization.html?client_id=" + 原诺诺第三方方式开票.appSecret + "&response_type=code&redirect_uri=" + HangXinRequestHelper.redirectUri + "&appKey=" + 原诺诺第三方方式开票.appKey + "";
|
|
|
jsonRespose.Data = newwindowurl;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 航信接口 开票
|
|
|
/// </summary>
|
|
|
/// <param name="bill"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNMakeInv(string bill, string redirecturl)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
var result = new DBResult();
|
|
|
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//首先判断数据完整性与合法性
|
|
|
var checkresult = checkinfo(bill, redirecturl);
|
|
|
|
|
|
if (!checkresult.Success)
|
|
|
{
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(checkresult) };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var head = (ChInvoice_HangXin)checkresult.Data;
|
|
|
decimal invamount = 0;
|
|
|
var invitems = ChinvoiceapplicationDAL.GetDetailList("PID='" + head.GID + "'", "");
|
|
|
foreach (var invitem in invitems)
|
|
|
{
|
|
|
invamount = invamount + invitem.AMOUNT + invitem.TAX;
|
|
|
}
|
|
|
if (invamount != head.INVAMOUNT)
|
|
|
{
|
|
|
var jsonRespose2 = new JsonResponse { Success = false, Message = "开票明细与开票金额不一致,请检查!" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose2) };
|
|
|
}
|
|
|
|
|
|
|
|
|
ChInvoice_HangXin returndate = null;
|
|
|
if (head.INVITERFACE == "诺诺发票接口" || head.INVITERFACE == "")
|
|
|
{
|
|
|
var hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
|
|
|
//20191107 如果该发票存在流水号 则首先去诺诺平台进行一次读取
|
|
|
//如开票信息形如
|
|
|
/*"{\"code\":\"E0000\",\"describe\":\"查询发票信息成功\",\"result\":[{\"orderNo\":\"IN2019110700005\",\"taxExcludedAmount\":500.00,\"c_invoiceid\":\"19110716260203390480\",\"invoiceImageUrl\":\"\",\"buyerName\":\"青岛世悠联国际物流有限公司\",\"invoiceCode\":\"\",\"invoiceNum\":\"\",\"resultMsg\":\"[][2019-11-07 16:30:02] 单据号:19110716260203390480,开具结果:0,开具失败原因:开票异常:\",\"checkCode\":\"\",\"invoiceSerialNum\":\"19110716260203390480\",\"statusMsg\":\"开票失败\",\"buyerTaxNum\":\"91370202MA3CGDCU83\",\"invoiceFileUrl\":\"\",\"invoiceLine\":\"电子增值税普通发票\",\"taxIncludedAmount\":500.00,\"status\":3}]}"*/
|
|
|
//则可能代表失败的原因是 ukey验证 的部分,也许重启税控软件和诺诺客户端可以解决问题。
|
|
|
if (!string.IsNullOrEmpty(head.INVOICESERIALNUM))
|
|
|
{//如果该发票流水号不为空
|
|
|
result = hx.ReadInvoice(head);
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
HangXinRequestHelper.redirectUri = getRedirecturl(redirecturl);
|
|
|
var detailList = ChinvoiceDAL.GetDetailList("PID='" + head.GID + "'");
|
|
|
//var CodeGoodInvList = MsCodeGoodInvDAL.GetDataList(" gid in (SELECT GOODSNAME FROM ch_fee_invoicedetail where PID = '"+ head.GID + "')");
|
|
|
if (!string.IsNullOrWhiteSpace(hx.accessToken))
|
|
|
{
|
|
|
result = hx.PostInvoice(head, detailList);
|
|
|
}
|
|
|
if (result.Message == "需要重新认证" || string.IsNullOrWhiteSpace(hx.accessToken))
|
|
|
{
|
|
|
BasicDataRefDAL.SaveLog("PostInvoice 反回‘需要重新认证’", "", "诺诺平台", "返回认证窗口");
|
|
|
var _r = TokenPage();
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(_r) };
|
|
|
}
|
|
|
//returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
}
|
|
|
}
|
|
|
else if (head.INVITERFACE == "瑞宏发票接口")
|
|
|
{
|
|
|
RuihongHelper ruihongHelper = new RuihongHelper();
|
|
|
string msg = null;
|
|
|
if (!string.IsNullOrEmpty(head.INVOICESERIALNUM))
|
|
|
{//如果该发票流水号不为空
|
|
|
result.Success = ruihongHelper.QueryInvoiceRecord(head.GID, head.INVOICESERIALNUM, out msg);
|
|
|
result.Message = msg;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (head.PTORRED == "2")
|
|
|
{
|
|
|
result.Success = ruihongHelper.RedInvoiceRecord(head.GID, out msg);
|
|
|
result.Message = msg;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.Success = ruihongHelper.PostInvoiceRecord(head.GID, out msg);
|
|
|
result.Message = msg;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else if (head.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
var hx = 诺诺全电发票.getHelper(head);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(head.INVOICESERIALNUM))
|
|
|
{//如果该发票流水号不为空
|
|
|
result = hx.ReadInvoice(head);
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
//HangXinRequestHelper.redirectUri = getRedirecturl(redirecturl);
|
|
|
var detailList = ChinvoiceDAL.GetDetailList("PID='" + head.GID + "'");
|
|
|
//var CodeGoodInvList = MsCodeGoodInvDAL.GetDataList(" gid in (SELECT GOODSNAME FROM ch_fee_invoicedetail where PID = '"+ head.GID + "')");
|
|
|
if (!string.IsNullOrWhiteSpace(hx.accessToken))
|
|
|
{
|
|
|
result = hx.PostInvoice(head, detailList);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
else if (head.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
|
|
|
var hp = new 东胜乐企他用(head, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
//var cansend = hp.CanSend();
|
|
|
|
|
|
//if (cansend.Success == false) {
|
|
|
// return BasicDataRefDAL.GetContentResult(cansend);
|
|
|
//}
|
|
|
|
|
|
result = hp.DoSend_BlueInvoice();
|
|
|
|
|
|
result.Data = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
if (returndate.EINVOICESTATE == "2" && returndate.BILLSTATUS == 0)
|
|
|
{
|
|
|
|
|
|
//20200106 添加 如sys_param_set.PARAMNAME=INVOICEAUTOLOCK 没有值或值为false 则不执行锁定
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
}
|
|
|
jsonRespose.Success = result.Success;
|
|
|
jsonRespose.Message = result.Message;
|
|
|
jsonRespose.Data = returndate;
|
|
|
}
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取诺诺平台上的发票信息 通过发票流水号 ch_fee_invoice.invoiceser
|
|
|
/// </summary>
|
|
|
/// <param name="taxnum"></param>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNReadInv(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
|
|
|
var headdata = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
|
|
|
if (headdata.PTORRED == "2")
|
|
|
{
|
|
|
//如果已有pdf地址 则直接返回
|
|
|
var isfee = ChinvoiceDAL.GetStCount("PAYBILLNO='" + BILLNO + "'");
|
|
|
if (isfee != 0)
|
|
|
{
|
|
|
|
|
|
var jsonRespose2 = new JsonResponse { Success = false, Message = "已发票结算,不允许冲红" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose2) };
|
|
|
|
|
|
}
|
|
|
}
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
|
|
|
JsonResponse result = new JsonResponse();
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(headdata.INVOICEPDFURL))
|
|
|
{
|
|
|
result.Success = true;
|
|
|
result.Data = headdata;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (headdata.INVITERFACE == "诺诺发票接口" || headdata.INVITERFACE == "")
|
|
|
{
|
|
|
result = Do_NNReadInv(BILLNO, redirecturl);
|
|
|
}
|
|
|
else if (headdata.INVITERFACE == "瑞宏发票接口")
|
|
|
{
|
|
|
RuihongHelper ruihongHelper = new RuihongHelper();
|
|
|
|
|
|
string msg = null;
|
|
|
var succ = ruihongHelper.QueryInvoiceRecord(headdata.GID, headdata.INVOICESERIALNUM, out msg);
|
|
|
result.Success = succ;
|
|
|
result.Message = msg;
|
|
|
result.Data = ChinvoiceDAL.GetData(" BILLNO='" + headdata.BILLNO + "'");
|
|
|
|
|
|
}
|
|
|
else if (headdata.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
//诺诺全电发票的红票 读取其实是 读取红字确认单查询接口
|
|
|
if (headdata.PTORRED == "1")
|
|
|
{
|
|
|
result = Do_NuoNuoQuanDianReadInv(BILLNO);
|
|
|
}
|
|
|
if (headdata.PTORRED == "2")
|
|
|
{
|
|
|
var _r = NNRedConfirm_Read(BILLNO);
|
|
|
return BasicDataRefDAL.GetContentResult(_r);
|
|
|
}
|
|
|
}
|
|
|
else if (headdata.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
//诺诺全电发票的红票 读取其实是 读取红字确认单查询接口
|
|
|
if (headdata.PTORRED == "1")
|
|
|
{
|
|
|
var hp = new 东胜乐企他用(headdata, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var _r = hp.DoReadInvoice();
|
|
|
|
|
|
|
|
|
if (_r.Success == false)
|
|
|
{
|
|
|
var sqlstr = $" update ch_fee_invoice set INVOICESERIALNUM='' where BILLNO='{headdata.BILLNO}'";
|
|
|
BasicDataRefDAL.ExecSql(sqlstr);
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(headdata.INVOICEPDFURL))
|
|
|
{
|
|
|
//初次读取 成功后发送邮件
|
|
|
if (!string.IsNullOrWhiteSpace(headdata.PUSHEMAIL))
|
|
|
{
|
|
|
//NNSendMail(headdata.BILLNO, headdata.PUSHEMAIL);
|
|
|
NNSendMail_Djy(headdata.BILLNO, headdata.PUSHEMAIL);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
_r.Data = ChinvoiceDAL.GetData(" BILLNO='" + headdata.BILLNO + "'");
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(_r);
|
|
|
}
|
|
|
if (headdata.PTORRED == "2")
|
|
|
{
|
|
|
var hp = new 东胜乐企他用(headdata, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var _r = hp.DoReadInvoice("2");
|
|
|
|
|
|
if (_r.Success == true && _r.Message.Contains("开票成功"))
|
|
|
{
|
|
|
|
|
|
ChinvoiceDAL.SetRed(headdata);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
var BlueInvoice = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + headdata.REDCODE + "' and cm.INVOICENO='" + headdata.REDNUM + "'");
|
|
|
SetInvoiceFee(BlueInvoice);
|
|
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(headdata.INVOICEPDFURL))
|
|
|
{
|
|
|
//初次读取 成功后发送邮件
|
|
|
if (!string.IsNullOrWhiteSpace(headdata.PUSHEMAIL))
|
|
|
{
|
|
|
//NNSendMail(headdata.BILLNO, headdata.PUSHEMAIL);
|
|
|
NNSendMail_Djy(headdata.BILLNO, headdata.PUSHEMAIL);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
_r.Data = ChinvoiceDAL.GetData(" BILLNO='" + headdata.BILLNO + "'");
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(_r);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
|
|
|
public ContentResult NNReadInv_P2(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
var headdata = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
JsonResponse result = new JsonResponse();
|
|
|
if (!string.IsNullOrWhiteSpace(headdata.INVOICEPDFURL))
|
|
|
{
|
|
|
result.Success = true;
|
|
|
result.Data = headdata;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
if (headdata.INVITERFACE == "诺诺发票接口" || headdata.INVITERFACE == "")
|
|
|
{
|
|
|
result = Do_NNReadInv(BILLNO, redirecturl);
|
|
|
if (result.Success)
|
|
|
{
|
|
|
//将相应信息写回P2
|
|
|
//1.正票/冲红 根据BSNO将P2的发票号和发票代码写回
|
|
|
//2.作废 根据BSNO将P2的 B_CANCEL设为1
|
|
|
var invoice = (ChInvoice_HangXin)result.Data;
|
|
|
var sqlstr = $" update M_INVOICE set INVOICE_NO='{invoice.INVOICENO}',INVOICE_CODE='{invoice.INVOICECODE}',REMARK='{invoice.REMARK}' where INVOICE_ID='{invoice.BSNO}'";
|
|
|
|
|
|
BasicDataRefDAL.ExecSql_DB(sqlstr, "P2DB");
|
|
|
}
|
|
|
}
|
|
|
else if (headdata.INVITERFACE == "瑞宏发票接口")
|
|
|
{
|
|
|
RuihongHelper ruihongHelper = new RuihongHelper();
|
|
|
|
|
|
string msg = null;
|
|
|
var succ = ruihongHelper.QueryInvoiceRecord(headdata.GID, headdata.INVOICESERIALNUM, out msg);
|
|
|
var invoice = ChinvoiceDAL.GetData(" BILLNO='" + headdata.BILLNO + "'");
|
|
|
result.Success = succ;
|
|
|
result.Message = msg;
|
|
|
result.Data = invoice;
|
|
|
|
|
|
var sqlstr = $" update M_INVOICE set INVOICE_NO='{invoice.INVOICENO}',INVOICE_CODE='{invoice.INVOICECODE}',REMARK='{invoice.REMARK}' where INVOICE_ID='{invoice.BSNO}'";
|
|
|
|
|
|
BasicDataRefDAL.ExecSql_DB(sqlstr, "P2DB");
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (headdata.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
//诺诺全电发票的红票 读取其实是 读取红字确认单查询接口
|
|
|
if (headdata.PTORRED == "1")
|
|
|
{
|
|
|
result = Do_NuoNuoQuanDianReadInv(BILLNO);
|
|
|
if (result.Success)
|
|
|
{
|
|
|
|
|
|
//将相应信息写回P2
|
|
|
//1.正票/冲红 根据BSNO将P2的发票号和发票代码写回
|
|
|
//2.作废 根据BSNO将P2的 B_CANCEL设为1
|
|
|
var invoice = (ChInvoice_HangXin)result.Data;
|
|
|
var sqlstr = $" update M_INVOICE set INVOICE_NO='{invoice.INVOICENO}',INVOICE_CODE='{invoice.INVOICECODE}',REMARK='{invoice.REMARK}' where INVOICE_ID='{invoice.BSNO}'";
|
|
|
|
|
|
BasicDataRefDAL.ExecSql_DB(sqlstr, "P2DB");
|
|
|
}
|
|
|
}
|
|
|
if (headdata.PTORRED == "2")
|
|
|
{
|
|
|
var _r = NNRedConfirm_Read(BILLNO);
|
|
|
|
|
|
if (_r.Success)
|
|
|
{
|
|
|
|
|
|
//将相应信息写回P2
|
|
|
//1.正票/冲红 根据BSNO将P2的发票号和发票代码写回
|
|
|
//2.作废 根据BSNO将P2的 B_CANCEL设为1
|
|
|
var invoice = (ChInvoice_HangXin)result.Data;
|
|
|
var sqlstr = $" update M_INVOICE set INVOICE_NO='{invoice.INVOICENO}',INVOICE_CODE='{invoice.INVOICECODE}',REMARK='{invoice.REMARK}' where INVOICE_ID='{invoice.BSNO}'";
|
|
|
|
|
|
BasicDataRefDAL.ExecSql_DB(sqlstr, "P2DB");
|
|
|
}
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(_r);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
|
|
|
private JsonResponse Do_NNReadInv(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
//var hx = HangXinRequestHelper.getHelper(taxnum);
|
|
|
|
|
|
//var result = new DBResult();
|
|
|
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "", Data = "" };
|
|
|
|
|
|
|
|
|
//首先判断数据完整性与合法性
|
|
|
var checkresult = checkCanRead(BILLNO, redirecturl);
|
|
|
|
|
|
if (!checkresult.Success) return checkresult;
|
|
|
|
|
|
var head = (ChInvoice_HangXin)checkresult.Data;
|
|
|
var hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
if (hx.accessToken == "")
|
|
|
{
|
|
|
BasicDataRefDAL.SaveLog("NNReadInv;税号" + head.TAXCODE + "的 accessToken为空", "", "诺诺平台", "返回认证窗口");
|
|
|
var _r = TokenPage();
|
|
|
return _r;
|
|
|
}
|
|
|
var result = hx.ReadInvoice(head);
|
|
|
|
|
|
if (result.Message == "需要重新认证")
|
|
|
{
|
|
|
//HangXinRequestHelper.clear(hx.accessToken);
|
|
|
BasicDataRefDAL.SaveLog("ReadInvoice 反回‘需要重新认证’", "", "诺诺平台", "返回认证窗口");
|
|
|
var _r = TokenPage();
|
|
|
return _r;
|
|
|
}
|
|
|
|
|
|
var returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
if (head.PTORRED == "2")
|
|
|
{
|
|
|
ChinvoiceDAL.SetRed(head);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
var BlueInvoice = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + head.REDCODE + "' and cm.INVOICENO='" + head.REDNUM + "'");
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
}
|
|
|
|
|
|
//如果状态为开出成功 则执行锁定
|
|
|
if (returndate.EINVOICESTATE == "2" && returndate.BILLSTATUS == 0)
|
|
|
{
|
|
|
//ChinvoiceDAL.Lock(returndate.BILLNO);
|
|
|
|
|
|
//20200106 添加 如sys_param_set.PARAMNAME=INVOICEAUTOLOCK 没有值或值为false 则不执行锁定
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
}
|
|
|
|
|
|
|
|
|
result.Data = returndate;
|
|
|
|
|
|
jsonRespose = new JsonResponse(result);
|
|
|
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 邮件转发
|
|
|
/// </summary>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <param name="redirecturl"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNSendMail(string BILLNO, string EMAIL)
|
|
|
{
|
|
|
//如果已有pdf地址 则直接返回
|
|
|
|
|
|
var headData = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
var cdc = new Common.DB.CommonDataContext();
|
|
|
|
|
|
var 销方抬头 = cdc.company.First(x => x.GID == headData.SALECORPID).BILLRISES;
|
|
|
|
|
|
DBResult result = new DBResult();
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(headData.INVOICEPDFURL))
|
|
|
{
|
|
|
var mailtitle = $"您收到一张 【{销方抬头}】开具的发票 票号:{headData.INVOICENO} 金额:{headData.INVAMOUNT}";
|
|
|
|
|
|
var Body = new StringBuilder();
|
|
|
Body.Append("<html> <Body>");
|
|
|
//Body.Append($"<br /><a href=\"{headData.INVOICEINFOURL}\">电子发票:{headData.INVOICENO}</a><br />");
|
|
|
Body.Append($"<br />购方名称:{headData.INVOICECUSTNAME}<br />");
|
|
|
Body.Append($"<br />发票号码:{headData.INVOICENO}<br />");
|
|
|
Body.Append($"<br />开票日期:{headData.INVOICEMAKETIME.Replace(" 00:00:00.000", "")}<br />");
|
|
|
Body.Append($"<br />合计金额:{headData.INVAMOUNT}<br />");
|
|
|
Body.Append($"<br /><a href=\"{headData.INVOICEPDFURL}\">PDF链接(点击查看)</a><br />");
|
|
|
var mailto = EMAIL;
|
|
|
|
|
|
var MAILTONAME = "admin@dongshengsoft.com";
|
|
|
var PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTONAME'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTONAME = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOPASSWORD = "ds!@#)(*";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOPASSWORD'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOPASSWORD = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOSERVER = "smtpcom.263xmail.com";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOSERVER'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOSERVER = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOPORT = "465";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOPORT'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOPORT = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILISSSL = false;
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILISSSL'");
|
|
|
if (PARAMVALUE.PARAMVALUE == "1") MAILISSSL = true;
|
|
|
|
|
|
SendEmail se = new SendEmail(mailto, MAILTONAME, "", "", mailtitle, Body.ToString(), true);
|
|
|
// SendEmail se = new SendEmail("dev001@dongshengsoft.com", "admin@dongshengsoft.com", "", "", mailtopic, mailbody, false);
|
|
|
//string filePath = filename;
|
|
|
//se.Attachments(filePath);
|
|
|
|
|
|
try
|
|
|
{
|
|
|
se.SetSmtp(MAILTONAME, MAILTOPASSWORD, MAILTOSERVER, Convert.ToInt32(MAILTOPORT), MAILISSSL, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
se.SetSmtp(MAILTONAME, MAILTOPASSWORD, MAILTOSERVER, Convert.ToInt32(MAILTOPORT), MAILISSSL, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法
|
|
|
|
|
|
}
|
|
|
result.OK("发送成功");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.SetErrorInfo("请先读取发票");
|
|
|
}
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 邮件转发
|
|
|
/// </summary>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <param name="redirecturl"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNSendMail_Djy2(string BILLNO, string EMAIL)
|
|
|
{
|
|
|
//如果已有pdf地址 则直接返回
|
|
|
|
|
|
var headData = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
var cdc = new Common.DB.CommonDataContext();
|
|
|
|
|
|
var 销方抬头 = cdc.company.First(x => x.GID == headData.SALECORPID).BILLRISES;
|
|
|
|
|
|
DBResult result = new DBResult();
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(headData.INVOICEPDFURL))
|
|
|
{
|
|
|
var mailtitle = $"您收到一张 【{销方抬头}】开具的发票 票号:{headData.INVOICENO} 金额:{headData.INVAMOUNT}";
|
|
|
|
|
|
var Body = new StringBuilder();
|
|
|
|
|
|
Body = new StringBuilder(GetDjyInvMail());
|
|
|
|
|
|
Body = Body.Replace("$VIEW_URL$", headData.INVOICEPDFURL);
|
|
|
Body = Body.Replace("$CUST_NAME$", headData.INVOICECUSTNAME);
|
|
|
Body = Body.Replace("$INV_DATA$", headData.INVOICEMAKETIME.Replace(" 00:00:00.000", ""));
|
|
|
Body = Body.Replace("$TOTAL$", headData.INVAMOUNT.ToString());
|
|
|
Body = Body.Replace("$INV_CODE$", headData.INVOICENO);
|
|
|
Body = Body.Replace("$PDF_URL$", headData.INVOICEPDFURL);
|
|
|
var mailto = EMAIL;
|
|
|
|
|
|
var MAILTONAME = "admin@dongshengsoft.com";
|
|
|
var PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTONAME'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTONAME = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOPASSWORD = "ds!@#)(*";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOPASSWORD'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOPASSWORD = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOSERVER = "smtpcom.263xmail.com";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOSERVER'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOSERVER = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILTOPORT = "465";
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILTOPORT'");
|
|
|
if (PARAMVALUE.PARAMVALUE != "") MAILTOPORT = PARAMVALUE.PARAMVALUE;
|
|
|
var MAILISSSL = false;
|
|
|
PARAMVALUE = MsSysParamSetDAL.GetData("PARAMNAME='MAILISSSL'");
|
|
|
if (PARAMVALUE.PARAMVALUE == "1") MAILISSSL = true;
|
|
|
|
|
|
SendEmail se = new SendEmail(mailto, MAILTONAME, "", "", mailtitle, Body.ToString(), true);
|
|
|
// SendEmail se = new SendEmail("dev001@dongshengsoft.com", "admin@dongshengsoft.com", "", "", mailtopic, mailbody, false);
|
|
|
//string filePath = filename;
|
|
|
//se.Attachments(filePath);
|
|
|
|
|
|
try
|
|
|
{
|
|
|
se.SetSmtp(MAILTONAME, MAILTOPASSWORD, MAILTOSERVER, Convert.ToInt32(MAILTOPORT), MAILISSSL, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
se.SetSmtp(MAILTONAME, MAILTOPASSWORD, MAILTOSERVER, Convert.ToInt32(MAILTOPORT), MAILISSSL, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法
|
|
|
|
|
|
}
|
|
|
result.OK("发送成功");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.SetErrorInfo("请先读取发票");
|
|
|
}
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
public ContentResult NNSendMail_Djy(string BILLNO, string EMAIL)
|
|
|
{
|
|
|
|
|
|
var headData = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
var cdc = new Common.DB.CommonDataContext();
|
|
|
|
|
|
var 销方抬头 = cdc.company.First(x => x.GID == headData.SALECORPID).BILLRISES;
|
|
|
|
|
|
DBResult result = new DBResult();
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(headData.INVOICEPDFURL))
|
|
|
{
|
|
|
DjyEmailSendReq hp = new DjyEmailSendReq();
|
|
|
|
|
|
hp.SendTo = EMAIL;
|
|
|
hp.Title = $"您收到一张 【{销方抬头}】开具的发票 票号:{headData.INVOICENO} 金额:{headData.INVAMOUNT}";
|
|
|
|
|
|
hp.Body = GetDjyInvMail();
|
|
|
|
|
|
hp.Body = hp.Body.Replace("$VIEW_URL$", headData.INVOICEPDFURL);
|
|
|
hp.Body = hp.Body.Replace("$CUST_NAME$", headData.INVOICECUSTNAME);
|
|
|
hp.Body = hp.Body.Replace("$INV_DATA$", headData.INVOICEMAKETIME.Replace(" 00:00:00.000", ""));
|
|
|
hp.Body = hp.Body.Replace("$TOTAL$", headData.INVAMOUNT.ToString());
|
|
|
hp.Body = hp.Body.Replace("$INV_CODE$", headData.INVOICENO);
|
|
|
hp.Body = hp.Body.Replace("$PDF_URL$", headData.INVOICEPDFURL);
|
|
|
|
|
|
|
|
|
/*SmtpConfig值 说明
|
|
|
CANGDAN dongshengcangdan@h8j.top
|
|
|
INVOICE inv@mail.myshipping.net
|
|
|
NOREPLAY noreplay@mail.myshipping.net
|
|
|
SERVICE service@mail.myshipping.net
|
|
|
SPOT spot@mail.myshipping.net
|
|
|
*/
|
|
|
hp.SmtpConfig = "INVOICE";
|
|
|
|
|
|
var pdfbase64 = BasicDataRefDAL.GetUrlBase64(headData.INVOICEPDFURL);
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(pdfbase64))
|
|
|
{
|
|
|
|
|
|
var pdf = new Attaches();
|
|
|
|
|
|
pdf.AttachName = headData.INVOICENO + ".pdf";
|
|
|
pdf.AttachContent = pdfbase64;
|
|
|
|
|
|
hp.Attaches = new List<Attaches>();
|
|
|
hp.Attaches.Add(pdf);
|
|
|
}
|
|
|
|
|
|
BasicDataRefDAL.SendEmailByDjy(hp);
|
|
|
|
|
|
//SendEmailByDjy
|
|
|
|
|
|
result.OK("转发成功");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.SetErrorInfo("请先读取发票");
|
|
|
}
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
///
|
|
|
///
|
|
|
///$VIEW_URL$ 发票地址
|
|
|
///$CUST_NAME$ 购方名称
|
|
|
///$INV_DATA$ 开票日期
|
|
|
///$TOTAL$ 合计金额
|
|
|
///$INV_CODE$发票号码
|
|
|
///$PDF_URL$ 发票下载地址
|
|
|
/// </summary>
|
|
|
///
|
|
|
/// <returns></returns>
|
|
|
public static string GetDjyInvMail()
|
|
|
{
|
|
|
var result = @"<!DOCTYPE html>
|
|
|
<html>
|
|
|
<head>
|
|
|
<meta charset=""utf-8"" />
|
|
|
<title>发送发票邮件</title>
|
|
|
</head>
|
|
|
<body>
|
|
|
<div style=""width:728px;border:1px solid #e5e6e7;margin:20px auto;padding-bottom:40px;"">
|
|
|
<img src=""data:image/jpg;base64,/9j/4QDeRXhpZgAASUkqAAgAAAAHABIBAwABAAAAAQAAABoBBQABAAAAYgAAABsBBQABAAAAagAAACgBAwABAAAAAgAAADEBAgAcAAAAcgAAADIBAgAXAAAAjgAAAGmHBAABAAAApgAAAAAAAACA/AoAECcAAID8CgAQJwAAQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzADIwMjAtMDctMDFUMTU6MDcrMDg6MDAAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAADYAgAAA6AEAAEAAADPAAAAAAAAAM8AAAAAAP/sABFEdWNreQABAAQAAABkAAD/4Ry3aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTA3LTAxVDEwOjE1OjUwKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTA3LTAxVDE1OjA3KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0wNy0wMVQxNTowNyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc1NzcwMjk4QkI2OTExRUE4ODYxRTNEQ0Y5Q0JERjc1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc1NzcwMjk5QkI2OTExRUE4ODYxRTNEQ0Y5Q0JERjc1IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MzQ3RjZFOUMzNUJCRUExMUI0MkVGNjVFMzdDNkZFQjUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM0N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDEwOjE1OjUwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM1N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDExOjUzOjU5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM2N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDEzOjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM3N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDEzOjM1OjMzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM4N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDEzOjQwOjE4KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM5N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjAwOjUyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjNDN0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjAzOjE4KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ3NTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjA2OjA1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4NTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjA2OjI4KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ5NTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjA2OjUxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRBNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjA3OjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRCNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjA3OjU3KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRDNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjEyOjUxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRENTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjEzOjIxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRFNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjE2OjU4KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRGNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjMyOjMwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjUwNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjMyOjQyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjUxNTdFN0YyNjBCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjMzOjQzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzQjhFQjM0NjVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdEV2dDp3aGVuPSIyMDIwLTA3LTAxVDE0OjM2OjM0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzQjhFQjM0NjVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM0N0Y2RTlDMzVCQkVBMTFCNDJFRjY1RTM3QzZGRUI1Ii8+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i55S15a2Q5Y+R56WoIHwg6Iix5Y2V55Sz5oqlIHwgU1BPVOi/kOS7t+aOqOmAgSB8IFZHTSB8IOi/kOi4quaOqOmAgSB8IOWFpeWMuuaLvOeuseeUs+ivt+WNlSIgcGhvdG9zaG9wOkxheWVyVGV4dD0i55S15a2Q5Y+R56WoIHwg6Iix5Y2V55Sz5oqlIHwgU1BPVOi/kOS7t+aOqOmAgSB8IFZHTSB8IOi/kOi4quaOqOmAgSB8IOWFpeWMuuaLvOeuseeUs+ivt+WNlSIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9Imh0dHA6Ly93d3cubXlzaGlwcGluZy5uZXQiIHBob3Rvc2hvcDpMYXllclRleHQ9Imh0dHA6Ly93d3cubXlzaGlwcGluZy5uZXQiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLlpKfnroDkupHvvIzlt6XkvZzku47mnKrlpoLmraTnroDljZXvvIEiIHBob3Rvc2hvcDpMYXllclRleHQ9IuWkp+eugOS6ke+8jOW3peS9nOS7juacquWmguatpOeugOWNle+8gSIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuWwiuaVrOeahOeahOWuouaIt++8jOaCqOWlve+8gSIgcGhvdG9zaG9wOkxheWVyVGV4dD0i5bCK5pWs55qE55qE5a6i5oi377yM5oKo5aW977yBIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i5p+l55yL5Y+R56WoIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLmn6XnnIvlj5HnpagiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLmgqjmlLbliLDkuIDlvKDnlLXlrZDlj5HnpajvvIzngrnlh7sg5p+l55yL5Y+R56Wo77yM5pGY6KaB5L+h5oGv5aaC5LiL77yaIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLmgqjmlLbliLDkuIDlvKDnlLXlrZDlj5HnpajvvIzngrnlh7sg5p+l55yL5Y+R56Wo77yM5pGY6KaB5L+h5oGv5aaC5LiL77yaIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i6LSt5pa55ZCN56ew77ya6Z2S5bKb5a+M6YKm5oiQ56iL5Zu96ZmF6LSn6L+Q5Luj55CG5pyJ6ZmQ5YWs5Y+4IOW8gOelqOaXpeacn++8mjIwMjDlubQ25pyIOOaXpSAg5Y+R56Wo5Luj56CB77yaMDM3MDUwMDAxMTEg5Y+R56Wo5LiL6L295Zyw5Z2A77yaaCIgcGhvdG9zaG9wOkxheWVyVGV4dD0i6LSt5pa55ZCN56ew77ya6Z2S5bKb5a+M6YKm5oiQ56iL5Zu96ZmF6LSn6L+Q5Luj55CG5pyJ6ZmQ5YWs5Y+4IOW8gOelqOaXpeacn++8mjIwMjDlubQ25pyIOOaXpSAg5Y+R56Wo5Luj56CB77yaMDM3MDUwMDAxMTEg5Y+R56Wo5LiL6L295Zyw5Z2A77yaaHR0cDovL2ludi5qc3MuY29tLmNuL2dyb3VwNS9NMDAvMDkvMWMvd2tqNnpmamlpLnBkZiIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuWPkeelqOWPt+egge+8mjM2NTg3ODQ0IiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLlj5Hnpajlj7fnoIHvvJozNjU4Nzg0NCIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuWQiOiuoemHkemine+8mu+/pS0xNjUzLjYwIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLlkIjorqHph5Hpop3vvJrvv6UtMTY1My42MCIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IiAgICAg5q2k6Ie0IOWkp+eugOS6kShodHRwOi8vd3d3Lm15c2hpcHBpbmcubmV0KSIgcGhvdG9zaG9wOkxheWVyVGV4dD0iICAgICDmraToh7Qg5aSn566A5LqRKGh0dHA6Ly93d3cubXlzaGlwcGluZy5uZXQpIi8+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6VGV4dExheWVycz4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMxYjFiMWNkLWUxNDAtMTFlNy1hMWExLWExY2FiMTM4ZjA5ODwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDozOTNhNTAwNi00NDc3LTExZTgtYjlhZS1iOTlhYjliZWU0ZjA8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NDAyMjNjYmEtNDQ3OC0xMWU4LWI5YWUtYjk5YWI5YmVlNGYwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozQjE5QjVGQTAwMjkxMUU4OEQxRkNDNkRFMzQ2MUFFNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Njc3MzRhMGYtMTc1Yy01NzQ3LTk0YTMtMzRhNTYzNTlhYjZiPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBOEQ5RTQ1MjY3MkUxMUVBQTVBRTg4QThEOEFCODFDNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Q0MzNEYxRjdFNDQxRTgxMTk1OTM4QkM4Mzc3ODFBMzY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRFQzNBRjczOEJBQzExRTdBM0Y0RUQxRDI0N0ZCODhDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpiZjc0NTdmMy1jYzgyLTU4NDMtYjc3NS1mMWE5ODRlZWZiZDI8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMDAQEBAQEBAQIBAQICAgECAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP/wAARCADPAtgDAREAAhEBAxEB/8QA3AABAAEEAwEBAQAAAAAAAAAAAAkGBwgKAwQFAgELAQEAAQUBAQEAAAAAAAAAAAAABQIDBAYHCAEJEAAABgIBAwICBwUFAQkLDQABAgMEBQYABwgREgkTFCEVUtKT01SUFjFBIiMXUTIkGAq4YTNDJSZ2txk5cYFCklNjNDc4eHmRwdFic0TU1VaWV5coEQACAQMDAgQEAgYFBwkIAgMBAgMAEQQhEgUxBkFRIhNhcRQHgTKRoUJSIxWxwWJyCPCyM3OzNRbR4YKSQ2MkNDbxosJTdLQldYMJk1Q3/9oADAMBAAIRAxEAPwDVf927/EuPtlPrZ7g2r5CuVXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qpc0927/EuPtlPrY2r5ClzT3bv8S4+2U+tjavkKXNPdu/xLj7ZT62Nq+Qp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j40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40p6B/pI/mG/wB7i4+NKegf6SP5hv8Ae4uPjSnoH+kj+Yb/AHuLj40r/9k="" />
|
|
|
<div style=""padding:0px 40px;"">
|
|
|
<p style=""margin-top:30px;color:#666;"">尊敬的的客户,您好!</p>
|
|
|
<p style=""margin-top:15px;color:#666;text-indent:2em;"">您收到一张电子发票,点击 <a style=""border-bottom:1px solid #4395ff;padding-bottom:2px;text-decoration:none; color:#4395ff;"" href=""$VIEW_URL$"">查看发票</a>,摘要信息如下:</p>
|
|
|
</div>
|
|
|
<div style=""width:588px;background:#f9fbff;border:1px solid #e0e2e4;padding:20px 30px;margin:20px auto;"">
|
|
|
<table>
|
|
|
<tbody>
|
|
|
<tr style=""height:26px;"">
|
|
|
<td colspan=""2"" style=""color:#666;"">
|
|
|
购方名称:<span style=""color:#4395ff;"">$CUST_NAME$</span>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr style=""height:26px;"">
|
|
|
<td style=""width:338px;color:#666;"">
|
|
|
开票日期:<span style=""color:#4395ff;"">$INV_DATA$</span>
|
|
|
</td>
|
|
|
<td style=""width:166px;color:#666;"">
|
|
|
合计金额:<span style=""color:#4395ff;"">$TOTAL$</span>
|
|
|
</td>
|
|
|
</tr>
|
|
|
|
|
|
<tr style=""height:26px;"">
|
|
|
发票号码:<span style=""color:#4395ff;"">$INV_CODE$</span>
|
|
|
</td>
|
|
|
<td style=""width:166px;color:#666;"">
|
|
|
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr style=""height:26px;"">
|
|
|
<td colspan=""2"" style=""color:#666;"">
|
|
|
发票下载地址:<a style=""color:#4395ff;"" href=""$PDF_URL$"">$PDF_URL$</a>
|
|
|
</td>
|
|
|
</tr>
|
|
|
</tbody>
|
|
|
</table>
|
|
|
</div>
|
|
|
<div style=""padding:0 40px;"">
|
|
|
<p style=""text-indent:2em; color:#666;"">此致</p>
|
|
|
<p style=""color:#666;"">大简云(<a style=""border-bottom:1px solid #4395ff;padding-bottom:2px;text-decoration:none;color:#4395ff;"" href=""http://www.myshipping.net"">http://www.myshipping.net</a>)</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
</body>
|
|
|
</html>";
|
|
|
|
|
|
//$VIEW_URL$ 发票地址
|
|
|
//$CUST_NAME$ 购方名称
|
|
|
//$INV_DATA$ 开票日期
|
|
|
//$TOTAL$ 合计金额
|
|
|
//$INV_CODE$发票号码
|
|
|
//$PDF_URL$ 发票下载地址
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
public JsonResponse Do_NuoNuoQuanDianReadInv(string BILLNO)
|
|
|
{
|
|
|
//var hx = HangXinRequestHelper.getHelper(taxnum);
|
|
|
|
|
|
//var result = new DBResult();
|
|
|
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "", Data = "" };
|
|
|
|
|
|
|
|
|
//首先判断数据完整性与合法性
|
|
|
var checkresult = checkCanRead(BILLNO);
|
|
|
|
|
|
if (!checkresult.Success) return checkresult;
|
|
|
|
|
|
var head = (ChInvoice_HangXin)checkresult.Data;
|
|
|
var hx = 诺诺全电发票.getHelper(head);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
if (hx.accessToken == "")
|
|
|
{
|
|
|
BasicDataRefDAL.SaveLog("NNReadInv;税号" + head.TAXCODE + "的 accessToken为空", "", "诺诺平台", "返回认证窗口");
|
|
|
var _r = TokenPage();
|
|
|
return _r;
|
|
|
}
|
|
|
var result = hx.ReadInvoice(head);
|
|
|
|
|
|
if (!result.Success)
|
|
|
{
|
|
|
return new JsonResponse { Success = result.Success, Message = result.Message, Data = "" }; ;
|
|
|
}
|
|
|
|
|
|
//if (result.Message == "需要重新认证")
|
|
|
//{
|
|
|
// //HangXinRequestHelper.clear(hx.accessToken);
|
|
|
// BasicDataRefDAL.SaveLog("ReadInvoice 反回‘需要重新认证’", "", "诺诺平台", "返回认证窗口");
|
|
|
// var _r = TokenPage();
|
|
|
// return _r;
|
|
|
//}
|
|
|
|
|
|
var returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
if (head.PTORRED == "2")
|
|
|
{
|
|
|
ChinvoiceDAL.SetRed(head);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
var BlueInvoice = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + head.REDCODE + "' and cm.INVOICENO='" + head.REDNUM + "'");
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
}
|
|
|
|
|
|
//如果状态为开出成功 则执行锁定
|
|
|
if (returndate.EINVOICESTATE == "2" && returndate.BILLSTATUS == 0)
|
|
|
{
|
|
|
//ChinvoiceDAL.Lock(returndate.BILLNO);
|
|
|
|
|
|
//20200106 添加 如sys_param_set.PARAMNAME=INVOICEAUTOLOCK 没有值或值为false 则不执行锁定
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
}
|
|
|
|
|
|
|
|
|
result.Data = returndate;
|
|
|
|
|
|
jsonRespose = new JsonResponse(result);
|
|
|
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
public static string getRedirecturl(string redirecturl)
|
|
|
{
|
|
|
return redirecturl;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 将发票业务内的申请或者费用恢复原状
|
|
|
/// </summary>
|
|
|
/// <param name="BlueInvoice"></param>
|
|
|
/// <returns></returns>
|
|
|
public DBResult SetInvoiceFee(ChInvoice_HangXin BlueInvoice)
|
|
|
{
|
|
|
//var result = new DBResult();
|
|
|
//if (BlueInvoice.INVOICETYPE == 2)
|
|
|
//{
|
|
|
// //申请开票
|
|
|
// var dataList = ChinvoiceapplicationDAL.GetDataListAll("INVBILLNO='" + BlueInvoice.BILLNO + "'", Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]));
|
|
|
// result = ChinvoiceDAL.DelAppList(dataList, BlueInvoice.BILLNO);
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
// var dataList = ChinvoiceDAL.GetBodyList("BILLNO='" + BlueInvoice.BILLNO + "'");
|
|
|
// result = ChinvoiceDAL.DelFeeDo(dataList, BlueInvoice.GID);
|
|
|
//}
|
|
|
//return result;
|
|
|
|
|
|
var result = ChinvoiceDAL.SetInvoiceFee(BlueInvoice, Session);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 发票作废
|
|
|
/// </summary>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <param name="redirecturl"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNVoidInv(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
var result = Do_NNVoidInv(BILLNO, redirecturl);
|
|
|
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
|
|
|
public ContentResult NNVoidInv_P2(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
var result = Do_NNVoidInv(BILLNO, redirecturl);
|
|
|
|
|
|
if (result.Success)
|
|
|
{
|
|
|
//将相应信息写回P2
|
|
|
//1.正票/冲红 根据BSNO将P2的发票号和发票代码写回
|
|
|
//2.作废 根据BSNO将P2的 B_CANCEL设为1
|
|
|
var invoice = (ChInvoice_HangXin)result.Data;
|
|
|
var sqlstr = $" update M_INVOICE set B_CANCEL='1' where INVOICE_ID='{invoice.BSNO}'";
|
|
|
|
|
|
BasicDataRefDAL.ExecSql_DB(sqlstr, "P2DB");
|
|
|
}
|
|
|
|
|
|
return result.getContentReult();
|
|
|
}
|
|
|
|
|
|
public JsonResponse Do_NNVoidInv(string BILLNO, string redirecturl)
|
|
|
{
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "", Data = "" };
|
|
|
|
|
|
//首先判断数据完整性与合法性 以及如果缺少认证信息则返回重新进行认证
|
|
|
var checkresult = checkinfo(BILLNO, redirecturl);
|
|
|
|
|
|
if (!checkresult.Success) return checkresult;
|
|
|
|
|
|
var head = (ChInvoice_HangXin)checkresult.Data;
|
|
|
|
|
|
if (string.IsNullOrEmpty(head.INVOICESERIALNUM))
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "没有进行平台开票的发票无法进行作废操作。";
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
if (head.PTORRED == "2" || head.SETRED == "true")
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "冲红或被冲红的发票不能作废";
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
if (head.ISDELETE == "true")
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "已作废的发票不能再次作废";
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
if (head.ISEInvoice)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "电子发票不能作废,只能冲红";
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var hx = new HangXinRequestHelper();
|
|
|
|
|
|
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺发票接口" || head.INVITERFACE == "")
|
|
|
{
|
|
|
hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
}
|
|
|
else if (head.INVITERFACE == "瑞宏发票接口")
|
|
|
{
|
|
|
|
|
|
|
|
|
}
|
|
|
else if (head.INVITERFACE == "诺诺全电发票" || head.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
//hx = 诺诺全电发票.getHelper(head.TAXCODE);
|
|
|
//jsonRespose.Success = false;
|
|
|
//jsonRespose.Message = "全电发票没有作废操作,请执行冲红操作。";
|
|
|
//return jsonRespose;
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
var result = hx.VoidInvoice(head);
|
|
|
var _result = new ContentResult();
|
|
|
|
|
|
//发送作废成功,则实际进行作废操作
|
|
|
if (result.Success)
|
|
|
{
|
|
|
_result = DeleteUp(head);
|
|
|
}
|
|
|
|
|
|
|
|
|
var returndate = ChinvoiceDAL.GetData(" cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
result.Data = returndate;
|
|
|
|
|
|
JsonResponse respose = new JsonResponse(result);
|
|
|
|
|
|
return respose;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 发票冲红
|
|
|
/// </summary>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <param name="redirecturl"></param>
|
|
|
/// <returns></returns>
|
|
|
public ContentResult NNSetRed(string bill, string redirecturl, string redReason = "")
|
|
|
{
|
|
|
//首先判断是否有 modInvLock 发票开出锁定
|
|
|
var result = new DBResult();
|
|
|
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
|
|
|
|
|
|
//首先判断数据完整性与合法性 及检查平台认证
|
|
|
var checkresult = checkinfo(bill, redirecturl, redReason, true);
|
|
|
|
|
|
//被冲红的蓝票信息
|
|
|
var BlueInvoice = ChinvoiceDAL.GetData(" cm.billno='" + bill + "'");
|
|
|
BlueInvoice.billUuid = BlueInvoice.GID.Replace("-", "");
|
|
|
|
|
|
if (BlueInvoice.ISNEEDFEE == "1")
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = $"该蓝票已结算,当前无法冲红";
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!checkresult.Success)
|
|
|
{
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(checkresult) };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
var head = (ChInvoice_HangXin)checkresult.Data;
|
|
|
var BlueHead = head;
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
//全电发票没有发票代码
|
|
|
if (string.IsNullOrEmpty(head.INVOICENO))
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "该电子发票没有发票号,无法进行冲红。";
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrEmpty(redReason))
|
|
|
{
|
|
|
//jsonRespose.Success = false;
|
|
|
//jsonRespose.Message = "必须选择冲红理由。";
|
|
|
|
|
|
//return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
redReason = "2";
|
|
|
}
|
|
|
|
|
|
//增加判断 如果原票createtime晚于当前时间24小时之前,则报错不允许开出
|
|
|
//20231120 取消此限制
|
|
|
//if (BlueInvoice.INVOICEMAKETIME == null || BlueInvoice.INVOICEMAKETIME == "" || Convert.ToDateTime(BlueInvoice.INVOICEMAKETIME) > DateTime.Now.AddDays(-1))
|
|
|
//{
|
|
|
// jsonRespose.Success = false;
|
|
|
// jsonRespose.Message = $"该蓝票为{BlueInvoice.INVOICEMAKETIME}开出,当前无法冲红";
|
|
|
|
|
|
// return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (head.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(head.INVOICENO))
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "该电子发票没有发票号,无法进行冲红。";
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrEmpty(redReason))
|
|
|
{
|
|
|
//jsonRespose.Success = false;
|
|
|
//jsonRespose.Message = "必须选择冲红理由。";
|
|
|
|
|
|
//return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
redReason = "2";
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
//if (head.INVITERFACE != "诺诺全电发票" && head.INVITERFACE != "东胜乐企他用")
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(head.INVOICENO) || string.IsNullOrEmpty(head.INVOICECODE))
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "该发票没有发票号和发票代码,无法进行冲红。";
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var beRedBillNo = head.BILLNO;
|
|
|
var RedCode = head.INVOICECODE;
|
|
|
var RedNo = head.INVOICENO;
|
|
|
|
|
|
var detailList = ChinvoiceDAL.GetDetailList("PID='" + head.GID + "'");
|
|
|
|
|
|
var redhead = AutoMapperHelper.MapTo<ChInvoice_HangXin, ChInvoice_HangXin>(head);
|
|
|
|
|
|
//如果已经存在一张相应的红票,则将现在这个head变成那个红票
|
|
|
var _existRed = ChinvoiceDAL.GetData(" REDNUM='" + head.INVOICENO + "' and REDCODE='" + head.INVOICECODE + "' ");
|
|
|
if (_existRed.BILLNO != "*")
|
|
|
{
|
|
|
head = _existRed;
|
|
|
|
|
|
head.REMARK = REDREMARK(head.REMARK);
|
|
|
detailList = ChinvoiceDAL.GetDetailList("PID='" + head.GID + "'");
|
|
|
|
|
|
head.DbOperationType = DbOperationType.DbotUpd;
|
|
|
head.ModelUIStatus = "E";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (head.INVITERFACE != "诺诺全电发票" && head.INVITERFACE != "东胜乐企他用")
|
|
|
{
|
|
|
//将该head改成一个新的发票信息
|
|
|
//将发票明细也同样处理
|
|
|
|
|
|
head.GID = System.Guid.NewGuid().ToString();
|
|
|
head.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
head.PTORRED = "2"; // 开票类型 红票
|
|
|
|
|
|
head.INVOICECODE = "";
|
|
|
head.INVOICENO = "";
|
|
|
head.EINVOICESTATE = "0";
|
|
|
head.INVOICESERIALNUM = "";
|
|
|
//head.BILLSTATUS = 0;
|
|
|
head.REDCODE = RedCode;
|
|
|
head.REDNUM = RedNo;
|
|
|
head.INVAMOUNT = head.INVAMOUNT * -1;
|
|
|
head.INVOICEPDFURL = "";
|
|
|
head.INVOICEINFOURL = "";
|
|
|
head.OTCURRAMOUNT = head.OTCURRAMOUNT * -1;
|
|
|
head.DbOperationType = DbOperationType.DbotIns;
|
|
|
head.ModelUIStatus = "I";
|
|
|
head.BILLSTATUS = 1;
|
|
|
foreach (var detail in detailList)
|
|
|
{
|
|
|
//数量 税额 含税金额 不含税金额 取负数
|
|
|
detail.SetRed();
|
|
|
detail.PID = "*";
|
|
|
}
|
|
|
|
|
|
#region SR2020060200007 红票清空推送模式和推送邮箱
|
|
|
head.PUSHMODE = "-1";
|
|
|
head.PUSHEMAIL = "";
|
|
|
head.PUSHMOBILE = "0";
|
|
|
#endregion
|
|
|
head.REMARK = REDREMARK(head.REMARK);
|
|
|
}
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺全电发票")//|| head.INVITERFACE == "东胜乐企他用"
|
|
|
{
|
|
|
redhead.GID = System.Guid.NewGuid().ToString();
|
|
|
//redhead.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
redhead.PTORRED = "2"; // 开票类型 红票
|
|
|
redhead.redReason = redReason;
|
|
|
|
|
|
redhead.REDCODE = RedCode;
|
|
|
redhead.REDNUM = RedNo;
|
|
|
redhead.INVAMOUNT = redhead.INVAMOUNT * -1;
|
|
|
redhead.INVOICEPDFURL = "";
|
|
|
redhead.INVOICEINFOURL = "";
|
|
|
|
|
|
redhead.DbOperationType = DbOperationType.DbotIns;
|
|
|
redhead.ModelUIStatus = "I";
|
|
|
redhead.BILLSTATUS = 1;
|
|
|
redhead.OTCURRAMOUNT = head.OTCURRAMOUNT * -1;
|
|
|
|
|
|
foreach (var detail in detailList)
|
|
|
{
|
|
|
//数量 税额 含税金额 不含税金额 取负数
|
|
|
detail.SetRed();
|
|
|
detail.PID = "*";
|
|
|
}
|
|
|
|
|
|
redhead.REMARK = REDREMARK_Quandian(redhead);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (head.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
redhead.GID = System.Guid.NewGuid().ToString();
|
|
|
//redhead.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
redhead.PTORRED = "2"; // 开票类型 红票
|
|
|
redhead.redReason = redReason;
|
|
|
|
|
|
redhead.REDCODE = RedCode;
|
|
|
redhead.REDNUM = RedNo;
|
|
|
redhead.INVAMOUNT = redhead.INVAMOUNT * -1;
|
|
|
redhead.INVOICEPDFURL = "";
|
|
|
redhead.INVOICEINFOURL = "";
|
|
|
|
|
|
redhead.DbOperationType = DbOperationType.DbotIns;
|
|
|
redhead.ModelUIStatus = "I";
|
|
|
redhead.BILLSTATUS = 1;
|
|
|
redhead.OTCURRAMOUNT = redhead.OTCURRAMOUNT * -1;
|
|
|
|
|
|
foreach (var detail in detailList)
|
|
|
{
|
|
|
//数量 税额 含税金额 不含税金额 取负数
|
|
|
detail.SetRed();
|
|
|
detail.PID = "*";
|
|
|
}
|
|
|
|
|
|
redhead.REMARK = REDREMARK_Quandian(redhead);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
var modb = new ModelObjectDB();
|
|
|
|
|
|
if (head.INVITERFACE != "诺诺全电发票" && head.INVITERFACE != "东胜乐企他用")
|
|
|
{
|
|
|
//一般的红票业务此时保存红票信息
|
|
|
|
|
|
result = ChinvoiceDAL.SaveInvDetail(head.GID, detailList);
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
|
|
|
result = modb.Save(head);
|
|
|
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
if (head.INVITERFACE == "诺诺发票接口" || head.INVITERFACE == "")
|
|
|
{
|
|
|
var hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose.getContentReult();
|
|
|
}
|
|
|
HangXinRequestHelper.redirectUri = getRedirecturl(redirecturl);
|
|
|
result = hx.PostInvoice(head, detailList);
|
|
|
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
|
|
|
//如果状态为开出成功 则执行锁定
|
|
|
//并将被冲红的原发票的setred属性设置成true
|
|
|
|
|
|
if (returndate.EINVOICESTATE == "2" && returndate.BILLSTATUS == 0)
|
|
|
{
|
|
|
//ChinvoiceDAL.Lock(returndate.BILLNO);
|
|
|
//20200106 添加 如sys_param_set.PARAMNAME=INVOICEAUTOLOCK 没有值或值为false 则不执行锁定
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
|
|
|
ChinvoiceDAL.SetRed(returndate);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
//
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else if (head.INVITERFACE == "瑞宏发票接口")
|
|
|
{
|
|
|
RuihongHelper ruihongHelper = new RuihongHelper();
|
|
|
string msg = null;
|
|
|
result.Success = ruihongHelper.RedInvoiceRecord(returndate.GID, out msg);
|
|
|
result.Message = msg;
|
|
|
if (result.Success)
|
|
|
{
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
|
|
|
ChinvoiceDAL.SetRed(returndate);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
//
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
}
|
|
|
}
|
|
|
else if (head.INVITERFACE == "诺诺全电发票")
|
|
|
{
|
|
|
var hx = 诺诺全电发票.getHelper(head);
|
|
|
|
|
|
if (head.PTORRED == "2")
|
|
|
{
|
|
|
redhead = AutoMapperHelper.MapTo<ChInvoice_HangXin, ChInvoice_HangXin>(head);
|
|
|
//redhead.REDNUM = head.INVOICENO;
|
|
|
|
|
|
result = hx.ReadInvoice(redhead);
|
|
|
|
|
|
if (!result.Success)
|
|
|
{
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
ChinvoiceDAL.SetRed(redhead);
|
|
|
BlueInvoice = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + head.REDCODE + "' and cm.INVOICENO='" + head.REDNUM + "'");
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
//20230529
|
|
|
//1 如果ch_fee_invoice.billuuid有值的话
|
|
|
//这个值是最近一次提交的红字确认单订单编码
|
|
|
//用这个值读取红字确认单状态 如成功则做红票相应的处理
|
|
|
//如状态15申请中 则不做操作返回申请中
|
|
|
//如非成功和15 则返回错误 并清空billuuid;
|
|
|
//2 如果ch_fee_invoice.billuuid无值 则重新产生值并发出红字确认单
|
|
|
|
|
|
//此时head.billUuid如果不为空 代表已有红字申请单
|
|
|
if (!string.IsNullOrWhiteSpace(head.billUuid))//&&
|
|
|
{
|
|
|
//redhead.BILLNO = redhead.billUuid;
|
|
|
redhead.GID = redhead.billUuid;
|
|
|
|
|
|
var _r = hx.ReadRedConfirm(ref redhead, detailList);
|
|
|
|
|
|
if (!_r.Success)
|
|
|
{
|
|
|
if (_r.Message != "红字确认单申请中" && _r.Message != "提交失败,请先完成扫脸身份认证后再试。")
|
|
|
{
|
|
|
//head.billUuid = "";
|
|
|
//modb.Save(head);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
modb.Save(head);
|
|
|
}
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(_r);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
|
|
|
//var hx = 诺诺全电发票.getHelper(head.TAXCODE);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
result.SetErrorInfo(hx.ERRORMSG);
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
//if (hx.accessToken == "")
|
|
|
//{
|
|
|
// BasicDataRefDAL.SaveLog("NNReadInv;税号" + head.TAXCODE + "的 accessToken为空", "", "诺诺平台", "返回认证窗口");
|
|
|
// var _r = TokenPage();
|
|
|
// return _r;
|
|
|
//}
|
|
|
result = hx.ReadInvoice(redhead);
|
|
|
|
|
|
if (!result.Success)
|
|
|
{
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
//if (result.Message == "需要重新认证")
|
|
|
//{
|
|
|
// //HangXinRequestHelper.clear(hx.accessToken);
|
|
|
// BasicDataRefDAL.SaveLog("ReadInvoice 反回‘需要重新认证’", "", "诺诺平台", "返回认证窗口");
|
|
|
// var _r = TokenPage();
|
|
|
// return _r;
|
|
|
//}
|
|
|
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
|
|
|
if (redhead.PTORRED == "2")
|
|
|
{
|
|
|
ChinvoiceDAL.SetRed(redhead);
|
|
|
|
|
|
//将原票内的申请和费用恢复原状
|
|
|
BlueInvoice = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + redhead.REDCODE + "' and cm.INVOICENO='" + redhead.REDNUM + "'");
|
|
|
result = SetInvoiceFee(BlueInvoice);
|
|
|
}
|
|
|
|
|
|
//如果状态为开出成功 则执行锁定
|
|
|
if (returndate.EINVOICESTATE == "2" && returndate.BILLSTATUS == 0)
|
|
|
{
|
|
|
//ChinvoiceDAL.Lock(returndate.BILLNO);
|
|
|
|
|
|
//20200106 添加 如sys_param_set.PARAMNAME=INVOICEAUTOLOCK 没有值或值为false 则不执行锁定
|
|
|
var needautolock = MsSysParamSetDAL.GetSysParam("INVOICEAUTOLOCK").isnullortrue();
|
|
|
|
|
|
if (needautolock)
|
|
|
{
|
|
|
ChinvoiceDAL.Lock(returndate.BILLNO, Convert.ToString(Session["USERID"]));
|
|
|
}
|
|
|
returndate = ChinvoiceDAL.GetData(" BILLNO='" + head.BILLNO + "'");
|
|
|
}
|
|
|
|
|
|
|
|
|
result.Data = returndate;
|
|
|
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//head.billUuid如果为空 代表还没发红字申请单
|
|
|
//获取红票信息并发出
|
|
|
redhead.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
|
|
|
head.billUuid = head.GID.Replace("-", "");
|
|
|
redhead.GID = head.billUuid;
|
|
|
//T_ALL_DA T_ALL_DA = new EntityDA.T_ALL_DA();
|
|
|
//var blUpSQL = $" update ch_fee_invoice set billUuid='{head.billUuid}' where GID='{redhead.GID}'";
|
|
|
//bool bl = T_ALL_DA.GetExecuteSqlCommand(blUpSQL);
|
|
|
|
|
|
|
|
|
result = hx.PostRedConfirm(redhead, ref head, detailList, Session);
|
|
|
if (result.Success == false)
|
|
|
{
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
returndate = (ChInvoice_HangXin)result.Data;
|
|
|
}
|
|
|
}
|
|
|
//诺诺全电票根据红字申请单的结果读取确认单
|
|
|
}
|
|
|
modb.Save(head);
|
|
|
}
|
|
|
else if (head.INVITERFACE == "东胜乐企他用")
|
|
|
{
|
|
|
//http://60.209.125.238:32222/single/file/uQWgweivofs0kqoA3wllrvQefbLURSKwNwUMXuG2uwX5OAW02GtkjrvK7y3Wb0N3
|
|
|
//请求成功 则调用head.BILLNO = PubSysDAL.GetBillNo("0308"); 获取billno
|
|
|
//然后保存 并清除蓝票费用内容
|
|
|
//失败则返回失败
|
|
|
|
|
|
//head.redReason = redReason;
|
|
|
|
|
|
head.redReason = "01";
|
|
|
|
|
|
var cdc = new Common.DB.CommonDataContext();
|
|
|
|
|
|
var enumvalueList = cdc.tSysEnumValue.Where(x => x.EnumTypeID == 80008 && x.EnumValueID == head.redReason).ToList();
|
|
|
|
|
|
if (enumvalueList != null && enumvalueList.Count > 0)
|
|
|
{
|
|
|
head.redReason = enumvalueList[0].EnumValueName_2;
|
|
|
}
|
|
|
|
|
|
|
|
|
var hp = new 东胜乐企他用(head, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
result = hp.DoSend_RedInvoice();
|
|
|
|
|
|
if (result.Success == false)
|
|
|
{
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
var 红字确认单申请返回值 = JsonConvert.Deserialize<乐企他用红字确认单申请返回>(result.Data.ToString());
|
|
|
|
|
|
if (红字确认单申请返回值.success == false || 红字确认单申请返回值.data == null)
|
|
|
{
|
|
|
result.Message = "";
|
|
|
result.SetErrorInfo("服务器响应出错:" + 红字确认单申请返回值.msg);
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
redhead.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
redhead.billUuid = 红字确认单申请返回值.data.senid;
|
|
|
|
|
|
redhead.INVOICENO = "";
|
|
|
|
|
|
result = modb.Save(redhead);
|
|
|
|
|
|
if (result.Success == false)
|
|
|
{
|
|
|
return BasicDataRefDAL.GetContentResult(result);
|
|
|
}
|
|
|
|
|
|
result.Data = ChinvoiceDAL.GetData(" BILLNO='" + redhead.BILLNO + "'");
|
|
|
|
|
|
//return BasicDataRefDAL.GetContentResult(result);
|
|
|
|
|
|
//ChinvoiceDAL.SetRed(redhead);
|
|
|
|
|
|
|
|
|
////将原票内的申请和费用恢复原状
|
|
|
//var BlueInvoice2 = ChinvoiceDAL.GetData(" cm.INVOICECODE='" + redhead.REDCODE + "' and cm.INVOICENO='" + redhead.REDNUM + "'");
|
|
|
//result = SetInvoiceFee(BlueInvoice2);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jsonRespose.Success = result.Success;
|
|
|
jsonRespose.Message = result.Message;
|
|
|
jsonRespose.Data = returndate;
|
|
|
}
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 诺诺全电发票 读取红字申请单
|
|
|
/// </summary>
|
|
|
/// <param name="bill"></param>
|
|
|
/// <returns></returns>
|
|
|
public DBResult NNRedConfirm_Read(string BILLNO)
|
|
|
{
|
|
|
ChInvoice_HangXin head = ChinvoiceDAL.GetData("cm.BILLNO='" + BILLNO + "'");
|
|
|
|
|
|
var result = new DBResult();
|
|
|
|
|
|
var hx = 诺诺全电发票.getHelper(head);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
result.SetErrorInfo(hx.ERRORMSG);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
result = hx.ReadRedConfirm(ref head);
|
|
|
|
|
|
if (!result.Success) { return result; }
|
|
|
else
|
|
|
{
|
|
|
var _r = Do_NuoNuoQuanDianReadInv(head.BILLNO);
|
|
|
|
|
|
result.Success = _r.Success;
|
|
|
result.Message = _r.Message;
|
|
|
result.Data = _r.Data;
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 红票票面备注 固定追加
|
|
|
/// 对应正数发票代码:037021900111号码:84769822
|
|
|
/// 共42字节,而总长度不能超过130字节
|
|
|
/// 因此红票的备注需要截断超过88字节长度的部分
|
|
|
/// </summary>
|
|
|
/// <param name="REMARK"></param>
|
|
|
/// <returns></returns>
|
|
|
private string REDREMARK(string REMARK)
|
|
|
{
|
|
|
|
|
|
if (REMARK.Length <= 88) return REMARK;
|
|
|
else
|
|
|
{
|
|
|
|
|
|
while ((REMARK.Length > 88) && (REMARK.IndexOf(" ") >= 0))
|
|
|
{
|
|
|
REMARK = REMARK.Replace(" ", " ");
|
|
|
}
|
|
|
|
|
|
if (REMARK.Length > 88)
|
|
|
{
|
|
|
REMARK = REMARK.Replace("\n", "");
|
|
|
}
|
|
|
if (REMARK.Length > 88)
|
|
|
{
|
|
|
REMARK = REMARK.Substring(0, 88);
|
|
|
}
|
|
|
return REMARK;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private string REDREMARK_Quandian(ChInvoice_HangXin head)
|
|
|
{
|
|
|
//
|
|
|
|
|
|
var 购方信息 = " 购方账号:" + head.CUSTBANK;
|
|
|
var 销方信息 = " 销方账号:" + head.ACCOUNT;
|
|
|
head.REMARK += 购方信息 + 销方信息;
|
|
|
|
|
|
return head.REMARK;
|
|
|
}
|
|
|
|
|
|
public bool IsValidEmail(string email)
|
|
|
{
|
|
|
// 正则表达式匹配电子邮箱格式
|
|
|
string pattern = @"^\S+@\S+\.\S+$";
|
|
|
return Regex.IsMatch(email, pattern);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 检查能否发出开票信息
|
|
|
/// </summary>
|
|
|
/// <param name="head"></param>
|
|
|
/// <returns></returns>
|
|
|
private DBResult checkCanPost(ChInvoice_HangXin head)
|
|
|
{
|
|
|
var result = new DBResult(true, "", "");
|
|
|
if (head.ISFRINV)
|
|
|
{
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrEmpty(head.INVOICECUSTNAME)) setErrorMessage(ref result, "购方名称 不能为空");
|
|
|
if (string.IsNullOrEmpty(head.PUSHMOBILE)) setErrorMessage(ref result, "推送的手机号码 不能为空");
|
|
|
|
|
|
var ErrorInfo = "销售方公司(我方公司)没有维护:";
|
|
|
var LocalErrorInfo = "销售方公司(我方公司)没有维护:";
|
|
|
if (string.IsNullOrWhiteSpace(head.TAXCODE))
|
|
|
{
|
|
|
result.Success = false;
|
|
|
|
|
|
LocalErrorInfo += " 税务登记号 ";
|
|
|
}
|
|
|
if (string.IsNullOrWhiteSpace(head.ADDRESS))
|
|
|
{
|
|
|
result.Success = false;
|
|
|
if (LocalErrorInfo != ErrorInfo)
|
|
|
LocalErrorInfo += "、";
|
|
|
LocalErrorInfo += " 公司地址 ";
|
|
|
}
|
|
|
if (string.IsNullOrWhiteSpace(head.BILLRISES))
|
|
|
{
|
|
|
result.Success = false;
|
|
|
if (LocalErrorInfo != ErrorInfo)
|
|
|
LocalErrorInfo += "、";
|
|
|
LocalErrorInfo += " 公司发票抬头 ";
|
|
|
}
|
|
|
if (string.IsNullOrWhiteSpace(head.OFFICEPHONE))
|
|
|
{
|
|
|
result.Success = false;
|
|
|
if (LocalErrorInfo != ErrorInfo)
|
|
|
LocalErrorInfo += "、";
|
|
|
LocalErrorInfo += " 办公电话 ";
|
|
|
}
|
|
|
if (LocalErrorInfo != ErrorInfo)
|
|
|
{
|
|
|
LocalErrorInfo += " ,请在企业信息内录入。";
|
|
|
setErrorMessage(ref result, LocalErrorInfo);
|
|
|
}
|
|
|
if (!string.IsNullOrEmpty(head.PUSHEMAIL)) {
|
|
|
bool isValid = IsValidEmail(head.PUSHEMAIL);
|
|
|
|
|
|
if (isValid)
|
|
|
{
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
setErrorMessage(ref result, "电子邮箱无效"); // 电子邮箱无效
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
if (head.PTORRED == "2")
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(head.REDCODE)) setErrorMessage(ref result, "冲红时 蓝票代码 不能为空");
|
|
|
if (string.IsNullOrEmpty(head.REDCODE)) setErrorMessage(ref result, "冲红时 蓝票号码 不能为空");
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 检查能否发出读取发票信息
|
|
|
/// </summary>
|
|
|
/// <param name="BILLNO"></param>
|
|
|
/// <param name="redirecturl"></param>
|
|
|
/// <returns></returns>
|
|
|
private JsonResponse checkCanRead(string BILLNO, string redirecturl = "")
|
|
|
{
|
|
|
|
|
|
var result = new DBResult();
|
|
|
var head = new ChInvoice_HangXin();
|
|
|
//var detail = new List<chinvoice_de>
|
|
|
var jsonRespose = new JsonResponse { Success = true, Message = result.Message, Data = result.Data };
|
|
|
//首先判断数据完整性与合法性
|
|
|
|
|
|
head = ChinvoiceDAL.GetData("cm.BILLNO='" + BILLNO + "'");
|
|
|
if (head.BILLNO != "")
|
|
|
{
|
|
|
//head = list[0];
|
|
|
jsonRespose.Data = head;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = "没有找到可以开票的发票信息,可能是权限不足或登录信息丢失。";
|
|
|
}
|
|
|
|
|
|
if (redirecturl != "")
|
|
|
{
|
|
|
|
|
|
//如果该税号的token需要 返回认证窗口
|
|
|
var hx = HangXinRequestHelper.getHelper(head.TAXCODE);
|
|
|
if (!hx.CanUse)
|
|
|
{
|
|
|
jsonRespose.Success = false;
|
|
|
jsonRespose.Message = hx.ERRORMSG;
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
HangXinRequestHelper.redirectUri = getRedirecturl(redirecturl);
|
|
|
if (hx.needStart)
|
|
|
{
|
|
|
BasicDataRefDAL.SaveLog("checkinfo;BILLNO=" + BILLNO, "", "诺诺平台", "返回认证窗口");
|
|
|
jsonRespose = TokenPage();
|
|
|
}
|
|
|
}
|
|
|
return jsonRespose;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void setErrorMessage(ref DBResult r, string message)
|
|
|
{
|
|
|
r.setMessage(false, message);
|
|
|
}
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
public ContentResult UpdatePrint(string billno)
|
|
|
{
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.UpdatePrint(billno);
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
#region 发票模板
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetRemarksTemplate(string TemplateName)
|
|
|
{
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.GetRemarksTemplate(Convert.ToString(Session["COMPANYID"]), TemplateName);
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult SaveRemarksTemplate(string Template, string TemplateName)
|
|
|
{
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.SaveRemarksTemplate(Template, Convert.ToString(Session["COMPANYID"]), TemplateName);
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetRemarksData(string billno, string TemplateName)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetBsList("c.BILLNO='" + billno + "'");
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.GetRemarksData(dataList, Convert.ToString(Session["COMPANYID"]), billno, TemplateName);
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message, Data = result.Data };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#region 发票票册
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetBookDataList(int start, int limit, string sort, string condition)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetBookDataList(condition, Convert.ToString(Session["COMPANYID"]), sort);
|
|
|
var list = dataList.Skip(start).Take(limit);
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = list.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetBookData(string handle, string condition)
|
|
|
{
|
|
|
ChInvoiceBook_HangXin head = null;
|
|
|
|
|
|
if (handle == "edit")
|
|
|
{
|
|
|
var list = ChinvoiceDAL.GetBookDataList(condition, Convert.ToString(Session["COMPANYID"]));
|
|
|
if (list.Count > 0)
|
|
|
head = list[0];
|
|
|
}
|
|
|
|
|
|
if (head == null)
|
|
|
{
|
|
|
head = new ChInvoiceBook_HangXin();
|
|
|
}
|
|
|
|
|
|
if (handle == "add")
|
|
|
{
|
|
|
head.CREATEUSER = Convert.ToString(Session["USERID"]);
|
|
|
head.CREATEUSERREF = Convert.ToString(Session["SHOWNAME"]);
|
|
|
head.COMPANYID = Convert.ToString(Session["COMPANYID"]);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(
|
|
|
new { Success = true, Message = "查询成功", data = head });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
|
|
|
public ContentResult SaveBook(string opstatus, string data)
|
|
|
{
|
|
|
|
|
|
|
|
|
var headData = JsonConvert.Deserialize<ChInvoiceBook_HangXin>(data);
|
|
|
|
|
|
|
|
|
if (opstatus == "add")
|
|
|
{
|
|
|
headData.GID = Guid.NewGuid().ToString();
|
|
|
headData.COMPANYID = Convert.ToString(Session["COMPANYID"]);
|
|
|
headData.CREATEUSER = Convert.ToString(Session["USERID"]);
|
|
|
headData.CREATETIME = DateTime.Now.ToString();
|
|
|
headData.DbOperationType = DbOperationType.DbotIns;
|
|
|
}
|
|
|
else if (opstatus == "edit")
|
|
|
{
|
|
|
headData.DbOperationType = DbOperationType.DbotUpd;
|
|
|
headData.ModelUIStatus = "E";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
headData.DbOperationType = DbOperationType.DbotDel;
|
|
|
}
|
|
|
if (headData.TYPE == "") headData.TYPE = "0";
|
|
|
|
|
|
var BILLNO = headData.GID;
|
|
|
var modb = new ModelObjectDB();
|
|
|
|
|
|
DBResult result = modb.Save(headData);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var jsonRespose = new JsonResponse
|
|
|
{
|
|
|
Success = result.Success,
|
|
|
Message = result.Message,
|
|
|
Data = ChinvoiceDAL.GetBookData(" GID='" + BILLNO + "'", Convert.ToString(Session["COMPANYID"]))
|
|
|
};
|
|
|
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
|
|
|
}
|
|
|
|
|
|
public ContentResult DeleteBook(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<ChInvoiceBook_HangXin>(data);
|
|
|
var isfee = ChinvoiceDAL.GetMakeOutCount(headData.GID);
|
|
|
if (isfee)
|
|
|
{
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = false, Message = "此票册已有开出发票,不允许删除!" };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
DBResult result;
|
|
|
var modb = new ModelObjectDB();
|
|
|
result = modb.Delete(headData);
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public ContentResult CreateBookitems(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<ChInvoiceBook_HangXin>(data);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.CreateBookitems(headData, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult LockBookitems(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<List<ChInvoiceBookdetail_HangXin>>(data);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.LockBookitems(headData);
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult CancelLockBookitems(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<List<ChInvoiceBookdetail_HangXin>>(data);
|
|
|
|
|
|
DBResult result = ChinvoiceDAL.CancelLockBookitems(headData);
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetBookitemsDataList(string condition, string sort)
|
|
|
{
|
|
|
var dataList = ChinvoiceDAL.GetBookitemsDataList(condition, sort);
|
|
|
|
|
|
|
|
|
var json = JsonConvert.Serialize(new { Success = true, Message = "查询成功", totalCount = dataList.Count, data = dataList.ToList() });
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
public ContentResult DeleteUpBook(string data)
|
|
|
{
|
|
|
var headData = JsonConvert.Deserialize<ChInvoiceBook_HangXin>(data);
|
|
|
DBResult result;
|
|
|
|
|
|
result = ChinvoiceDAL.DeleteUpBook(headData.GID, Convert.ToString(Session["USERID"]));
|
|
|
|
|
|
var jsonRespose = new JsonResponse { Success = result.Success, Message = result.Message };
|
|
|
return new ContentResult() { Content = JsonConvert.Serialize(jsonRespose) };
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 参照部分
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 联力 连接P2系统的sql数据库表 查询没有发票号的M_invoice表内容
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
public ContentResult GetP2Invoice(string condition)
|
|
|
{
|
|
|
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
var _count = 0;
|
|
|
|
|
|
//(string TABLENAME,string _PKEY,string _sql,string DBNAME)
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
|
|
|
var dataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票", condition);
|
|
|
|
|
|
var list_2 = ModelObjectBill.getDicList(ModelObjectConvert<BaseTableMC>.ToModelObjectList(dataList));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "查询成功",
|
|
|
totalCount = _count,
|
|
|
data = list_2.ToList()
|
|
|
|
|
|
});
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetP2Invoice_Fee(string INVOICE_ID)
|
|
|
{
|
|
|
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
var _count = 0;
|
|
|
|
|
|
//(string TABLENAME,string _PKEY,string _sql,string DBNAME)
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
if (string.IsNullOrWhiteSpace(INVOICE_ID)) INVOICE_ID = "0";
|
|
|
|
|
|
var dataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票_明细", $"INVOICE_ID='{INVOICE_ID}'");
|
|
|
|
|
|
var resultlist = new List<BaseTableMC>();
|
|
|
|
|
|
var splitword = "\r\n";
|
|
|
|
|
|
if (dataList.Count > 0)
|
|
|
{
|
|
|
foreach (var data in dataList)
|
|
|
{
|
|
|
var feenamearray = data.GetSplitField("FEENAME", splitword);
|
|
|
var amoutarray = data.GetSplitField("AMOUNT", splitword);
|
|
|
var PRICEarray = data.GetSplitField("PRICE", splitword);
|
|
|
var ratearray = data.GetSplitField("RATE", splitword);
|
|
|
var NUMarray = data.GetSplitField("NUM", splitword);
|
|
|
|
|
|
if (feenamearray.Length > 1)
|
|
|
{
|
|
|
for (var _i = 0; _i < feenamearray.Length; _i++)
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(feenamearray[_i])) continue;
|
|
|
var resultdata = new BaseTableMC();
|
|
|
|
|
|
resultdata.SetValue("CURRENCY", data.GetValue("CURRENCY"));
|
|
|
resultdata.SetValue("FEENAME", feenamearray[_i]);
|
|
|
resultdata.SetValue("AMOUNT", amoutarray[_i]);
|
|
|
resultdata.SetValue("PRICE", PRICEarray[_i]);
|
|
|
resultdata.SetValue("RATE", ratearray[_i]);
|
|
|
resultdata.SetValue("NUM", NUMarray[_i]);
|
|
|
|
|
|
resultlist.Add(resultdata);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
resultlist.Add(data);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var list_2 = ModelObjectBill.getDicList(ModelObjectConvert<BaseTableMC>.ToModelObjectList(resultlist));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "查询成功",
|
|
|
totalCount = _count,
|
|
|
data = list_2.ToList()
|
|
|
|
|
|
});
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetP2_CUST(string condition = " isnull(invoice_no,'')='' ")
|
|
|
{
|
|
|
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
var _count = 0;
|
|
|
|
|
|
//(string TABLENAME,string _PKEY,string _sql,string DBNAME)
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
|
|
|
var dataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票_开票单位", condition, " select distinct COMPANY_CODE from M_INVOICE ");
|
|
|
|
|
|
var list_2 = ModelObjectBill.getDicList(ModelObjectConvert<BaseTableMC>.ToModelObjectList(dataList));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "查询成功",
|
|
|
totalCount = _count,
|
|
|
data = list_2.ToList()
|
|
|
|
|
|
});
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetP2_CURRENCY(string condition = " isnull(invoice_no,'')='' ")
|
|
|
{
|
|
|
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
var _count = 0;
|
|
|
|
|
|
//(string TABLENAME,string _PKEY,string _sql,string DBNAME)
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
|
|
|
var dataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票_币别", condition, " select distinct CURR_TYPE from M_INVOICE ");
|
|
|
|
|
|
var list_2 = ModelObjectBill.getDicList(ModelObjectConvert<BaseTableMC>.ToModelObjectList(dataList));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "查询成功",
|
|
|
totalCount = _count,
|
|
|
data = list_2.ToList()
|
|
|
|
|
|
});
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
public ContentResult GetP2_CREATOR(string condition = " isnull(invoice_no,'')='' ")
|
|
|
{
|
|
|
|
|
|
var canlogin = BasicDataRefDAL.CheckLogin(Session);
|
|
|
if (!canlogin.Success)
|
|
|
{
|
|
|
return (ContentResult)canlogin.Data;
|
|
|
}
|
|
|
|
|
|
var _count = 0;
|
|
|
|
|
|
//(string TABLENAME,string _PKEY,string _sql,string DBNAME)
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
|
|
|
var dataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票_申请人", condition, " select distinct CREATE_BY from M_INVOICE ");
|
|
|
|
|
|
var list_2 = ModelObjectBill.getDicList(ModelObjectConvert<BaseTableMC>.ToModelObjectList(dataList));
|
|
|
|
|
|
var json = JsonConvert.Serialize(new
|
|
|
{
|
|
|
Success = true,
|
|
|
Message = "查询成功",
|
|
|
totalCount = _count,
|
|
|
data = list_2.ToList()
|
|
|
|
|
|
});
|
|
|
return new ContentResult() { Content = json };
|
|
|
}
|
|
|
|
|
|
|
|
|
public ContentResult SaveNewP2(string opstatus, string data, string GID, string localdata)
|
|
|
{
|
|
|
|
|
|
var headData = JsonConvert.Deserialize<ChInvoice_HangXin>(data);
|
|
|
var localData = JsonConvert.Deserialize<ChInvoice_HangXin>(localdata);
|
|
|
|
|
|
BaseTableMC fromdbbase = new BaseTableMC("M_INVOICE", "INVOICE_ID", "", "P2DB");
|
|
|
|
|
|
var P2DataList = DBTableConnDAL.getToList(fromdbbase, "联力P2发票", " INVOICE_ID='" + headData.BSNO + "'");
|
|
|
|
|
|
var bodyList = new List<ChInvoiceDetail>();
|
|
|
|
|
|
var SaveBodyList = new List<ChInvoiceDetail>();
|
|
|
|
|
|
var P2Data = new BaseTableMC();
|
|
|
|
|
|
if (P2DataList.Count() > 0)
|
|
|
{
|
|
|
P2Data = P2DataList[0];
|
|
|
}
|
|
|
|
|
|
if (opstatus == "add")
|
|
|
{
|
|
|
//查看是否已被使用 如是则返回错误并结束
|
|
|
var isexists = CheckExists(" BSNO='" + headData.BSNO + "' ");
|
|
|
if (!isexists.Success)
|
|
|
{
|
|
|
return isexists.getContentReult();
|
|
|
}
|
|
|
|
|
|
localData.GID = Guid.NewGuid().ToString();
|
|
|
localData.BILLNO = PubSysDAL.GetBillNo("0308");
|
|
|
localData.COMPANYID = Convert.ToString(Session["COMPANYID"]);
|
|
|
localData.OPERATOR = Convert.ToString(Session["USERID"]);
|
|
|
localData.OPERATETIME = DateTime.Now;
|
|
|
localData.DbOperationType = DbOperationType.DbotIns;
|
|
|
|
|
|
}
|
|
|
else if (opstatus == "edit")
|
|
|
{
|
|
|
//localData = ChinvoiceDAL.GetData(" GID='"+ GID + "' ");
|
|
|
|
|
|
var isexists = CheckExists(" BSNO='" + headData.BSNO + "' and GID<>'" + GID + "' ");
|
|
|
if (!isexists.Success)
|
|
|
{
|
|
|
return isexists.getContentReult();
|
|
|
}
|
|
|
|
|
|
localData.DbOperationType = DbOperationType.DbotUpd;
|
|
|
|
|
|
bodyList = ChinvoiceDAL.GetDetailList(" PID='" + localData.GID + "' ");
|
|
|
|
|
|
}
|
|
|
localData.SetP2Value(P2Data);
|
|
|
|
|
|
|
|
|
if (bodyList.Count > 0)
|
|
|
{
|
|
|
ChinvoiceDAL.DelInvDetail(bodyList);
|
|
|
}
|
|
|
|
|
|
SaveBodyList = ChInvoiceDetail.GetP2DetailList(P2Data, (localData.PTORRED == "2"));
|
|
|
|
|
|
var BILLNO = localData.BILLNO;
|
|
|
var modb = new ModelObjectDB();
|
|
|
DBResult result = ChinvoiceDAL.SaveInvDetail(localData.GID, SaveBodyList);
|
|
|
if (result.Success == true)
|
|
|
{
|
|
|
|
|
|
result = modb.Save(localData);
|
|
|
//ChinvoiceDAL.UpdateInvNoUse(headData.INVOICENO, Convert.ToString(Session["USERID"]),headData.BILLNO);
|
|
|
//if (headData.EXCHANGERATE != 0)
|
|
|
//{
|
|
|
// ChinvoiceDAL.updateFeeTax(headData.BILLNO, headData.EXCHANGERATE);
|
|
|
|
|
|
//}
|
|
|
|
|
|
};
|
|
|
|
|
|
var jsonRespose = new JsonResponse
|
|
|
{
|
|
|
Success = result.Success,
|
|
|
Message = result.Message,
|
|
|
Data = ChinvoiceDAL.GetData(" BILLNO='" + BILLNO + "'", Convert.ToString(Session["USERID"]), CookieConfig.GetCookie_UserCode(Request), Convert.ToString(Session["COMPANYID"]))
|
|
|
};
|
|
|
|
|
|
return jsonRespose.getContentReult();
|
|
|
}
|
|
|
[SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器
|
|
|
private JsonResponse CheckExists(string condition)
|
|
|
{
|
|
|
var existsdata = ChinvoiceDAL.GetData(condition);
|
|
|
JsonResponse result = new JsonResponse();
|
|
|
if (!string.IsNullOrWhiteSpace(existsdata.GID))
|
|
|
{
|
|
|
result.Success = false;
|
|
|
result.Message = "该发票已经被使用!";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result.Success = true;
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|