You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

267 lines
15 KiB

using EasyBL.WebApi.Message;
using EasyNet;
using Entity;
using Entity.Sugar;
using HtmlAgilityPack;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
using SqlSugar.Base;
using System;
using System.Collections.Generic;
namespace EasyBL.WEBSITE.TG
{
public class TGAPIService : ServiceBase
{
#region 在線預約
/// <summary>
/// 在線預約
/// </summary>
/// <param name="i_crm"></param>
/// <returns></returns>
public ResponseMessage Appoint(RequestMessage i_crm)
{
ResponseMessage rm = null;
string sMsg = null;
var bSend = false;
var db = SugarBase.GetIntance();
try
{
do
{
var sExhibitionNO = _fetchString(i_crm, "ExhibitionNO");
var sCompName = _fetchString(i_crm, "CompName");
var oExhibition = db.Queryable<OTB_OPM_Exhibition>().Single(x => x.SN == int.Parse(sExhibitionNO));
var sCurDate = DateTime.Now.ToString("yyyyMMdd");
var oImportCustomers = db.Queryable<OTB_CRM_ImportCustomers>()
.First(x => x.OrgID == i_crm.ORIGID && x.ExhibitionNO.ToString() == sExhibitionNO && x.CustomerCName == sCompName);
var oPackingOrder = new OTB_WSM_PackingOrder
{
AppointNO = SerialNumber.GetMaxNumberByType(i_crm.ORIGID, oExhibition.ExhibitionCode, MaxNumberType.Empty, i_crm.USERID, 3, sCurDate),
OrgID = i_crm.ORIGID,
ExhibitionNO = sExhibitionNO,
CustomerId = oImportCustomers?.guid,
CompName = sCompName,
MuseumMumber = _fetchString(i_crm, "MuseumMumber"),
AppointUser = _fetchString(i_crm, "AppointUser"),
AppointTel = _fetchString(i_crm, "AppointTel"),
AppointEmail = _fetchString(i_crm, "AppointEmail"),
Contactor = _fetchString(i_crm, "Contactor"),
ContactTel = _fetchString(i_crm, "ContactTel"),
ApproachTime = Convert.ToDateTime(_fetchString(i_crm, "ApproachTime") + " " + _fetchString(i_crm, "ApproachTime_Hour") + ":" + _fetchString(i_crm, "ApproachTime_Min")),
ExitTime = Convert.ToDateTime(_fetchString(i_crm, "ExitTime") + " " + _fetchString(i_crm, "ExitTime_Hour") + ":" + _fetchString(i_crm, "ExitTime_Min")),
PackingInfo = _fetchString(i_crm, "PackingInfo"),
Total = Convert.ToDecimal(_fetchString(i_crm, "Total")),
AppointDateTime = DateTime.Now,
CreateDate = DateTime.Now,
ModifyDate = DateTime.Now
};
//獲取Email郵件格式
var sTemplId = "Appoint_TG" + (i_crm.LANG == "en" ? "_en" : "");
var oEmailTempl = db.Queryable<OTB_SYS_Email>().Single(it => it.OrgID == i_crm.ORIGID && it.EmailID == sTemplId);
if (oEmailTempl != null)
{
//寄信開始
var sEmailBody = oEmailTempl.BodyHtml
.Replace("{{:AppointNO}}", oPackingOrder.AppointNO)
.Replace("{{:CompName}}", oPackingOrder.CompName)
.Replace("{{:ExpoName}}", i_crm.LANG == "en" ? oExhibition.Exhibitioname_EN : oExhibition.Exhibitioname_TW)
.Replace("{{:MuseumMumber}}", oPackingOrder.MuseumMumber)
.Replace("{{:AppointUser}}", oPackingOrder.AppointUser)
.Replace("{{:AppointTel}}", oPackingOrder.AppointTel)
.Replace("{{:AppointEmail}}", oPackingOrder.AppointEmail)
.Replace("{{:Contactor}}", oPackingOrder.Contactor)
.Replace("{{:ContactTel}}", oPackingOrder.ContactTel)
.Replace("{{:ApproachTime}}", Convert.ToDateTime(oPackingOrder.ApproachTime).ToString("yyyy/MM/dd HH:mm"))
.Replace("{{:ExitTime}}", Convert.ToDateTime(oPackingOrder.ExitTime).ToString("yyyy/MM/dd HH:mm"))
.Replace("{{:Total}}", String.Format("{0:N0}", oPackingOrder.Total));
if (!string.IsNullOrEmpty(oExhibition.CostRulesId))
{
var oExhibitionRules = db.Queryable<OTB_WSM_ExhibitionRules>().Single(x => x.Guid == oExhibition.CostRulesId);
sEmailBody = sEmailBody.Replace("{{:ServiceInstruction}}", i_crm.LANG == "en" ? oExhibitionRules.ServiceInstruction_EN : oExhibitionRules.ServiceInstruction);
}
var doc = new HtmlDocument();
doc.LoadHtml(sEmailBody);
HtmlNode hService_Temple = null; //航班信息模版
foreach (HtmlNode NodeTb in doc.DocumentNode.SelectNodes("//tr")) //按照<table>節點尋找
{
if (NodeTb.Attributes["data-repeat"] != null && NodeTb.Attributes["data-repeat"].Value == "Y")
{
hService_Temple = NodeTb;
var hReplace = HtmlNode.CreateNode("[servicetemple]");
NodeTb.ParentNode.InsertAfter(hReplace, NodeTb);
NodeTb.Remove();
break;
}
}
sEmailBody = doc.DocumentNode.OuterHtml; //總模版
var sService_Html = "";
var sService_Temple = hService_Temple.OuterHtml; //服務信息模板
var ja = (JArray)JsonConvert.DeserializeObject(oPackingOrder.PackingInfo);
var oExpoType_TW = new Map { { "01", "裸機" }, { "02", "木箱" }, { "03", "散貨" }, { "04", "打板" }, { "05", "其他" } };
var oExpoType_EN = new Map { { "01", "Unwrapped" }, { "02", "Wooden Crate" }, { "03", "Bulk Cargo" }, { "04", "Pallet" }, { "05", "Other" } };
var saService_TW = new List<string> { "堆高機服務", "拆箱", "裝箱", "空箱收送與儲存(展覽期間)" };
var saService_EN = new List<string> { "Forklift", "Unpacking", "Packing", "'Empty Crate Transport And StorageEmpty Crate Transport and Storage During the Exhibition" };
var builder = new System.Text.StringBuilder();
builder.Append(sService_Html);
foreach (JObject jo in ja)
{
var sExpoType = jo["ExpoType"].ToString();
var sExpoLen = jo["ExpoLen"].ToString();
var sExpoWidth = jo["ExpoWidth"].ToString();
var sExpoHeight = jo["ExpoHeight"].ToString();
var sExpoWeight = jo["ExpoWeight"].ToString();
var sExpoNumber = jo["ExpoNumber"].ToString();
var sExpoStack = jo["ExpoStack"].ToString();//堆高機
var sExpoSplit = jo["ExpoSplit"].ToString();//拆箱
var sExpoPack = jo["ExpoPack"].ToString();//裝箱
var sExpoFeed = jo["ExpoFeed"].ToString();//空箱收送與儲存(展覽期間)
var sSubTotal = jo["SubTotal"].ToString();
var dExpoLen = Convert.ToDecimal(sExpoLen == "" ? "0" : sExpoLen);
var dExpoWidth = Convert.ToDecimal(sExpoWidth == "" ? "0" : sExpoWidth);
var dExpoHeight = Convert.ToDecimal(sExpoHeight == "" ? "0" : sExpoHeight);
var dExpoWeight = Convert.ToDecimal(sExpoWeight == "" ? "0" : sExpoWeight);
var dSubTotal = Convert.ToDecimal(sSubTotal);
var saText = new List<string>();
if (sExpoStack == "True")
{
saText.Add(i_crm.LANG == "en" ? saService_EN[0].ToString() : saService_TW[0].ToString());
}
if (sExpoSplit == "True")
{
saText.Add(i_crm.LANG == "en" ? saService_EN[1].ToString() : saService_TW[1].ToString());
}
if (sExpoPack == "True")
{
saText.Add(i_crm.LANG == "en" ? saService_EN[2].ToString() : saService_TW[2].ToString());
}
if (sExpoFeed == "True")
{
saText.Add(i_crm.LANG == "en" ? saService_EN[3].ToString() : saService_TW[3].ToString());
}
builder.Append(sService_Temple
.Replace("{{:ExpoType}}", i_crm.LANG == "en" ? oExpoType_EN[sExpoType].ToString() : oExpoType_TW[sExpoType].ToString())
.Replace("{{:ExpoSize}}", String.Format("{0:N0}", dExpoLen) + "*" + String.Format("{0:N0}", dExpoWidth) + "*" + String.Format("{0:N0}", dExpoHeight))
.Replace("{{:ExpoWeight}}", String.Format("{0:N0}", dExpoWeight))
.Replace("{{:ExpoNumber}}", sExpoNumber)
.Replace("{{:ServiceText}}", string.Join(",", saText))
.Replace("{{:SubTotal}}", String.Format("{0:N0}", dSubTotal)));
}
sService_Html = builder.ToString();
sEmailBody = sEmailBody.Replace("[servicetemple]", sService_Html);
var oEmail = new Emails();
var saEmailTo = new List<EmailTo>(); //收件人
var oEmailTo = new EmailTo
{
ToUserID = "",
ToUserName = oPackingOrder.AppointUser,
ToEmail = oPackingOrder.AppointEmail,
Type = "to"
};
saEmailTo.Add(oEmailTo);
var sServiceEmail = Common.GetSystemSetting(db, i_crm.ORIGID, "ServiceEmail");
var saServiceEmail = sServiceEmail.Split(new string[] { @";", @",", @",", @"|" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var _email in saServiceEmail)
{
var oEmailBc = new EmailTo
{
ToUserID = "",
ToUserName = _email,
ToEmail = _email,
Type = "bcc"
};
saEmailTo.Add(oEmailBc);
}
oEmail.FromUserName = i_crm.LANG == "en" ? "Online Booking" : "線上預約";
oEmail.Title = oEmailTempl.EmailSubject + (i_crm.LANG == "en" ? "(Booking No.:" : "(單號:") + oPackingOrder.AppointNO + ")";
oEmail.EmailBody = sEmailBody;
oEmail.IsCCSelf = false;
oEmail.Attachments = null;
oEmail.EmailTo = saEmailTo;
//bSend = new MailService(i_crm.ORIGID, true).MailFactory(oEmail, out sMsg);
bSend = new MailService(i_crm.ORIGID).MailFactory(oEmail, out sMsg);
if (bSend || oPackingOrder.AppointUser.IndexOf("***TEST***") > -1)
{
db.Insertable(oPackingOrder).ExecuteCommand();
}
}
rm = new SuccessResponseMessage(null, i_crm);
rm.DATA.Add(BLWording.REL, bSend);
rm.DATA.Add("AppointNO", oPackingOrder.AppointNO);
} while (false);
}
catch (Exception ex)
{
sMsg = Util.GetLastExceptionMsg(ex);
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, "EasyBL.WebSite.TG.TGAPIService", "", "Appoint(在線預約)", "", "", "");
}
finally
{
if (null != sMsg)
{
rm = new ErrorResponseMessage(sMsg, i_crm);
}
}
return rm;
}
#endregion 在線預約
#region 獲取預約明細
/// <summary>
/// 獲取預約明細
/// </summary>
/// <param name="i_crm"></param>
/// <returns></returns>
public ResponseMessage GetAppointInfo(RequestMessage i_crm)
{
ResponseMessage rm = null;
string sMsg = null;
var db = SugarBase.GetIntance();
try
{
do
{
var sAppointNO = _fetchString(i_crm, "AppointNO");
var sdb = new SimpleClient<OTB_WSM_PackingOrder>(db);
var oPackingOrder = sdb.GetById(sAppointNO);
var oRules = db.Queryable<OTB_WSM_ExhibitionRules, OTB_OPM_Exhibition>((t1, t2) => t1.OrgID == t2.OrgID && t1.Guid == t2.CostRulesId)
.Where((t1, t2) => t2.SN == int.Parse(oPackingOrder.ExhibitionNO))
.Select((t1, t2) => new { Info = t1, ExpoName = t2.Exhibitioname_TW })
.Single();
rm = new SuccessResponseMessage(null, i_crm);
rm.DATA.Add(BLWording.REL, oPackingOrder);
rm.DATA.Add("rule", oRules);
} while (false);
}
catch (Exception ex)
{
sMsg = Util.GetLastExceptionMsg(ex);
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, "EasyBL.WebSite.TG.TGAPIService", "", "GetAppointInfo(獲取預約明細)", "", "", "");
}
finally
{
if (null != sMsg)
{
rm = new ErrorResponseMessage(sMsg, i_crm);
}
}
return rm;
}
#endregion 獲取預約明細
}
}