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.
2261 lines
134 KiB
2261 lines
134 KiB
using Aspose.Cells;
|
|
using EasyBL.WebApi.Message;
|
|
using EasyNet.Common;
|
|
using Entity.Sugar;
|
|
using Entity.ViewModels;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using SqlSugar;
|
|
using SqlSugar.Base;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Diagnostics;
|
|
|
|
namespace EasyBL.WEBAPP.RPT
|
|
{
|
|
public class CostAndProfitReportService : ServiceBase
|
|
{
|
|
private bool ShowSource = false;
|
|
private static int TimeOut = 120;
|
|
#region 利潤明細表(依業務)
|
|
|
|
public ResponseMessage CVPAnalysisBySaler(RequestMessage i_crm)
|
|
{
|
|
//帳單(拋轉)區間、銷帳區間、部門、業務
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(CVPAnalysisBySaler);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "利潤明細表(依業務)");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var CurrencyUnit = CommonRPT.GetCurrencyUnit(i_crm.ORIGID);
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
|
|
var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
|
|
var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
var sBillAuditDateStart = _fetchString(i_crm, @"BillAuditDateStart");
|
|
var sBillAuditDateEnd = _fetchString(i_crm, @"BillAuditDateEnd");
|
|
var sBillWriteOffDateStart = _fetchString(i_crm, @"BillWriteOffDateStart");
|
|
var sBillWriteOffDateEnd = _fetchString(i_crm, @"BillWriteOffDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
|
|
var SearchMatchedExps = !string.IsNullOrWhiteSpace(sResponsibleDeptID) || !string.IsNullOrWhiteSpace(sResponsiblePerson);
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var MatchedExpList = CommonRPT.GetMatchedExps(db, i_crm.ORIGID, ChildDeptIDs, sResponsiblePerson);
|
|
var MatchedExpGuids = MatchedExpList.Select(t1 => t1.Guid).Distinct().ToArray();
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
var Filter = new CVPFilter();
|
|
Filter.SetBill(sBillAuditDateStart, sBillAuditDateEnd, sBillWriteOffDateStart, sBillWriteOffDateEnd);
|
|
//撈取符合的billguid
|
|
var view = db.Queryable<OVW_OPM_Bills, OTB_OPM_BillInfo>
|
|
((t1, t2) =>
|
|
new object[] {
|
|
JoinType.Inner, t1.OrgID == t2.OrgID && t1.BillNO == t2.BillNO
|
|
}
|
|
)
|
|
.Where((t1, t2) => t1.OrgID == i_crm.ORIGID && Filter.PassStatus.Contains(t2.AuditVal))
|
|
.WhereIF(SearchMatchedExps, (t1, t2) => SqlFunc.ContainsArray(MatchedExpGuids, t2.ParentId))
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateStart), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) >= Filter.rBillAuditDateStart.Date)
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateEnd), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) < Filter.rBillAuditDateEnd.Date)
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillWriteOffDateStart), (t1, t2) => SqlFunc.ToDate(t2.BillWriteOffDate) >= Filter.rBillWriteOffDateStart.Date)
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillWriteOffDateEnd), (t1, t2) => SqlFunc.ToDate(t2.BillWriteOffDate) < Filter.rBillWriteOffDateEnd.Date);
|
|
var saBills = view.Select((t1, t2) =>
|
|
new View_OPM_BillIReport
|
|
{
|
|
BillNO = t2.BillNO,
|
|
BillType = t2.BillType,
|
|
ParentId = t2.ParentId,
|
|
ProjectNumber = t1.ProjectNumber,
|
|
CustomerCode = t1.CustomerCode,
|
|
ResponsiblePerson = t2.ResponsiblePerson,
|
|
Currency = t2.Currency,
|
|
ExchangeRate = t2.ExchangeRate,
|
|
InCome = t1.TWNOTaxAmount, //未稅總計
|
|
OrgID = t2.OrgID,
|
|
IsReturn = t2.IsRetn,
|
|
Volume = t2.Volume,
|
|
AuditVal = t2.AuditVal,
|
|
ReFlow = t2.ReFlow,
|
|
FeeItems = t2.FeeItems
|
|
})
|
|
.MergeTable()
|
|
.OrderBy("ResponsiblePerson", "asc")
|
|
.ToList();
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 4;
|
|
cells[1, 1].PutValue(sBillAuditDateStart + "~" + sBillAuditDateEnd);//帳單區間
|
|
cells[1, 11].PutValue(i_crm.USERID);//列表人
|
|
cells[2, 1].PutValue(string.Join(",", ChildDeptIDs));//部門
|
|
cells[2, 11].PutValue(DateTime.Now.ToString(@"yyyy/MM/dd"));//列印時間
|
|
var AllofPorfits = new List<ProfitInfo>();
|
|
var group = saBills.GroupBy(c => c.ResponsiblePerson).OrderBy(c => c.Key);
|
|
var CellType = GetCellType(RPTEnum.CVPAnalysisBySaler, RoundingPoint, ShowSource);
|
|
var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
|
|
foreach (IGrouping<string, View_OPM_BillIReport> bills in group)
|
|
{
|
|
var _bills = bills.OrderBy(x => x.BillType).ThenBy(x => x.ProjectNumber).ThenBy(x => x.ParentId);
|
|
var SubProfits = new List<ProfitInfo>();
|
|
foreach (View_OPM_BillIReport bill in _bills)
|
|
{
|
|
var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == bill.ParentId && t1.IsReturn == bill.IsReturn).ToList();
|
|
var BillUntaxAmt = bill.InCome * decimal.Parse(bill.ExchangeRate == "" ? "0" : bill.ExchangeRate);
|
|
var ActualCostFeeItemJson = "";
|
|
var sActualCost = "";
|
|
var sTransportationMode = "";
|
|
|
|
CommonRPT.CalcuCostAndProfit(db, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, bill.BillNO, bill.ParentId, bill.IsReturn, bill.ReFlow, bill.BillType);
|
|
var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
|
|
var BillFeeItemList = CommonRPT.ToFeeItems(bill.FeeItems);
|
|
var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO);
|
|
var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
|
|
var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO, ActualPrepayFeeList);//抓實際成本的資料
|
|
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
ExField = bill.IsReturn,
|
|
MemberID = bill.ResponsiblePerson,
|
|
BillUntaxAmt = BillUntaxAmt.Value,
|
|
SharedActualCost = SharedActualCost,
|
|
BillReimburseAmount = BillReimburseAmount,
|
|
ActualBillReimburseAmount = ActualBillReimburseAmount
|
|
};
|
|
if (ShowSource)
|
|
{
|
|
profitInfo.BillNO = $"類型:{bill.BillType}-單號:{bill.BillNO}-狀態:{bill.AuditVal}";
|
|
}
|
|
SubProfits.Add(profitInfo);
|
|
}
|
|
var GroupByLogistic = SubProfits.GroupBy(c => c.ExField);
|
|
ProfitInfo SubtotalProfitInfo = new ProfitInfo() { MemberID = _bills.FirstOrDefault()?.ResponsiblePerson };
|
|
foreach (var items in GroupByLogistic)
|
|
{
|
|
SubtotalProfitInfo.BillUntaxAmt += CommonRPT.Rounding(items.Sum(c => c.BillUntaxAmt), RoundingPoint);
|
|
SubtotalProfitInfo.SharedActualCost += CommonRPT.Rounding(items.Sum(c => c.SharedActualCost), RoundingPoint);
|
|
SubtotalProfitInfo.BillReimburseAmount += CommonRPT.Rounding(items.Sum(c => c.BillReimburseAmount), RoundingPoint);
|
|
SubtotalProfitInfo.ActualBillReimburseAmount += CommonRPT.Rounding(items.Sum(c => c.ActualBillReimburseAmount), RoundingPoint);
|
|
}
|
|
var CellColumns = CalcuCellValue(RPTEnum.CVPAnalysisBySaler, SubtotalProfitInfo).ToList();
|
|
if (ShowSource)
|
|
{
|
|
SubtotalProfitInfo.BillNO = string.Join("■", SubProfits.Select(test => test.BillNO));
|
|
CellColumns.Add(SubtotalProfitInfo.BillNO);
|
|
}
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
AllofPorfits.Add(SubtotalProfitInfo);
|
|
iCurrRow++;
|
|
}
|
|
//總計
|
|
if (AllofPorfits.Any())
|
|
{
|
|
ProfitInfo TotalProfitInfo = new ProfitInfo()
|
|
{
|
|
MemberID = $"合計({CurrencyUnit})",
|
|
BillUntaxAmt = CommonRPT.Rounding(AllofPorfits.Sum(c => c.BillUntaxAmt), RoundingPoint),
|
|
SharedActualCost = CommonRPT.Rounding(AllofPorfits.Sum(c => c.SharedActualCost), RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(AllofPorfits.Sum(c => c.BillReimburseAmount), RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(AllofPorfits.Sum(c => c.ActualBillReimburseAmount), RoundingPoint),
|
|
};
|
|
var CellColumns = CalcuCellValue(RPTEnum.CVPAnalysisBySaler, TotalProfitInfo);
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
}
|
|
cellsApp.sheet.AutoFitColumns();
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName, "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
#region 利潤明細表(依展覽)
|
|
|
|
public ResponseMessage CVPAnalysisByExhibition(RequestMessage i_crm)
|
|
{
|
|
//展覽區間(第一天)、展覽名稱
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(CVPAnalysisByExhibition);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "利潤明細表(依展覽)");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var CurrencyUnit = CommonRPT.GetCurrencyUnit(i_crm.ORIGID);
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
|
|
var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
|
|
var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
var sExhibitionDateStart = _fetchString(i_crm, @"ExhibitionDateStart");
|
|
var sExhibitionDateEnd = _fetchString(i_crm, @"ExhibitionDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
|
|
var SearchMatchedExps = !string.IsNullOrWhiteSpace(sResponsibleDeptID) || !string.IsNullOrWhiteSpace(sResponsiblePerson);
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var MatchedExpList = CommonRPT.GetMatchedExps(db, i_crm.ORIGID, ChildDeptIDs, sResponsiblePerson);
|
|
var MatchedExpGuids = MatchedExpList.Select(t1 => t1.Guid).Distinct().ToArray();
|
|
var Filter = new CVPFilter();
|
|
Filter.SetExhibition(sExhibitionDateStart, sExhibitionDateEnd);
|
|
//根據前端選擇
|
|
var sProjectNO = _fetchString(i_crm, @"ProjectNO"); //ProjectNO == OTB_OPM_Exhibition.ExhibitionCode
|
|
var sProjectName = _fetchString(i_crm, @"ProjectName");
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
//展覽區間依「展覽日期第一天」來定義區間
|
|
var MatchedExhibitions = db.Queryable<OTB_OPM_Exhibition>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateStart), (t1) => t1.ExhibitionDateStart >= Filter.rExhibitionDateStart.Date)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateEnd), (t1) => t1.ExhibitionDateStart < Filter.rExhibitionDateEnd.Date)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sProjectName), (t1) =>
|
|
t1.Exhibitioname_EN.Contains(sProjectName) || t1.Exhibitioname_TW.Contains(sProjectName) ||
|
|
t1.Exhibitioname_CN.Contains(sProjectName) || t1.ExhibitioShotName_TW.Contains(sProjectName) ||
|
|
t1.ExhibitioShotName_CN.Contains(sProjectName) || t1.ExhibitioShotName_EN.Contains(sProjectName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sProjectNO), (t1) => t1.ExhibitionCode == sProjectNO)
|
|
.Select(ex => new { ex.ExhibitionCode, ex.ExhibitioShotName_TW, ex.ExhibitionDateStart, SN = ex.SN.ToString(), ProjectNumber = ex.SN.ToString() }).ToList();
|
|
var FindProjectNum = MatchedExhibitions.Select(c => c.ExhibitionCode).ToArray();
|
|
//挑調
|
|
var saBills = new List<View_OPM_BillIReport>();
|
|
//資料guid
|
|
if (FindProjectNum.Length != 0)
|
|
{
|
|
var view = db.Queryable<OVW_OPM_Bills, OTB_OPM_BillInfo>
|
|
((t1, t2) => new object[] {
|
|
JoinType.Inner, t1.OrgID == t2.OrgID && t1.BillNO == t2.BillNO })
|
|
.Where((t1, t2) => t1.OrgID == i_crm.ORIGID && CommonRPT.PassStatus.Contains(t2.AuditVal))
|
|
.WhereIF(FindProjectNum.Any(), (t1, t2) => !SqlFunc.IsNullOrEmpty(t1.ProjectNumber) && SqlFunc.ContainsArray(FindProjectNum, t1.ProjectNumber))
|
|
.WhereIF(SearchMatchedExps, (t1, t2) => SqlFunc.ContainsArray(MatchedExpGuids, t2.ParentId));
|
|
saBills = view.Select((t1, t2) =>
|
|
new View_OPM_BillIReport
|
|
{
|
|
BillNO = t2.BillNO,
|
|
BillType = t2.BillType,
|
|
ParentId = t2.ParentId,
|
|
ProjectNumber = t1.ProjectNumber,
|
|
CustomerCode = t1.CustomerCode,
|
|
ResponsiblePerson = t2.ResponsiblePerson,
|
|
Currency = t2.Currency,
|
|
ExchangeRate = t2.ExchangeRate,
|
|
InCome = t1.TWNOTaxAmount, //未稅總計
|
|
OrgID = t2.OrgID,
|
|
IsReturn = t2.IsRetn,
|
|
Volume = t2.Volume,
|
|
AuditVal = t2.AuditVal,
|
|
ReFlow = t2.ReFlow,
|
|
FeeItems = t2.FeeItems
|
|
})
|
|
.MergeTable()
|
|
.OrderBy("ResponsiblePerson", "asc")
|
|
.ToList();
|
|
}
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 4;
|
|
var iCurrRowOri = iCurrRow;
|
|
cells[1, 1].PutValue(sExhibitionDateStart + "~" + sExhibitionDateEnd);//展覽區間
|
|
cells[1, 11].PutValue(i_crm.USERID);//列表人
|
|
cells[2, 1].PutValue(string.Join(",", ChildDeptIDs));//部門
|
|
cells[2, 11].PutValue(DateTime.Now.ToString(@"yyyy/MM/dd"));//列印時間
|
|
var AllofPorfits = new List<ProfitInfo>();
|
|
var group = saBills.GroupBy(c => c.ProjectNumber).OrderBy(c => c.Key);
|
|
var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
|
|
foreach (IGrouping<string, View_OPM_BillIReport> bills in group)
|
|
{
|
|
var _bills = bills.OrderBy(x => x.BillNO).ThenBy(x => x.BillType).ThenBy(x => x.ProjectNumber).ThenBy(x => x.ParentId);
|
|
|
|
var SubProfits = new List<ProfitInfo>();
|
|
foreach (View_OPM_BillIReport bill in _bills)
|
|
{
|
|
var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == bill.ParentId && t1.IsReturn == bill.IsReturn).ToList();
|
|
var BillUntaxAmt = bill.InCome * decimal.Parse(bill.ExchangeRate == "" ? "0" : bill.ExchangeRate);
|
|
var ActualCostFeeItemJson = "";
|
|
var sActualCost = "";
|
|
var sTransportationMode = "";
|
|
|
|
CommonRPT.CalcuCostAndProfit(db, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, bill.BillNO, bill.ParentId, bill.IsReturn, bill.ReFlow, bill.BillType);
|
|
var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
|
|
var BillFeeItemList = CommonRPT.ToFeeItems(bill.FeeItems);
|
|
var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO);
|
|
var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
|
|
var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO, ActualPrepayFeeList);//抓實際成本的資料
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
ExField = bill.IsReturn,
|
|
BillUntaxAmt = BillUntaxAmt.Value,
|
|
SharedActualCost = SharedActualCost,
|
|
BillReimburseAmount = BillReimburseAmount,
|
|
ActualBillReimburseAmount = ActualBillReimburseAmount
|
|
};
|
|
if (ShowSource)
|
|
{
|
|
profitInfo.BillNO = $"類型:{bill.BillType}-單號:{bill.BillNO}-狀態:{bill.AuditVal}";
|
|
}
|
|
SubProfits.Add(profitInfo);
|
|
}
|
|
var Exhibition = MatchedExhibitions.Find(c => c.ExhibitionCode == _bills.FirstOrDefault()?.ProjectNumber);
|
|
//分成正物流、逆物流計算
|
|
var GroupByLogistic = SubProfits.GroupBy(c => c.ExField);
|
|
ProfitInfo SubtotalProfitInfo = new ProfitInfo() { MemberID = Exhibition.ExhibitioShotName_TW };
|
|
foreach (var items in GroupByLogistic)
|
|
{
|
|
SubtotalProfitInfo.BillUntaxAmt += CommonRPT.Rounding(items.Sum(c => c.BillUntaxAmt), RoundingPoint);
|
|
SubtotalProfitInfo.SharedActualCost += CommonRPT.Rounding(items.Sum(c => c.SharedActualCost), RoundingPoint);
|
|
SubtotalProfitInfo.BillReimburseAmount += CommonRPT.Rounding(items.Sum(c => c.BillReimburseAmount), RoundingPoint);
|
|
SubtotalProfitInfo.ActualBillReimburseAmount += CommonRPT.Rounding(items.Sum(c => c.ActualBillReimburseAmount), RoundingPoint);
|
|
}
|
|
SubtotalProfitInfo.OrderValue = Exhibition.ExhibitionDateStart == null ? 0 : Exhibition.ExhibitionDateStart.Value.Ticks;
|
|
if (ShowSource)
|
|
{
|
|
SubtotalProfitInfo.BillNO = string.Join("■", SubProfits.Select(test => test.BillNO));
|
|
}
|
|
AllofPorfits.Add(SubtotalProfitInfo);
|
|
iCurrRow++;
|
|
|
|
}
|
|
|
|
//總計
|
|
if (AllofPorfits.Any())
|
|
{
|
|
List<object> CellColumns = null;
|
|
var CellType = GetCellType(RPTEnum.CVPAnalysisByExhibition, RoundingPoint, ShowSource);
|
|
//依展期先後順序排序
|
|
foreach (var SubtotalProfitInfo in AllofPorfits.OrderBy(c => c.OrderValue))
|
|
{
|
|
|
|
CellColumns = CalcuCellValue(RPTEnum.CVPAnalysisBySaler, SubtotalProfitInfo);
|
|
if (ShowSource)
|
|
{
|
|
CellColumns.Add(SubtotalProfitInfo.BillNO);
|
|
}
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRowOri, CellColumns, CellType);
|
|
++iCurrRowOri;
|
|
}
|
|
//總計
|
|
ProfitInfo TotalProfitInfo = new ProfitInfo()
|
|
{
|
|
MemberID = $"合計({CurrencyUnit})",
|
|
BillUntaxAmt = CommonRPT.Rounding(AllofPorfits.Sum(c => c.BillUntaxAmt), RoundingPoint),
|
|
SharedActualCost = CommonRPT.Rounding(AllofPorfits.Sum(c => c.SharedActualCost), RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(AllofPorfits.Sum(c => c.BillReimburseAmount), RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(AllofPorfits.Sum(c => c.ActualBillReimburseAmount), RoundingPoint),
|
|
};
|
|
CellColumns = CalcuCellValue(RPTEnum.CVPAnalysisBySaler, TotalProfitInfo);
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
}
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile);
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
#region 金流帳單
|
|
|
|
public ResponseMessage CashFlow(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(CashFlow);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "金流帳單");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
|
|
var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
|
|
var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
#region BillType 帳單資料:「帳單號碼」、 「帳單狀態」 、 「帳單拋轉日期」、 「銷帳日期」(OTB_OPM_BillInfo )
|
|
var sBillNO = _fetchString(i_crm, @"BillNO");
|
|
var sBillStatus = _fetchString(i_crm, @"BillStatus");
|
|
var sBillAuditDateStart = _fetchString(i_crm, @"BillAuditDateStart");
|
|
var sBillAuditDateEnd = _fetchString(i_crm, @"BillAuditDateEnd");
|
|
var sBillWriteOffDateStart = _fetchString(i_crm, @"BillWriteOffDateStart");
|
|
var sBillWriteOffDateEnd = _fetchString(i_crm, @"BillWriteOffDateEnd");
|
|
var Filter = new CVPFilter();
|
|
Filter.SetBill(sBillAuditDateStart, sBillAuditDateEnd, sBillWriteOffDateStart, sBillWriteOffDateEnd, sBillStatus);
|
|
#endregion
|
|
|
|
#region ExhibitionType 展覽資料:「專案代號」、「展覽名稱」、「展覽區間(第1天)」、「組團單位」(OTB_OPM_BillInfo : ExhibitionNO => OTB_OPM_Exhibition.SN)
|
|
var sExhibitionCode = _fetchString(i_crm, @"ExhibitionCode");
|
|
var sExhibitionName = _fetchString(i_crm, @"ExhibitionName");
|
|
var sExhibitionSN = _fetchString(i_crm, @"ExhibitionSN");
|
|
var sExhibitionDateStart = _fetchString(i_crm, @"ExhibitionDateStart");
|
|
var sExhibitionDateEnd = _fetchString(i_crm, @"ExhibitionDateEnd");
|
|
var sOrganizerGuid = _fetchString(i_crm, @"OrganizerGuid");
|
|
Filter.SetExhibition(sExhibitionDateStart, sExhibitionDateEnd);
|
|
#endregion
|
|
|
|
#region CustomerType 顧客資料:「客戶名稱」、「客戶編號」、「客戶類別(國內 / 外)」(OTB_OPM_BillInfo : Payer => OTB_CRM_Customers.guid)
|
|
var sCustomerName = _fetchString(i_crm, @"CustomerName");
|
|
var sCustomerGuid = _fetchString(i_crm, @"CustomerGuid");
|
|
var sCustomerNO = _fetchString(i_crm, @"CustomerNO");
|
|
var sTranType = _fetchString(i_crm, @"TransType");
|
|
#endregion
|
|
|
|
#region SalerType 業務資料:「負責部門、組別」、「負責業務」(OTB_OPM_BillInfo :ResponsiblePerson => OTB_SYS_Members.MemberID)
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var MatchedExps = CommonRPT.GetMatchedExps(db, i_crm.ORIGID, ChildDeptIDs, sResponsiblePerson);
|
|
var MatchedExpGuids = MatchedExps.Select(x => x.Guid).Distinct().ToArray();
|
|
#endregion
|
|
|
|
#region Exhibition(四展覽)
|
|
var viewExpIm = db.Queryable<OTB_OPM_ImportExhibition>().Where(t1 => t1.OrgID == i_crm.ORIGID)
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
Id = t1.ImportBillNO,
|
|
ExhibitionType = "ExhibitionImport_Upd",
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
});
|
|
var viewExpEx = db.Queryable<OTB_OPM_ExportExhibition>().Where(t1 => t1.OrgID == i_crm.ORIGID)
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
Id = t1.ExportBillNO,
|
|
ExhibitionType = "ExhibitionExport_Upd",
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
});
|
|
var viewExpOth = db.Queryable<OTB_OPM_OtherExhibition>().Where(t1 => t1.OrgID == i_crm.ORIGID)
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
Id = t1.Guid,
|
|
ExhibitionType = "OtherBusiness_Upd",
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
});
|
|
var viewExpOthtG = db.Queryable<OTB_OPM_OtherExhibitionTG>().Where(t1 => t1.OrgID == i_crm.ORIGID)
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
Id = t1.Guid,
|
|
ExhibitionType = "OtherExhibitionTG_Upd",
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
});
|
|
var saExps = db.UnionAll(viewExpIm, viewExpEx, viewExpOth, viewExpOthtG).ToList();
|
|
|
|
#endregion
|
|
var saBills = db.Queryable<OTB_OPM_BillInfo, OTB_OPM_Exhibition, OTB_SYS_Arguments, OTB_CRM_Customers, OTB_CRM_CustomersMST, OTB_SYS_Members>((bill, exp, args, cus, cus_m, mber) => new object[] {
|
|
JoinType.Left, bill.OrgID == exp.OrgID && bill.ExhibitionNO == exp.SN.ToString(),
|
|
JoinType.Left, args.OrgID == "TE" && exp.Industry == args.ArgumentID && args.ArgumentClassID == "ExhibClass",
|
|
JoinType.Left, bill.OrgID == cus.OrgID && bill.Payer == cus.guid,
|
|
JoinType.Left, cus.OrgID == cus_m.OrgID && cus.guid == cus_m.customer_guid,
|
|
JoinType.Left, bill.OrgID == mber.OrgID && bill.ResponsiblePerson == mber.MemberID })
|
|
.Where(bill => bill.OrgID == i_crm.ORIGID)
|
|
//帳單資料:「帳單號碼」、 「帳單狀態」 、 「帳單拋轉日期」、 「銷帳日期」
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sBillNO), bill => bill.BillNO.Contains(sBillNO))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.PassStatus), bill => Filter.PassStatus.Contains(bill.AuditVal))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sBillAuditDateStart), bill => SqlFunc.ToDate(bill.BillFirstCheckDate) >= Filter.rBillAuditDateStart)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sBillAuditDateEnd), bill => SqlFunc.ToDate(bill.BillFirstCheckDate) < Filter.rBillAuditDateEnd)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sBillWriteOffDateStart), bill => SqlFunc.ToDate(bill.BillWriteOffDate) >= Filter.rBillWriteOffDateStart)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sBillWriteOffDateEnd), bill => SqlFunc.ToDate(bill.BillWriteOffDate) < Filter.rBillWriteOffDateEnd)
|
|
//展覽資料:「專案代號」、「展覽名稱」、「展覽區間(第1天)」、 「組團單位」?????
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionCode), (bill, exp) => exp.ExhibitionCode == sExhibitionCode)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionName), (bill, exp) => exp.Exhibitioname_EN.Contains(sExhibitionName) || exp.Exhibitioname_TW.Contains(sExhibitionName) ||
|
|
exp.Exhibitioname_CN.Contains(sExhibitionName) || exp.ExhibitioShotName_TW.Contains(sExhibitionName) ||
|
|
exp.ExhibitioShotName_CN.Contains(sExhibitionName) || exp.ExhibitioShotName_EN.Contains(sExhibitionName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionSN), (bill, exp) => exp.SN.ToString() == sExhibitionSN)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateStart), (bill, exp) => SqlFunc.ToDate(exp.ExhibitionDateStart) >= Filter.rExhibitionDateStart)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateEnd), (bill, exp) => SqlFunc.ToDate(exp.ExhibitionDateStart) < Filter.rExhibitionDateEnd)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sOrganizerGuid), (bill) => bill.Organizer.Contains(sOrganizerGuid))
|
|
//顧客資料:「客戶名稱」、「客戶編號」、「客戶類別(國內 / 外)」
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerName), (bill, exp, args, cus) => cus.CustomerCName.Contains(sCustomerName) || cus.CustomerEName.Contains(sCustomerName) ||
|
|
cus.CustomerShotCName.Contains(sCustomerName) || cus.CustomerShotEName.Contains(sCustomerName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerNO), (bill, exp, args, cus, cus_m) => cus_m.CustomerNO.Contains(sCustomerNO))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerGuid), (bill, exp, args, cus, cus_m) => cus.guid == sCustomerGuid)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sTranType), (bill, exp, args, cus, cus_m) => sTranType.Contains(cus.TransactionType))
|
|
.Where((bill, exp, args, cus, cus_m) => cus_m.Effective == "Y")
|
|
//業務資料:「負責部門、組別」、「負責業務」
|
|
.WhereIF(!string.IsNullOrEmpty(sResponsibleDeptID) || !string.IsNullOrEmpty(sResponsiblePerson),
|
|
(bill, exp, args, cus, cus_m) => SqlFunc.ContainsArray(MatchedExpGuids, bill.ParentId))
|
|
.Select((bill, exp, args, cus, cus_m, mber) => new
|
|
{
|
|
bill.BillNO,
|
|
bill.AuditVal,
|
|
bill.BillWriteOffDate,
|
|
bill.BillFirstCheckDate,
|
|
bill.CreateDate,
|
|
exp.ExhibitionCode,
|
|
exp.Exhibitioname_TW,
|
|
exp.ExhibitioShotName_TW,
|
|
exp.Industry,
|
|
exp.ExhibitionDateStart,
|
|
sOrganizer = bill.Organizer,
|
|
cus_m.CustomerNO,
|
|
cus.CustomerCName,
|
|
cus.CustomerEName,
|
|
cus.CustomerShotCName,
|
|
cus.TransactionType,
|
|
bill.ResponsiblePerson,
|
|
bill.Volume,
|
|
bill.Currency,
|
|
bill.ExchangeRate,
|
|
bill.AmountSum, //(原幣別)
|
|
bill.TaxSum,
|
|
//拼湊資料用
|
|
bill.OrgID,
|
|
bill.FeeItems,
|
|
bill.ParentId,
|
|
bill.IsRetn,
|
|
bill.ReFlow,
|
|
bill.BillType
|
|
}).ToList();
|
|
|
|
var TransDic = new Dictionary<string, string>() { {"A","國內" },{"B","國外" },{"C","國外" },
|
|
{ "D","國內" },{"E","其他" },{"F","其他" } };
|
|
var CustomerDic = db.Queryable<OTB_CRM_Customers>().Where(t1 => t1.OrgID == i_crm.ORIGID)
|
|
.Select((t1) => new OTB_CRM_Customers
|
|
{
|
|
guid = t1.guid,
|
|
CustomerCName = t1.CustomerCName
|
|
}).ToList().Distinct().ToList();
|
|
CustomerDic.Add(new OTB_CRM_Customers { guid = "SelfCome", CustomerCName = "自來" });
|
|
var DeptDic = CommonRPT.GetDeptInfos(db, i_crm.ORIGID);
|
|
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 1;
|
|
saBills = saBills.OrderBy(c => c.OrgID).ThenBy(c => c.BillNO).ThenBy(c => c.AuditVal).ToList();
|
|
var CellType = GetCellType(RPTEnum.CashFlow, RoundingPoint, ShowSource);
|
|
var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
|
|
var SearchList = GetExpList(db);
|
|
foreach (var bill in saBills)
|
|
{
|
|
|
|
var OrganierCName = "";
|
|
if (!string.IsNullOrWhiteSpace(bill.sOrganizer))
|
|
OrganierCName = CustomerDic.FirstOrDefault(t1 => t1.guid == bill.sOrganizer.Trim())?.CustomerCName;
|
|
var UpperDeptID = "";// 負責部門
|
|
var ResDeptID = "";//負責組別
|
|
var expInfo = saExps.Where(c => c.Id == bill.ParentId).FirstOrDefault(c => c.Id == bill.ParentId);
|
|
if (expInfo != null && DeptDic.TryGetValue(expInfo.DeptOfResponsibleMember, out var DeptInfo))
|
|
{
|
|
//DepartmentID, DepartmentName, ParentDepartmentID, ParentDepartmentName, Level
|
|
if (DeptInfo.Item5 == "2")
|
|
{
|
|
UpperDeptID = DeptInfo.Item4;
|
|
ResDeptID = DeptInfo.Item2;
|
|
}
|
|
else
|
|
{
|
|
UpperDeptID = DeptInfo.Item2;
|
|
}
|
|
}
|
|
var ExchangeRate = decimal.Parse(bill.ExchangeRate == "" ? "0" : bill.ExchangeRate);
|
|
TransDic.TryGetValue(bill.TransactionType, out var TransCategory);
|
|
|
|
var BillUntaxAmt = decimal.Parse(bill.AmountSum == "" ? "0" : bill.AmountSum) * ExchangeRate;
|
|
var BilltaxAmt = decimal.Parse(bill.TaxSum == "" ? "0" : bill.TaxSum) * ExchangeRate;
|
|
var ActualCostFeeItemJson = "";
|
|
var sActualCost = "";
|
|
var sTransportationMode = "";
|
|
var BillInfo = new OVW_OPM_BillInfo()
|
|
{
|
|
OrgID = bill.OrgID,
|
|
ParentId = bill.ParentId,
|
|
IsRetn = bill.IsRetn,
|
|
AuditVal = bill.AuditVal,
|
|
Volume = bill.Volume,
|
|
};
|
|
var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == bill.ParentId && t1.IsReturn == bill.IsRetn).ToList();
|
|
CommonRPT.CalcuCostAndProfitFast(SearchList, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, bill.BillNO, bill.ParentId, bill.IsRetn, bill.ReFlow, bill.BillType);
|
|
|
|
var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
|
|
var BillFeeItemList = CommonRPT.ToFeeItems(bill.FeeItems);
|
|
var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO);
|
|
var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
|
|
var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO, ActualPrepayFeeList);//抓實際成本的資料
|
|
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
BillUntaxAmt = CommonRPT.Rounding(BillUntaxAmt, RoundingPoint),
|
|
SharedActualCost = CommonRPT.Rounding(SharedActualCost, RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(BillReimburseAmount, RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(ActualBillReimburseAmount, RoundingPoint)
|
|
};
|
|
var SummaryInfo = new List<object>
|
|
{
|
|
bill.BillNO,
|
|
bill.AuditVal,
|
|
bill.BillWriteOffDate,
|
|
bill.BillFirstCheckDate,
|
|
bill.CreateDate.ToString(),
|
|
|
|
bill.ExhibitionCode,
|
|
bill.Exhibitioname_TW,
|
|
bill.ExhibitioShotName_TW,
|
|
bill.Industry,
|
|
bill.ExhibitionDateStart.ObjToString(),
|
|
OrganierCName,
|
|
|
|
bill.CustomerNO,
|
|
bill.CustomerCName,
|
|
bill.CustomerEName,
|
|
bill.CustomerShotCName,
|
|
TransCategory,
|
|
bill.TransactionType,
|
|
UpperDeptID,
|
|
ResDeptID,
|
|
bill.ResponsiblePerson,
|
|
bill.Volume.ObjToDecimal(),
|
|
bill.Currency,
|
|
bill.ExchangeRate.ObjToDecimal(),
|
|
bill.AmountSum.ObjToDecimal(),
|
|
|
|
profitInfo.BillUntaxAmt,
|
|
BilltaxAmt,
|
|
profitInfo.SharedActualCost,
|
|
profitInfo.BillReimburseAmount,
|
|
profitInfo.ActualBillReimburseAmount,
|
|
profitInfo.GrossProfit,
|
|
profitInfo.NetProfit
|
|
};
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, SummaryInfo, CellType);
|
|
iCurrRow++;
|
|
}
|
|
//DATAS
|
|
cells.StandardWidth = 15;
|
|
cellsApp.sheet.AutoFitColumns();
|
|
cellsApp.sheet.AutoFitRows();
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
cellsApp.sheet.AutoFitColumns();
|
|
cellsApp.sheet.AutoFitRows();
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
private List<dynamic> GetExpList(SqlSugarClient db)
|
|
{
|
|
var SearchDatas = new List<dynamic>();
|
|
var Others = db.Queryable<OTB_OPM_OtherExhibition>().Select(t1 => new OTB_OPM_OtherExhibition() { ActualCost = t1.ActualCost, ExFeild1 = "OtherBusiness_Upd", Guid = t1.Guid }).ToList();
|
|
SearchDatas.AddRange(Others);
|
|
var Imports = db.Queryable<OTB_OPM_ImportExhibition>().Select(t1 => new OTB_OPM_ImportExhibition() { ExFeild1 = "ExhibitionImport_Upd", ReturnBills = t1.ReturnBills, ReImports = t1.ReImports, ActualCost = t1.ActualCost, TransportationMode = t1.TransportationMode, ImportBillNO = t1.ImportBillNO }).ToList();
|
|
SearchDatas.AddRange(Imports);
|
|
var Exports = db.Queryable<OTB_OPM_ExportExhibition>().Select(t1 => new OTB_OPM_ExportExhibition() { ExFeild1 = "ExhibitionExport_Upd", ReturnBills = t1.ReturnBills, Exhibitors = t1.Exhibitors, ActualCost = t1.ActualCost, TransportationMode = t1.TransportationMode, ExportBillNO = t1.ExportBillNO }).ToList();
|
|
SearchDatas.AddRange(Exports);
|
|
return SearchDatas;
|
|
}
|
|
|
|
#endregion
|
|
#region 貢獻度報表(代理)
|
|
|
|
public ResponseMessage DegreeOfContributionByAgent(RequestMessage i_crm)
|
|
{
|
|
//帳單(拋轉)區間、銷帳區間、部門、業務 代理 ==> C
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(DegreeOfContributionByAgent);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "貢獻度報表(代理)");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var stransactiontype = "C";
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sBillAuditDateStart = _fetchString(i_crm, @"BillAuditDateStart");
|
|
var sBillAuditDateEnd = _fetchString(i_crm, @"BillAuditDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var sAgentName = _fetchString(i_crm, @"AgentName");
|
|
var sAgentGuid = _fetchString(i_crm, @"AgentGuid");
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
var Filter = new CVPFilter();
|
|
|
|
Filter.SetBill(sBillAuditDateStart, sBillAuditDateEnd, "", "");
|
|
//依序1.Customers => 2.Exhibition(四展覽) => 3.Billinfo => 4.統計
|
|
var CustomerKey = "";
|
|
var Customers = db.Queryable<OTB_CRM_Customers>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y" && t1.TransactionType == stransactiontype)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sAgentName), (t1) =>
|
|
t1.CustomerCName.Contains(sAgentName) || t1.CustomerEName.Contains(sAgentName) ||
|
|
t1.CustomerShotCName.Contains(sAgentName) || t1.CustomerShotEName.Contains(sAgentName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sAgentGuid), t1 => t1.guid == sAgentGuid);
|
|
CustomerKey = Customers.Select(t1 => t1.guid).ToJson();
|
|
|
|
|
|
#region Exhibition(四展覽)
|
|
var viewExpIm = db.Queryable<OTB_OPM_ImportExhibition, OTB_CRM_Customers>
|
|
((t1, t2) => new object[] { JoinType.Left, t1.OrgID == t2.OrgID && t1.Agent == t2.guid })
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N" && !SqlFunc.IsNullOrEmpty(t1.Agent))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(CustomerKey), (t1) => CustomerKey.Contains(t1.Agent))
|
|
.WhereIF(ChildDeptIDs.Any(), t1 => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsiblePerson), t1 => t1.ResponsiblePerson == sResponsiblePerson)
|
|
.Select((t1, t2) => new ExpInfo
|
|
{
|
|
Id = t1.ImportBillNO,
|
|
ExhibitionType = "ExhibitionImport_Upd",
|
|
ActualCost = t1.ActualCost,
|
|
Bills = t1.Bills,
|
|
ReturnBills = t1.ReturnBills,
|
|
RefNumber = t1.RefNumber,
|
|
ExpNO = t1.ExhibitionNO,
|
|
Agent = t2.CustomerShotCName
|
|
});
|
|
var viewExpEx = db.Queryable<OTB_OPM_ExportExhibition, OTB_CRM_Customers>
|
|
((t1, t2) => new object[] { JoinType.Left, t1.OrgID == t2.OrgID && t1.Agent == t2.guid })
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N" && !SqlFunc.IsNullOrEmpty(t1.Agent))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(CustomerKey), (t1) => CustomerKey.Contains(t1.Agent))
|
|
.WhereIF(ChildDeptIDs.Any(), t1 => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsiblePerson), t1 => t1.ResponsiblePerson == sResponsiblePerson)
|
|
.Select((t1, t2) => new ExpInfo
|
|
{
|
|
Id = t1.ExportBillNO,
|
|
ExhibitionType = "ExhibitionExport_Upd",
|
|
ActualCost = t1.ActualCost,
|
|
Bills = t1.Bills,
|
|
ReturnBills = t1.ReturnBills,
|
|
RefNumber = t1.RefNumber,
|
|
ExpNO = t1.ExhibitionNO,
|
|
Agent = t2.CustomerShotCName
|
|
});
|
|
var viewExpOth = db.Queryable<OTB_OPM_OtherExhibition, OTB_CRM_Customers>
|
|
((t1, t2) => new object[] { JoinType.Left, t1.OrgID == t2.OrgID && t1.Agent == t2.guid })
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N" && !SqlFunc.IsNullOrEmpty(t1.Agent))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(CustomerKey), (t1) => CustomerKey.Contains(t1.Agent))
|
|
.WhereIF(ChildDeptIDs.Any(), t1 => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsiblePerson), t1 => t1.ResponsiblePerson == sResponsiblePerson)
|
|
.Select((t1, t2) => new ExpInfo
|
|
{
|
|
Id = t1.Guid,
|
|
ExhibitionType = "OtherBusiness_Upd",
|
|
ActualCost = t1.ActualCost,
|
|
Bills = t1.Bills,
|
|
ReturnBills = "",
|
|
RefNumber = "",
|
|
ExpNO = t1.ExhibitionNO,
|
|
Agent = t2.CustomerShotCName
|
|
});
|
|
var viewExpOthtG = db.Queryable<OTB_OPM_OtherExhibitionTG, OTB_CRM_Customers>
|
|
((t1, t2) => new object[] { JoinType.Left, t1.OrgID == t2.OrgID && t1.Agent == t2.guid })
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N" && !SqlFunc.IsNullOrEmpty(t1.Agent))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(CustomerKey), (t1) => CustomerKey.Contains(t1.Agent))
|
|
.WhereIF(ChildDeptIDs.Any(), t1 => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsiblePerson), t1 => t1.ResponsiblePerson == sResponsiblePerson)
|
|
.Select((t1, t2) => new ExpInfo
|
|
{
|
|
Id = t1.Guid,
|
|
ExhibitionType = "OtherExhibitionTG_Upd",
|
|
ActualCost = t1.ActualCost,
|
|
Bills = t1.Bills,
|
|
ReturnBills = "",
|
|
RefNumber = "",
|
|
ExpNO = t1.ExhibitionNO,
|
|
Agent = t2.CustomerShotCName
|
|
});
|
|
var saExps = db.UnionAll(viewExpIm, viewExpEx, viewExpOth, viewExpOthtG).ToList();
|
|
var SearchedExp =!string.IsNullOrWhiteSpace(CustomerKey) || !string.IsNullOrWhiteSpace(sResponsibleDeptID) || !string.IsNullOrWhiteSpace(sResponsibleDeptID);
|
|
#endregion
|
|
|
|
#region 符合展覽的的帳單
|
|
var ExhibitionKeys = string.Join(",", saExps.Select(c => c.Id).ToList());
|
|
var view = db.Queryable<OVW_OPM_Bills, OTB_OPM_BillInfo>
|
|
((t1, t2) =>
|
|
new object[] {
|
|
JoinType.Inner, t1.OrgID == t2.OrgID && t1.BillNO == t2.BillNO
|
|
}
|
|
)
|
|
.Where((t1, t2) => t1.OrgID == i_crm.ORIGID && CommonRPT.PassStatus.Contains(t2.AuditVal))
|
|
.WhereIF(SearchedExp, (t1, t2) => ExhibitionKeys.Contains(t2.ParentId))
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateStart), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) >= Filter.rBillAuditDateStart.Date)
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateEnd), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) < Filter.rBillAuditDateEnd.Date);
|
|
|
|
var saBills = view.Select((t1, t2) =>
|
|
new View_OPM_BillIReport
|
|
{
|
|
BillNO = t2.BillNO,
|
|
BillType = t2.BillType,
|
|
ParentId = t2.ParentId,
|
|
ProjectNumber = t1.ProjectNumber,
|
|
CustomerCode = t1.CustomerCode,
|
|
ResponsiblePerson = t1.ResponsiblePersonFullCode,
|
|
Currency = t2.Currency,
|
|
ExchangeRate = t2.ExchangeRate,
|
|
InCome = t1.TWNOTaxAmount, //未稅總計
|
|
OrgID = t2.OrgID,
|
|
IsReturn = t2.IsRetn,
|
|
Weight = t2.Weight,
|
|
Volume = t2.Volume,
|
|
AuditVal = t2.AuditVal,
|
|
ReFlow = t2.ReFlow,
|
|
FeeItems = t2.FeeItems
|
|
})
|
|
.MergeTable()
|
|
.ToList();
|
|
#endregion
|
|
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 6;
|
|
cells[1, 1].PutValue(sBillAuditDateStart + "~" + sBillAuditDateEnd);//帳單區間
|
|
cells[1, 7].PutValue(i_crm.USERID);//列表人
|
|
cells[2, 1].PutValue(string.Join(",", ChildDeptIDs));//部門
|
|
cells[2, 7].PutValue(DateTime.Now.ToString(@"yyyy/MM/dd"));//列印時間
|
|
cells[3, 1].PutValue(sResponsiblePerson);//業務
|
|
var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
|
|
var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
|
|
var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var AllofPorfits = new List<ProfitInfo>();
|
|
var BillGroup = saBills.GroupBy(c => c.ParentId);
|
|
var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
|
|
foreach (var bills in BillGroup)
|
|
{
|
|
var SubProfits = new List<ProfitInfo>();
|
|
foreach (View_OPM_BillIReport bill in bills)
|
|
{
|
|
var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == bill.ParentId && t1.IsReturn == bill.IsReturn).ToList();
|
|
var iInCome = bill.InCome * decimal.Parse(bill.ExchangeRate == "" ? "0" : bill.ExchangeRate);
|
|
var ActualCostFeeItemJson = "";
|
|
var sActualCost = "";
|
|
var sTransportationMode = "";
|
|
|
|
CommonRPT.CalcuCostAndProfit(db, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, bill.BillNO, bill.ParentId, bill.IsReturn, bill.ReFlow, bill.BillType);
|
|
var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
|
|
var BillFeeItemList = CommonRPT.ToFeeItems(bill.FeeItems);
|
|
var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO);
|
|
var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
|
|
var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO, ActualPrepayFeeList);//抓實際成本的資料
|
|
decimal.TryParse(bill.Volume, out var Volume);
|
|
decimal.TryParse(bill.Weight, out var Weight);
|
|
var CustomerName = saExps.FirstOrDefault(c => c.Id == bill.ParentId)?.Agent;
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
ExhibitionName = bill.ProjectNumber,
|
|
CustomerName = CustomerName,
|
|
BillUntaxAmt = CommonRPT.Rounding(iInCome.Value, RoundingPoint),
|
|
SharedActualCost = SharedActualCost,
|
|
BillReimburseAmount = BillReimburseAmount,
|
|
ActualBillReimburseAmount = ActualBillReimburseAmount,
|
|
Weight = Weight,
|
|
Volume = Volume
|
|
};
|
|
if (ShowSource)
|
|
{
|
|
profitInfo.BillNO = $"類型:{bill.BillType}-單號:{bill.BillNO}-狀態:{bill.AuditVal}";
|
|
}
|
|
SubProfits.Add(profitInfo);
|
|
}
|
|
ProfitInfo SubtotalProfitInfo = new ProfitInfo()
|
|
{
|
|
ExhibitionName = SubProfits.First().ExhibitionName,
|
|
CustomerName = SubProfits.First().CustomerName,
|
|
BillUntaxAmt = SubProfits.Sum(c => c.BillUntaxAmt),
|
|
SharedActualCost = CommonRPT.Rounding(SubProfits.Sum(c => c.SharedActualCost), RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(SubProfits.Sum(c => c.BillReimburseAmount), RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(SubProfits.Sum(c => c.ActualBillReimburseAmount), RoundingPoint),
|
|
Weight = SubProfits.Sum(c => c.Weight),
|
|
Volume = SubProfits.Sum(c => c.Volume)
|
|
};
|
|
if (ShowSource)
|
|
{
|
|
SubtotalProfitInfo.BillNO = string.Join("■", SubProfits.Select(test => test.BillNO));
|
|
}
|
|
AllofPorfits.Add(SubtotalProfitInfo);
|
|
}
|
|
//分類印出來
|
|
var AgentGroup = AllofPorfits.GroupBy(c => c.CustomerName).OrderBy(c => c.Key);
|
|
var CellType = GetCellType(RPTEnum.DegreeOfContributionByAgent, RoundingPoint, ShowSource);
|
|
foreach (var profitInfos in AgentGroup)
|
|
{
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
ExField = profitInfos.Select(c => c.ExhibitionName).Distinct().Count(),
|
|
CustomerName = profitInfos.First().CustomerName,
|
|
BillUntaxAmt = CommonRPT.Rounding(profitInfos.Sum(c => c.BillUntaxAmt), RoundingPoint),
|
|
SharedActualCost = CommonRPT.Rounding(profitInfos.Sum(c => c.SharedActualCost), RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(profitInfos.Sum(c => c.BillReimburseAmount), RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(profitInfos.Sum(c => c.ActualBillReimburseAmount), RoundingPoint),
|
|
Weight = profitInfos.Sum(c => c.Weight),
|
|
Volume = profitInfos.Sum(c => c.Volume)
|
|
};
|
|
var CellColumns = CalcuCellValue(RPTEnum.DegreeOfContributionByAgent, profitInfo).ToList();
|
|
if (ShowSource)
|
|
{
|
|
var Source = string.Join("", profitInfos.Select(test => test.BillNO));
|
|
CellColumns.Add(Source);
|
|
}
|
|
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
iCurrRow++;
|
|
|
|
}
|
|
cellsApp.sheet.AutoFitColumns();
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
#region 貢獻度報表(客戶)
|
|
|
|
public ResponseMessage DegreeOfContributionByCustomer(RequestMessage i_crm)
|
|
{
|
|
//帳單(拋轉)區間、銷帳區間、部門、業務 客戶 ==> A B
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(DegreeOfContributionByCustomer);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "貢獻度報表(客戶)");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
var sTransactiontype = "A,B";
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sBillAuditDateStart = _fetchString(i_crm, @"BillAuditDateStart");
|
|
var sBillAuditDateEnd = _fetchString(i_crm, @"BillAuditDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
|
|
var SearchMatchedExps = !string.IsNullOrWhiteSpace(sResponsibleDeptID) || !string.IsNullOrWhiteSpace(sResponsiblePerson);
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var MatchedExpList = CommonRPT.GetMatchedExps(db, i_crm.ORIGID, ChildDeptIDs, sResponsiblePerson);
|
|
var MatchedExpGuids = MatchedExpList.Select(t1 => t1.Guid).Distinct().ToArray();
|
|
var sCustomerName = _fetchString(i_crm, @"CustomerName");
|
|
var sCustomerGuid = _fetchString(i_crm, @"CustomerGuid");
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
|
|
var Filter = new CVPFilter();
|
|
Filter.SetBill(sBillAuditDateStart, sBillAuditDateEnd, "", "");
|
|
//依序1.Customers => 2.Exhibition(四展覽) => 3.Billinfo => 4.統計
|
|
var CustomerKey = "";
|
|
var Customers = db.Queryable<OTB_CRM_Customers>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y" && sTransactiontype.Contains(t1.TransactionType))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerName), (t1) =>
|
|
t1.CustomerCName.Contains(sCustomerName) || t1.CustomerEName.Contains(sCustomerName) ||
|
|
t1.CustomerShotCName.Contains(sCustomerName) || t1.CustomerShotEName.Contains(sCustomerName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerGuid), t1 => t1.guid == sCustomerGuid);
|
|
//找不到也要篩選
|
|
CustomerKey = Customers.Select(t1 => t1.guid).ToJson();
|
|
#region 符合展覽的的帳單
|
|
var view = db.Queryable<OVW_OPM_Bills, OTB_OPM_BillInfo, OTB_CRM_Customers>
|
|
((t1, t2, t3) =>
|
|
new object[] {
|
|
JoinType.Inner, t1.OrgID == t2.OrgID && t1.BillNO == t2.BillNO,
|
|
JoinType.Inner, t1.OrgID == t3.OrgID && t2.Payer == t3.guid && sTransactiontype.Contains(t3.TransactionType)
|
|
}
|
|
)
|
|
.Where((t1, t2) => t1.OrgID == i_crm.ORIGID && CommonRPT.PassStatus.Contains(t2.AuditVal))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(CustomerKey), (t1, t2) => !SqlFunc.IsNullOrEmpty(t2.Payer) && CustomerKey.Contains(t2.Payer))
|
|
.WhereIF(SearchMatchedExps, (t1, t2) => SqlFunc.ContainsArray(MatchedExpGuids, t2.ParentId))
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateStart), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) >= Filter.rBillAuditDateStart.Date)
|
|
.WhereIF(!string.IsNullOrEmpty(Filter.sBillAuditDateEnd), (t1, t2) => SqlFunc.ToDate(t2.BillFirstCheckDate) < Filter.rBillAuditDateEnd.Date);
|
|
|
|
var saBills = view.Select((t1, t2, t3) =>
|
|
new View_OPM_BillIReport
|
|
{
|
|
BillNO = t2.BillNO,
|
|
BillType = t2.BillType,
|
|
ParentId = t2.ParentId,
|
|
ProjectNumber = t1.ProjectNumber,
|
|
CustomerName = t3.CustomerShotCName,
|
|
ResponsiblePerson = t1.ResponsiblePersonFullCode,
|
|
Currency = t2.Currency,
|
|
ExchangeRate = t2.ExchangeRate,
|
|
InCome = t1.TWNOTaxAmount, //未稅總計
|
|
OrgID = t2.OrgID,
|
|
IsReturn = t2.IsRetn,
|
|
Weight = t2.Weight,
|
|
Volume = t2.Volume,
|
|
AuditVal = t2.AuditVal,
|
|
ReFlow = t2.ReFlow,
|
|
FeeItems = t2.FeeItems
|
|
})
|
|
.MergeTable()
|
|
.ToList();
|
|
#endregion
|
|
|
|
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 6;
|
|
cells[1, 1].PutValue(sBillAuditDateStart + "~" + sBillAuditDateEnd);//帳單區間
|
|
cells[1, 7].PutValue(i_crm.USERID);//列表人
|
|
cells[2, 1].PutValue(string.Join(",", ChildDeptIDs));//部門
|
|
cells[2, 7].PutValue(DateTime.Now.ToString(@"yyyy/MM/dd"));//列印時間
|
|
cells[3, 1].PutValue(sResponsiblePerson);//業務
|
|
|
|
var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
|
|
var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
|
|
var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
var AllofPorfits = new List<ProfitInfo>();
|
|
//統計帳單資料
|
|
var BillGroup = saBills.GroupBy(c => c.CustomerName).OrderBy(c => c.Key);
|
|
var CellType = GetCellType(RPTEnum.DegreeOfContributionByCustomer, RoundingPoint, ShowSource);
|
|
var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
|
|
foreach (var bills in BillGroup)
|
|
{
|
|
var SubProfits = new List<ProfitInfo>();
|
|
foreach (View_OPM_BillIReport bill in bills)
|
|
{
|
|
var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == bill.ParentId && t1.IsReturn == bill.IsReturn).ToList();
|
|
var iInCome = bill.InCome * decimal.Parse(bill.ExchangeRate == "" ? "0" : bill.ExchangeRate);
|
|
var ActualCostFeeItemJson = "";
|
|
var sActualCost = "";
|
|
var sTransportationMode = "";
|
|
|
|
CommonRPT.CalcuCostAndProfit(db, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, bill.BillNO, bill.ParentId, bill.IsReturn, bill.ReFlow, bill.BillType);
|
|
var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
|
|
var BillFeeItemList = CommonRPT.ToFeeItems(bill.FeeItems);
|
|
var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO);
|
|
var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
|
|
var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, bill.BillNO, ActualPrepayFeeList);//抓實際成本的資料
|
|
decimal.TryParse(bill.Volume, out var Volume);
|
|
decimal.TryParse(bill.Weight, out var Weight);
|
|
ProfitInfo profitInfo = new ProfitInfo()
|
|
{
|
|
ExhibitionName = bill.ProjectNumber,
|
|
CustomerName = bill.CustomerName,
|
|
BillUntaxAmt = CommonRPT.Rounding(iInCome.Value, RoundingPoint),
|
|
SharedActualCost = SharedActualCost,
|
|
BillReimburseAmount = BillReimburseAmount,
|
|
ActualBillReimburseAmount = ActualBillReimburseAmount,
|
|
Weight = Weight,
|
|
Volume = Volume
|
|
};
|
|
if (ShowSource)
|
|
{
|
|
profitInfo.BillNO = $"類型:{bill.BillType}-單號:{bill.BillNO}-狀態:{bill.AuditVal}";
|
|
}
|
|
SubProfits.Add(profitInfo);
|
|
}
|
|
ProfitInfo SubtotalProfitInfo = new ProfitInfo()
|
|
{
|
|
//放展覽次數
|
|
ExField = SubProfits.Select(c => c.ExhibitionName).Distinct().Count(),
|
|
CustomerName = SubProfits.First().CustomerName,
|
|
BillUntaxAmt = CommonRPT.Rounding(SubProfits.Sum(c => c.BillUntaxAmt), RoundingPoint),
|
|
SharedActualCost = CommonRPT.Rounding(SubProfits.Sum(c => c.SharedActualCost), RoundingPoint),
|
|
BillReimburseAmount = CommonRPT.Rounding(SubProfits.Sum(c => c.BillReimburseAmount), RoundingPoint),
|
|
ActualBillReimburseAmount = CommonRPT.Rounding(SubProfits.Sum(c => c.ActualBillReimburseAmount), RoundingPoint),
|
|
Weight = SubProfits.Sum(c => c.Weight),
|
|
Volume = SubProfits.Sum(c => c.Volume)
|
|
};
|
|
|
|
var CellColumns = CalcuCellValue(RPTEnum.DegreeOfContributionByCustomer, SubtotalProfitInfo).ToList();
|
|
if (ShowSource)
|
|
{
|
|
var Source = string.Join("■", SubProfits.Select(test => test.BillNO));
|
|
CellColumns.Add(Source);
|
|
}
|
|
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
|
|
|
|
AllofPorfits.AddRange(SubProfits);
|
|
iCurrRow++;
|
|
}
|
|
|
|
cells.StandardWidth = 15;
|
|
cellsApp.sheet.AutoFitColumn(7);
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
cellsApp.sheet.AutoFitColumns();
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
#region 現有客戶資訊
|
|
|
|
public ResponseMessage ExistingCustomer(RequestMessage i_crm)
|
|
{
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(ExistingCustomer);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "現有客戶資訊");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sCustomerName = _fetchString(i_crm, @"CustomerName");
|
|
var sCustomerGuid = _fetchString(i_crm, @"CustomerGuid");
|
|
var sState = _fetchString(i_crm, @"State");
|
|
var sStartAttendeeTime = _fetchString(i_crm, @"StartAttendeeTime");
|
|
var sEndAttendeeTime = _fetchString(i_crm, @"EndAttendeeTime");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var iStartAttendeeTime = 0;
|
|
var iEndAttendeeTime = 0;
|
|
int.TryParse(sStartAttendeeTime, out iStartAttendeeTime);
|
|
int.TryParse(sEndAttendeeTime, out iEndAttendeeTime);
|
|
var stransactiontype = _fetchString(i_crm, @"TransactionType");
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
//「客戶」、「交易型態」、「國家」、「參展次數」
|
|
var Customers = db.Queryable<OTB_CRM_Customers>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerName), (t1) =>
|
|
t1.CustomerCName.Contains(sCustomerName) || t1.CustomerEName.Contains(sCustomerName) ||
|
|
t1.CustomerShotCName.Contains(sCustomerName) || t1.CustomerShotEName.Contains(sCustomerName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sCustomerGuid), (t1) => t1.guid == sCustomerGuid)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(stransactiontype), (t1) => stransactiontype.Contains(t1.TransactionType))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sState), (t1) => t1.State == sState)
|
|
.ToList();
|
|
var ExistingCustomerInfo = new List<ExistingCustomerInfo>();
|
|
foreach (var customer in Customers)
|
|
{
|
|
var info = new ExistingCustomerInfo()
|
|
{
|
|
GUID = customer.guid,
|
|
ChName = customer.CustomerCName,
|
|
EnName = customer.CustomerEName,
|
|
TaxNumber = customer.UniCode,
|
|
TransType = customer.TransactionType,
|
|
State = customer.State,
|
|
AttendeeTimes = 0,
|
|
Address = customer.Address,
|
|
Website = customer.WebsiteAdress,
|
|
AttendeeExhibitions = new List<string>(),
|
|
};
|
|
#region 計算次數
|
|
var sId = customer.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")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1, t2) => SqlFunc.ContainsArray(ChildDeptIDs, t2.DepartmentID))
|
|
.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 },
|
|
{ @"Source", "OTB_OPM_ExportExhibition" }
|
|
|
|
};
|
|
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")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1, t2) => SqlFunc.ContainsArray(ChildDeptIDs, t2.DepartmentID))
|
|
.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 },
|
|
{ @"Source", "OTB_OPM_ImportExhibition" }
|
|
};
|
|
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")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1, t2) => SqlFunc.ContainsArray(ChildDeptIDs, t2.DepartmentID))
|
|
.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 },
|
|
{ @"Source", "OTB_OPM_OtherExhibition" }
|
|
};
|
|
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")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1, t2) => SqlFunc.ContainsArray(ChildDeptIDs, t2.DepartmentID))
|
|
.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 },
|
|
{ @"Source", "OTB_OPM_OtherExhibitionTG" }
|
|
};
|
|
saExhibitions.Add(m);
|
|
}
|
|
}
|
|
}
|
|
info.AttendeeTimes = saExhibitions.Count;
|
|
info.AttendeeExhibitions = saExhibitions.Select(t1 => t1["ExhibitionCode"].ObjToString()).ToList();
|
|
#endregion
|
|
if (!string.IsNullOrEmpty(customer.Contactors))
|
|
{
|
|
var jaContactors = (JArray)JsonConvert.DeserializeObject(customer.Contactors);
|
|
var ShowOneContactor = jaContactors.First;
|
|
if (ShowOneContactor != null)
|
|
{
|
|
info.FullName = ShowOneContactor["FullName"]?.ObjToString();
|
|
info.Email = ShowOneContactor["Email"]?.ObjToString();
|
|
info.JobtitleName = ShowOneContactor["JobtitleName"]?.ObjToString();
|
|
info.TEL = ShowOneContactor["TEL1"]?.ObjToString();
|
|
}
|
|
}
|
|
|
|
ExistingCustomerInfo.Add(info);
|
|
}
|
|
|
|
//篩選次數
|
|
if (!string.IsNullOrWhiteSpace(sStartAttendeeTime))
|
|
ExistingCustomerInfo = ExistingCustomerInfo.Where(e => e.AttendeeTimes >= iStartAttendeeTime).ToList();
|
|
if (!string.IsNullOrWhiteSpace(sEndAttendeeTime))
|
|
ExistingCustomerInfo = ExistingCustomerInfo.Where(e => e.AttendeeTimes <= iEndAttendeeTime).ToList();
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 4;
|
|
ExistingCustomerInfo = ExistingCustomerInfo.OrderByDescending(e => e.AttendeeTimes).ToList();
|
|
var CellType = GetCellType(RPTEnum.ExistingCustomer, RoundingPoint, false);
|
|
foreach (var ECI in ExistingCustomerInfo)
|
|
{
|
|
var CellColumns = CalcuCellValue(RPTEnum.ExistingCustomer, ECI);
|
|
CellsSetValueWithAutoHeight(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
++iCurrRow;
|
|
}
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
#region 展覽資訊
|
|
|
|
public ResponseMessage ExhibitionInfo(RequestMessage i_crm)
|
|
{
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(ExhibitionInfo);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "展覽資訊");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
|
|
//「展覽名稱」、「展期」、「國家」、「展覽產業別」
|
|
var sExhibitionName = _fetchString(i_crm, @"ExhibitionName");
|
|
var sExhibitionCode = _fetchString(i_crm, @"ExhibitionCode");
|
|
var sExhibitionDateStart = _fetchString(i_crm, @"ExhibitionDateStart");
|
|
var sExhibitionDateEnd = _fetchString(i_crm, @"ExhibitionDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var sState = _fetchString(i_crm, @"State");
|
|
var sIndustry = _fetchString(i_crm, @"Industry");
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
var Filter = new CVPFilter();
|
|
Filter.SetExhibition(sExhibitionDateStart, sExhibitionDateEnd);
|
|
// => 篩選出展覽code
|
|
//
|
|
var ActiveCustomers = db.Queryable<OTB_CRM_Customers>().Where(t1 => t1.Effective == "Y" && t1.OrgID == i_crm.ORIGID).Select(c => c.guid).ToList();
|
|
var MatchedExhibitions = db.Queryable<OTB_OPM_Exhibition, OTB_SYS_Arguments, OTB_SYS_Arguments>(((t1, t2, t3) => new object[] {
|
|
JoinType.Left, t1.OrgID == t2.OrgID && t1.State == t2.ArgumentID && t2.ArgumentClassID == "Area" && t2.DelStatus == "N" ,
|
|
JoinType.Left, t3.OrgID == "TE" && t1.Industry == t3.ArgumentID && t3.ArgumentClassID == "ExhibClass"&& t2.DelStatus == "N" ,
|
|
}
|
|
))
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionName), t1 =>
|
|
t1.Exhibitioname_EN.Contains(sExhibitionName) || t1.Exhibitioname_TW.Contains(sExhibitionName) ||
|
|
t1.Exhibitioname_CN.Contains(sExhibitionName) || t1.ExhibitioShotName_TW.Contains(sExhibitionName) ||
|
|
t1.ExhibitioShotName_CN.Contains(sExhibitionName) || t1.ExhibitioShotName_EN.Contains(sExhibitionName))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionCode), t1 => t1.ExhibitionCode == sExhibitionCode)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sIndustry), t1 => t1.Industry == sIndustry)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sState), t1 => t1.State == sState)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateStart), t1 => SqlFunc.ToDate(t1.ExhibitionDateStart) >= Filter.rExhibitionDateStart.Date)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateEnd), t1 => SqlFunc.ToDate(t1.ExhibitionDateStart) < Filter.rExhibitionDateEnd.Date);
|
|
var ExhibitionList = MatchedExhibitions.Select((t1, t2, t3) =>
|
|
new OTB_OPM_Exhibition()
|
|
{
|
|
Exhibitioname_TW = t1.Exhibitioname_TW,
|
|
SN = t1.SN,
|
|
ExhibitionDateStart = t1.ExhibitionDateStart,
|
|
ExhibitionDateEnd = t1.ExhibitionDateEnd,
|
|
State = t2.ArgumentValue,
|
|
Industry = t3.ArgumentValue,
|
|
ExFeild1 = t1.State,
|
|
ExFeild2 = t1.Industry,
|
|
}).ToList();
|
|
var ExhibitionKeys = string.Join("", ExhibitionList.Select(t1 => "|" + t1.SN + "|").ToList());
|
|
var ExhibitionDic = ExhibitionList.ToDictionary(t1 => t1.SN.ToString());
|
|
#region Exhibition(四展覽)
|
|
|
|
var viewExpIm = db.Queryable<OTB_OPM_ImportExhibition, OTB_CRM_Customers>((t1, t2) => new object[] {
|
|
JoinType.Left,t1.Agent==t2.guid && t1.OrgID==t2.OrgID && t2.Effective == "Y"})
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1) => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
ExpNO = t1.ExhibitionNO,
|
|
ExhibitionType = "ImportExhibition",
|
|
Exhibitors = "",
|
|
Organizer = "",
|
|
Supplier = t1.Supplier,
|
|
Agent = t1.Agent,
|
|
ResponsibleMember = t1.ResponsiblePerson,
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
OrgID = t1.OrgID
|
|
});
|
|
var viewExpEx = db.Queryable<OTB_OPM_ExportExhibition, OTB_CRM_Customers>((t1, t2) => new object[] {
|
|
JoinType.Left,t1.Agent==t2.guid && t1.OrgID==t2.OrgID && t2.Effective == "Y"})
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N")
|
|
//Organizer、Exhibitors
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1) => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
ExpNO = t1.ExhibitionNO,
|
|
ExhibitionType = "ExportExhibition",
|
|
Exhibitors = t1.Exhibitors,
|
|
Organizer = t1.Organizer,
|
|
Supplier = "",
|
|
Agent = t1.Agent,
|
|
ResponsibleMember = t1.ResponsiblePerson,
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
OrgID = t1.OrgID
|
|
});
|
|
var viewExpOth = db.Queryable<OTB_OPM_OtherExhibition, OTB_CRM_Customers>((t1, t2) => new object[] {
|
|
JoinType.Left,t1.Agent==t2.guid && t1.OrgID==t2.OrgID && t2.Effective == "Y"})
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1) => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
ExpNO = t1.ExhibitionNO,
|
|
ExhibitionType = "OtherExhibition",
|
|
Exhibitors = "",
|
|
Organizer = "",
|
|
Supplier = t1.Supplier,
|
|
Agent = t1.Agent,
|
|
ResponsibleMember = t1.ResponsiblePerson,
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
OrgID = t1.OrgID
|
|
});
|
|
var viewExpOthtG = db.Queryable<OTB_OPM_OtherExhibitionTG, OTB_CRM_Customers>((t1, t2) => new object[] {
|
|
JoinType.Left,t1.Agent==t2.guid && t1.OrgID==t2.OrgID && t2.Effective == "Y"})
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.IsVoid == "N")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), (t1) => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.Select((t1) => new ExpInfo
|
|
{
|
|
ExpNO = t1.ExhibitionNO,
|
|
ExhibitionType = "OtherExhibitionTG",
|
|
Exhibitors = t1.Exhibitors,
|
|
Organizer = "",
|
|
Supplier = "",
|
|
Agent = t1.Agent,
|
|
ResponsibleMember = t1.ResponsiblePerson,
|
|
DeptOfResponsibleMember = t1.DepartmentID,
|
|
OrgID = t1.OrgID
|
|
});
|
|
var saExps = db.UnionAll(viewExpIm, viewExpEx, viewExpOth, viewExpOthtG).ToList();
|
|
|
|
#endregion
|
|
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
|
|
var iCurrRow = 1;
|
|
var ExhibitionGroup = saExps.Where(c => ExhibitionKeys.Contains("|" + c.ExpNO.Trim() + "|"))
|
|
.GroupBy(c => c.ExpNO).OrderBy(c => c.Key);
|
|
var CellType = GetCellType(RPTEnum.ExhibitionInfo, RoundingPoint, ShowSource);
|
|
if (ExhibitionGroup.Any())
|
|
{
|
|
var DeptDic = CommonRPT.GetDeptInfos(db, i_crm.ORIGID);
|
|
|
|
foreach (var Exhibitions in ExhibitionGroup)
|
|
{
|
|
var ExhibitionCode = Exhibitions.First().ExpNO;
|
|
ExhibitionDic.TryGetValue(ExhibitionCode, out var ExhibitionInfo);
|
|
var AgentCount = Exhibitions.Where(c => !string.IsNullOrWhiteSpace(c.Agent) && ActiveCustomers.Any(ac => ac == c.Agent))
|
|
.Select(c => c.Agent).Distinct().Count();
|
|
var OrganizerList = new List<string>();
|
|
var SuppliersList = Exhibitions.Where(c => !string.IsNullOrWhiteSpace(c.Supplier))
|
|
.Select(c => c.Supplier.Trim()).ToList();
|
|
var Organizers = Exhibitions.Where(c => !string.IsNullOrWhiteSpace(c.Organizer)).Select(c => c.Organizer).ToList();
|
|
var Exhibitors = Exhibitions.Where(c => !string.IsNullOrWhiteSpace(c.Exhibitors)).Select(c => c.Exhibitors).ToList();
|
|
//組團單位數
|
|
if (Organizers.Any())
|
|
{
|
|
var SingleOrganizers = Organizers.Where(c => c.Length == 36).ToList();
|
|
OrganizerList.AddRange(SingleOrganizers);
|
|
//出口展覽的組團單位包含舊資料(guid)、新資料(json後的guids)
|
|
var MultipleOrganizer = Organizers.Where(c => c.Length > 36).ToList();
|
|
foreach (var sOrganizer in MultipleOrganizer)
|
|
{
|
|
var jaContactors = (JArray)JsonConvert.DeserializeObject(sOrganizer);
|
|
foreach (var jaContactor in jaContactors)
|
|
{
|
|
var sContactor = jaContactor.ObjToString();
|
|
if (!OrganizerList.Any(c => c == sContactor))
|
|
{
|
|
OrganizerList.Add(sContactor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//參加廠商家數
|
|
if (Exhibitors.Any())
|
|
{
|
|
var ExhibitorsList = new List<string>() { };
|
|
foreach (var sExhibitor in Exhibitors)
|
|
{
|
|
var jaExhibitors = (JArray)JsonConvert.DeserializeObject(sExhibitor);
|
|
var SupplierIDs = jaExhibitors.Where(c => !string.IsNullOrWhiteSpace(c["SupplierID"].ObjToString())).Select(c => c["SupplierID"].ToString()).Distinct().ToList();
|
|
ExhibitorsList.AddRange(SupplierIDs);
|
|
}
|
|
SuppliersList.AddRange(ExhibitorsList);
|
|
}
|
|
//依序:展覽名稱 展期 國家 展覽產業別 組團公司 國外代理 部門 組別 負責業務 參展廠商家數
|
|
#region 取相關業務資料
|
|
|
|
var ResponsibleMembersList = Exhibitions.Select(c => c.ResponsibleMember).Distinct().ToList();
|
|
var DeptOfResponsibleMembers = Exhibitions.Select(c => c.DeptOfResponsibleMember).Distinct().ToList();
|
|
var TotalResponsibleMembers = string.Join(",", ResponsibleMembersList);
|
|
var ResDeptID = "";
|
|
var UpperDeptID = "";
|
|
if (ResponsibleMembersList.Count >= 2 && DeptOfResponsibleMembers.Count > 2)
|
|
{
|
|
UpperDeptID = DeptOfResponsibleMembers.Count.ToString();
|
|
}
|
|
else
|
|
{
|
|
//只有兩層代表是只顯示部門
|
|
if (DeptDic.TryGetValue(DeptOfResponsibleMembers.First(), out var DeptInfo))
|
|
{
|
|
if (DeptInfo.Item5 == "2")
|
|
{
|
|
ResDeptID = DeptInfo.Item2;
|
|
UpperDeptID = DeptInfo.Item4;
|
|
}
|
|
else
|
|
{
|
|
UpperDeptID = DeptInfo.Item2;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
var DateStart = ExhibitionInfo.ExhibitionDateStart.HasValue ? ExhibitionInfo.ExhibitionDateStart.Value.ToString("yyyy/MM/dd") : "";
|
|
var DateEnd = ExhibitionInfo.ExhibitionDateEnd.HasValue ? ExhibitionInfo.ExhibitionDateEnd.Value.ToString("yyyy/MM/dd") : "";
|
|
OrganizerList = OrganizerList.Distinct().ToList();
|
|
SuppliersList = SuppliersList.Distinct().ToList();
|
|
var SummaryInfo = new List<object>
|
|
{
|
|
ExhibitionInfo.Exhibitioname_TW.ObjToString() ?? "",
|
|
DateStart + "-" + DateEnd,
|
|
ExhibitionInfo.State.ObjToString() ?? "",
|
|
ExhibitionInfo.Industry.ObjToString() ?? "",
|
|
OrganizerList.Count,
|
|
AgentCount.ObjToInt(),
|
|
UpperDeptID.ObjToString(),
|
|
ResDeptID.ObjToString(),
|
|
TotalResponsibleMembers.ObjToString(),
|
|
SuppliersList.Count
|
|
};
|
|
CellsSetValueWithAutoHeight(cellsApp.workbook, cells, iCurrRow, SummaryInfo, CellType);
|
|
++iCurrRow;
|
|
}
|
|
}
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 展覽資訊
|
|
|
|
public ResponseMessage CostFeeItemReport(RequestMessage i_crm)
|
|
{
|
|
ShowSource = CommonRPT.RPTShow();
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance(commandTimeOut: TimeOut);
|
|
var FunctionName = nameof(CostFeeItemReport);
|
|
var ExcutePath = CommonRPT.GetExcutePath(FunctionName, "成本費用報表");
|
|
var sOutPut = ExcutePath.Item1;
|
|
var sTempFile = ExcutePath.Item2;
|
|
var sBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"");
|
|
var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
|
|
try
|
|
{
|
|
do
|
|
{
|
|
//「展覽名稱」(下拉)、「展期」、「部門」、「費用項目」、
|
|
var sExhibitionCode = _fetchString(i_crm, @"ProjectNO");
|
|
var sExhibitionName = "";
|
|
var sExhibitionDateStart = _fetchString(i_crm, @"ExhibitionDateStart");
|
|
var sExhibitionDateEnd = _fetchString(i_crm, @"ExhibitionDateEnd");
|
|
var sResponsibleDeptID = _fetchString(i_crm, @"ResponsibleDeptID");
|
|
var sFeeClass = _fetchString(i_crm, @"FeeClass");
|
|
var ChildDeptIDs = CommonRPT.GetChildDepteList(db, i_crm.ORIGID, sResponsibleDeptID);
|
|
var sFlag = _fetchString(i_crm, @"Flag");
|
|
var Filter = new CVPFilter();
|
|
Filter.SetExhibition(sExhibitionDateStart, sExhibitionDateEnd);
|
|
// => 篩選出展覽code
|
|
var MatchedExhibitions = db.Queryable<OTB_OPM_Exhibition>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.Effective == "Y")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionCode), t1 => t1.ExhibitionCode == sExhibitionCode)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateStart), t1 => SqlFunc.ToDate(t1.ExhibitionDateStart) >= Filter.rExhibitionDateStart.Date)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(Filter.sExhibitionDateEnd), t1 => SqlFunc.ToDate(t1.ExhibitionDateStart) < Filter.rExhibitionDateEnd.Date);
|
|
var ExpSNs = MatchedExhibitions
|
|
.Select(t1 => t1.SN.ToString()).ToList().ToArray();
|
|
var saActualCosts = db.Queryable<OVW_OPM_ALLExps>()
|
|
.Where((t1) => t1.OrgID == i_crm.ORIGID)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sExhibitionCode) || !string.IsNullOrWhiteSpace(Filter.sExhibitionDateStart)
|
|
|| !string.IsNullOrWhiteSpace(Filter.sExhibitionDateEnd), t1 => SqlFunc.ContainsArray(ExpSNs, t1.ExhibitionSN))
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sResponsibleDeptID), t1 => SqlFunc.ContainsArray(ChildDeptIDs, t1.DepartmentID))
|
|
.ToList();
|
|
if (!string.IsNullOrWhiteSpace(sExhibitionCode))
|
|
{
|
|
sExhibitionName = db.Queryable<OTB_OPM_Exhibition>()
|
|
.Where(t1 => t1.OrgID == "TE" && t1.Effective == "Y" && t1.ExhibitionCode == sExhibitionCode)
|
|
.Select(t1 => t1.Exhibitioname_TW).First();
|
|
}
|
|
|
|
|
|
var ActualCostSummary = db.Queryable<OTB_SYS_Arguments>()
|
|
.Where(t1 => t1.OrgID == i_crm.ORIGID && t1.ArgumentClassID == "FeeClass" && t1.DelStatus == "N")
|
|
.WhereIF(!string.IsNullOrWhiteSpace(sFeeClass), t1 => t1.ArgumentID == sFeeClass)
|
|
.Select(t1 => new CostFeeItem
|
|
{
|
|
ArgumentID = t1.ArgumentID,
|
|
ArgumentDescription = t1.ArgumentValue,
|
|
})
|
|
.ToList().Where(t1 => t1.ArgumentID.IndexOf("99") == 0).ToList();
|
|
var ToAnalysisList = saActualCosts.Select(t1 => t1.ActualCost).ToList();
|
|
foreach (var ReturnBill in saActualCosts.Select(t1 => t1.ReturnBills).ToList())
|
|
{
|
|
var JADatas = JArray.Parse(ReturnBill);
|
|
if (JADatas.Any())
|
|
{
|
|
foreach (var jToken in JADatas)
|
|
{
|
|
var sActualCost = jToken["ActualCost"];
|
|
if (sActualCost != null)
|
|
{
|
|
ToAnalysisList.Add(sActualCost.ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach (string sJsons in ToAnalysisList)
|
|
{
|
|
var ActualCostBills = JToken.Parse(sJsons);
|
|
var ActualCosts = ActualCostBills["FeeItems"];
|
|
if (ActualCostBills.Any() && ActualCosts != null && ActualCosts.Any())
|
|
{
|
|
foreach (var ActualCost in ActualCosts)
|
|
{
|
|
var FinancialCode = ActualCost["FinancialCode"].ObjToString();
|
|
var AlreadyExist = ActualCostSummary.FirstOrDefault(c => c.ArgumentID == FinancialCode);
|
|
if (AlreadyExist != null)
|
|
{
|
|
AlreadyExist.Amount += ActualCost["FinancialTWAmount"].ObjToDecimal();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var CellType = GetCellType(RPTEnum.CostFeeItemReport, RoundingPoint);
|
|
var cellsApp = new ExcelService(sTempFile);
|
|
var cells = cellsApp.sheet.Cells;//单元格
|
|
var iCurrRow = 5;
|
|
cells[1, 0].PutValue("展覽區間:" + sExhibitionDateStart + "~" + sExhibitionDateEnd);
|
|
cells[1, 2].PutValue("部門:" + string.Join(",", ChildDeptIDs));
|
|
cells[2, 0].PutValue("展覽名稱:" + sExhibitionName);
|
|
cells[2, 2].PutValue("列表人:" + i_crm.USERID);
|
|
cells[3, 2].PutValue("列印時間:" + DateTime.Now.ToString(@"yyyy/MM/dd"));
|
|
foreach (var costFee in ActualCostSummary)
|
|
{
|
|
var CellColumns = CalcuCellValue(RPTEnum.CostFeeItemReport, costFee);
|
|
CellsSetValue(cellsApp.workbook, cells, iCurrRow, CellColumns, CellType);
|
|
++iCurrRow;
|
|
}
|
|
if (File.Exists(sOutPut))
|
|
{
|
|
File.Delete(sOutPut);
|
|
}
|
|
//保存
|
|
cellsApp.workbook.Save(sOutPut);
|
|
|
|
if (sFlag == @"pdf")
|
|
{
|
|
var excelApp = new ExcelEdit();
|
|
try
|
|
{
|
|
excelApp.Open(sOutPut);
|
|
sOutPut = sOutPut.Replace(@".xlsx", @".pdf").Replace(@".xls", @".pdf");
|
|
excelApp.SaveAsPdf(sOutPut);
|
|
excelApp.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = ex.Message;
|
|
excelApp.Close();
|
|
}
|
|
}
|
|
File.Delete(sTempFile); //刪除臨時文件
|
|
sOutPut = sOutPut.Replace(sBase, @"");
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, sOutPut);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(CostAndProfitReportService), "", FunctionName + "(報表模組)", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion
|
|
private void CellsSetValueWithAutoHeight(Aspose.Cells.Workbook workbook, Cells cells, int irow, List<object> values, List<int> NumberTypes = null)
|
|
{
|
|
var DefaultHeight = 20;
|
|
var LengthList = values.Select(t1 =>
|
|
{
|
|
var st1 = t1.ObjToString();
|
|
if (!string.IsNullOrWhiteSpace(st1))
|
|
{
|
|
byte[] Dbyte = System.Text.Encoding.Default.GetBytes(st1);
|
|
return Math.Ceiling((Dbyte.Length / 10.0)) * 10 + 10;
|
|
}
|
|
else
|
|
return DefaultHeight;
|
|
});
|
|
CellsSetValue(workbook, cells, irow, values, NumberTypes, LengthList.Max());
|
|
}
|
|
|
|
private void CellsSetValue(Aspose.Cells.Workbook workbook, Cells cells, int irow, List<object> values, List<int> NumberTypes = null, double SetRowHeight = 20)
|
|
{
|
|
var styleForNumber = GetStyle(workbook, 12, false, TextAlignmentType.Right, Color.White, true);
|
|
var styleForText = GetStyle(workbook, 12, false, TextAlignmentType.Left, Color.White, true);
|
|
styleForNumber.Number = 4;
|
|
cells.SetRowHeight(irow, SetRowHeight);
|
|
var SetRowValueNumber = NumberTypes != null && values.Count == NumberTypes.Count;
|
|
for (int i = 0; i < values.Count; i++)
|
|
{
|
|
if (values[i] is string)
|
|
{
|
|
cells[irow, i].PutValue(values[i]);
|
|
cells[irow, i].SetStyle(styleForText);
|
|
}
|
|
else
|
|
{
|
|
cells[irow, i].PutValue(values[i]);
|
|
if (SetRowValueNumber && NumberTypes[i] != -1)
|
|
{
|
|
styleForNumber.Number = NumberTypes[i];
|
|
}
|
|
cells[irow, i].SetStyle(styleForNumber);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public List<object> CalcuCellValue(RPTEnum type, object Data, int RoundingPoint = 0)
|
|
{
|
|
switch (type)
|
|
{
|
|
case RPTEnum.CVPAnalysisBySaler:
|
|
case RPTEnum.CVPAnalysisByExhibition:
|
|
{
|
|
ProfitInfo profitInfo = (ProfitInfo)Data;
|
|
return new List<object>
|
|
{
|
|
profitInfo.MemberID,//名稱
|
|
profitInfo.BillUntaxAmt,//收入(A)
|
|
profitInfo.SharedActualCost,//成本 (B)
|
|
profitInfo.GrossProfit,//毛利(C)=(A)-(B)
|
|
profitInfo.GrossProfitPercent, //毛利率(C)/(A)
|
|
profitInfo.BillReimburseAmount,//帳單代墊款(D)
|
|
profitInfo.ActualBillReimburseAmount, //實際代墊款(E)
|
|
profitInfo.NetIncome,//淨收入(F) =(A)-(D)
|
|
profitInfo.NetCost, //淨成本(G) =(B)-(E)
|
|
profitInfo.NetProfit, //淨毛利(H)=(F)-(G)
|
|
profitInfo.NetProfitPercent//淨毛利率(H)/(F)
|
|
};
|
|
}
|
|
case RPTEnum.CashFlow:
|
|
break;
|
|
case RPTEnum.DegreeOfContributionByCustomer:
|
|
case RPTEnum.DegreeOfContributionByAgent:
|
|
{
|
|
ProfitInfo profitInfo = (ProfitInfo)Data;
|
|
return new List<object>()
|
|
{
|
|
profitInfo.CustomerName,//(代理/客戶)簡稱
|
|
profitInfo.ExField,//次數
|
|
profitInfo.Weight,//重量
|
|
CommonRPT.Rounding(profitInfo.Volume, RoundingPoint),//材積
|
|
CommonRPT.Rounding(profitInfo.BillUntaxAmt, RoundingPoint),//收入(A)
|
|
CommonRPT.Rounding(profitInfo.GrossProfit, RoundingPoint),//毛利(C)=(A)-(B)
|
|
CommonRPT.Rounding(profitInfo.NetIncome, RoundingPoint),//淨收入(F) =(A)-(D)
|
|
CommonRPT.Rounding(profitInfo.NetProfit, RoundingPoint), //淨毛利(H)=(F)-(G)
|
|
};
|
|
}
|
|
case RPTEnum.ExistingCustomer:
|
|
{
|
|
ExistingCustomerInfo eci = (ExistingCustomerInfo)Data;
|
|
return new List<object>()
|
|
{
|
|
eci.ChName ,
|
|
eci.EnName ,
|
|
eci.TaxNumber ,
|
|
eci.TransType ,
|
|
eci.State ,
|
|
eci.AttendeeTimes,
|
|
eci.FullName ,
|
|
eci.JobtitleName ,
|
|
eci.TEL ,
|
|
eci.Email ,
|
|
eci.Address ,
|
|
eci.Website ,
|
|
};
|
|
}
|
|
case RPTEnum.ExhibitionInfo:
|
|
break;
|
|
case RPTEnum.CostFeeItemReport:
|
|
{
|
|
CostFeeItem CFI = (CostFeeItem)Data;
|
|
return new List<object>()
|
|
{
|
|
CFI.ArgumentID,
|
|
CFI.ArgumentDescription,
|
|
CFI.Amount
|
|
};
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return new List<object> { };
|
|
}
|
|
|
|
public List<int> GetCellType(RPTEnum type, int RoundingPoint = 0, bool showSource = false)
|
|
{
|
|
//Ref:https://docs.aspose.com/display/cellsnet/List+of+Supported+Number+Formats
|
|
var CurrencyType = 5;
|
|
if (RoundingPoint != 0)
|
|
CurrencyType = 4;
|
|
var Types = new List<int>();
|
|
switch (type)
|
|
{
|
|
case RPTEnum.CVPAnalysisBySaler:
|
|
case RPTEnum.CVPAnalysisByExhibition:
|
|
{
|
|
Types = new List<int>
|
|
{
|
|
-1,//名稱
|
|
CurrencyType,//收入(A)
|
|
CurrencyType,//成本 (B)
|
|
CurrencyType,//毛利(C)=(A)-(B)
|
|
10, //毛利率(C)/(A)
|
|
CurrencyType,//帳單代墊款(D)
|
|
CurrencyType, //實際代墊款(E)
|
|
CurrencyType,//淨收入(F) =(A)-(D)
|
|
CurrencyType, //淨成本(G) =(B)-(E)
|
|
CurrencyType, //淨毛利(H)=(F)-(G)
|
|
10//淨毛利率(H)/(F)
|
|
};
|
|
}
|
|
break;
|
|
case RPTEnum.CashFlow:
|
|
{
|
|
Types = new List<int>
|
|
{
|
|
-1,//帳單號碼
|
|
-1,//帳單狀態
|
|
-1,//銷帳日期
|
|
-1,//帳單拋轉日期
|
|
-1,//帳單創建日期
|
|
-1,//專案代號
|
|
-1,//展覽名稱
|
|
-1,//展覽簡稱
|
|
-1,//展覽類別
|
|
-1,//展期第一天
|
|
-1,//組團單位
|
|
-1,//客戶編號
|
|
-1,//客戶中文名
|
|
-1,//客戶英文名
|
|
-1,//客戶簡稱
|
|
-1,//國內/國外
|
|
-1,//交易型態
|
|
-1,//負責部門
|
|
-1,//負責組別
|
|
-1,//負責業務
|
|
4,//材積(CBM)
|
|
-1,//帳單幣別
|
|
4,//匯率
|
|
4,//未稅金額(原幣別)
|
|
CurrencyType,//未稅金額(收入)
|
|
CurrencyType,//稅額
|
|
CurrencyType,//成本
|
|
CurrencyType,//帳單代墊款
|
|
CurrencyType,//實際代墊款
|
|
CurrencyType,//毛利
|
|
CurrencyType,//淨毛利
|
|
};
|
|
}
|
|
break;
|
|
case RPTEnum.DegreeOfContributionByCustomer:
|
|
case RPTEnum.DegreeOfContributionByAgent:
|
|
{
|
|
Types = new List<int>
|
|
{
|
|
-1,//(代理/客戶)簡稱
|
|
1,//次數
|
|
4,//重量
|
|
4,//材積
|
|
CurrencyType,//收入(A)
|
|
CurrencyType,//毛利(C)=(A)-(B)
|
|
CurrencyType,//淨收入(F) =(A)-(D)
|
|
CurrencyType, //淨毛利(H)=(F)-(G)
|
|
};
|
|
}
|
|
break;
|
|
case RPTEnum.ExistingCustomer:
|
|
{
|
|
|
|
Types = new List<int>
|
|
{
|
|
-1,//客戶中文名稱
|
|
-1,//客戶英文名稱
|
|
-1,//統一編號
|
|
-1,//交易型態
|
|
-1,//國家
|
|
1,//參展次數
|
|
-1, //聯絡人
|
|
-1, //職稱
|
|
-1, //電話
|
|
-1, //EMAIL
|
|
-1, //地址
|
|
-1, //網址
|
|
};
|
|
}
|
|
break;
|
|
case RPTEnum.ExhibitionInfo:
|
|
{
|
|
Types = new List<int>
|
|
{
|
|
-1,//展覽名稱
|
|
-1 ,//展期
|
|
-1 ,//國家
|
|
-1 ,//展覽產業別
|
|
1 ,//組團公司(數字)
|
|
1,//國外代理(數字)
|
|
-1,//部門
|
|
-1 ,//組別
|
|
-1 ,//負責業務
|
|
1 ,//參展廠商家數
|
|
};
|
|
}
|
|
break;
|
|
case RPTEnum.CostFeeItemReport:
|
|
{
|
|
Types = new List<int>
|
|
{
|
|
-1,//參數值
|
|
-1 ,//費用項目
|
|
CurrencyType//金額(NT$)
|
|
};
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (showSource)
|
|
{
|
|
Types.Add(-1);
|
|
}
|
|
return Types;
|
|
}
|
|
/// <summary>
|
|
/// 固定的樣式
|
|
/// </summary>
|
|
/// <param name="sFontSize"></param>
|
|
/// <param name="bIsBold"></param>
|
|
/// <param name="sAlign"></param>
|
|
/// <param name="sBgColor"></param>
|
|
/// <param name="bIsWrap"></param>
|
|
/// <param name="workbook"></param>
|
|
/// <returns></returns>
|
|
public static Aspose.Cells.Style GetStyle(Aspose.Cells.Workbook workbook, int sFontSize, bool bIsBold, TextAlignmentType sAlign, Color sBgColor, bool bIsWrap)
|
|
{
|
|
var style = workbook.CreateStyle();
|
|
style.HorizontalAlignment = sAlign;//文字居左/中/右 ---TextAlignmentType.Center
|
|
style.VerticalAlignment = TextAlignmentType.Top;
|
|
if (sFontSize != 0)
|
|
{
|
|
style.Font.Size = sFontSize;//文字大小 ----12
|
|
}
|
|
style.Font.IsBold = bIsBold;//粗体 ----false
|
|
style.ForegroundColor = sBgColor;//背景顏色
|
|
style.Pattern = BackgroundType.Solid;//设置背景類型
|
|
style.IsTextWrapped = bIsWrap;//单元格内容自动换行
|
|
// 邊線設置
|
|
style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
|
|
return style;
|
|
}
|
|
|
|
public OVW_OPM_BillInfo ToBillInfo(View_OPM_BillIReport billIReport)
|
|
{
|
|
return new OVW_OPM_BillInfo()
|
|
{
|
|
OrgID = billIReport.OrgID,
|
|
ParentId = billIReport.ParentId,
|
|
IsRetn = billIReport.IsReturn,
|
|
AuditVal = billIReport.AuditVal,
|
|
Volume = billIReport.Volume,
|
|
};
|
|
}
|
|
|
|
public void CalcAttendeeAsCustomerGuid(string ExhibitionNO, string CustomerGuid, List<ExistingCustomerInfo> existingCustomerInfos)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(CustomerGuid))
|
|
{
|
|
var ECI = existingCustomerInfos.FirstOrDefault(c => c.GUID == CustomerGuid);
|
|
if (ECI != null && !ECI.AttendeeExhibitions.Any(e => e == ExhibitionNO))
|
|
{
|
|
ECI.AttendeeExhibitions.Add(ExhibitionNO);
|
|
++ECI.AttendeeTimes;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|