using EasyBL.WebApi.Message;
using EasyNet;
using Entity;
using Entity.Sugar;
using JumpKick.HttpLib;
using SqlSugar;
using SqlSugar.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;

namespace EasyBL.WEBAPP.CRM
{
    public class Customers_UpdService : ServiceBase
    {
        #region 客戶管理編輯(單筆查詢)

        /// <summary>
        /// 客戶管理編輯(單筆查詢)
        /// </summary>
        /// <param name="i_crm"></param>
        /// <returns></returns>
        public ResponseMessage QueryOne(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var sId = _fetchString(i_crm, @"guid");

                    var oEntity = db.Queryable<OTB_CRM_Customers, OTB_SYS_Members, OTB_SYS_Members>
                        ((t1, t2, t3) =>
                        new object[] {
                                JoinType.Left, t1.OrgID == t2.OrgID && t1.CreateUser == t2.MemberID,
                                JoinType.Left, t1.OrgID == t3.OrgID && t1.ModifyUser == t3.MemberID
                              }
                        )
                        .Where((t1, t2, t3) => t1.OrgID == i_crm.ORIGID && t1.guid == sId)
                        .Select((t1, t2, t3) => new OTB_CRM_Customers
                        {
                            guid = SqlFunc.GetSelfAndAutoFill(t1.guid),
                            CreateUserName = t2.MemberName,
                            ModifyUserName = t3.MemberName
                        })
                        .Single();

                    rm = new SuccessResponseMessage(null, i_crm);
                    rm.DATA.Add(BLWording.REL, oEntity);
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_QryService), "", "QueryOne(客戶管理編輯(單筆查詢))", "", "", "");
            }
            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 QueryCout(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var sId = _fetchString(i_crm, @"guid");
                    var sCustomerShotCName = _fetchString(i_crm, @"CustomerShotCName");
                    var sUniCode = _fetchString(i_crm, @"UniCode");

                    var iCount = db.Queryable<OTB_CRM_Customers>()
                        .Where(x => x.OrgID == i_crm.ORIGID)
                        .WhereIF(!string.IsNullOrEmpty(sId), x => x.guid != sId)
                        .WhereIF(!string.IsNullOrEmpty(sCustomerShotCName), x => x.CustomerShotCName == sCustomerShotCName)
                        .WhereIF(!string.IsNullOrEmpty(sUniCode), x => x.UniCode == sUniCode)
                        .Count();

                    rm = new SuccessResponseMessage(null, i_crm);
                    rm.DATA.Add(BLWording.REL, iCount);
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_QryService), "", "QueryOne(客戶管理編輯(單筆查詢))", "", "", "");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(單筆查詢)


        /// <summary>
        /// 檢查客戶簡稱(不能重複)與統一編號(不能重複),組織不同視為不同
        /// </summary>
        /// <param name="i_crm"></param>
        /// <returns></returns>
        private Tuple<bool, string> CheckShortNameAndUniCode(RequestMessage i_crm)
        {
            var OrgID = i_crm.ORIGID;
            if (i_crm.TYPE == "CopySync")
                OrgID = _fetchString(i_crm, OTB_CRM_Customers.CN_ORGID);
            var db = SugarBase.GetIntance();
            var iCount = -1;
            try
            {
                var sTransactiontype = _fetchString(i_crm, @"TransactionType");
                var sId = _fetchString(i_crm, @"guid");
                var sCustomerShotCName = _fetchString(i_crm, @"CustomerShotCName");
                var sUniCode = _fetchString(i_crm, @"UniCode");
                if (string.IsNullOrWhiteSpace(sCustomerShotCName))
                    return new Tuple<bool, string>(false, "客戶簡稱不得為空。");
                var sTaxpayerOrgID = _fetchString(i_crm, @"TaxpayerOrgID");

                if (!string.IsNullOrWhiteSpace(sTransactiontype))
                {
                    var TypeAD = sTransactiontype.Any(c => c == 'D' || c == 'A');

                    if (OrgID == "SG")
                    {
                        var SqlType = @" (CustomerShotCName = @CustomerShotCName  {1} )";
                        var TaxpayerOrgIDSql = "";
                        var ConvertedTaxpayerOrgID = sTaxpayerOrgID.Trim() ?? "";
                        var TaxpayerOrgIDLength = ConvertedTaxpayerOrgID.Length;
                        //Type A or D 一定要輸入納稅人組織號
                        if (TypeAD && TaxpayerOrgIDLength > 18)
                        {
                            return new Tuple<bool, string>(false, "交易型態為A或D時,納稅人組織號必填且為限制18碼內。");
                        }
                        //有輸入統編的話 一定要8碼
                        if (TaxpayerOrgIDLength > 0 && TaxpayerOrgIDLength < 18)
                            return new Tuple<bool, string>(false, "納稅人組織號需要18碼。");

                        if (TaxpayerOrgIDLength == 18)
                        {
                            TaxpayerOrgIDSql = "OR TaxpayerOrgID = @TaxpayerOrgID";
                        }
                        SqlType = SqlType.Replace("{1}", TaxpayerOrgIDSql);

                        iCount = db.Queryable<OTB_CRM_Customers>()
                            .Where(x => x.OrgID == i_crm.ORIGID)
                            .WhereIF(!string.IsNullOrEmpty(sId), x => x.guid != sId)
                            .Where(SqlType, new { CustomerShotCName = sCustomerShotCName, TaxpayerOrgID = ConvertedTaxpayerOrgID })
                            .Count();
                    }
                    else
                    {
                        var SqlType = @" (CustomerShotCName = @CustomerShotCName {1} )";
                        var UnicodeSql = "";
                        var ConvertedUnicode = sUniCode.Trim() ?? "";
                        var UnicodeLength = ConvertedUnicode.Length;
                        //Type A or D 一定要輸入統編
                        if (TypeAD && UnicodeLength < 8)
                            return new Tuple<bool, string>(false, "交易型態為A或D時,統一編號必填且為8碼。");

                        //有輸入統編的話 一定要8碼
                        if (UnicodeLength > 0 && UnicodeLength < 8)
                            return new Tuple<bool, string>(false, "統一編號需要8碼。");
                        if (UnicodeLength == 8)
                        {
                            UnicodeSql = "OR UniCode = @UniCode";
                        }
                        SqlType = SqlType.Replace("{1}", UnicodeSql);
                        iCount = db.Queryable<OTB_CRM_Customers>()
                            .Where(x => x.OrgID == OrgID)
                            .WhereIF(!string.IsNullOrEmpty(sId), x => x.guid != sId)
                            .Where(SqlType, new { CustomerShotCName = sCustomerShotCName, UniCode = sUniCode })
                            .Count();
                    }
                }

            }
            catch (Exception ex)
            {
                var sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_QryService), "", "CheckShortNameAndUniCode(客戶管理編輯(檢查客戶簡稱與統一編號))", "", "", "");

            }
            var TaxName = "統一編號";
            if (OrgID == "SG")
                TaxName = "納稅人組織號";
            switch (iCount)
            {
                case 0:
                    return new Tuple<bool, string>(true, "沒有找到重複" + TaxName + "或簡稱。");
                case -1:
                    return new Tuple<bool, string>(false, "尋找過程發生錯誤,請稍後嘗試。");
                default:
                    return new Tuple<bool, string>(false, TaxName + "或客戶簡稱重複。請重新檢查資料。");
            }
        }


        #region 客戶管理編輯(新增)

        /// <summary>
        /// 客戶管理編輯(新增)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on UpdImportCustomers</param>
        /// <returns></returns>
        public ResponseMessage Insert(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            ////檢查統一編號或客戶簡稱要為唯一
            var CheckResult = CheckShortNameAndUniCode(i_crm);
            if (!CheckResult.Item1)
                return new ErrorResponseMessage(CheckResult.Item2, i_crm);
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        string sCustomerGUID = Guid.NewGuid().ToString();

                        //客戶資料表身
                        var oEntity = _fetchEntity<OTB_CRM_Customers>(i_crm);
                        _setEntityBase(oEntity, i_crm);
                        oEntity.guid = sCustomerGUID;
                        oEntity.IsAudit = "N";
                        oEntity.CustomerNO = SerialNumber.GetMaxNumberByType(i_crm.ORIGID, oEntity.CustomerNO, MaxNumberType.Empty, i_crm.USERID, 3);

                        //客戶資料表頭
                        var oMstEntity = _fetchEntity<OTB_CRM_CustomersMST>(i_crm);
                        _setEntityBase(oMstEntity, i_crm);
                        oMstEntity.guid = Guid.NewGuid().ToString();
                        oMstEntity.CustomerNO = oEntity.CustomerNO;
                        oMstEntity.customer_guid = sCustomerGUID;
                        oMstEntity.Effective = "Y";

                        var iRel = db.Insertable(oEntity).ExecuteReturnEntity();
                        var iRelMst = db.Insertable(oMstEntity).ExecuteCommand();
                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, iRel);
                    } while (false);

                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"Add(客戶管理編輯(新增))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(新增)

        #region 客戶管理編輯(修改)

        /// <summary>
        /// 客戶管理編輯(修改)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on UpdImportCustomers</param>
        /// <returns></returns>
        public ResponseMessage Update(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;

            var CheckResult = CheckShortNameAndUniCode(i_crm);
            if (!CheckResult.Item1)
                return new ErrorResponseMessage(CheckResult.Item2, i_crm);
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, @"guid");
                        var oNewEntity = _fetchEntity<OTB_CRM_Customers>(i_crm);
                        _setEntityBase(oNewEntity, i_crm);
                        oNewEntity.IsAudit = "N";

                        string sOrgId = oNewEntity.OrgID;

                        if (oNewEntity.CustomerNO.Length == 4)
                        {
                            oNewEntity.CustomerNO = SerialNumber.GetMaxNumberByType(i_crm.ORIGID, oNewEntity.CustomerNO, MaxNumberType.Empty, i_crm.USERID, 3);

                            //查詢出該

                            //更新現有其他對應表頭資料為N
                            var oUpdMstEntity = _fetchEntity<OTB_CRM_CustomersMST>(i_crm);
                            db.Updateable(oUpdMstEntity).UpdateColumns(p => p.Effective == "N").Where(p => p.customer_guid == sId).ExecuteCommand();


                            //若有變更,新增一筆到表頭
                            var oInsertMstEntity = _fetchEntity<OTB_CRM_CustomersMST>(i_crm);
                            _setEntityBase(oInsertMstEntity, i_crm);
                            oInsertMstEntity.guid = Guid.NewGuid().ToString();
                            oInsertMstEntity.CustomerNO = oNewEntity.CustomerNO;
                            oInsertMstEntity.customer_guid = sId;
                            oInsertMstEntity.Effective = "Y";

                            db.Insertable(oInsertMstEntity).ExecuteCommand();
                        }

                        var iRel = db.Updateable(oNewEntity)
                                     .IgnoreColumns(x => new
                                     {
                                         x.IsApply,
                                         x.IsAudit,
                                         x.ToAuditer,
                                         x.NotPassReason,
                                         x.CreateUser,
                                         x.CreateDate
                                     }).ExecuteCommand();

                        var NewResult = db.Queryable<OTB_CRM_Customers>()
                                .Where(p => p.OrgID == sOrgId && p.guid == oNewEntity.guid)
                                .Single();

                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, NewResult);
                    } while (false);

                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"Update(客戶管理編輯(修改))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(修改)

        #region 客戶管理編輯(刪除)

        /// <summary>
        /// 客戶管理編輯(刪除)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on UpdImportCustomers</param>
        /// <returns></returns>
        public ResponseMessage Delete(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, @"guid");

                        var iRel = db.Deleteable<OTB_CRM_Customers>().Where(x => x.guid == sId).ExecuteCommand();
                        var iMstRel = db.Deleteable<OTB_CRM_CustomersMST>().Where(x => x.customer_guid == sId).ExecuteCommand();
                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, iRel);
                    } while (false);

                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"Delete(客戶管理編輯(刪除))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(刪除)

        #region 客戶管理編輯(提交審核)

        /// <summary>
        /// 客戶管理編輯(提交審核)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on ToAudit</param>
        /// <returns></returns>
        public ResponseMessage ToAudit(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var CheckResult = CheckShortNameAndUniCode(i_crm);
            if (!CheckResult.Item1)
                return new ErrorResponseMessage(CheckResult.Item2, i_crm);
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
                        var sIsAudit = _fetchString(i_crm, @"IsAudit");
                        var sdb = new SimpleClient<OTB_CRM_Customers>(db);
                        var customer = sdb.GetById(sId);

                        if (customer == null)
                        {
                            sMsg = @"系統找不到對應的客戶資料,請核查!";
                            break;
                        }

                        var sTitle = @"客戶資料「" + (string.IsNullOrWhiteSpace(customer.CustomerCName) ? customer.CustomerEName : customer.CustomerCName) + @"」申請審核";
                        if (i_crm.LANG == @"zh")
                        {
                            sTitle = ChineseStringUtility.ToSimplified(sTitle);
                        }
                        //更新客戶資料
                        var oCustomersUpd = new OTB_CRM_Customers
                        {
                            IsAudit = sIsAudit,
                            ToAuditer = i_crm.USERID,
                            ModifyUser = i_crm.USERID,
                            ModifyDate = DateTime.Now
                        };
                        db.Updateable(oCustomersUpd)
                                .UpdateColumns(it => new { it.IsAudit, it.ToAuditer, it.ModifyUser, it.ModifyDate })
                                .Where(it => it.guid == sId).ExecuteCommand();
                        //更新代辦
                        SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId);

                        var listTips = new List<OTB_SYS_Tips>();
                        var listTask = new List<OTB_SYS_Task>();
                        var lstCustomersAuditUsers = new List<string>();
                        var sCustomersAuditUsers = Common.GetSystemSetting(db, i_crm.ORIGID, @"CustomersAuditUsers");
                        if (sCustomersAuditUsers != @"")
                        {
                            var saCustomersAuditUsers = sCustomersAuditUsers.Split(new string[] { @";", @",", @",", @"|" }, StringSplitOptions.RemoveEmptyEntries);
                            lstCustomersAuditUsers = saCustomersAuditUsers.Distinct<string>().ToList();
                            foreach (string user in lstCustomersAuditUsers)
                            {
                                //添加代辦
                                var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, customer.guid, user, sTitle, i_crm.CUSTOMDATA[@"program_id"], @"?Action=Upd&guid=" + customer.guid);
                                listTask.Add(oTaskAdd);

                                //添加提醒消息
                                var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, user, i_crm.CUSTOMDATA[@"program_id"] + @"|?Action=Upd&guid=" + customer.guid, WebAppGlobalConstWord.BELL);
                                listTips.Add(oTipsAdd);
                            }
                        }
                        if (listTips.Count > 0)
                        {
                            db.Insertable(listTips).ExecuteCommand();
                        }
                        if (listTask.Count > 0)
                        {
                            db.Insertable(listTask).ExecuteCommand();
                        }

                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, lstCustomersAuditUsers);
                    } while (false);
                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"ToAudit(客戶管理編輯(提交審核))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(提交審核)

        #region 客戶管理編輯(主管會計審核)

        /// <summary>
        /// 客戶管理編輯(主管會計審核)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on Audit</param>
        /// <returns></returns>
        public ResponseMessage Audit(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
                        var sIsAudit = _fetchString(i_crm, @"IsAudit");
                        var sNotPassReason = _fetchString(i_crm, @"NotPassReason");

                        var sdb = new SimpleClient<OTB_CRM_Customers>(db);
                        var customer = sdb.GetById(sId);

                        if (customer == null)
                        {
                            sMsg = @"系統找不到對應的客戶資料,請核查!";
                            break;
                        }

                        //更新客戶資料
                        var oCustomersUpd = new OTB_CRM_Customers
                        {
                            IsAudit = sIsAudit,
                            NotPassReason = sNotPassReason,
                            ModifyUser = i_crm.USERID,
                            ModifyDate = DateTime.Now
                        };
                        db.Updateable(oCustomersUpd)
                            .UpdateColumns(it => new { it.IsAudit, it.NotPassReason, it.ModifyUser, it.ModifyDate })
                            .Where(it => it.guid == sId).ExecuteCommand();
                        //更新代辦
                        SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId);

                        var oUserInfo = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
                        var sTitle = (oUserInfo.MemberName ?? i_crm.USERID) + @"審核了您創建的客戶資料「" + (string.IsNullOrWhiteSpace(customer.CustomerCName) ? customer.CustomerEName : customer.CustomerCName) + @"」,審核結果:";
                        sTitle += sIsAudit == @"Y" ? @"通過" : @"不通過";
                        if (i_crm.LANG == @"zh")
                        {
                            sTitle = ChineseStringUtility.ToSimplified(sTitle);
                        }

                        //成功與否
                        var TipsType = sIsAudit == @"Y" ? WebAppGlobalConstWord.CHECK : WebAppGlobalConstWord.FAIL;

                        //添加提醒消息
                        var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, customer.ToAuditer, i_crm.CUSTOMDATA[@"program_id"] + @"|?Action=Upd&guid=" + customer.guid, TipsType);
                        db.Insertable(oTipsAdd).ExecuteCommand();
                        if (sIsAudit == @"Q")
                        {
                            //添加代辦
                            var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, customer.guid, customer.ToAuditer, sTitle, i_crm.CUSTOMDATA[@"program_id"], @"?Action=Upd&guid=" + customer.guid);
                            db.Insertable(oTaskAdd).ExecuteCommand();
                        }
                        else
                        {
                            var oCustomersTransferAdd = new OTB_CRM_CustomersTransfer();
                            var sEventID = Guid.NewGuid().ToString();
                            oCustomersTransferAdd.OrgID = i_crm.ORIGID;
                            oCustomersTransferAdd.Feild01 = customer.CustomerNO;
                            oCustomersTransferAdd.Feild02 = @"0";
                            oCustomersTransferAdd.Feild03 = Common.CutByteString(customer.CustomerShotCName, 12);
                            oCustomersTransferAdd.Feild04 = Common.CutByteString(customer.CustomerCName == @"" ? customer.CustomerEName : customer.CustomerCName, 60);
                            oCustomersTransferAdd.Feild05 = @"";
                            oCustomersTransferAdd.Feild06 = @"";
                            oCustomersTransferAdd.Feild07 = customer.UniCode;
                            oCustomersTransferAdd.Feild08 = @"";
                            oCustomersTransferAdd.Feild09 = @"";
                            oCustomersTransferAdd.Feild10 = Common.CutByteString(customer.InvoiceAddress, 60);
                            oCustomersTransferAdd.Feild11 = Common.CutByteString(customer.Address, 60);
                            oCustomersTransferAdd.Feild12 = @"";
                            oCustomersTransferAdd.Feild13 = @"";
                            oCustomersTransferAdd.Feild14 = Common.CutByteString(customer.Telephone, 20);
                            oCustomersTransferAdd.Feild15 = @"";
                            oCustomersTransferAdd.Feild16 = Common.CutByteString(customer.FAX, 20);
                            oCustomersTransferAdd.Feild17 = @"";
                            oCustomersTransferAdd.Feild18 = @"";
                            oCustomersTransferAdd.Feild19 = @"";
                            oCustomersTransferAdd.Feild20 = @"";
                            oCustomersTransferAdd.Feild21 = @"";
                            oCustomersTransferAdd.Feild22 = @"";
                            oCustomersTransferAdd.Feild23 = Common.CutByteString(customer.Memo, 30);
                            oCustomersTransferAdd.Feild24 = @"100";
                            oCustomersTransferAdd.Feild25 = @"";
                            oCustomersTransferAdd.Feild26 = @"";
                            oCustomersTransferAdd.Feild27 = @"100";
                            oCustomersTransferAdd.Feild28 = @"";
                            oCustomersTransferAdd.Feild29 = Common.CutByteString(customer.CreateUser.Split('.')[0], 11);
                            oCustomersTransferAdd.Feild30 = @"";
                            oCustomersTransferAdd.Feild31 = @"";
                            oCustomersTransferAdd.Feild32 = @"";
                            oCustomersTransferAdd.Feild33 = @"";
                            oCustomersTransferAdd.Feild34 = @"";
                            oCustomersTransferAdd.Feild35 = @"";
                            oCustomersTransferAdd.Feild36 = @"";
                            oCustomersTransferAdd.Feild37 = @"B,C".IndexOf(customer.TransactionType) > -1 ? @"6" : @"5";
                            oCustomersTransferAdd.Feild38 = @"2";
                            oCustomersTransferAdd.Feild39 = @"";
                            oCustomersTransferAdd.Feild40 = @"";
                            oCustomersTransferAdd.Feild41 = @"1";
                            oCustomersTransferAdd.Feild42 = @"";
                            oCustomersTransferAdd.Feild43 = @"";
                            oCustomersTransferAdd.Feild44 = @"";
                            oCustomersTransferAdd.Feild45 = @"";
                            oCustomersTransferAdd.Feild46 = @"";
                            oCustomersTransferAdd.Feild47 = @"";
                            oCustomersTransferAdd.Feild48 = @"";
                            oCustomersTransferAdd.Feild49 = @"";
                            oCustomersTransferAdd.Feild50 = @"";
                            oCustomersTransferAdd.Feild51 = @"";
                            oCustomersTransferAdd.Feild52 = @"";
                            oCustomersTransferAdd.Feild53 = @"";
                            oCustomersTransferAdd.Feild54 = @"";
                            oCustomersTransferAdd.Feild55 = @"";
                            oCustomersTransferAdd.Feild56 = @"";
                            oCustomersTransferAdd.Feild57 = @"";
                            oCustomersTransferAdd.Feild58 = customer.CustomerNO;
                            oCustomersTransferAdd.Feild59 = @"";
                            oCustomersTransferAdd.Feild60 = @"";
                            oCustomersTransferAdd.Feild61 = @"";
                            oCustomersTransferAdd.Feild62 = @"";
                            oCustomersTransferAdd.Feild63 = @"";
                            oCustomersTransferAdd.Feild64 = @"";
                            oCustomersTransferAdd.Feild65 = @"";
                            oCustomersTransferAdd.Feild66 = @"";
                            oCustomersTransferAdd.Feild67 = @"";
                            oCustomersTransferAdd.Feild68 = @"";
                            oCustomersTransferAdd.Feild69 = @"";
                            oCustomersTransferAdd.Feild70 = @"";
                            oCustomersTransferAdd.Feild71 = @"";
                            oCustomersTransferAdd.Feild72 = @"";
                            oCustomersTransferAdd.Feild73 = @"";
                            oCustomersTransferAdd.Feild74 = @"";
                            oCustomersTransferAdd.Feild75 = @"";
                            oCustomersTransferAdd.Feild76 = @"";
                            oCustomersTransferAdd.Feild77 = @"";
                            oCustomersTransferAdd.Feild78 = @"";
                            oCustomersTransferAdd.Feild79 = @"";
                            oCustomersTransferAdd.Feild80 = @"";
                            oCustomersTransferAdd.Feild81 = @"";
                            oCustomersTransferAdd.Feild82 = Common.CutByteString(customer.CustomerEName, 120);
                            var sAddress = customer.Address;
                            var cn = new Regex(@"[一-龥]+");//正则表达式 表示汉字范围
                            if (cn.IsMatch(sAddress))
                            {
                                sAddress = @"";
                            }
                            oCustomersTransferAdd.Feild83 = Common.CutByteString(sAddress, 240);
                            oCustomersTransferAdd.Feild84 = @"";
                            oCustomersTransferAdd.Feild85 = @"";
                            oCustomersTransferAdd.Feild86 = @"";
                            oCustomersTransferAdd.Feild87 = @"";
                            oCustomersTransferAdd.Feild88 = @"";
                            oCustomersTransferAdd.Feild89 = @"";
                            oCustomersTransferAdd.Feild90 = @"";
                            oCustomersTransferAdd.Feild91 = @"0";
                            oCustomersTransferAdd.Feild92 = @"0";
                            oCustomersTransferAdd.Feild93 = @"";
                            oCustomersTransferAdd.Feild94 = @"";
                            oCustomersTransferAdd.Feild95 = @"";
                            oCustomersTransferAdd.Feild96 = @"";
                            oCustomersTransferAdd.Feild97 = @"";
                            oCustomersTransferAdd.Feild98 = @"";
                            oCustomersTransferAdd.Feild99 = @"";
                            db.Insertable(oCustomersTransferAdd).ExecuteCommand();
                        }

                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, customer.ToAuditer);
                    } while (false);
                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"Audit(客戶管理編輯(主管會計審核))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(主管會計審核)

        #region 客戶管理編輯(取消審核)

        /// <summary>
        /// 客戶管理編輯(取消審核)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on CancelAudit</param>
        /// <returns></returns>
        public ResponseMessage CancelAudit(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
                        var sNotPassReason = _fetchString(i_crm, @"NotPassReason");
                        var sUserName = _fetchString(i_crm, @"UserName");
                        var sdb = new SimpleClient<OTB_CRM_Customers>(db);
                        var customer = sdb.GetById(sId);

                        if (customer == null)
                        {
                            sMsg = @"系統找不到對應的客戶資料,請核查!";
                            break;
                        }

                        var sTitle = sUserName + @"客戶管理取消審核了您創建的客戶資料「" + (customer.CustomerCName.Trim() == @"" ? customer.CustomerEName : customer.CustomerCName) + @"」";
                        if (i_crm.LANG == @"zh")
                        {
                            sTitle = ChineseStringUtility.ToSimplified(sTitle);
                        }
                        //更新客戶資料
                        var oCustomersUpd = new OTB_CRM_Customers
                        {
                            IsAudit = @"N",
                            NotPassReason = sNotPassReason,
                            ModifyUser = i_crm.USERID,
                            ModifyDate = DateTime.Now
                        };
                        db.Updateable(oCustomersUpd)
                            .UpdateColumns(it => new { it.IsAudit, it.NotPassReason, it.ModifyUser, it.ModifyDate })
                            .Where(it => it.guid == sId).ExecuteCommand();
                        //更新代辦
                        SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId);

                        //添加提醒消息
                        var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, customer.ToAuditer, i_crm.CUSTOMDATA[@"program_id"] + @"|?Action=Upd&guid=" + customer.guid, WebAppGlobalConstWord.BELL);
                        db.Insertable(oTipsAdd).ExecuteCommand();
                        //添加代辦
                        var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, customer.guid, customer.ToAuditer, sTitle, i_crm.CUSTOMDATA[@"program_id"], @"?Action=Upd&guid=" + customer.guid);
                        db.Insertable(oTaskAdd).ExecuteCommand();

                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, customer.ToAuditer);
                    } while (false);
                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"CancelAudit(客戶管理編輯(取消審核))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(取消審核)

        #region 客戶管理編輯(提交申請修改)

        /// <summary>
        /// 客戶管理編輯(提交申請修改)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on ApplyforUpdate</param>
        /// <returns></returns>
        public ResponseMessage ApplyforUpdate(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        var sId = _fetchString(i_crm, @"Guid");
                        var sNotPassReason = _fetchString(i_crm, @"NotPassReason");

                        var sdb = new SimpleClient<OTB_CRM_Customers>(db);
                        var oCustomers = sdb.GetById(sId);

                        if (oCustomers == null)
                        {
                            sMsg = @"系統找不到對應的請假資料,請核查!";
                            break;
                        }

                        //更新客戶資料
                        var oCustomersUpd = new OTB_CRM_Customers
                        {
                            IsAudit = @"Z",
                            NotPassReason = sNotPassReason,
                            ModifyUser = i_crm.USERID,
                            ModifyDate = DateTime.Now
                        };
                        db.Updateable(oCustomersUpd)
                            .UpdateColumns(it => new { it.IsAudit, it.NotPassReason, it.ModifyUser, it.ModifyDate }).Where(it => it.guid == sId).ExecuteCommand();
                        var oUserInfo = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
                        var sTitle = @"客戶資料「" + (oCustomers.CustomerCName.Trim() == @"" ? oCustomers.CustomerEName : oCustomers.CustomerCName) + @"」已被" + (oUserInfo.MemberName ?? @"") + @"申請修改";

                        var listTips = new List<OTB_SYS_Tips>();
                        //List<OTB_SYS_Task> listTask = new List<OTB_SYS_Task>();
                        var lstCustomersAuditUsers = new List<string>();
                        var sCustomersAuditUsers = Common.GetSystemSetting(db, i_crm.ORIGID, @"CustomersAuditUsers");
                        if (sCustomersAuditUsers != @"")
                        {
                            var saCustomersAuditUsers = sCustomersAuditUsers.Split(new string[] { @";", @",", @",", @"|" }, StringSplitOptions.RemoveEmptyEntries);
                            lstCustomersAuditUsers = saCustomersAuditUsers.Distinct<string>().ToList();
                            foreach (string user in lstCustomersAuditUsers)
                            {
                                //添加代辦
                                //OTB_SYS_Task oTaskAdd = SYS.TaskService.TaskAdd(i_crm, oCustomers.guid, user, sTitle, i_crm.CUSTOMDATA["program_id"], "?Action=Upd&guid=" + oCustomers.guid);
                                //listTask.Add(oTaskAdd);

                                //添加提醒消息
                                var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, user, i_crm.CUSTOMDATA[@"program_id"] + @"|?Action=Upd&guid=" + oCustomers.guid, WebAppGlobalConstWord.BELL);
                                listTips.Add(oTipsAdd);
                            }
                        }
                        if (listTips.Count > 0)
                        {
                            db.Insertable(listTips).ExecuteCommand();
                        }
                        //if (listTask.Count > 0)
                        //{
                        //    db.Insertable(listTask).ExecuteCommand();
                        //}

                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, lstCustomersAuditUsers);
                    } while (false);
                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"ApplyforUpdate(客戶管理編輯(提交申請修改))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(提交申請修改)

        #region 客戶管理編輯(抓取參加展覽列表資料)

        /// <summary>
        /// 客戶管理編輯(抓取參加展覽列表資料)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on GetExhibitionlist</param>
        /// <returns></returns>
        public ResponseMessage GetExhibitionlist(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var sId = _fetchString(i_crm, @"Guid");
                    var saExhibitions = new List<Map>();
                    //出口
                    var saExport = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_ExportExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID && t1.Effective == "Y" && t2.IsVoid == "N")
                          .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Exhibitors, t2.Agent }).MergeTable()
                          .Where(it => it.ExhibitionNO != @"" && it.OrgID == i_crm.ORIGID && (it.Exhibitors.Contains(sId) || it.Agent == sId)).ToList();
                    if (saExport.Count > 0)
                    {
                        foreach (var opm in saExport)
                        {
                            if (!saExhibitions.Any(x => (x[@"SN"].ToString() == opm.SN.ToString())))
                            {
                                var m = new Map
                                {
                                    { @"RowIndex", saExhibitions.Count + 1 },
                                    { @"SN", opm.SN },
                                    { @"ExhibitionCode", opm.ExhibitionCode },
                                    { @"Exhibitioname_TW", opm.Exhibitioname_TW },
                                    { @"Exhibitioname_CN", opm.Exhibitioname_CN }
                                };
                                saExhibitions.Add(m);
                            }
                        }
                    }
                    //進口
                    var saImport = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_ImportExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID && t1.Effective == "Y" && t2.IsVoid == "N")
                          .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Suppliers, t2.Supplier, t2.Agent }).MergeTable()
                          .Where(it => it.ExhibitionNO != @"" && it.OrgID == i_crm.ORIGID && (it.Suppliers.Contains(sId) || it.Supplier == sId || it.Agent == sId)).ToList();
                    if (saImport.Count > 0)
                    {
                        foreach (var opm in saImport)
                        {
                            if (!saExhibitions.Any(x => (x[@"SN"].ToString() == opm.SN.ToString())))
                            {
                                var m = new Map
                                {
                                    { @"RowIndex", saExhibitions.Count + 1 },
                                    { @"SN", opm.SN },
                                    { @"ExhibitionCode", opm.ExhibitionCode },
                                    { @"Exhibitioname_TW", opm.Exhibitioname_TW },
                                    { @"Exhibitioname_CN", opm.Exhibitioname_CN }
                                };
                                saExhibitions.Add(m);
                            }
                        }
                    }
                    //其他
                    var saOther = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_OtherExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID && t1.Effective == "Y" && t2.IsVoid == "N")
                          .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Supplier, t2.Agent }).MergeTable()
                          .Where(it => it.ExhibitionNO != @"" && it.OrgID == i_crm.ORIGID && (it.Supplier == sId || it.Agent == sId)).ToList();
                    if (saOther.Count > 0)
                    {
                        foreach (var opm in saOther)
                        {
                            if (!saExhibitions.Any(x => (x[@"SN"].ToString() == opm.SN.ToString())))
                            {
                                var m = new Map
                                {
                                    { @"RowIndex", saExhibitions.Count + 1 },
                                    { @"SN", opm.SN },
                                    { @"ExhibitionCode", opm.ExhibitionCode },
                                    { @"Exhibitioname_TW", opm.Exhibitioname_TW },
                                    { @"Exhibitioname_CN", opm.Exhibitioname_CN }
                                };
                                saExhibitions.Add(m);
                            }
                        }
                    }
                    //其他
                    var saOtherTG = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_OtherExhibitionTG>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID && t1.Effective == "Y" && t2.IsVoid == "N")
                          .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Exhibitors, t2.Agent }).MergeTable()
                          .Where(it => it.ExhibitionNO != @"" && it.OrgID == i_crm.ORIGID && (it.Exhibitors.Contains(sId) || it.Agent == sId)).ToList();
                    if (saOtherTG.Count > 0)
                    {
                        foreach (var opm in saOtherTG)
                        {
                            if (!saExhibitions.Any(x => (x[@"SN"].ToString() == opm.SN.ToString())))
                            {
                                var m = new Map
                                {
                                    { @"RowIndex", saExhibitions.Count + 1 },
                                    { @"SN", opm.SN },
                                    { @"ExhibitionCode", opm.ExhibitionCode },
                                    { @"Exhibitioname_TW", opm.Exhibitioname_TW },
                                    { @"Exhibitioname_CN", opm.Exhibitioname_CN }
                                };
                                saExhibitions.Add(m);
                            }
                        }
                    }

                    rm = new SuccessResponseMessage(null, i_crm);
                    rm.DATA.Add(BLWording.REL, saExhibitions);
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"GetCustomers(客戶管理編輯(抓取參加展覽列表資料))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(抓取參加展覽列表資料)

        #region 客戶管理編輯((通過政府API)依據客戶編碼抓取基本資料)

        /// <summary>
        /// 客戶管理編輯((通過政府API)依據客戶編碼抓取基本資料)
        /// </summary>
        /// <param name="i_crm">
        /// <returns></returns>
        public ResponseMessage GetCrmBaseDataByUniCode(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var sUniCode = _fetchString(i_crm, @"UniCode");
                    var sKeyWords = _fetchString(i_crm, @"KeyWords");
                    var sAPIUrl = @"https://data.gcis.nat.gov.tw/od/data/api/5F64D864-61CB-4D0D-8AD9-492047CC1EA6?$format=json&$filter=Business_Accounting_NO eq ";
                    if (sUniCode != "")
                    {
                        sAPIUrl += sUniCode;
                    }
                    else
                    {
                        sAPIUrl = @"https://data.gcis.nat.gov.tw/od/data/api/6BBA2268-1367-4B42-9CCA-BC17499EBE8C?$format=json&$filter=Company_Name like " + sKeyWords + " and Company_Status eq 01";
                    }
                    var client = new HttpWebClient(sAPIUrl);

                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                    var sHtml = client.GetString();
                    rm = new SuccessResponseMessage(null, i_crm);
                    rm.DATA.Add(BLWording.REL, sHtml);
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"GetCrmBaseDataByUniCode(客戶管理編輯((通過政府API)依據客戶編碼抓取基本資料))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯((通過政府API)依據客戶編碼抓取基本資料)

        #region 客戶管理編輯(依據預約單號查詢匯入廠商)

        /// <summary>
        /// 客戶管理編輯(依據預約單號查詢匯入廠商)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on GetCrmBaseDataByUniCode</param>
        /// <returns></returns>
        public ResponseMessage GetImportCustomersByAppointNO(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var sAppointNO = _fetchString(i_crm, @"AppointNO");
                    var oImportCustomers = db.Queryable<OTB_WSM_PackingOrder, OTB_CRM_ImportCustomers>(
                        (t1, t2) => t1.OrgID == t2.OrgID && t1.CustomerId == t2.guid)
                        .Where((t1, t2) => t1.OrgID == i_crm.ORIGID && t1.AppointNO == sAppointNO)
                        .Select((t1, t2) => t2)
                        .Single();
                    rm = new SuccessResponseMessage(null, i_crm);
                    rm.DATA.Add(BLWording.REL, oImportCustomers);
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"GetImportCustomersByAppointNO(客戶管理編輯(依據預約單號查詢匯入廠商))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(依據預約單號查詢匯入廠商)

        #region 客戶管理編輯(複製同步)

        /// <summary>
        /// 客戶管理編輯(複製同步)
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on UpdImportCustomers</param>
        /// <returns></returns>
        public ResponseMessage CopySync(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            ////檢查統一編號或客戶簡稱要為唯一
            var CheckResult = CheckShortNameAndUniCode(i_crm);
            if (!CheckResult.Item1)
                return new ErrorResponseMessage(CheckResult.Item2, i_crm);

            try
            {
                rm = SugarBase.ExecTran(db =>
                {
                    do
                    {
                        string sCustomerGUID = Guid.NewGuid().ToString();
                        string sOldCustomerGUID = string.Empty;
                        string sCurrentOrgID = _fetchString(i_crm, "currOrgID");
                        //客戶資料表身
                        string sOrgID = _fetchString(i_crm, OTB_CRM_Customers.CN_ORGID);

                        if (string.IsNullOrEmpty(sOrgID))
                        {
                            sMsg = "OrgID Error";
                            break;
                        }

                        var oEntity = _fetchEntity<OTB_CRM_Customers>(i_crm);
                        _setEntityBase(oEntity, i_crm);
                        sOldCustomerGUID = oEntity.guid;
                        oEntity.guid = sCustomerGUID;
                        oEntity.OrgID = sOrgID;
                        oEntity.CustomerNO = SerialNumber.GetMaxNumberByType(oEntity.OrgID, oEntity.CustomerNO, MaxNumberType.Empty, i_crm.USERID, 3);

                        //客戶資料表頭
                        var oMstEntity = _fetchEntity<OTB_CRM_CustomersMST>(i_crm);
                        _setEntityBase(oMstEntity, i_crm);
                        oMstEntity.guid = Guid.NewGuid().ToString();
                        oMstEntity.CustomerNO = oEntity.CustomerNO;
                        oMstEntity.customer_guid = sCustomerGUID;
                        oMstEntity.Effective = "Y";

                        //找出參展資料並複製到不同公司別
                        #region 出口

                        //var saExport = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_ExportExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID)
                        //                 .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Exhibitors, t2.Agent }).MergeTable()
                        //                 .Where(it => it.ExhibitionNO != @"" && it.OrgID == sCurrentOrgID && (it.Exhibitors.Contains(sOldCustomerGUID) || it.Agent == sOldCustomerGUID))
                        //                 .ToList();

                        //if (saExport.Count > 0)
                        //{
                        //    List<OTB_OPM_Exhibition> lExh = db.Queryable<OTB_OPM_Exhibition>()
                        //                                    .Where(p => p.SN == saExport.Select(x => x.SN).First())
                        //                                    .ToList();

                        //    foreach (OTB_OPM_Exhibition data in lExh)
                        //    {
                        //        data.OrgID = sOrgID;
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;
                        //    }

                        //    List<OTB_OPM_ExportExhibition> lExportExh = db.Queryable<OTB_OPM_ExportExhibition>()
                        //                                    .Where(p => p.ExhibitionNO == saExport.Select(x => x.SN).First().ToString())
                        //                                    .ToList();

                        //    var exData = db.Insertable<OTB_OPM_Exhibition>(lExh)
                        //                                  .IgnoreColumns(p => p == OTB_OPM_Exhibition.CN_SN)
                        //                                  .ExecuteReturnIdentity();

                        //    foreach (OTB_OPM_ExportExhibition data in lExportExh)
                        //    {
                        //        data.ExportBillNO = Guid.NewGuid().ToString();
                        //        data.ExhibitionNO = exData.ToString();
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;

                        //        if (data.Exhibitors.IndexOf(sOldCustomerGUID) > -1)
                        //        {
                        //            data.Exhibitors.Replace(sOldCustomerGUID, sCustomerGUID);
                        //        }

                        //        if (data.Agent == sOldCustomerGUID)
                        //        {
                        //            data.Agent = sCustomerGUID;
                        //        }

                        //    }

                        //    db.Insertable<OTB_OPM_ExportExhibition>(lExportExh)
                        //                .ExecuteCommand();
                        //}

                        #endregion

                        #region 進口

                        //var saImport = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_ImportExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID)
                        //                 .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Supplier, t2.Agent }).MergeTable()
                        //                 .Where(it => it.ExhibitionNO != @"" && it.OrgID == sCurrentOrgID && (it.Supplier.Contains(sOldCustomerGUID) || it.Agent == sOldCustomerGUID))
                        //                 .ToList();

                        //if (saImport.Count > 0)
                        //{
                        //    List<OTB_OPM_Exhibition> lExh = db.Queryable<OTB_OPM_Exhibition>()
                        //                                    .Where(p => p.SN == saImport.Select(x => x.SN).First())
                        //                                    .ToList();

                        //    foreach (OTB_OPM_Exhibition data in lExh)
                        //    {
                        //        data.OrgID = sOrgID;
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;
                        //    }

                        //    List<OTB_OPM_ImportExhibition> lImportExh = db.Queryable<OTB_OPM_ImportExhibition>()
                        //                                    .Where(p => p.ExhibitionNO == saImport.Select(x => x.SN).First().ToString())
                        //                                    .ToList();

                        //    var exData = db.Insertable<OTB_OPM_Exhibition>(lExh)
                        //                                  .IgnoreColumns(p => p == OTB_OPM_Exhibition.CN_SN)
                        //                                  .ExecuteReturnIdentity();

                        //    foreach (OTB_OPM_ImportExhibition data in lImportExh)
                        //    {
                        //        data.ExportBillNO = Guid.NewGuid().ToString();
                        //        data.ExhibitionNO = exData.ToString();
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;

                        //        if (data.Supplier.IndexOf(sOldCustomerGUID) > -1)
                        //        {
                        //            data.Supplier.Replace(sOldCustomerGUID, sCustomerGUID);
                        //        }

                        //        if (data.Agent == sOldCustomerGUID)
                        //        {
                        //            data.Agent = sCustomerGUID;
                        //        }

                        //    }

                        //    db.Insertable<OTB_OPM_ImportExhibition>(lImportExh)
                        //                .ExecuteCommand();
                        //}

                        #endregion

                        #region 其他

                        //var saOther = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_OtherExhibition>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID)
                        //                 .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Supplier, t2.Agent }).MergeTable()
                        //                 .Where(it => it.ExhibitionNO != @"" && it.OrgID == sCurrentOrgID && (it.Supplier == sOldCustomerGUID || it.Agent == sOldCustomerGUID))
                        //                 .ToList();

                        //if (saOther.Count > 0)
                        //{
                        //    List<OTB_OPM_Exhibition> lExh = db.Queryable<OTB_OPM_Exhibition>()
                        //                                    .Where(p => p.SN == saOther.Select(x => x.SN).First())
                        //                                    .ToList();

                        //    foreach (OTB_OPM_Exhibition data in lExh)
                        //    {
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;
                        //    }

                        //    List<OTB_OPM_OtherExhibition> lOtherExh = db.Queryable<OTB_OPM_OtherExhibition>()
                        //                                    .Where(p => p.ExhibitionNO == saOther.Select(x => x.SN).First().ToString())
                        //                                    .ToList();

                        //    var exData = db.Insertable<OTB_OPM_Exhibition>(lExh)
                        //                                  .IgnoreColumns(p => p == OTB_OPM_Exhibition.CN_SN)
                        //                                  .ExecuteReturnIdentity();

                        //    foreach (OTB_OPM_OtherExhibition data in lOtherExh)
                        //    {
                        //        data.Guid = Guid.NewGuid().ToString();
                        //        data.ExhibitionNO = exData.ToString();
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;

                        //        if (data.Supplier == sOldCustomerGUID)
                        //        {
                        //            data.Supplier = sCustomerGUID;
                        //        }

                        //        if (data.Agent == sOldCustomerGUID)
                        //        {
                        //            data.Agent = sCustomerGUID;
                        //        }

                        //    }

                        //    db.Insertable<OTB_OPM_OtherExhibition>(lOtherExh)
                        //                .ExecuteCommand();
                        //}

                        #endregion

                        #region 其他(駒驛)

                        //var saOtherTG = db.Queryable<OTB_OPM_Exhibition, OTB_OPM_OtherExhibitionTG>((t1, t2) => t1.SN.ToString() == t2.ExhibitionNO && t1.OrgID == t2.OrgID)
                        //                 .Select((t1, t2) => new { t1.OrgID, t1.SN, t1.ExhibitionCode, t1.Exhibitioname_TW, t1.Exhibitioname_CN, t2.ExhibitionNO, t2.Exhibitors, t2.Agent }).MergeTable()
                        //                 .Where(it => it.ExhibitionNO != @"" && it.OrgID == sCurrentOrgID && (it.Exhibitors.Contains(sOldCustomerGUID) || it.Agent == sOldCustomerGUID))
                        //                 .ToList();

                        //if (saOtherTG.Count > 0)
                        //{
                        //    List<OTB_OPM_Exhibition> lExh = db.Queryable<OTB_OPM_Exhibition>()
                        //                                    .Where(p => p.SN == saOtherTG.Select(x => x.SN).First())
                        //                                    .ToList();

                        //    foreach (OTB_OPM_Exhibition data in lExh)
                        //    {

                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;
                        //    }

                        //    List<OTB_OPM_OtherExhibitionTG> lOtherTGExh = db.Queryable<OTB_OPM_OtherExhibitionTG>()
                        //                                    .Where(p => p.ExhibitionNO == saOtherTG.Select(x => x.SN).First().ToString())
                        //                                    .ToList();

                        //    var exData = db.Insertable<OTB_OPM_Exhibition>(lExh)
                        //                                  .IgnoreColumns(p => p == OTB_OPM_Exhibition.CN_SN)
                        //                                  .ExecuteReturnIdentity();

                        //    foreach (OTB_OPM_OtherExhibitionTG data in lOtherTGExh)
                        //    {
                        //        data.Guid = Guid.NewGuid().ToString();
                        //        data.ExhibitionNO = exData.ToString();
                        //        data.OrgID = sOrgID;
                        //        data.CreateUser = i_crm.USERID;
                        //        data.CreateDate = DateTime.Now;
                        //        data.ModifyUser = i_crm.USERID;
                        //        data.ModifyDate = DateTime.Now;

                        //        if (data.Exhibitors.IndexOf(sOldCustomerGUID) > -1)
                        //        {
                        //            data.Exhibitors.Replace(sOldCustomerGUID, sCustomerGUID);
                        //        }

                        //        if (data.Agent == sOldCustomerGUID)
                        //        {
                        //            data.Agent = sCustomerGUID;
                        //        }

                        //    }

                        //    db.Insertable<OTB_OPM_OtherExhibitionTG>(lOtherTGExh)
                        //                .ExecuteCommand();
                        //}

                        #endregion

                        var iRel = db.Insertable(oEntity).ExecuteReturnEntity();
                        var iRelMst = db.Insertable(oMstEntity).ExecuteCommand();
                        rm = new SuccessResponseMessage(null, i_crm);
                        rm.DATA.Add(BLWording.REL, iRel);
                    } while (false);

                    return rm;
                });
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Customers_UpdService), @"客戶管理編輯", @"Update(客戶管理編輯(修改))", @"", @"", @"");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 客戶管理編輯(修改)
    }
}