using System.Text;
using DS.Module.Core;
using DS.Module.Core.Extensions;
using DS.WMS.Core.Application.Dtos;
using DS.WMS.Core.Application.Entity;
using DS.WMS.Core.Application.Interface;
using DS.WMS.Core.Fee.Entity;
using DS.WMS.Core.Fee.Method;
using DS.WMS.Core.Info.Entity;
using DS.WMS.Core.Op.Entity;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace DS.WMS.Core.Application.Method
{
///
/// 发票模板服务
///
public class InvoiceTemplateService : FeeServiceBase, IInvoiceTemplateService
{
const int MAX_NUM = 3;//每个用户的最大模板数量
///
/// 初始化
///
///
public InvoiceTemplateService(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
///
/// 获取模板字段
///
///
public DataResult> GetFields(IHostEnvironment environment)
{
string path = Path.Combine(environment.ContentRootPath, "inv_template.json");
if (!File.Exists(path))
return DataResult>.FailedWithDesc(nameof(MultiLanguageConst.TemplateFileNotFound));
string json = File.ReadAllText(path);
var list = JsonConvert.DeserializeObject>(json);
return DataResult>.Success(list);
}
///
/// 获取列表
///
/// 模板所有人
/// 如果为空则创建
///
public DataResult> GetList(long userId, bool createIfEmpty)
{
var list = TenantDb.Queryable().Where(x => x.CreateBy == userId)
.OrderByDescending(x => x.CreateTime).Take(MAX_NUM).ToList();
if (list.Count == 0 && createIfEmpty)
{
var arr = new InvoiceTemplate[MAX_NUM];
for (int i = 0; i < MAX_NUM; i++)
{
arr[i] = new InvoiceTemplate { Content = string.Empty, Name = $"{MultiLanguageConst.DefaultTemplateName}{i + 1}" };
}
return Save(arr);
}
return DataResult>.Success(list);
}
///
/// 保存模板
///
///
public DataResult> Save(params InvoiceTemplate[] templates)
{
int rows = TenantDb.Storageable(templates).DefaultAddElseUpdate().ExecuteCommand();
return rows > 0 ?
DataResult>.Success(new List(templates)) :
DataResult>.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
}
///
/// 渲染模板
///
/// 发票申请ID
/// 模板文本
///
///
public async Task> RenderTemplateAsync(long id, string templateText, IHostEnvironment environment)
{
var dto = await GetTemplateFormAsync(id);
if (dto == null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData));
string json = JsonConvert.SerializeObject(dto);
var jObj = JObject.Parse(json);
var jArray = jObj[nameof(InvoiceTemplateForm.Details)] as JArray;
StringBuilder sb = new(templateText);
StringBuilder sb2 = new();
var fields = GetFields(environment).Data;
foreach (var field in fields)
{
//循环输出
if (templateText.Contains($"<{field.DisplayName}>"))
{
foreach (var item in jArray)
{
sb2.Append(item[field.FieldName]?.Value());
sb2.Append(' ');
}
if (sb2.Length > 0)
{
sb2.Remove(sb2.Length - 1, 1); //移除最后一个空格
sb = sb.Replace($"<{field.DisplayName}>", sb2.ToString());
sb2.Clear();
}
}
//单次输出
else if (templateText.Contains($"[{field.DisplayName}]"))
{
string val = string.Empty;
if (field.IsSumValue)
{
val = jObj[field.FieldName]?.Value();
}
else if (jArray.Count > 0)
{
var item1 = jArray[0];
val = item1[field.FieldName]?.Value();
}
if (!val.IsNullOrEmpty())
sb = sb.Replace($"[{field.DisplayName}]", val);
}
}
return DataResult.Success(sb.ToString());
}
///
/// 获取发票模板所需数据
///
/// 发票申请ID
///
internal async Task GetTemplateFormAsync(long id)
{
var dto = await TenantDb.Queryable()
.LeftJoin((a, b) => a.CustomerBankId == b.Id)
.Where((a, b) => a.Id == id).Select((a, b) => new InvoiceTemplateForm
{
CustomerId = a.CustomerId,
CustomerName = a.CustomerName,
CustomerBankId = a.CustomerBankId,
ClientAccount = b.Account,
ClientBankName = b.BankName
}).FirstAsync();
if (dto != null)
{
dto.Details = await TenantDb.Queryable()
.LeftJoin((d, f) => d.RecordId == f.Id)
.Where(d => d.ApplicationId == id)
.Select((d, f) => new InvoiceTemplateDetail
{
Amount = d.ApplyAmount,
OriginalAmount = d.OriginalAmount,
OriginalCurrency = d.OriginalCurrency,
OriginalRate = f.ExchangeRate,
ExchangeRate = d.ExchangeRate,
BusinessId = f.BusinessId,
BusinessType = f.BusinessType,
}).ToListAsync();
var gList = dto.Details.GroupBy(x => x.BusinessType).ToList();
foreach (var g in gList)
{
var ids = g.Select(x => x.BusinessId).Distinct();
switch (g.Key)
{
case BusinessType.OceanShippingExport:
var list1 = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)).Select(x => new
{
x.Id,
x.MBLNO,
x.CustomerNo,
ClientName = x.CustomerName,
x.ETD,
x.CntrTotal,
x.AccountDate,
x.OperatorCode,
x.Vessel,
x.Voyno,
x.LoadPort,
x.DischargePort,
x.Destination
}).ToListAsync();
foreach (var item in g)
{
var biz = list1.Find(x => x.Id == item.BusinessId);
if (biz != null)
{
item.MBLNO = biz.MBLNO;
item.ClientName = biz.ClientName;
item.CustomerNo = biz.CustomerNo;
item.ETD = biz.ETD;
item.CntrTotal = biz.CntrTotal;
item.Vessel = biz.Vessel;
item.Voyage = biz.Voyno;
item.LoadPort = biz.LoadPort;
item.DischargePort = biz.DischargePort;
item.Destination = biz.Destination;
item.ForeignAmount = item.OriginalCurrency != FeeCurrency.RMB_CODE ? item.OriginalAmount : 0;
item.RMBAmount = item.OriginalCurrency == FeeCurrency.RMB_CODE ? item.OriginalAmount : 0;
}
}
break;
case BusinessType.OceanShippingImport:
break;
}
}
dto.ForeignTotal = dto.Details.Sum(x => x.ForeignAmount);
dto.RMBTotal = dto.Details.Sum(x => x.RMBAmount);
dto.ExchangeRateTotal = dto.Details.Sum(x => x.ExchangeRate);
}
return dto;
}
}
}