using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using djy.Paas.IService; using Ys.Core.Common; using djy.Model; using djy.Paas.Model; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; using System.Security.Cryptography; using System.Text.Json; using Hangfire; using AutoMapper; using djy.Paas.Model.Dto; using iTextSharp.text.pdf; using iTextSharp.text; using System.IO; using System.Drawing.Imaging; using System.Threading; namespace djy.Paas.Service { /// /// /// public class BaoguanService : ServBase, IBaoguanService { /// /// 字典数据 /// private List _dictlist = new List(); public BaoguanService(string dbname = DbList.djypublicedb) : base(dbname) { _dictlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.DictType == "dict").ToList(); } #region api接口 /// /// 条件查询报关单数据 /// /// /// /// public async Task> GetBaoguanOrderList(tb_BaoGuanOrderList Dto, ApiFromDto apiFrom) { var rs = new ReturnPagedResult(); apiFrom.EndTimeAddDay(); var sql = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status > 0) .WhereIf(apiFrom.StartTime > 0, w => w.AddTime >= apiFrom.StartTime) .WhereIf(apiFrom.EndTime > 0, w => w.AddTime <= apiFrom.EndTime) .WhereIf(Dto.Gid != null, w => w.Gid == Dto.Gid) .WhereIf(Dto.stateCode.IsNotNull(), w => w.stateCode != null && w.stateCode == Dto.stateCode) .WhereIf(Dto.CompId != null, w => w.CompId == Dto.CompId) .WhereIf(Dto.ClientName.IsNotNull(), w => w.ClientName.Contains(Dto.ClientName) || w.TradeName.Contains(Dto.ClientName)) .WhereIf(Dto.DeclareCustoms.IsNotNull(), w => w.DeclareCustoms.Contains(Dto.DeclareCustoms)) .WhereIf(Dto.TradeName.IsNotNull(), w => w.TradeName.Contains(Dto.TradeName)) .WhereIf(Dto.UniqueNumber.IsNotNull(), w => w.UniqueNumber.Length > 0 && Dto.UniqueNumber.Contains(w.UniqueNumber)) .WhereIf(Dto.IEFlag.IsNotNull(), w => w.IEFlag == Dto.IEFlag) .WhereIf(Dto.CompName.IsNotNull(), w => w.CompName.Contains(Dto.CompName)) .WhereIf(Dto.ShipOrderNo.IsNotNull(), w => w.ShipOrderNo.Contains(Dto.ShipOrderNo) || w.ShipOrderNoMain.Contains(Dto.ShipOrderNo)); rs.Data = await sql.OrderByDescending(w => w.AddTime).Count(out var totalcount).Page(apiFrom.Page, apiFrom.Limit).ToListAsync(); rs.Pageset(apiFrom, totalcount); rs.OK(); return rs; } /// ///报关审核保存 /// /// /// public async Task> OrderCheck(tb_BaoGuanOrderList Dto) { var rs = new ReturnResult(); var order = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Gid == Dto.Gid).ToOne(); if (order == null) { rs.Not("非法操作没有此报关单"); return rs; } order.CustomersCheck = Dto.CustomersCheck; await DbBus.Get(DbList.djypublicedb).Update().SetSource(order).UpdateColumns(w => w.CustomersCheck).ExecuteAffrowsAsync(); rs.OK(); return rs; } /// /// 绑定客户信息 /// /// /// public async Task> BindClient(ClientLinkInfoDto dto) { var rs = new ReturnResult(); //if (!dto.Email.IsEmail()) //{ // rs.Not("要绑定的数据信息不正确"); // return rs; //} var order = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Gid == dto.DataGid).ToOne(); //order.ClientName = dto.ClientName.IsNotNull() ? dto.ClientName : order.ClientName; //order.ClientMain = dto.LinkName.IsNotNull() ? dto.LinkName : order.ClientMain; //order.ClientEmail = dto.Email.IsNotNull() ? dto.Email : order.ClientEmail; order.ClientName = dto.ClientName; order.ClientMain = dto.LinkName; order.ClientEmail = dto.Email; _LogsAdd("报关客户绑定:" + order.UniqueNumber, "报关绑定", new { dto, order }); rs.Data = DbBus.Get(DbList.djypublicedb).Update().SetSource(order).ExecuteAffrows(); if (dto.Email.IsNotNull() && dto.ClientName.IsNotNull()) { //未绑定的一起绑定更新 var bangdinglist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.CompId == order.CompId && w.TradeName.Length > 0 && w.TradeName == order.TradeName && (w.ClientName == null || w.ClientName.Length == 0)).ToList(w => new { w.Id, w.Gid, w.UniqueNumber }); //var bangdinglist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.CompId == order.CompId && w.TradeName.Length > 0 && w.TradeName == order.TradeName && (w.ClientName!=dto.ClientName || w.ClientMain!=dto.LinkName || w.ClientEmail!=dto.Email)).ToList(w => new { w.Id, w.Gid, w.UniqueNumber }); var unidlist = ""; bangdinglist.ForEach(item => { unidlist += $",{item.UniqueNumber}"; }); _LogsAdd("手动绑定触发更新:" + unidlist, "报关绑定", new { dto, order, bangdinglist }); DbBus.Get(DbList.djypublicedb).Update().Set(w => new tb_BaoGuanOrderList { ClientName = dto.ClientName, ClientMain = dto.LinkName, ClientEmail = dto.Email }) .Where(w => w.CompId == order.CompId && w.TradeName.Length > 0 && w.TradeName == order.TradeName && (w.ClientName == null || w.ClientName.Length == 0)).ExecuteAffrows(); //.Where(w =>w.CompId==order.CompId&& w.TradeName.Length > 0 && w.TradeName == order.TradeName && (w.ClientEmail.Length == 0 || w.ClientEmail == null)).ExecuteAffrows(); //.Where(w => w.CompId == order.CompId && w.TradeName.Length > 0 && w.TradeName == order.TradeName && (w.ClientName != dto.ClientName || w.ClientMain != dto.LinkName || w.ClientEmail != dto.Email)).ExecuteAffrows(); } rs.OK(); return rs; } /// /// 根据箱号获取报关箱体数据详情 /// /// /// public async Task>> GetContainerList(List ContNoList) { var rs = new ReturnResult>(); if (ContNoList != null || ContNoList.Count > 0) { var contlist = await DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status == 1 && ContNoList.Contains(w.ContainerId)).ToListAsync(); var orderidlist = contlist.Select(w => w.BaoguanOrderGid).ToList(); var gidlist = contlist.Select(w => w.Gid).ToList(); var orderlist = await DbBus.Get(DbList.djypublicedb).Select().Where(w => orderidlist.Contains(w.Gid)).ToListAsync(); var goodslist = await DbBus.Get(DbList.djypublicedb).Select().Where(w => gidlist.Contains(w.ContainerGid)).ToListAsync(); contlist.ForEach(item => { item.OrderInfo = orderlist.Where(w => w.Gid == item.BaoguanOrderGid).First(); item.GoodsList = goodslist.Where(w => w.ContainerGid == item.Gid).ToList(); }); rs.Data = contlist; } rs.OK(); return rs; } /// /// 读取报关消息推送数据 /// /// public ReturnResult> ReadCompanyPushMsg(Guid? CompanyGid) { var rs = new ReturnResult>(); rs.Data = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status < 100 && w.CompanyGid == CompanyGid).OrderBy(w => w.Id).ToList(); //if (rs.Data.Count > 10) { // rs.Data= rs.Data.Skip(0).Take(10).ToList(); //} var idlist = rs.Data.Select(w => w.Id).ToList(); DbBus.Get(DbList.djypublicedb).Update().Set(s => s.Status, 100).Where(s => idlist.Contains(s.Id)).ExecuteAffrows(); rs.OK(); return rs; } #endregion #region 阿里云报关对接部分 /// /// 阿里云apiHost /// private const string _aliapihost = @"http://gw.open.1688.com/openapi/"; ///阿里云测试服务地址 //private const string _aliapihost = @"http://pre-gw.api.1688.com/openapi/"; /// /// 生成的签名秘钥 /// private const string _aliappsecretKey = @"YJwlNbSYPVe"; /// /// 阿里用户数据回写请求 阿里请求我们 /// /// /// public async Task> AliBack(ApiFromDto Dto) { var rs = new ReturnResult(); //解析密文 var getjson = ""; var aliyunkey = DjyTools.GetConfigKey("bg_aliyunseckey"); try { getjson = Jose.JWT.Decode(Dto.Token, Encoding.UTF8.GetBytes(aliyunkey), Jose.JweAlgorithm.PBES2_HS512_A256KW, Jose.JweEncryption.A256CBC_HS512); _LogsAdd("baoguan阿里报关用户数据回写", "报关", getjson); long aliid = 0; var jsondata = YsJson.DeserializeAnonymousType(getjson, new { openUserId = "", aliId = aliid, companyid = 0 }); var user = DbBus.Get(DbList.djyolddb).Select().Where(w => w.GID == jsondata.openUserId).ToOne(); if (user != null) { //更新绑定到user DbBus.Get(DbList.djyolddb).Update().Set(w => w.BaoguanAliId, jsondata.aliId.ToString()).Where(w => w.GID == jsondata.openUserId).ExecuteAffrows(); //更新绑定到公司 DbBus.Get(DbList.djyolddb).Update().Set(w => w.AliCompanyId, jsondata.companyid).Where(w => w.CompId == user.CompId && w.AliCompanyId == 0).ExecuteAffrows(); } } catch (Exception ex) { } _LogsAdd("报关阿里回馈", "baoguan", new { Dto.Token, getjson }); rs.OK("接收成功"); return rs; } #region 阿里云报关对接 /// /// 报关自动接收数据生成同步报关单数据job /// /// public async Task> AutoAllibonBaoguanJob(ApiFromDto UserDto) { var rs = new ReturnResult(); ///接收数据 1 接收 2 标记告诉阿里接收状态 await AliBaoguanrationlist(); //生成与更新报关单数据到本地 解析报关数据 单一窗口数据 下载报关附件文件 触发发送不同状态的Email 更新绑定报关订单数据 tb-baoguanorderlist await AutoRunBaoguanOrder(); //仅用于测试重新下载附件 //await TestRedown(); //重试发送 await AutoSendMail(); rs.MemoData = UserDto; rs.OK(); _LogsAdd($"报关全局刷新请求{UserDto.Name} {UserDto.UserId}", "报关", rs); return rs; } /// /// 发送指定的文件给客户 /// /// /// public ReturnResult EmailSend(ApiFromDto Dto) { var rs = new ReturnResult(); var order = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Gid == Dto.Gid).ToOne(); if (order == null) { rs.Not("错误的请求"); return rs; } var _newfilelist = order.FileList.Where(w => w.Name.Contains(Dto.FileName)).ToList(); if (_newfilelist.Count == 0) { rs.Not(Dto.FileName + "文件不存在!"); return rs; } if (!order.ClientEmail.IsEmail()) { rs.Not("客户Email地址不正确!"); return rs; } if (_newfilelist.Count > 0) { var _newfile = _newfilelist[_newfilelist.Count - 1]; var _mailbody = @" " + _newfile.Name.Split('.')[0] + @"

尊敬的" + order.ClientName + @",您好:

请确认报关单草稿,并回复我们OK确认,请查看附件,谢谢!

提单号:" + order.ShipOrderNo + @"

" + order.CompName + @"

"; var _userlist = DbBus.Get(DbList.djyolddb).Select().LeftJoin((u, c) => u.USERID == c.AdminUser).Where((u, c) => c.CompId == order.CompId.ToString()).ToOne((u, c) => new { u.USERID, c.CompId, u.EMAIL1 }); var _sendmail = ""; if (_userlist != null) { _sendmail = _userlist.EMAIL1; var _mailhostconfig = DbBus.Get(DbList.djyolddb).Select().Where(w => w.UserId == _userlist.USERID).ToList(); } var sendmail = new MailSendDto { FileList = new List { _newfile }, DataKey = order.Gid.ToString() + "_" + order.UniqueNumber, SendEmail = _sendmail, Email = order.ClientEmail, MailBody = _mailbody, Title = _newfile.Name.Split('.')[0] }; if (_userlist != null) { var _mailconfig = DbBus.Get(DbList.djyolddb).Select().Where(w => w.UserId == _userlist.USERID).ToOne(); if (_mailconfig != null) { sendmail.SendMailConfig = new Ys.Core.Common.Email.SendServerConfigurationEntity { SmtpHost = _mailconfig.SmtpServer, SmtpPort = _mailconfig.SmtpPort, SenderAccount = _mailconfig.MailAccount, SenderPassword = _mailconfig.Password, IsSsl = _mailconfig.SmtpSSL }; sendmail.SendEmail = _mailconfig.MailAccount; } else { sendmail.MailBody = sendmail.MailBody.Replace("", "

因您的大简云邮箱配置错误无法直接发送Email给客户,错误原因: 未配置,请登录大简云->个人中心->个人信息进行配置


客户Email为: " + sendmail.Email + "

"); } } return _SendEmail(sendmail); } rs.OK(); return rs; } public const string 待发邮件列表 = "BaoguanEmailSend"; /// /// 自动根据阿里海关数据解出报关订单数据 /// /// public async Task> AutoRunBaoguanOrder() { var rs = new ReturnResult(); var topiclist = new List() { "DraftDecStatus", "DeclarationAttachments", "CusDecInfo" }; var dblist = await DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status < 100 && topiclist.Contains(w.topic)).OrderBy(w => w.Id).ToListAsync(); var orderlist = new List();//报关订单 var SendMailList = new List();//Email发送 var companylist = DbBus.Get(DbList.djyolddb).Select().Where(w => w.AliCompanyId > 0).ToList(); foreach (var item in dblist) { try { if (item.topic == "DraftDecStatus" || item.topic == "CusDecInfo" || item.topic == "DeclarationAttachments")//报关草稿状态 { var data = YsJson.JsonToObject(item.data); if (data != null) { var comp = companylist.Where(w => w.AliCompanyId == item.companyId).FirstOrDefault(); var compid = Guid.Empty; var compname = ""; if (comp != null) { compid = Guid.Parse(comp.CompId); compname = comp.CompName; } var order = new tb_BaoGuanOrderList { OrderType = "ali" , UniqueNumber = item.uniqueNumber , AlSActionGid = item.Gid , AliCompanyId = item.companyId , CompId = compid , CompName = compname , ShipOrderNo = data.BillNo , Topic = item.topic, stateCode = item.StateCode, stateName = item.StateName, ClientName = "" }; //获取最新客户联系方式 //绑定客户 仅在【提交到单一窗口】时触发一次 //其它时候不做此操作 以减少访问数据库的次数 //if (item.topic == "CusDecInfo" && data.StateCode == "22") //{ // _LogsAdd("海关报文解析" + order.UniqueNumber, "绑定客户", new { data }); // var linkinfo = DbBus.Get(DbList.djypublicedb).Select().Where(w => // w.AliCompanyId == order.AliCompanyId // && w.TradeName == order.TradeName // //&& w.ClientEmail.Length > 0 // ).OrderByDescending(w => w.Id).ToOne(); // if (linkinfo != null) // { // order.ClientName = linkinfo.ClientName; // order.ClientMain = linkinfo.ClientMain; // order.ClientEmail = linkinfo.ClientEmail; // _LogsAdd("海关报文解析" + order.UniqueNumber, "绑定客户", new { order }); // } //} if (data.StateCode == "13") {//海关查验时间 order.CheckTime = data.Date.ToTimestamp(); //创建Email发送委托 var _mailbody = @"海关查验"; SendMailList.Add(new MailSendDto { DataKey = item.uniqueNumber, MailBody = _mailbody, Title = "海关查验", Type = "13" }); } if (data.StateCode == "14") { //海关放行触发发送邮件 SendMailList.Add(new MailSendDto { Type = "14", DataKey = item.uniqueNumber, Title = "海关放行" }); } //item.topic == "CusDecInfo" && //20220301 海关报文改为状态11 海关入库 时发送,此时内容包括报关单号 if ((item.topic == "CusDecInfo" || data.StateCode == "11") && data.MessageContent.IsNotNull())//海关报文 { var jsonstr = YsJson.XmlToJson(data.MessageContent.Base64ToString()); if (jsonstr.IsNotNull()) { jsonstr = jsonstr.Replace("?", "").Replace("@", ""); _LogsAdd("海关报文解析" + order.UniqueNumber, "海关报文", new { order, jsonstr }); var cusdata = JsonSerializer.Deserialize(jsonstr); var customerdec = YsJson.DeserializeAnonymousType(cusdata.GetProperty("DecMessage").ToString(), new { DecSign = new AliBaoGuanCustomesDecSignDto(), DecHead = new AliBaoGuanCustomesDecHeadDto() }); if (customerdec != null) { //_LogsAdd("海关报文解析" + order.UniqueNumber, "海关报文", new { order, customerdec }); order.IEFlag = customerdec.DecHead.IEFlag.IsNull() ? "E" : customerdec.DecHead.IEFlag; order.DeclareCustoms = customerdec.DecHead.CustomMaster; order.CustomsMessage = jsonstr; order.TradeName = customerdec.DecHead.TradeName; //报关单号 //20220301 海关报文改为状态11 海关入库 时发送,此时内容包括报关单号 //order.CustomsNo = customerdec.DecHead.SeqNo; //如有海关入库时才解析报关单号 if (data.StateCode == "11") order.CustomsNo = customerdec.DecHead.EntryId; order.TrafName = customerdec.DecHead.TrafName; ////获取最新客户联系方式 ///改为如果ClientName有值 就不修改 if (!string.IsNullOrWhiteSpace(order.TradeName) && (order.ClientName == null || order.ClientName.Length == 0)) { var linkinfo = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.AliCompanyId == order.AliCompanyId && w.TradeName == order.TradeName && (w.ClientName != null && w.ClientName.Length > 0) //&& w.ClientEmail.Length > 0 ).OrderByDescending(w => w.Id).ToOne(); _LogsAdd("海关报文解析" + order.UniqueNumber, "绑定客户", new { linkinfo }); if (linkinfo != null) { order.ClientName = linkinfo.ClientName; order.ClientMain = linkinfo.ClientMain; order.ClientEmail = linkinfo.ClientEmail; } } } } } if (item.topic == "DeclarationAttachments") {//接收回执文件 var url = HttpHelp.FileDown(data.docUrl, "userdata/alibaoguanfile", item.uniqueNumber + "_" + data.docName).Result; var flist = order.FileList; var _newfile = new FileListDto { Name = data.docName, Url = url }; flist.Add(_newfile); order.FileList = flist; _LogsAdd("接收文件" + order.UniqueNumber, "报关file", order); } if (orderlist.Where(w => w.UniqueNumber == order.UniqueNumber).Count() > 0) {//如果已存在则更新 foreach (var o in orderlist) if (o.UniqueNumber == order.UniqueNumber) { o.ShipOrderNo = order.ShipOrderNo; o.stateCode = order.stateCode.IsNotNull() ? order.stateCode : o.stateCode; o.stateName = order.stateName.IsNotNull() ? order.stateName : o.stateName; o.IEFlag = order.IEFlag.IsNotNull() ? order.IEFlag : o.IEFlag; o.DeclareCustoms = order.DeclareCustoms.IsNotNull() ? order.DeclareCustoms : o.DeclareCustoms; o.CheckTime = order.CheckTime > 0 ? order.CheckTime : o.CheckTime; o.CustomsMessage = order.CustomsMessage.IsNotNull() ? order.CustomsMessage : o.CustomsMessage; o.TrafName = order.TrafName.IsNotNull() ? order.TrafName : o.TrafName; o.CustomsNo = order.CustomsNo.IsNotNull() ? order.CustomsNo : o.CustomsNo; o.TradeName = order.TradeName.IsNotNull() ? order.TradeName : o.TradeName; if (string.IsNullOrWhiteSpace(o.ClientName)) { //如果已绑定 则不做修改 //如未绑定 才判断是否记录绑定数据 o.ClientName = order.ClientName.IsNotNull() ? order.ClientName : o.ClientName; o.ClientMain = order.ClientMain.IsNotNull() ? order.ClientMain : o.ClientMain; o.ClientEmail = order.ClientEmail.IsNotNull() ? order.ClientEmail : o.ClientEmail; } if (order.FileList.Count > 0) { var flist = o.FileList; var namelist = flist.Select(w => w.Name).ToList(); List nlist = order.FileList.Where(w => !namelist.Contains(w.Name)).ToList(); flist.AddRange(nlist); o.FileList = flist; } break; } } else { orderlist.Add(order); } } } } catch (Exception ex) { } } //更新或插入 var alinumberlist = orderlist.Select(w => w.UniqueNumber).ToList(); var _shoporderlist = orderlist.Where(w => w.ShipOrderNo.IsNotNull()).Select(w => w.ShipOrderNo).ToList(); var datalist = DbBus.Get(DbList.djypublicedb).Select().Where(w => _shoporderlist.Contains(w.ShipOrderNo) || alinumberlist.Contains(w.UniqueNumber)).ToList(); var uplist = new List(); var newlist = new List(); // orderlist.ForEach(item => { foreach (var item in orderlist) { var order = datalist.Where(w => w.UniqueNumber == item.UniqueNumber || (w.UniqueNumber.Length == 0 && w.ShipOrderNo == item.ShipOrderNo && w.ShipOrderNo.Length > 0)).FirstOrDefault(); if (order == null) { item.Init(); newlist.Add(item); } else { order.UniqueNumber = item.UniqueNumber.IsNotNull() ? item.UniqueNumber : order.UniqueNumber; order.ShipOrderNo = item.ShipOrderNo.IsNotNull() ? item.ShipOrderNo : order.ShipOrderNo; order.stateCode = item.stateCode.IsNotNull() ? item.stateCode : order.stateCode; order.stateName = item.stateName.IsNotNull() ? item.stateName : order.stateName; order.IEFlag = item.IEFlag.IsNotNull() ? item.IEFlag : order.IEFlag; order.DeclareCustoms = item.DeclareCustoms.IsNotNull() ? item.DeclareCustoms : order.DeclareCustoms; order.CheckTime = item.CheckTime > 0 ? item.CheckTime : item.CheckTime; order.CustomsMessage = item.CustomsMessage.IsNotNull() ? item.CustomsMessage : order.CustomsMessage; order.CustomsNo = item.CustomsNo.IsNotNull() ? item.CustomsNo : order.CustomsNo; order.TradeName = item.TradeName.IsNotNull() ? item.TradeName : order.TradeName; order.TrafName = item.TrafName.IsNotNull() ? item.TrafName : order.TrafName; //联系信息在绑定过后不更新 if (item.ClientName.IsNotNull() && order.ClientName.IsNull())//order.ClientEmail.IsNull() && { order.ClientName = item.ClientName; order.ClientMain = item.ClientMain; order.ClientEmail = item.ClientEmail; _LogsAdd("自动绑定报关客户:" + order.UniqueNumber, "报关绑定", new { item, order }); } //order.ClientName = item.ClientName.IsNotNull() ? item.ClientName : order.ClientName; //order.ClientMain = item.ClientMain.IsNotNull() ? item.ClientMain : order.ClientMain; //order.ClientEmail = item.ClientEmail.IsNotNull() ? item.ClientEmail : order.ClientEmail; if (item.FileList.Count > 0) { var filist = order.FileList; filist.AddRange(item.FileList); order.FileList = filist; } if (item.CustomsMessage.IsNotNull()) {//如果原始单一报文发生改变则重新解析数据 order.ParseStatus = 1; } uplist.Add(order); } } // }); //事务提交数据 DbBus.Get(DbList.djypublicedb).Transaction(() => { if (uplist.Count > 0) { DbBus.Get(DbList.djypublicedb).Update().SetSource(uplist).ExecuteAffrows(); } if (newlist.Count > 0) { var bangdinglist = newlist.Where(w => w.ClientEmail.IsNotNull()).ToList(); var bandinggidlist = ""; bangdinglist.ForEach(item => { bandinggidlist += $",{item.UniqueNumber}"; }); _LogsAdd("新建时绑定:" + bandinggidlist, "报关绑定", bangdinglist); DbBus.Get(DbList.djypublicedb).Insert(newlist).ExecuteAffrows(); } //更新状态 var _gidlist = dblist.Select(w => w.Gid).ToList(); DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, 100).Where(w => _gidlist.Contains(w.Gid)).ExecuteAffrows(); }); //Email发送处理 if (sysOptionConfig.YsWebconfig.IsDev) { SendMailList = new List(); } if (SendMailList.Count > 0) { //创建Email发送委托 var keylist = SendMailList.GroupBy(w => w.DataKey).Select(w => w.Key).ToList(); var _getorder = DbBus.Get(DbList.djypublicedb).Select().Where(w => keylist.Contains(w.UniqueNumber)).ToList(); var baoguanhanggid = _getorder.GroupBy(w => w.CompId).Select(w => w.Key.Value.ToString()).ToList(); var _userlist = DbBus.Get(DbList.djyolddb).Select().LeftJoin((u, c) => u.USERID == c.AdminUser).Where((u, c) => baoguanhanggid.Contains(c.CompId)).ToList((u, c) => new { u.USERID, c.CompId, u.EMAIL1 }); var _useridlist = _userlist.Select(w => w.USERID).ToList(); var _mailhostconfig = DbBus.Get(DbList.djyolddb).Select().Where(w => _useridlist.Contains(w.UserId)).ToList(); foreach (var item in SendMailList) { var border = _getorder.Where(w => w.UniqueNumber == item.DataKey).FirstOrDefault(); //20220323 如果该绑定客户没有邮箱 则跳过 if (string.IsNullOrWhiteSpace(border.ClientEmail)) { continue; } if (border != null) {//获取接收Email if (item.Type == "13") { //查验Email完善处理 var Mailbody = @" 海关查验 " + border.ShipOrderNo + " " + border.CustomsNo + @"

尊敬的" + border.ClientName + @",您好:

你单位申报的报关单号,经审核现决定实施口岸检查,请联系港务等相关部门做好准备,并派员配合海关实施口岸检查。特此通知!

检查关区:" + border.DeclareCustoms + @"

报关单号:" + border.CustomsNo + @"

提单号:" + border.ShipOrderNo + @"

运输工具:" + border.TrafName + @"

" + border.CompName + @"

"; item.MailBody = Mailbody; item.Title = "海关查验" + border.ShipOrderNo; } if (item.Type == "14") { //加入Email发送队列 var _mailbody = @" 海关放行通知 " + border.ShipOrderNo + @"

尊敬的" + border.ClientName + @",您好:

您的提单号为" + border.ShipOrderNo + @"海关已放行,报关单及放行条请查看附件,谢谢!

" + border.CompName + @"

"; item.Title = "海关放行通知 " + border.ShipOrderNo; item.MailBody = _mailbody; var _flist = border.FileList.Where(w => w.Name.Contains("报关单") || w.Name.Contains("放行条")).ToList(); //20220309 逐个判断文件是否存在, //如不存在 select * from tb_BaoguanAliActionList where uniquenumber='6743-0-4923' and topic='DeclarationAttachments' //寻找这个文件的docname ,找到它对应的url 重新下载。 //foreach (var filedto in _flist) //{ // var retrycount = 0; // 重新下载文件(border, filedto.Name, ref retrycount); //} item.FileList = _flist; } item.Email = border.ClientEmail; var _sml = _userlist.Where(w => w.CompId == border.CompId.ToString()).FirstOrDefault(); if (_sml != null) { var _mailconfig = _mailhostconfig.Where(w => w.UserId == _sml.USERID).FirstOrDefault(); item.SendEmail = _sml.EMAIL1; if (_mailconfig != null) { item.SendMailConfig = new Ys.Core.Common.Email.SendServerConfigurationEntity { SmtpHost = _mailconfig.SmtpServer, SmtpPort = _mailconfig.SmtpPort, SenderAccount = _mailconfig.MailAccount, SenderPassword = _mailconfig.Password, IsSsl = _mailconfig.SmtpSSL }; item.SendEmail = _mailconfig.MailAccount; //20220317 如果此时没接收到附件 则将此项任务丢到redis的BaoguanEmailSend队列 if (item.Type == "14") { if (!item.文件包含报关单和放行条()) { item.border = border; item.SendTime = DateTime.Now.AddMinutes(2); DbRedis.LPush(待发邮件列表, YsJson.ToJson(item)); continue; } else { var cansend = true; foreach (var fileDto in item.FileList) { if (!File.Exists(fileDto.Url)) { item.border = border; item.SendTime = DateTime.Now.AddMinutes(1); DbRedis.LPush(待发邮件列表, YsJson.ToJson(item)); cansend = false; continue; } } if (!cansend) continue; } } } else { item.MailBody = item.MailBody.Replace("", "

因您的大简云邮箱配置错误无法直接发送Email给客户,错误原因: 未配置,请登录大简云->个人中心->个人信息进行配置


客户Email为: " + item.Email + "

"); } } } else { item.Status = 0; } if (item.Status == 1) { BackgroundJob.Enqueue(() => _SendEmail(item)); } } } rs.OK("成功"); return rs; } /// /// 仅用于测试发送邮件时重新下载文件的测试 /// public async Task> TestRedown() { var rs = new ReturnResult(); var topiclist = new List() { "DraftDecStatus", "DeclarationAttachments", "CusDecInfo" }; var dblist = await DbBus.Get(DbList.djypublicedb).Select() .Where(w => w.uniqueNumber == "6637-0-28698" //&& (w.topic== "DeclarationAttachments"||w.StateCode=="14") && w.StateCode == "22" ).OrderBy(w => w.Id).ToListAsync(); var orderlist = new List();//报关订单 var SendMailList = new List();//Email发送 var companylist = DbBus.Get(DbList.djyolddb).Select().Where(w => w.AliCompanyId > 0).ToList(); foreach (var item in dblist) { try { if (item.topic == "DraftDecStatus" || item.topic == "CusDecInfo" || item.topic == "DeclarationAttachments")//报关草稿状态 { var data = YsJson.JsonToObject(item.data); if (data != null) { var comp = companylist.Where(w => w.AliCompanyId == item.companyId).FirstOrDefault(); var compid = Guid.Empty; var compname = ""; if (comp != null) { compid = Guid.Parse(comp.CompId); compname = comp.CompName; } var order = new tb_BaoGuanOrderList { OrderType = "ali" , UniqueNumber = item.uniqueNumber , AlSActionGid = item.Gid , AliCompanyId = item.companyId , CompId = compid , CompName = compname , ShipOrderNo = data.BillNo , Topic = item.topic, stateCode = item.StateCode, stateName = item.StateName, ClientName = "" }; //获取最新客户联系方式 //绑定客户 仅在【提交到单一窗口】时触发一次 //其它时候不做此操作 以减少访问数据库的次数 if (order.TradeName.IsNotNull() && data.StateCode == "22") { } if (data.StateCode == "13") {//海关查验时间 order.CheckTime = data.Date.ToTimestamp(); //创建Email发送委托 var _mailbody = @"海关查验"; SendMailList.Add(new MailSendDto { DataKey = item.uniqueNumber, MailBody = _mailbody, Title = "海关查验", Type = "13", SendTime = DateTime.Now }); } if (data.StateCode == "14") { //海关放行触发发送邮件 SendMailList.Add(new MailSendDto { Type = "14", DataKey = item.uniqueNumber, Title = "海关放行", SendTime = DateTime.Now.AddMinutes(2) }); } //item.topic == "CusDecInfo" && //20220301 海关报文改为状态11 海关入库 时发送,此时内容包括报关单号 if ((item.topic == "CusDecInfo" || data.StateCode == "11") && data.MessageContent.IsNotNull())//海关报文 { var jsonstr = YsJson.XmlToJson(data.MessageContent.Base64ToString()); if (jsonstr.IsNotNull()) { jsonstr = jsonstr.Replace("?", "").Replace("@", ""); _LogsAdd("海关报文解析" + order.UniqueNumber, "海关报文", new { order, jsonstr }); var cusdata = JsonSerializer.Deserialize(jsonstr); var customerdec = YsJson.DeserializeAnonymousType(cusdata.GetProperty("DecMessage").ToString(), new { DecSign = new AliBaoGuanCustomesDecSignDto(), DecHead = new AliBaoGuanCustomesDecHeadDto() }); if (customerdec != null) { //_LogsAdd("海关报文解析" + order.UniqueNumber, "海关报文", new { order, customerdec }); order.IEFlag = customerdec.DecHead.IEFlag.IsNull() ? "E" : customerdec.DecHead.IEFlag; order.DeclareCustoms = customerdec.DecHead.CustomMaster; order.CustomsMessage = jsonstr; order.TradeName = customerdec.DecHead.TradeName; //报关单号 //20220301 海关报文改为状态11 海关入库 时发送,此时内容包括报关单号 //order.CustomsNo = customerdec.DecHead.SeqNo; //如有海关入库时才解析报关单号 if (data.StateCode == "11") order.CustomsNo = customerdec.DecHead.EntryId; order.TrafName = customerdec.DecHead.TrafName; ////获取最新客户联系方式 if (!string.IsNullOrWhiteSpace(order.TradeName) && (order.ClientName == null || order.ClientName.Length == 0)) { var linkinfo = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.AliCompanyId == order.AliCompanyId && w.TradeName == order.TradeName && (w.ClientName != null && w.ClientName.Length > 0) //&& w.ClientEmail.Length > 0 ).OrderByDescending(w => w.Id).ToOne(); _LogsAdd("海关报文解析" + order.UniqueNumber, "绑定客户", new { linkinfo }); if (linkinfo != null) { order.ClientName = linkinfo.ClientName; order.ClientMain = linkinfo.ClientMain; order.ClientEmail = linkinfo.ClientEmail; } } } } } //if (item.topic == "DeclarationAttachments") //{//接收回执文件 // var url = HttpHelp.FileDown(data.docUrl, "userdata/alibaoguanfile", item.uniqueNumber + "_" + data.docName).Result; // var flist = order.FileList; // var _newfile = new FileListDto { Name = data.docName, Url = url }; // flist.Add(_newfile); // order.FileList = flist; // _LogsAdd("接收文件" + order.UniqueNumber, "报关file", order); //} if (orderlist.Where(w => w.UniqueNumber == order.UniqueNumber).Count() > 0) {//如果已存在则更新 foreach (var o in orderlist) if (o.UniqueNumber == order.UniqueNumber) { o.ShipOrderNo = order.ShipOrderNo; o.stateCode = order.stateCode.IsNotNull() ? order.stateCode : o.stateCode; o.stateName = order.stateName.IsNotNull() ? order.stateName : o.stateName; o.IEFlag = order.IEFlag.IsNotNull() ? order.IEFlag : o.IEFlag; o.DeclareCustoms = order.DeclareCustoms.IsNotNull() ? order.DeclareCustoms : o.DeclareCustoms; o.CheckTime = order.CheckTime > 0 ? order.CheckTime : o.CheckTime; o.CustomsMessage = order.CustomsMessage.IsNotNull() ? order.CustomsMessage : o.CustomsMessage; o.TrafName = order.TrafName.IsNotNull() ? order.TrafName : o.TrafName; o.CustomsNo = order.CustomsNo.IsNotNull() ? order.CustomsNo : o.CustomsNo; o.TradeName = order.TradeName.IsNotNull() ? order.TradeName : o.TradeName; o.ClientName = order.ClientName.IsNotNull() ? order.ClientName : o.ClientName; o.ClientMain = order.ClientMain.IsNotNull() ? order.ClientMain : o.ClientMain; o.ClientEmail = order.ClientEmail.IsNotNull() ? order.ClientEmail : o.ClientEmail; if (order.FileList.Count > 0) { var flist = o.FileList; var namelist = flist.Select(w => w.Name).ToList(); List nlist = order.FileList.Where(w => !namelist.Contains(w.Name)).ToList(); flist.AddRange(nlist); o.FileList = flist; } break; } } else { orderlist.Add(order); } } } } catch (Exception ex) { } } //更新或插入 var alinumberlist = orderlist.Select(w => w.UniqueNumber).ToList(); var _shoporderlist = orderlist.Where(w => w.ShipOrderNo.IsNotNull()).Select(w => w.ShipOrderNo).ToList(); var datalist = DbBus.Get(DbList.djypublicedb).Select().Where(w => _shoporderlist.Contains(w.ShipOrderNo) || alinumberlist.Contains(w.UniqueNumber)).ToList(); var uplist = new List(); var newlist = new List(); // orderlist.ForEach(item => { foreach (var item in orderlist) { var order = datalist.Where(w => w.UniqueNumber == item.UniqueNumber || (w.UniqueNumber.Length == 0 && w.ShipOrderNo == item.ShipOrderNo && w.ShipOrderNo.Length > 0)).FirstOrDefault(); if (order == null) { item.Init(); newlist.Add(item); } else { order.CompId = item.CompId; order.CompName = item.CompName; order.UniqueNumber = item.UniqueNumber.IsNotNull() ? item.UniqueNumber : order.UniqueNumber; order.ShipOrderNo = item.ShipOrderNo.IsNotNull() ? item.ShipOrderNo : order.ShipOrderNo; order.stateCode = item.stateCode.IsNotNull() ? item.stateCode : order.stateCode; order.stateName = item.stateName.IsNotNull() ? item.stateName : order.stateName; order.IEFlag = item.IEFlag.IsNotNull() ? item.IEFlag : order.IEFlag; order.DeclareCustoms = item.DeclareCustoms.IsNotNull() ? item.DeclareCustoms : order.DeclareCustoms; order.CheckTime = item.CheckTime > 0 ? item.CheckTime : item.CheckTime; order.CustomsMessage = item.CustomsMessage.IsNotNull() ? item.CustomsMessage : order.CustomsMessage; order.CustomsNo = item.CustomsNo.IsNotNull() ? item.CustomsNo : order.CustomsNo; order.TradeName = item.TradeName.IsNotNull() ? item.TradeName : order.TradeName; order.TrafName = item.TrafName.IsNotNull() ? item.TrafName : order.TrafName; //联系信息在绑定过后不更新 if (item.ClientName.IsNotNull() && order.ClientName.IsNull())//order.ClientEmail.IsNull() && { order.ClientName = item.ClientName; order.ClientMain = item.ClientMain; order.ClientEmail = item.ClientEmail; _LogsAdd("自动绑定报关客户:" + order.UniqueNumber, "报关绑定", new { item, order }); } if (item.FileList.Count > 0) { var filist = order.FileList; filist.AddRange(item.FileList); order.FileList = filist; } if (item.CustomsMessage.IsNotNull()) {//如果原始单一报文发生改变则重新解析数据 order.ParseStatus = 1; } uplist.Add(order); } } // }); //事务提交数据 DbBus.Get(DbList.djypublicedb).Transaction(() => { if (uplist.Count > 0) { DbBus.Get(DbList.djypublicedb).Update().SetSource(uplist).ExecuteAffrows(); } if (newlist.Count > 0) { var bangdinglist = newlist.Where(w => w.ClientEmail.IsNotNull()).ToList(); var bandinggidlist = ""; bangdinglist.ForEach(item => { bandinggidlist += $",{item.UniqueNumber}"; }); _LogsAdd("新建时绑定:" + bandinggidlist, "报关绑定", bangdinglist); DbBus.Get(DbList.djypublicedb).Insert(newlist).ExecuteAffrows(); } //更新状态 var _gidlist = dblist.Select(w => w.Gid).ToList(); DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, 100).Where(w => _gidlist.Contains(w.Gid)).ExecuteAffrows(); }); //Email发送处理 //if (sysOptionConfig.YsWebconfig.IsDev) //{ // SendMailList = new List(); //} if (SendMailList.Count > 0) { //创建Email发送委托 var keylist = SendMailList.GroupBy(w => w.DataKey).Select(w => w.Key).ToList(); var _getorder = DbBus.Get(DbList.djypublicedb).Select().Where(w => keylist.Contains(w.UniqueNumber)).ToList(); var baoguanhanggid = _getorder.GroupBy(w => w.CompId).Select(w => w.Key.Value.ToString()).ToList(); var _userlist = DbBus.Get(DbList.djyolddb).Select().LeftJoin((u, c) => u.USERID == c.AdminUser).Where((u, c) => baoguanhanggid.Contains(c.CompId)).ToList((u, c) => new { u.USERID, c.CompId, u.EMAIL1 }); var _useridlist = _userlist.Select(w => w.USERID).ToList(); var _mailhostconfig = DbBus.Get(DbList.djyolddb).Select().Where(w => _useridlist.Contains(w.UserId)).ToList(); foreach (var item in SendMailList) { var border = _getorder.Where(w => w.UniqueNumber == item.DataKey).FirstOrDefault(); if (border != null) {//获取接收Email if (item.Type == "13") { //查验Email完善处理 var Mailbody = @" 海关查验 " + border.ShipOrderNo + " " + border.CustomsNo + @"

尊敬的" + border.ClientName + @",您好:

你单位申报的报关单号,经审核现决定实施口岸检查,请联系港务等相关部门做好准备,并派员配合海关实施口岸检查。特此通知!

检查关区:" + border.DeclareCustoms + @"

报关单号:" + border.CustomsNo + @"

提单号:" + border.ShipOrderNo + @"

运输工具:" + border.TrafName + @"

" + border.CompName + @"

"; item.MailBody = Mailbody; item.Title = "海关查验" + border.ShipOrderNo; } if (item.Type == "14") { //加入Email发送队列 var _mailbody = @" 海关放行通知 " + border.ShipOrderNo + @"

尊敬的" + border.ClientName + @",您好:

您的提单号为" + border.ShipOrderNo + @"海关已放行,报关单及放行条请查看附件,谢谢!

" + border.CompName + @"

"; item.Title = "海关放行通知 " + border.ShipOrderNo; item.MailBody = _mailbody; var _flist = border.FileList.Where(w => w.Name.Contains("报关单") || w.Name.Contains("放行条")).ToList(); ////20220309 逐个判断文件是否存在, ////如不存在 select * from tb_BaoguanAliActionList where uniquenumber='6743-0-4923' and topic='DeclarationAttachments' ////寻找这个文件的docname ,找到它对应的url 重新下载。 //foreach (var filedto in _flist) //{ // var retrycount = 0; // 重新下载文件(border, filedto.Name, ref retrycount); //} item.FileList = _flist; } item.Email = border.ClientEmail; var _sml = _userlist.Where(w => w.CompId == border.CompId.ToString()).FirstOrDefault(); if (_sml != null) { var _mailconfig = _mailhostconfig.Where(w => w.UserId == _sml.USERID).FirstOrDefault(); item.SendEmail = _sml.EMAIL1; if (_mailconfig != null) { item.SendMailConfig = new Ys.Core.Common.Email.SendServerConfigurationEntity { SmtpHost = _mailconfig.SmtpServer, SmtpPort = _mailconfig.SmtpPort, SenderAccount = _mailconfig.MailAccount, SenderPassword = _mailconfig.Password, IsSsl = _mailconfig.SmtpSSL }; item.SendEmail = _mailconfig.MailAccount; //20220317 如果此时没接收到附件 则将此项任务丢到redis的BaoguanEmailSend队列 if (item.Type == "14") { //用于测试 if (item.文件包含报关单和放行条()) { item.border = border; item.SendTime = DateTime.Now.AddMinutes(1); DbRedis.LPush(待发邮件列表, YsJson.ToJson(item)); continue; } else { var cansend = true; foreach (var fileDto in item.FileList) { if (!File.Exists(fileDto.Url)) { item.border = border; item.SendTime = DateTime.Now.AddMinutes(1); DbRedis.LPush(待发邮件列表, YsJson.ToJson(item)); cansend = false; continue; } } if (!cansend) continue; } } } else { item.MailBody = item.MailBody.Replace("", "

因您的大简云邮箱配置错误无法直接发送Email给客户,错误原因: 未配置,请登录大简云->个人中心->个人信息进行配置


客户Email为: " + item.Email + "

"); } } } else { item.Status = 0; } if (item.Status == 1) { //BackgroundJob.Enqueue(() => _SendEmail(item)); } } } rs.OK("成功"); return rs; } /// /// 20220309 逐个判断文件是否存在, /// 如不存在 select * from tb_BaoguanAliActionList where uniquenumber='6743-0-4923' and topic='DeclarationAttachments' /// 寻找这个文件的docname ,找到它对应的url 重新下载。 /// /// /// /// private void 重新下载文件(tb_BaoGuanOrderList baoguanorder, string docname, ref int retrycount) { //只允许递归2次 if (retrycount >= 2) return; retrycount++; try { //判断文件是否存在 foreach (var fileDto in baoguanorder.FileList) { if (!File.Exists(fileDto.Url)) //if (!File.Exists("userdata/alibaoguanfile/10000288-0-7339_报关单_QDWE251107.pdf")) //10000288-0-7339_报关单_QDWE251107.pdf { var _getorderbaoguan = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.uniqueNumber == baoguanorder.UniqueNumber && w.topic == "DeclarationAttachments" && w.data.IndexOf(fileDto.Name) > 0).ToList(); var AlibaoguanDoc = _getorderbaoguan[0]; var data = YsJson.JsonToObject(AlibaoguanDoc.data); _LogsAdd("重新下载" + baoguanorder.UniqueNumber, "报关file", new { fileDto.Name, data.docUrl }); //重新下载 HttpHelp.FileDown(data.docUrl, "userdata/alibaoguanfile", fileDto.Name); Thread.Sleep(500); } else { _LogsAdd("文件已存在" + baoguanorder.UniqueNumber, "报关file", new { fileDto.Name }); retrycount = 3; return; } } 重新下载文件(baoguanorder, docname, ref retrycount); } catch (Exception e) { _LogsAdd("重新下载error:" + baoguanorder.UniqueNumber, "报关file", new { e.Message }); } } public async Task> AutoSendMail() { var rs = new ReturnResult(); //从redis中获得数据 var 列表数量 = DbRedis.LLen(待发邮件列表); if (列表数量 == 0) { rs.OK("成功"); return rs; } else { for (var _i = 0; _i < 列表数量; _i++) { var str = DbRedis.RPop(待发邮件列表); MailSendDto Sendmail = YsJson.JsonToObject(str); if (Sendmail.SendTime > DateTime.Now) { DbRedis.LPush(待发邮件列表, YsJson.ToJson(Sendmail)); } else { if (!Sendmail.文件包含报关单和放行条()) { tb_BaoGuanOrderList border = DbBus.Get(DbList.djypublicedb).Select().Where(x => x.Gid == Sendmail.border.Gid).ToOne(); if (!Sendmail.文件包含报关单和放行条()) { //推迟2分钟 Sendmail.SendTime = DateTime.Now.AddMinutes(2); DbRedis.LPush(待发邮件列表, YsJson.ToJson(Sendmail)); continue; } } var cansend = true; foreach (var fileDto in Sendmail.FileList) { if (!File.Exists(fileDto.Url)) { //推迟2分钟 Sendmail.SendTime = DateTime.Now.AddMinutes(2); DbRedis.LPush(待发邮件列表, YsJson.ToJson(Sendmail)); cansend = false; continue; } } if (!cansend) continue; BackgroundJob.Enqueue(() => _SendEmail(Sendmail)); } } } rs.OK("成功"); return rs; } /// /// Email发送 /// /// public ReturnResult _SendEmail(MailSendDto sendDto) { var rs = new ReturnResult(); //创建发送委托任务 var sendflist = new List(); sendDto.FileList.ForEach(im => { sendflist.Add(new Ys.Core.Common.Email.MailFile { FileName = im.Name, MailFileType = "application/pdf", MailFileSubType = "pdf", MailFilePath = im.Url }); }); if (sendDto.Email.IsNull()) { _LogsAdd("报关Email空" + sendDto.Title + sendDto.DataKey, "报关Email空", sendDto); rs.Not("Email 未设置"); return rs; } //发送 var mlist = sendDto.Email.Split(',').ToList(); var send = DjyTools.EmailSendOnLogs(mlist, sendDto.Title, sendDto.MailBody, sendDto.SendEmail, sendDto.Title + sendDto.DataKey, sendflist, sendDto.SendMailConfig); if (send.ResultStatus) { rs.OK(); } if (sendDto.SendMailConfig != null && !send.ResultStatus && mlist.Where(w => w == sendDto.SendMailConfig.SenderAccount).Count() == 0) {//通过自有邮件配置发送失败 则将邮件发送一份给配置客户 var _sendmail = YsJson.JsonToObject(YsJson.ToJson(sendDto)); _sendmail.SendMailConfig = null; _sendmail.Email = sendDto.SendMailConfig.SenderAccount; _sendmail.MailBody = _sendmail.MailBody.Replace("", "

因您的大简云邮箱配置错误无法直接发送Email给客户,错误原因: " + send.ResultInformation + ",请登录大简云->个人中心->个人信息进行配置


客户Email为: " + sendDto.Email + "

"); var _mlist = _sendmail.Email.Split(',').ToList(); _sendmail.SendEmail = null; var rsend = DjyTools.EmailSendOnLogs(_mlist, _sendmail.Title, _sendmail.MailBody, _sendmail.SendEmail, _sendmail.Title + _sendmail.DataKey, sendflist); if (rsend.ResultStatus) { rs.OK(); } else { rs.Not(rsend.ResultInformation); } } return rs; } /// /// 1 生成阿里云报关跳转地址 同时建立关联用户流程或联合登录到一达通 /// /// public async Task> AliyunBaoguanToken(User Dto) { var rs = new ReturnResult(); var user = DbBus.Get(DbList.djyolddb).Select().Where(w => w.GID == Dto.GID).ToOne(); if (user == null) { rs.Not("请求错误:账户不存在!"); return rs; } if (user.CompId.IsNull()) { rs.Not("您所在企业未认证,请先做企业认证!"); return rs; } var company = DbBus.Get(DbList.djyolddb).Select().Where(w => w.CompId == user.CompId).ToOne(); if (company == null) { rs.Not("没有找到所属企业主体!"); return rs; } if (company.AuditStatus.ToLower() != "Success".ToLower()) { rs.Not("企业主体未认证!"); return rs; } if (company.CustomsCode.IsNull()) { rs.Not("海关号未完善,请先完善企业主体海关号!"); return rs; } if (company.AdminUser != user.GID) { var ccount = DbBus.Get(DbList.djyolddb).Select().Where(w => w.CompId == company.CompId && w.BaoguanAliId != null).Count(); if (ccount == 0) { rs.Not("企业账户第一次使用,请使用企业管理员账户!"); return rs; } } var userinfo = DbBus.Get(DbList.djyolddb).Select().Where(w => w.USERID == user.GID).ToOne(); if (userinfo.EMAIL1.IsNull() || userinfo.MOBILE.IsNull()) { if (userinfo.EMAIL1.IsNull()) { rs.Not("账户Email未维护请先维护!"); } if (userinfo.MOBILE.IsNull()) { rs.Not("账户手机号未维护请先维护!"); } return rs; } var aliyunkey = DjyTools.GetConfigKey("bg_aliyunseckey"); var jwtcreate = new TokenProvider(); jwtcreate.Jwtoptions.SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(aliyunkey)), SecurityAlgorithms.HmacSha512); var claimlist = new List() { new Claim("entName",company.CompName),//企业名称 new Claim("cusCode",company.CustomsCode),//10位海关登记号 new Claim("scCode",company.TaxCode),//18位企业信用代码 new Claim("userName",user.CODENAME),//该账户用户名 new Claim("userId",user.GID),//该账户大简云ID new Claim("email",userinfo.EMAIL1),//Email new Claim("mobile",userinfo.MOBILE)//手机号 }; var rstoken = await jwtcreate.CreateToken(user.GID, claimlist); _LogsAdd("报关跳转登录注册", "baoguan", new { claimlist, rstoken }); if (!rstoken.Status) { rs.Not("token生成失败"); return rs; } rs.Data = rstoken.Token; var url = @"https://onetouch-partner.alibaba.com/ptnProvider/customs/thirdParty.htm?token=" + rs.Data + "&platform=DaJianYun&targetUrl=%2F%2Fonetouch-partner.alibaba.com%2FptnProvider%2Fluyou%2Fcustoms%2Fexternal%2Fcustomer%2Flist.htm%3Fplatform%3DDaJianYun"; rs.MemoData = new { url, key = aliyunkey }; rs.OK(); return rs; } /// /// 用户离职 /// /// public async Task> AliUserQuit(string UserId) { var rs = new ReturnResult(); var aliURl = @"https://onetouch-partner.alibaba.com/ptnProvider/customs/thirdParty/quitJob.json"; var user = DbBus.Get(DbList.djyolddb).Select().Where(w => w.GID == UserId).ToOne(); if (user == null) { rs.Not("没有此账户!"); return rs; } var userinfo = DbBus.Get(DbList.djyolddb).Select().Where(w => w.USERID == user.GID).ToOne(); var aliyunkey = DjyTools.GetConfigKey("bg_aliyunseckey"); var jwtcreate = new TokenProvider(); jwtcreate.Jwtoptions.SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(aliyunkey)), SecurityAlgorithms.HmacSha512); var claimlist = new List() { new Claim("openUserId",user.GID),//大简云账户Id new Claim("openUserEmail",userinfo.EMAIL1),//大简云账户email new Claim("aliId",user.BaoguanAliId)// 阿里平台用户id }; var rstoken = await jwtcreate.CreateToken(user.GID, claimlist); await DjyTools.PostOnLogs(new { token = rstoken.Token }, aliURl, "alliuser"); DbBus.Get(DbList.djyolddb).Update().Set(w => w.BaoguanAliId, null).Where(w => w.GID == user.GID).ExecuteAffrows(); rs.OK(); return rs; } /// /// 阿里报关消息查询接口 接收了就标记自动消费掉 /// /// public async Task> AliBaoguanrationlist() { var rs = new ReturnResult(); var urlPath = @"param2/1/ali.intl.onetouch/customs.saas.declaration.message.list.get/855313"; var pdata = new Dictionary(); pdata.Add("appKey", "855313"); var sinkey = Getalisign(urlPath, pdata, _aliappsecretKey); var gethtml = await DjyTools.PostOnLogs(new { appKey = "855313", _aop_signature = sinkey }, _aliapihost + urlPath, "阿里报关消息查询", YsPsotType.Form); var jsone = JsonSerializer.Deserialize(gethtml); var jsondata = YsJson.DeserializeAnonymousType(jsone.GetProperty("result").ToString(), new { isSuccess = false, resultMsg = "", resultCode = "", traceId = "", data = "" }); if (jsondata.data != null) { var data = Encoding.UTF8.GetString(Convert.FromBase64String(jsondata.data)); var datalist = JsonSerializer.Deserialize>(data); var idlist = datalist.Select(w => w.msgId).ToList(); var oldlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => idlist.Contains(w.msgId)).ToList(w => w.msgId); var newlist = datalist.Where(w => !oldlist.Contains(w.msgId)).ToList(); foreach (var item in newlist) { if (item.data.IsNotNull()) { item.data = Encoding.UTF8.GetString(Convert.FromBase64String(item.data)); //尝试解析 var datainfo = YsJson.JsonToObject(item.data); if (datainfo != null) { item.AliTime = datainfo.Date.IsDateTime() ? datainfo.Date.ToTimestamp() : 0; item.StateCode = datainfo.StateCode.IsNotNull() ? datainfo.StateCode : ""; item.StateName = datainfo.StateName.IsNotNull() ? datainfo.StateName : ""; } } item.Init(); } if (newlist.Count > 0) { var dbcount = DbBus.Get(DbList.djypublicedb).Insert(newlist).ExecuteAffrows(); if (dbcount > 0) {//数据保存成功标记消费掉 var msidlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status == 1).ToList(w => w.msgId); await AliBaodanActionConsume(msidlist); //提交到阿里更新消费掉 标记status=2 await DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, 2).Where(w => msidlist.Contains(w.msgId)).ExecuteAffrowsAsync(); } } rs.Data = datalist.Count().ToString(); } rs.OK(); return rs; } /// /// 阿里报关消息消费修改状态 /// /// /// public async Task> AliBaodanActionConsume(List MsIdList) { var rs = new ReturnResult(); if (MsIdList == null || MsIdList.Count == 0) { rs.Not("消息id未指定!"); } var urlPath = @"param2/1/ali.intl.onetouch/customs.saas.declaration.message.list.consume/855313"; var pdata = new Dictionary(); pdata.Add("appKey", "855313");//阿里分配的固定appkeyid var idstr = ""; MsIdList.ForEach(item => { if (idstr.IsNull()) { idstr += ","; } idstr += "\"" + item + "\""; }); var pidlist = "[" + idstr + "]"; pdata.Add("msgIdList", pidlist); var sinkey = Getalisign(urlPath, pdata, _aliappsecretKey); var gethtml = await DjyTools.PostOnLogs(new { appKey = "855313", msgIdList = pidlist, _aop_signature = sinkey }, _aliapihost + urlPath, "消费阿里报关消息", YsPsotType.Form); rs.Data = DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, 100).Where(w => MsIdList.Contains(w.msgId)).ExecuteAffrows(); rs.OK(); return rs; } /// /// 计算阿里签名 /// /// /// /// /// private string Getalisign(string urlPath, Dictionary paramDic, string AppsecretKey) { byte[] signatureKey = Encoding.UTF8.GetBytes(AppsecretKey); //此处固定⽤⾃⼰ 的签名密钥 List list = new List(); foreach (KeyValuePair kv in paramDic) { list.Add(kv.Key + kv.Value); } list.Sort(); string tmp = urlPath; foreach (string kvstr in list) { tmp = tmp + kvstr; } //HMAC-SHA1 HMACSHA1 hmacsha1 = new HMACSHA1(signatureKey); hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(tmp)); /*hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(urlPath)); foreach (string kvstr in list) { hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(kvstr)); }*/ byte[] hash = hmacsha1.Hash; //TO HEX return BitConverter.ToString(hash).Replace("-", string.Empty).ToUpper(); } #endregion #endregion /// /// 运行杂项 /// /// public ReturnResult Run() { //批量更新解析发货人 var rs = new ReturnResult(); try { var getlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => (w.TradeName.Length == 0 || w.TradeName == null) && w.CustomsMessage.Length > 0).ToList(); getlist.ForEach(item => { var cusdata = JsonSerializer.Deserialize(item.CustomsMessage); var customerdec = YsJson.DeserializeAnonymousType(cusdata.GetProperty("DecMessage").ToString(), new { DecSign = new AliBaoGuanCustomesDecSignDto(), DecHead = new AliBaoGuanCustomesDecHeadDto() }); item.TradeName = customerdec.DecHead.TradeName; }); DbBus.Get(DbList.djypublicedb).Update().SetSource(getlist).UpdateColumns(w => w.TradeName).ExecuteAffrows(); } catch (Exception ex) { } rs.OK(); return rs; } /// ///报关单详情数据数据解析 自动解析 1 将报关单的箱数据和商品明细数据解析出来 2 将报关订阅的公司数据生成订阅消息数据到baoguanmsg表 /// /// public ReturnResult RunOrderPsrse() { var rs = new ReturnResult(); var codelist = new List { "14", "15" };//,"22" var datalist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.ParseStatus < 100 && w.CustomsMessage != null && w.CustomsMessage.Length > 0 && codelist.Contains(w.stateCode)).ToList(); var contlist = new List(); var decList = new List(); foreach (var item in datalist) { if (item.CustomsMessage.IsNull()) { continue; } var cusdata = JsonSerializer.Deserialize(item.CustomsMessage); var customerdec = YsJson.DeserializeAnonymousType(cusdata.GetProperty("DecMessage").ToString(), new { DecSign = new AliBaoGuanCustomesDecSignDto(), DecContainers = new JsonElement(), DecLists = new JsonElement(), DecHead = new AliBaoGuanCustomesDecHeadDto() }); var ncontlist = new List(); if (customerdec.DecContainers.ToString().IsNotNull()) { //箱型数据 if (customerdec.DecContainers.GetProperty("Container").ValueKind == JsonValueKind.Object) { ncontlist.Add(YsJson.JsonToObject(customerdec.DecContainers.GetProperty("Container").ToString())); } else if (customerdec.DecContainers.GetProperty("Container").ValueKind == JsonValueKind.Array) { ncontlist.AddRange(YsJson.JsonToObject>(customerdec.DecContainers.GetProperty("Container").ToString())); } } ncontlist.ForEach(nc => { nc.BaoguanOrderGid = item.Gid; nc.Init(); }); contlist.AddRange(ncontlist); var ndeclist = new List(); if (customerdec.DecLists.ToString().IsNotNull()) { //商品数据解析 var jsonstr = customerdec.DecLists.GetProperty("DecList").ToString(); if (customerdec.DecLists.GetProperty("DecList").ValueKind == JsonValueKind.Object) { ndeclist.Add(JsonSerializer.Deserialize(jsonstr)); } else if (customerdec.DecLists.GetProperty("DecList").ValueKind == JsonValueKind.Array) { ndeclist.AddRange(YsJson.JsonToObject>(jsonstr)); } } ndeclist.ForEach(decitem => { var e = new tb_BaoguanDecList { BaoguanOrderGid = item.Gid , GNo = decitem.GNo , OriginCountry = decitem.OriginCountry , OriginCountryName = _GetDcitValue("原产地区", decitem.OriginCountry)// , CodeTS = decitem.CodeTS , GModel = decitem.GModel , GName = decitem.GName , FirstQty = decitem.FirstQty.IsDecimal() ? Math.Round(decimal.Parse(decitem.FirstQty), 4) : 0 , FirstUnit = decitem.FirstUnit , FirstUnitName = _GetDcitValue("计量单位", decitem.FirstUnit)// , DutyMode = decitem.DutyMode , DutyModeName = _GetDcitValue("征减免税方式", decitem.DutyMode)// , DestinationCountry = decitem.DestinationCountry , DestinationCountryName = _GetDcitValue("原产地区", decitem.DestinationCountry)// , DistrictCode = decitem.DistrictCode , DistrictCodeName = _GetDcitValue("国内地区", decitem.DistrictCode)// , TradeCurr = decitem.TradeCurr , TradeCurrName = _GetDcitValue("货币代码", decitem.TradeCurr)// , GQty = decitem.GQty.IsDecimal() ? Math.Round(decimal.Parse(decitem.GQty), 4) : 0 , DeclTotal = decitem.DeclTotal.IsDecimal() ? Math.Round(decimal.Parse(decitem.DeclTotal), 4) : 0 , GUnit = decitem.GUnit , GUnitName = _GetDcitValue("计量单位", decitem.GUnit)// , DeclPrice = decitem.DeclPrice.IsDecimal() ? Math.Round(decimal.Parse(decitem.DeclPrice), 4) : 0 , }; e.Init(); decList.Add(e); }); } //绑定箱柜和订单数据关系 contlist.ForEach(cnt => { var goidlist = cnt.GoodsNo.Split(',').ToList(); foreach (var item in goidlist) { foreach (var dec in decList.Where(w => w.BaoguanOrderGid == cnt.BaoguanOrderGid)) { if (dec.GNo == item) { dec.ContainerGid = cnt.Gid; break; } } } cnt.Init(); }); decList.ForEach(cnt => { cnt.Init(); }); var idlist_cnt = contlist.Select(w => w.BaoguanOrderGid).ToList(); var idlist_dec = decList.Select(w => w.BaoguanOrderGid).ToList(); var orderidlist = new List(); orderidlist.AddRange(idlist_cnt); orderidlist.AddRange(idlist_dec); DbBus.Get(DbList.djypublicedb).Transaction(() => { //删除历史 DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, -1).Where(w => idlist_cnt.Contains(w.BaoguanOrderGid)).ExecuteAffrows(); DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, -1).Where(w => idlist_dec.Contains(w.BaoguanOrderGid)).ExecuteAffrows(); DbBus.Get(DbList.djypublicedb).Insert(contlist).ExecuteAffrows(); DbBus.Get(DbList.djypublicedb).Insert(decList).ExecuteAffrows(); DbBus.Get(DbList.djypublicedb).Update().Set(w => w.ParseStatus, 100).Where(w => orderidlist.Contains(w.Gid)).ExecuteAffrows(); }); //生成公司订阅消息到消息表 更多的往参数表中增加逗号间隔 var msgcomlist = DjyTools.GetConfigKey("baoguan_msg_company").Split(',').ToList().ConvertAll(s => Guid.Parse(s)); if (msgcomlist.Count > 0) { var msgdatalist = datalist.Where(w => msgcomlist.Contains(w.CompId)).ToList(); var msg_pushlist = new List(); var msgorderidlist = msgdatalist.Select(w => w.Gid).ToList(); var Containerlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status > 0 && msgorderidlist.Contains(w.BaoguanOrderGid)).ToList(); var conidlist = Containerlist.Select(w => w.Gid).ToList(); var declist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status > 0 && conidlist.Contains(w.ContainerGid)).ToList(); foreach (var con in Containerlist) { con.DecList = declist.Where(w => w.ContainerGid == con.Gid).ToList(); } var pushmsglist = new List(); foreach (var order in msgdatalist) { var filelist = YsJson.JsonToObject>(order.FileInfo); if (filelist != null) { filelist.ForEach(f => { f.Url = $"http://djypaas.myshipping.net/api/tools/download?name={f.Url}"; }); } order.FileInfo = YsJson.ToJson(filelist); var orderdata = new { Order = order, ContainerList = Containerlist.Where(w => w.BaoguanOrderGid == order.Gid).ToList() }; var newordermsg = new tb_BaoguanOrderCompanyPushMsg { CompanyGid = order.CompId, Data = YsJson.ToJson(orderdata), OrderGid = order.Gid }; newordermsg.Init(); pushmsglist.Add(newordermsg); } if (pushmsglist.Count > 0) { DbBus.Get(DbList.djypublicedb).Insert(pushmsglist).ExecuteAffrows(); } } rs.OK(); return rs; } /// /// 将通过open提送上来的单一窗口数据解析到BaoguanOrder /// /// public ReturnResult RunOpenDanyiParseToOrder() { var rs = new ReturnResult(); var openlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => w.Status == 1 && w.Module == "报关单一窗口").ToList(); if (openlist.Count == 0) { rs.Data = "没有可解析数据!"; rs.OK("没有可解析数据!"); return rs; } var useridlist = openlist.Select(w => w.UserId).ToList(); var companylist = DbBus.Get(DbList.djyolddb).Select().LeftJoin((c, u) => c.CompId == u.CompId).Where((c, u) => useridlist.Contains(u.GID)).ToList((c, u) => new { UserGid = u.GID, c.CompId, c.CompName }); var new_orderlist = new List(); foreach (var opendataitem in openlist) { try { var _company = companylist.Where(w => w.UserGid == opendataitem.UserId).FirstOrDefault(); if (_company == null) { _company = new { UserGid = "", CompId = "", CompName = "" }; } var jsondata = Newtonsoft.Json.JsonConvert.DeserializeObject(opendataitem.ResultJson); foreach (var _jsondata in jsondata.message) { var _data = _jsondata.data; var _preDecHeadVo = _data.preDecHeadVo; var _newDanyichuagkou = new DanyichuagkouDto(); _newDanyichuagkou.DecMessage.DecHead = new AliBaoGuanCustomesDecHeadDto { AgentCode = _preDecHeadVo.agentCode , AgentCodeScc = _preDecHeadVo.agentScc , AgentName = _preDecHeadVo.agentName , BillNo = _preDecHeadVo.billNo , ChkSurety = _preDecHeadVo.chktstFlag , ContrNo = _preDecHeadVo.contrNo , CopCode = _preDecHeadVo.contrNo//~ , CopCodeScc = _preDecHeadVo.cnsnTradeScc//~ , CopName = _preDecHeadVo.consignorCname//~ , CustomMaster = _preDecHeadVo.customMaster // ,CutMode=_preDecHeadVo.//~ , DeclCiqCode = _preDecHeadVo.declCode // ,DeclTrnRel=_preDecHeadVo.//~ , DistinatePort = _preDecHeadVo.distinatePort // ,EdiId=_preDecHeadVo.//~ //,EntryId = _preDecHeadVo.entryId , EntryType = _preDecHeadVo.entryType , EntyPortCode = _preDecHeadVo.despPortCode//~ , GrossWet = _preDecHeadVo.grossWt , IEFlag = _preDecHeadVo.ciqIEFlag , IEPort = _preDecHeadVo.iEPort , MarkNo = _preDecHeadVo.markNo , NetWt = _preDecHeadVo.netWt , OverseasConsigneeEname = _preDecHeadVo.consigneeEname , OwnerCiqCode = _preDecHeadVo.ownerCiqCode , OwnerCode = _preDecHeadVo.ownerCode , OwnerCodeScc = _preDecHeadVo.ownerScc , OwnerName = _preDecHeadVo.ownerName , PackNo = _preDecHeadVo.packNo //,PromiseItmes=_preDecHeadVo.//~ , SeqNo = _preDecHeadVo.cusCiqNo , TradeAreaCode = _preDecHeadVo.ciqTradeCountryCode , TradeCiqCode = _preDecHeadVo.consignorCode , TradeCode = _preDecHeadVo.consigneeEname //_preDecHeadVo.cnsnTradeCode , TradeCoScc = _preDecHeadVo.cnsnTradeScc , TradeCountry = _preDecHeadVo.cusTradeCountry , TradeMode = _preDecHeadVo.supvModeCdde , TradeName = _preDecHeadVo.consignorCname , TrafMode = _preDecHeadVo.cusTrafMode , TrafName = _preDecHeadVo.trafName , TransMode = _preDecHeadVo.transMode , WrapType = _preDecHeadVo.wrapType }; //商品数据解析 var _declist = Newtonsoft.Json.JsonConvert.DeserializeObject>(_preDecHeadVo.decMergeListVo); _declist.ForEach((row) => { _newDanyichuagkou.DecMessage.DecLists.DecList.Add(row.ToBaoguanDecListDto()); }); //集装箱数据 var _containerlist = Newtonsoft.Json.JsonConvert.DeserializeObject>(_preDecHeadVo.preDecContainerVo); _containerlist.ForEach(row => { _newDanyichuagkou.DecMessage.DecContainers.Container.Add(row.ToBaoguanContainer()); }); //文件文档 var _fileList = new List(); foreach (var file in _jsondata.pdfFile) { var url = HttpHelp.FileDown(file.path, "userdata/alibaoguanfile", _preDecHeadVo.preEntryId + "_" + file.filename + ".pdf").Result; _LogsAdd("open单一窗口文件下载", "opendanyi", new { file, newurl = url }); try { SignPdf(url); } catch (Exception e) { _LogsAdd("open签章错误", "opendanyi", e.Message); } _fileList.Add(new FileListDto { Name = file.filename, Url = url }); } //创建报关订单 var _newbaoguanorder = new tb_BaoGuanOrderList() { AlSActionGid = opendataitem.Gid // ,ClientName=_preDecHeadVo.ownerName , CompId = Guid.Parse(_company.CompId) , CompName = _company.CompName , CustomsMessage = YsJson.ToJson(_newDanyichuagkou) , CustomsNo = _preDecHeadVo.preEntryId , BillType = _preDecHeadVo.billType , Memo = _preDecHeadVo.billType + "," + _preDecHeadVo.billTypeName , DeclareCustoms = _newDanyichuagkou.DecMessage.DecHead.CustomMaster , DelegateMain = _newDanyichuagkou.DecMessage.DecHead.AgentName , FileInfo = YsJson.ToJson(_fileList) , IEFlag = _newDanyichuagkou.DecMessage.DecHead.IEFlag , ParseStatus = 1 , ShipOrderNo = _preDecHeadVo.billNo , stateCode = "15" , stateName = "海关结关" , Status = 100 , TradeName = _newDanyichuagkou.DecMessage.DecHead.TradeName , TrafName = _newDanyichuagkou.DecMessage.DecHead.TrafName , UniqueNumber = _preDecHeadVo.preEntryId , UpTime = DateTime.Now.ToTimeStamp() , OrderType = "open" }; _newbaoguanorder.Init(); new_orderlist.Add(_newbaoguanorder); } } catch { } } //保存报关单数据 if (new_orderlist.Count > 0) { var _orderid = new_orderlist.Select(w => w.UniqueNumber).ToList(); var _oldorderlist = DbBus.Get(DbList.djypublicedb).Select().Where(w => _orderid.Contains(w.CustomsNo)).ToList(); var _oldnolist = _oldorderlist.Select(w => w.CustomsNo).ToList(); var addnew_orderlist = new_orderlist.Where(w => !_oldnolist.Contains(w.UniqueNumber)).ToList();//筛选最后的写入单号数据 var del_orderid = addnew_orderlist.Select(s => s.UniqueNumber).ToList(); DbBus.Get(DbList.djypublicedb).Transaction(() => { //删除旧的 DbBus.Get(DbList.djypublicedb).Delete().Where(w => w.OrderType == "open" && _orderid.Contains(w.UniqueNumber)).ExecuteAffrows(); //保存新的 DbBus.Get(DbList.djypublicedb).Insert(addnew_orderlist).ExecuteAffrows(); }); } var opengidlist = openlist.Select(w => w.Gid).ToList(); DbBus.Get(DbList.djypublicedb).Update().Set(w => w.Status, 100).Where(w => opengidlist.Contains(w.Gid)).ExecuteAffrows(); rs.Data = YsJson.ToJson(new_orderlist); rs.OK(); return rs; } /// /// 获取数据字典的title值 /// /// /// public string _GetDcitValue(string GroupName, string KeyValue, string Titletype = "title") { string val = ""; var dict = _dictlist.Where(w => w.GroupName == GroupName && w.Key == KeyValue).FirstOrDefault(); if (dict != null) { val = Titletype == "title" ? dict.Title : dict.Value; } return val; } #region 图片插入PDF方法 /// /// pdf添加图片 /// /// 图片的list public void SignPdf(string pdfPath) { var imgFile = ""; if (pdfPath.IndexOf("放行通知书") > 0 || pdfPath.IndexOf("报关单") > 0) imgFile = @"userdata/alibaoguanfile/sign2.png"; else imgFile = @"userdata/alibaoguanfile/sign.png"; ///分割list //string[] imgs = imglist.Split(','); //string pdfpath = Server.MapPath("pdf"); //string imagepath = Server.MapPath("Image"); //string pdfpath = @"G:\MyWeb\Web学习\Windows\LiveProject\LiveProject\Images\"; //文件路径 //string imagepath = @"G:\MyWeb\Web学习\Windows\LiveProject\LiveProject\Images\"; var imagePath = imgFile; //load pdf file var pdfBytes = File.ReadAllBytes(pdfPath); var oldFile = new PdfReader(pdfBytes); //load image var preImage = System.Drawing.Image.FromFile(imagePath); var imgSign = iTextSharp.text.Image.GetInstance(preImage, ImageFormat.Png); preImage.Dispose(); if (pdfPath.IndexOf("放行通知书") > 0) { //imgSign.SetFixedPosition(430, 30); //左、上、右、下 //imgSign.SetWidth(120); imgSign.SetAbsolutePosition(391, 20); imgSign.ScalePercent(60); } else if (pdfPath.IndexOf("报关单") > 0) { //imgSign.SetFixedPosition(430, 520); //左、上、右、下 //imgSign.SetWidth(120); imgSign.SetAbsolutePosition(445, 30); imgSign.ScalePercent(60); } else { //imgSign.SetFixedPosition(480, 400);//左、上、右、下 //imgSign.SetWidth(100); imgSign.SetAbsolutePosition(480, 400); imgSign.ScalePercent(60); } //in production, I use MemoryStream //I put FileStream here to test the code in console application using (var newFileStream = new FileStream(pdfPath, FileMode.Create)) { //setup PdfStamper var stamper = new PdfStamper(oldFile, newFileStream); //iterate through the pages in the original file for (var i = 1; i <= oldFile.NumberOfPages; i++) { //get canvas for current page var canvas = stamper.GetOverContent(i); //add image with pre-set position and size canvas.AddImage(imgSign); } stamper.Close(); } } #endregion #region 自动扣费companeynew用户相关 /// /// 处理自动扣费 /// public void ProcCustFee() { var cfgAutoCompId = DjyTools.GetConfigKey("baoguanAutoBindCompanyFeeCompId"); var cfgDingtalk = DjyTools.GetConfigKey("baoguanDingtalkNotify"); _LogsAdd($"报关自动扣费,公司参数:{cfgAutoCompId}", "胜云航通客服消息", null); _LogsAdd($"报关自动扣费,钉钉:{cfgDingtalk}", "胜云航通客服消息", null); if (!string.IsNullOrEmpty(cfgAutoCompId)) { try { var arr = cfgAutoCompId.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); _LogsAdd($"报关自动扣费,待处理公司:{arr.Length}", "胜云航通客服消息", null); foreach (var compid in arr) { var guidComp = Guid.Parse(compid); var orderList = DbBus.Get(DbList.djypublicedb) .Select() .Where(x => x.CompId == guidComp && (x.StaCustFee == null || x.StaCustFee == "") //未扣费 && x.ClientName != null && x.ClientName != "" //已绑定客户 && (x.stateCode == "14" || x.stateCode == "15" || x.stateCode == "18"))//14海关放行,15已结关,18准予入港 .ToList(); _LogsAdd($"处理{compid}的报关自动扣费,共发现{orderList.Count}票", "胜云航通客服消息", null); foreach (var ord in orderList) { var customerComp = DbBus.Get(DbList.djyolddb) .Select() .Where(x => x.CompName == ord.ClientName) .ToOne(); if (customerComp == null) { //推送钉钉消息给客服 var content = $"公司{ord.ClientName}未找到"; _LogsAdd(content, "胜云航通客服消息", null); var gethtml = DjyTools.PostOnLogs(new { text = new { content = $"【未扣费提醒】\r\n{content}\r\n----报关消息通知" }, msgtype = "text" }, cfgDingtalk, "胜云航通客服消息", YsPsotType.Json).Result; continue; } var balance = DbBus.Get(DbList.djyolddb) .Select() .Where(x => x.COMNAME == customerComp.CompName) .ToOne(); //没有钱包 if (balance == null) { //推送钉钉消息给客服 var content = $"公司{ord.ClientName}没有钱包"; _LogsAdd(content, "胜云航通客服消息", null); var gethtml = DjyTools.PostOnLogs(new { text = new { content = $"【未扣费提醒】\r\n{content}\r\n----报关消息通知" }, msgtype = "text" }, cfgDingtalk, "胜云航通客服消息", YsPsotType.Json).Result; continue; } var price = DbBus.Get(DbList.djyolddb) .Select() .Where(x => x.COMNAME == customerComp.CompName && x.SENDTYPE == 0 && x.BSTYPE == 13) .ToOne(); //未设置单价 if (price == null) { //推送钉钉消息给客服 var content = $"公司{ord.ClientName}的报关单价未设置"; var gethtml = DjyTools.PostOnLogs(new { text = new { content = $"【未扣费提醒】\r\n{content}\r\n----报关消息通知" }, msgtype = "text" }, cfgDingtalk, "胜云航通客服消息", YsPsotType.Json).Result; continue; } //余额不足 if (price.PRICE > balance.Balance) { //推送钉钉消息给客服 var content = $"公司{ord.ClientName}的余额不足"; var gethtml = DjyTools.PostOnLogs(new { text = new { content = $"【未扣费提醒】\r\n{content}\r\n----报关消息通知" }, msgtype = "text" }, cfgDingtalk, "胜云航通客服消息", YsPsotType.Json).Result; continue; } //执行扣费 var fin = new FinanceService(); var getfinrs = fin.Expend(new djy.Model.CustFee { SENDUSERID = customerComp.AdminUser, LURURENID = customerComp.AdminUser, CtnrCount = 1, CtnrInfo = string.Empty, BSTYPE = 13, SENDTYPE = 0, BSNO = ord.Gid.ToString(), MBLNO = ord.ShipOrderNo }, 1); if (getfinrs.Status) { //设置状态 DbBus.Get(DbList.djypublicedb).Update() .Where(x => x.Gid == ord.Gid) .Set(x => x.StaCustFee, "OK") .Set(x => x.TimeCustFee, DateTime.Now) .ExecuteAffrows(); } else { //推送钉钉消息给客服 var content = $"公司{ord.ClientName}报关扣费失败:{getfinrs.Message}"; var gethtml = DjyTools.PostOnLogs(new { text = new { content = $"【未扣费提醒】\r\n{content}\r\n----报关消息通知" }, msgtype = "text" }, cfgDingtalk, "胜云航通客服消息", YsPsotType.Json).Result; } } } } catch (Exception ex) { _LogsAdd(ex.Message, "胜云航通自动扣费", new { ex.StackTrace }); } } } #endregion } }