jianghaiqing 4 months ago
commit 45e05029c5

@ -87,6 +87,12 @@ public static class MultiLanguageConst
[Description("请选择数据!")]
public const string DataNoSelect = "Data_No_Select";
/// <summary>
/// Http请求失败
/// </summary>
[Description("Http请求失败错误代码{0}")]
public const string HttpRequestFailed = "Http_Request_Failed";
#region 数据映射
[Description("场站映射信息已存在")]
public const string MappingYardExist = "MappingYard_Exist";
@ -648,6 +654,9 @@ public static class MultiLanguageConst
[Description("开票单位有且只能有一个")]
public const string InvoiceCustomerOnlyOne = "Invoice_Customer_OnlyOne";
[Description("未配置开票API请求地址请联系管理员")]
public const string InvoiceAPIUrlNull = "Invoice_API_Url_Null";
#endregion
#region 预订舱API

@ -29,7 +29,7 @@ namespace DS.Module.Core.Enums
/// <summary>
/// 开票方式
/// </summary>
public enum InvoiceType
public enum InvoiceMode
{
/// <summary>
/// 自由发票
@ -44,11 +44,34 @@ namespace DS.Module.Core.Enums
Applcation = 2,
}
/// <summary>
/// 发票类型
/// </summary>
public enum InvoiceType
{
/// <summary>
/// 蓝票
/// </summary>
[Description("蓝票")]
Blue = 1,
/// <summary>
/// 红票
/// </summary>
[Description("红票")]
Red = 2,
}
/// <summary>
/// 发票接口类型
/// </summary>
public enum InvoiceApiType
{
/// <summary>
/// 默认
/// </summary>
Default,
/// <summary>
/// 诺诺
/// </summary>
@ -57,7 +80,7 @@ namespace DS.Module.Core.Enums
/// <summary>
/// 航信
/// </summary>
Hangxin,
Hangxin
}
/// <summary>

@ -63,6 +63,18 @@ namespace DS.WMS.Core.Application.Entity
[SugarColumn(ColumnDescription = "税额", IsNullable = false)]
public decimal TaxAmount { get; set; }
/// <summary>
/// 数量
/// </summary>
[SugarColumn(ColumnDescription = "数量", IsNullable = false)]
public int Quantity { get; set; } = 1;
/// <summary>
/// 含税总额
/// </summary>
[SugarColumn(ColumnDescription = "含税总额", IsNullable = false)]
public decimal Amount { get; set; }
/// <summary>
/// 明细类别
/// </summary>

@ -25,6 +25,7 @@
<ItemGroup>
<Folder Include="Finance\Dtos\" />
<Folder Include="Finance\Entity\" />
<Folder Include="Op\Interface\Task\" />
</ItemGroup>
<ItemGroup>

@ -47,10 +47,15 @@ namespace DS.WMS.Core.Invoice.Dto
public string? InvoiceHeader { get; set; }
/// <summary>
/// 收款单位银行
/// 收款单位账号
/// </summary>
public string? Account { get; set; }
/// <summary>
/// 收款单位银行
/// </summary>
public string? BankName { get; set; }
/// <summary>
/// 申请金额(费用明细的合计)
/// </summary>
@ -100,7 +105,7 @@ namespace DS.WMS.Core.Invoice.Dto
/// <summary>
/// 开票方式
/// </summary>
public InvoiceType Type { get; set; }
public InvoiceMode Type { get; set; }
/// <summary>
/// 开票方式文本
@ -149,14 +154,25 @@ namespace DS.WMS.Core.Invoice.Dto
public string? TaxID { get; set; }
/// <summary>
/// 客户地址电话
/// 客户地址
/// </summary>
public string? CustomerAddress { get; set; }
/// <summary>
/// 客户电话
/// </summary>
public string? CustomerAddTel { get; set; }
public string? CustomerPhone { get; set; }
/// <summary>
/// 客户银行
/// </summary>
public string? CustomerBank { get; set; }
public string? CustomerBankName { get; set; }
/// <summary>
/// 客户银行账号
/// </summary>
public string? CustomerAccount { get; set; }
/// <summary>
/// 代开客户

@ -0,0 +1,332 @@
namespace DS.WMS.Core.Invoice.Dtos
{
/// <summary>
/// 开票请求
/// </summary>
public class InvoiceIssuanceRequest
{
/// <summary>
/// 唯一标识由企业自己生成32位随机码【消息体】
/// </summary>
public string senid { get; set; } = Guid.NewGuid().ToString("N");
/// <summary>
/// 忽略商品和服务税收分类合并编码提醒
/// </summary>
public bool IgnoreSphfwssflhbbm { get; set; }
/// <summary>
/// 请求体
/// </summary>
public List<InvoiceInfo> order { get; set; }
}
/// <summary>
/// 发票
/// </summary>
public class InvoiceInfo
{
/// <summary>
/// 1蓝票;2红票
/// </summary>
public string invoiceType { get; set; } = "1";
/// <summary>
/// 订单号(每个企业唯一)
/// </summary>
public string orderNo { get; set; }
/// <summary>
/// 用于接受发票附件的邮箱
/// </summary>
public string? email { get; set; }
/// <summary>
/// 销售方开户行
/// </summary>
public string xsfkhh { get; set; }
/// <summary>
/// 销售方账号
/// </summary>
public string xsfzh { get; set; }
/// <summary>
/// 销方电话
/// </summary>
public string salerTel { get; set; }
/// <summary>
/// 销方地址
/// </summary>
public string salerAddress { get; set; }
/// <summary>
/// 购方税号
/// </summary>
public string buyerTaxNum { get; set; }
/// <summary>
/// 购方名称
/// </summary>
public string buyerName { get; set; }
/// <summary>
/// 购方地址
/// </summary>
public string? buyerAddress { get; set; }
/// <summary>
/// 购方电话
/// </summary>
public string? buyerTel { get; set; }
/// <summary>
/// 购买方开户行
/// </summary>
public string? gmfkhh { get; set; }
/// <summary>
/// 购买方账号
/// </summary>
public string? gmfzh { get; set; }
/// <summary>
/// 购买方经办人姓名
/// </summary>
public string? buyerManagerName { get; set; }
/// <summary>
/// 经办人证件号码
/// </summary>
public string? jbrsfzjhm { get; set; }
/// <summary>
/// 购买方经办人联系电话
/// </summary>
public string gmfjbrlxdh { get; set; }
/// <summary>
/// 收款银行名称
/// </summary>
public string? skyhmc { get; set; }
/// <summary>
/// 收款银行账号
/// </summary>
public string? skyhzh { get; set; }
/// <summary>
/// 复核人
/// </summary>
public string checker { get; set; }
/// <summary>
/// 收款人
/// </summary>
public string payee { get; set; }
/// <summary>
/// 合计金额
/// </summary>
public decimal hjje { get; set; }
/// <summary>
/// 合计税额
/// </summary>
public decimal hjse { get; set; }
/// <summary>
/// 金税合计
/// </summary>
public decimal jshj { get; set; }
/// <summary>
/// 开票员
/// </summary>
public string clerk { get; set; }
/// <summary>
/// 开票人证件号码
/// </summary>
public string kprzjhm { get; set; }
/// <summary>
/// 开票人证件类型
/// </summary>
public string kprzjlx { get; set; }
/// <summary>
/// 备注
/// </summary>
public string remark { get; set; }
/// <summary>
/// 发票种类 bs:电子发票(增值税专用发票)-即数电专票(电子), pc:电子发票(普通发票)-即数电普票(电子)
/// </summary>
public string invoiceLine { get; set; } = "bs";
/// <summary>
/// 购买方自然人标志
/// </summary>
public string gmfzrrbz { get; set; } = "Y";
/// <summary>
/// 特定要素
/// </summary>
public string tdys { get; set; }
/// <summary>
/// 差额征税类型代码
/// </summary>
public string cezslxDm { get; set; }
/// <summary>
/// 收购发票类型代码
/// </summary>
public string sgfplxDm { get; set; }
/// <summary>
/// 出口业务适用政策代码
/// </summary>
public string ckywsyzcDm { get; set; }
/// <summary>
/// 增值税即征即退代码
/// </summary>
public string zzsjzjtDm { get; set; }
/// <summary>
/// 结算方式
/// </summary>
/// <remarks></remarks>
public string jsfs { get; set; } = "01";
/// <summary>
/// 应税发生地
/// </summary>
public string ysxwfsd { get; set; }
/// <summary>
/// 是否展示销售方银行账号标签
/// </summary>
public string sfzsxsfyhzhbq { get; set; }
/// <summary>
/// 是否展示购买方银行账号标签
/// </summary>
public string sfzsgmfyhzhbq { get; set; }
/// <summary>
/// 发票明细
/// </summary>
public List<InvoiceDetailInfo> invoiceDetail { get; set; }
/// <summary>
/// 附件要素
/// </summary>
public List<Fjys>? fjysList { get; set; }
/// <summary>
/// 差额扣除
/// </summary>
public List<Cekc>? cekcList { get; set; }
}
/// <summary>
/// 发票明细
/// </summary>
public class InvoiceDetailInfo
{
/// <summary>
/// 明细序号
/// </summary>
public int mxxh { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string xmmc { get; set; }
/// <summary>
/// 商品服务简称
/// </summary>
public string spfwjc { get; set; }
/// <summary>
/// 规格号型
/// </summary>
public string specType { get; set; }
/// <summary>
/// 发票行性质
/// </summary>
public string invoiceLineProperty { get; set; } = "00";
/// <summary>
/// 数量
/// </summary>
public string num { get; set; }
/// <summary>
/// 单价
/// </summary>
public string price { get; set; }
/// <summary>
/// 税额
/// </summary>
public decimal? tax { get; set; }
/// <summary>
/// 含税金额
/// </summary>
public decimal? taxIncludedAmount { get; set; }
/// <summary>
/// 金额
/// </summary>
public decimal? taxExcludedAmount { get; set; }
/// <summary>
/// 增值税税率/征收率
/// </summary>
public string taxRate { get; set; }
/// <summary>
/// 单位
/// </summary>
public string unit { get; set; }
/// <summary>
/// 扣除额
/// </summary>
public string deduction { get; set; }
/// <summary>
/// 商品和服务税收分类合并编码
/// </summary>
public string goodsCode { get; set; }
/// <summary>
/// 优惠政策表示
/// </summary>
public string favouredPolicyFlag { get; set; }
}
/// <summary>
/// 附加要素
/// </summary>
public class Fjys
{
/// <summary>
/// 附加要素名称
/// </summary>
public string fjysmc { get; set; }
/// <summary>
/// 附加要素类型
/// </summary>
public string fjyslx { get; set; }
/// <summary>
/// 附加要素值
/// </summary>
public string fjysz { get; set; }
}
/// <summary>
/// 业务信息
/// </summary>
public class Cekc
{
/// <summary>
/// 序号
/// </summary>
public int xh { get; set; }
/// <summary>
/// 凭证类型
/// </summary>
public string pzlx { get; set; }
/// <summary>
/// 发票代码
/// </summary>
public string fpdm { get; set; }
/// <summary>
/// 发票号码
/// </summary>
public string fphm { get; set; }
/// <summary>
/// 差额凭证号码
/// </summary>
public string cepzhm { get; set; }
/// <summary>
/// 开具日期
/// </summary>
public string kjrq { get; set; }
/// <summary>
/// 凭证合计金额
/// </summary>
public decimal pzhjje { get; set; }
/// <summary>
/// 本次扣除金额
/// </summary>
public decimal bckcje { get; set; }
/// <summary>
/// 备注
/// </summary>
public string bz { get; set; }
}
}

@ -0,0 +1,25 @@
using System.Runtime.Serialization;
namespace DS.WMS.Core.Invoice.Dtos
{
public class InvoiceIssuanceResult
{
[DataMember(Name = "code")]
public int Code { get; set; }
[DataMember(Name = "success")]
public bool Success { get; set; }
[DataMember(Name = "msg")]
public string Message { get; set; }
[DataMember(Name = "data")]
public object Data { get; set; }
}
public class InvoiceIssuanceResult<T> : InvoiceIssuanceResult
{
[DataMember(Name = "data")]
public new T Data { get; set; }
}
}

@ -0,0 +1,46 @@
namespace DS.WMS.Core.Invoice.Dtos
{
/// <summary>
/// 租户信息
/// </summary>
public class Tenant
{
/// <summary>
/// 公司纳税人识别标识
/// </summary>
public string TaxCode { get; set; }
/// <summary>
/// 公司名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 使用单位乐企Id
/// </summary>
public string sydwptbh { get; set; }
/// <summary>
/// 授权人证件号码
/// </summary>
public string idCard { get; set; }
/// <summary>
/// 授权人证件类型
/// </summary>
public string idCardType { get; set; } = "101";
/// <summary>
/// 自然人类型
/// </summary>
public string relatedType { get; set; } = "01";
/// <summary>
/// 开票人
/// </summary>
public string kpr { get; set; }
/// <summary>
/// 开票人证件号码
/// </summary>
public string kprzjhm { get; set; }
/// <summary>
/// 开票人证件类型
/// </summary>
public string kprzjlx { get; set; }
}
}

@ -52,7 +52,13 @@ namespace DS.WMS.Core.Invoice.Entity
/// <summary>
/// 收款单位银行
/// </summary>
[SugarColumn(ColumnDescription = "收款单位银行", Length = 200)]
[SugarColumn(ColumnDescription = "收款单位银行", Length = 100, IsNullable = true)]
public string? BankName { get; set; }
/// <summary>
/// 收款单位银行
/// </summary>
[SugarColumn(ColumnDescription = "收款单位账号", Length = 100, IsNullable = true)]
public string? Account { get; set; }
/// <summary>
@ -101,6 +107,12 @@ namespace DS.WMS.Core.Invoice.Entity
/// 开票方式
/// </summary>
[SugarColumn(ColumnDescription = "开票方式")]
public InvoiceMode Mode { get; set; }
/// <summary>
/// 发票类型
/// </summary>
[SugarColumn(ColumnDescription = "发票类型")]
public InvoiceType Type { get; set; }
/// <summary>
@ -140,16 +152,28 @@ namespace DS.WMS.Core.Invoice.Entity
public string? TaxID { get; set; }
/// <summary>
/// 客户地址电话
/// 客户地址
/// </summary>
[SugarColumn(ColumnDescription = "客户地址", Length = 200, IsNullable = true)]
public string? CustomerAddress { get; set; }
/// <summary>
/// 客户电话
/// </summary>
[SugarColumn(ColumnDescription = "客户电话", Length = 20, IsNullable = true)]
public string? CustomerPhone { get; set; }
/// <summary>
/// 客户银行名称
/// </summary>
[SugarColumn(ColumnDescription = "客户地址电话", Length = 200, IsNullable = true)]
public string? CustomerAddTel { get; set; }
[SugarColumn(ColumnDescription = "客户银行名称", Length = 100, IsNullable = true)]
public string? CustomerBankName { get; set; }
/// <summary>
/// 客户银行
/// 客户银行账号
/// </summary>
[SugarColumn(ColumnDescription = "客户银行", Length = 100, IsNullable = true)]
public string? CustomerBank { get; set; }
[SugarColumn(ColumnDescription = "客户银行账号", Length = 100, IsNullable = true)]
public string? CustomerAccount { get; set; }
/// <summary>
/// 代开客户
@ -205,12 +229,6 @@ namespace DS.WMS.Core.Invoice.Entity
[SugarColumn(ColumnDescription = "是否境外发票", DefaultValue = "0")]
public bool IsOverseasInvoice { get; set; }
/// <summary>
/// 正票,冲红
/// </summary>
[SugarColumn(ColumnDescription = "正票,冲红", IsNullable = true, Length = 2)]
public string? Reversal { get; set; }
/// <summary>
/// 红票发票代码
/// </summary>

@ -0,0 +1,171 @@
using System.Collections.Specialized;
using System.Security;
using System.Text;
using DS.Module.Core;
using DS.Module.Core.Extensions;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
namespace DS.WMS.Core.Invoice.Method
{
internal class ApiFox
{
/// <summary>
/// 发票API的基URL
/// </summary>
public string? BaseUrl { get; set; }
/// <summary>
/// 用户Key
/// </summary>
public string? UserKey { get; set; }
/// <summary>
/// 用户密钥
/// </summary>
public SecureString? UserSecret { get; private set; }
public ApiFox(IConfiguration config)
{
BaseUrl = config.GetValue<string>("InvoiceApi:BaseUrl");
UserKey = config.GetValue<string>("InvoiceApi:UserKey");
string? us = config.GetValue<string>("InvoiceApi:UserSecret");
if (!us.IsNullOrEmpty())
{
UserSecret = new SecureString();
for (int i = 0; i < us.Length; i++)
UserSecret.AppendChar(us[i]);
UserSecret.MakeReadOnly();
}
us = null;
}
/// <summary>
/// 发起<see cref="HttpMethod.Get"/>请求
/// </summary>
/// <typeparam name="T">请求结果的类型</typeparam>
/// <param name="url">请求Url</param>
/// <param name="keyValues">查询字符串的键值对</param>
/// <returns></returns>
/// <exception cref="ArgumentException"><paramref name="url"/>为null或空字符串</exception>
public async Task<DataResult<T>> GetAsync<T>(string url, NameValueCollection? keyValues = null)
{
ArgumentException.ThrowIfNullOrEmpty(nameof(url));
string? queryString = null;
if (keyValues != null && keyValues.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (string key in keyValues.Keys)
{
var values = keyValues.GetValues(key);
if (values?.Length > 0)
{
for (int i = 0; i < values.Length; i++)
{
sb.Append($"&{key}={values[i]}");
}
}
}
if (sb.Length > 0) //移除首个&符
sb.Remove(0, 1);
queryString = sb.ToString();
}
if (!queryString.IsNullOrEmpty())
url = url.LastOrDefault() == '?' ? url + queryString : url + "?" + queryString;
var result = await SendRequestAsync(HttpMethod.Get, url);
if (!result.Succeeded)
return DataResult<T>.Failed(result.Message, result.MultiCode);
var response = result.Data;
string json = await response.Content.ReadAsStringAsync();
return DataResult<T>.Success(JsonConvert.DeserializeObject<T>(json));
}
/// <summary>
/// 发起<see cref="HttpMethod.Post"/>请求
/// </summary>
/// <typeparam name="T">请求结果的类型</typeparam>
/// <param name="url">请求Url</param>
/// <param name="requestParams">查询字符串的键值对</param>
/// <returns></returns>
/// <exception cref="ArgumentException"><paramref name="url"/>为null或空字符串</exception>
public async Task<DataResult<T>> PostAsync<T>(string url, object? requestParams = null)
{
ArgumentException.ThrowIfNullOrEmpty(nameof(url));
var result = await SendRequestAsync(HttpMethod.Post, url, requestParams);
if (!result.Succeeded)
return DataResult<T>.Failed(result.Message, result.MultiCode);
var response = result.Data;
string json = await response.Content.ReadAsStringAsync();
return DataResult<T>.Success(JsonConvert.DeserializeObject<T>(json));
}
/// <summary>
/// 发起请求
/// </summary>
/// <param name="method">请求方法</param>
/// <param name="url">请求Url</param>
/// <param name="requestParams">请求参数</param>
/// <returns></returns>
public async Task<DataResult<HttpResponseMessage>> SendRequestAsync(HttpMethod method, string url, object? requestParams = null)
{
if (!Uri.TryCreate(BaseUrl, UriKind.RelativeOrAbsolute, out Uri? uri))
return DataResult<HttpResponseMessage>.FailedWithDesc(nameof(MultiLanguageConst.InvoiceAPIUrlNull));
HttpClient http = new();
http.DefaultRequestHeaders.Add("User-Agent", "X-HttpClient");
if (!UserKey.IsNullOrEmpty())
http.DefaultRequestHeaders.Add("USER_KEY", UserKey);
if (UserSecret != null)
http.DefaultRequestHeaders.Add("USER_SECRET", UserSecret.ToString());
Uri reqUri = new(uri, url);
try
{
HttpResponseMessage? response = null;
if (method == HttpMethod.Get)
{
response = await http.GetAsync(reqUri);
}
else if (method == HttpMethod.Post)
{
var jsonRequest = new StringContent(JsonConvert.SerializeObject(requestParams), Encoding.UTF8, "application/json");
response = await http.PostAsync(reqUri, jsonRequest);
}
else if (method == HttpMethod.Put)
{
var jsonRequest = new StringContent(JsonConvert.SerializeObject(requestParams), Encoding.UTF8, "application/json");
response = await http.PutAsync(reqUri, jsonRequest);
}
else if (method == HttpMethod.Delete)
{
response = await http.DeleteAsync(reqUri);
}
else
{
throw new NotSupportedException($"不支持的请求方法:{method.Method}");
}
if (!response.IsSuccessStatusCode)
return DataResult<HttpResponseMessage>.FailedData(response, string.Format(MultiLanguageConst.HttpRequestFailed, $"{response.StatusCode}"));
return DataResult<HttpResponseMessage>.Success(response);
}
finally
{
http?.Dispose();
}
}
}
}

@ -155,7 +155,7 @@ namespace DS.WMS.Core.Invoice.Method
protected override async Task<DataResult> PreSaveAsync(Entity.Invoice invoice)
{
invoice.Type = InvoiceType.Free;
invoice.Mode = InvoiceMode.Free;
//获取剩余待开票金额
var ids = invoice.Details.Select(x => x.RecordId);

@ -120,7 +120,7 @@ namespace DS.WMS.Core.Invoice.Method
protected override Task<DataResult> PreSaveAsync(Entity.Invoice invoice)
{
invoice.Type = InvoiceType.Applcation;
invoice.Mode = InvoiceMode.Applcation;
return Task.FromResult(DataResult.Success);
}

@ -0,0 +1,105 @@
using DS.Module.Core;
using DS.WMS.Core.Application.Method;
using DS.WMS.Core.Invoice.Dtos;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace DS.WMS.Core.Invoice.Method
{
/// <summary>
/// 发票开具服务
/// </summary>
public sealed class InvoiceIssuanceService : ApplicationServiceBase
{
readonly ApiFox api;
/// <summary>
/// 初始化并加载配置
/// </summary>
/// <param name="provider"></param>
public InvoiceIssuanceService(IServiceProvider provider) : base(provider)
{
var config = provider.GetRequiredService<IConfiguration>();
api = new ApiFox(config);
}
/// <summary>
/// 发起开票请求
/// </summary>
/// <param name="invoices">开票的发票信息</param>
/// <returns></returns>
public async Task<DataResult<string>> InitiateAsync(params Entity.Invoice[] invoices)
{
//请求参数设置
InvoiceIssuanceRequest request = new();
request.order = invoices.Select(x => new InvoiceInfo
{
invoiceType = ((int)x.Type).ToString(),
orderNo = x.BillNO,
email = x.Email,
buyerTaxNum = x.TaxID,
buyerName = x.InvoiceHeader,
buyerAddress = x.CustomerAddress,
buyerTel = x.CustomerPhone,
gmfkhh = x.CustomerBankName,
gmfzh = x.CustomerAccount,
skyhmc = x.BankName,
skyhzh = x.Account,
checker = x.Checker,
payee = x.Payee,
//---------金额项---------
hjse = x.InvoiceAmount * x.TaxRate,
hjje = x.InvoiceAmount - x.InvoiceAmount * x.TaxRate,
jshj = x.InvoiceAmount,
clerk = x.CreateUserName, //开票人
kprzjhm = "", //证件号
kprzjlx = "201", //身份证,
//---------发票明细---------
invoiceDetail = x.InvoiceDetails.Select(y => new InvoiceDetailInfo
{
mxxh = x.InvoiceDetails.IndexOf(y) + 1,
xmmc = y.Name,
spfwjc = string.Empty,
specType = y.Specification,
unit = y.Unit,
num = y.Quantity.ToString(),
taxExcludedAmount = y.UnitPrice,
taxRate = y.TaxRate.ToString(),
tax = y.TaxAmount,
taxIncludedAmount = y.TaxUnitPrice,
goodsCode = "", //商品和服务税收分类合并编码
invoiceLineProperty = "00"
}).ToList()
}).ToList();
var result = await api.PostAsync<InvoiceIssuanceResult<string>>("/api/Invoice/services", request);
if (!result.Succeeded)
return DataResult<string>.Failed(result.Message, result.MultiCode);
var invResult = result.Data;
if (!invResult.Success)
{
if (invResult.Code == 1)
return await InitiateAsync(invoices);
return DataResult<string>.Failed(invResult.Message);
}
return DataResult<string>.Success(invResult.Data);
}
/// <summary>
/// 添加租户信息
/// </summary>
/// <param name="tenant">租户信息</param>
/// <returns></returns>
/// <exception cref="ArgumentNullException">当<paramref name="tenant"/>为null时引发。</exception>
public async Task<string> AddTenantAsync(Tenant tenant)
{
ArgumentNullException.ThrowIfNull(tenant, nameof(tenant));
var result = await api.PostAsync<string>("/api/Login/AddTenant", tenant);
return result.Data;
}
}
}

@ -49,12 +49,14 @@ namespace DS.WMS.Core.Invoice.Method
InvoiceDate = i.InvoiceDate,
CustomerId = i.CustomerId,
CustomerName = i.CustomerName,
Type = i.Type,
Type = i.Mode,
Category = i.Category,
InvoiceHeader = i.InvoiceHeader,
TaxID = i.TaxID,
CustomerAddTel = i.CustomerAddTel,
CustomerBank = i.CustomerBank,
CustomerAddress = i.CustomerAddress,
CustomerBankName = i.CustomerBankName,
CustomerPhone = i.CustomerPhone,
CustomerAccount = i.CustomerAccount,
AutualCustomerName = i.AutualCustomerName,
Currency = i.Currency,
ReceiptCurrency = i.ReceiptCurrency,
@ -185,7 +187,7 @@ namespace DS.WMS.Core.Invoice.Method
{
Id = x.Id,
IsLocked = x.IsLocked,
Type = x.Type,
Mode = x.Mode,
}).FirstAsync(x => x.Id == request.Invoice.Id);
}
var result = EnsureSettlement(request.Invoice, dbValue);
@ -335,15 +337,18 @@ namespace DS.WMS.Core.Invoice.Method
{
x.InvoiceNO,
x.InvoiceDate,
x.Account,
x.BankName,
//x.Currency,
x.ReceiptCurrency,
x.CustomerId,
x.CustomerName,
x.AutualCustomerName,
x.InvoiceHeader,
x.Account,
x.CustomerAddTel,
x.CustomerBank,
x.CustomerAddress,
x.CustomerPhone,
x.CustomerBankName,
x.CustomerAccount,
x.OperatorId,
x.TaxID,
x.TaxRate,
@ -370,7 +375,7 @@ namespace DS.WMS.Core.Invoice.Method
}).ToList();
var updateable = TenantDb.Updateable(fees).PublicSetColumns(x => x.InvoiceAmount, "+");
if (invoice.Type == InvoiceType.Applcation)
if (invoice.Mode == InvoiceMode.Applcation)
updateable = updateable.PublicSetColumns(x => x.OrderInvSettlementAmount, "+")
.UpdateColumns(x => new { x.OrderInvSettlementAmount });
@ -430,12 +435,13 @@ namespace DS.WMS.Core.Invoice.Method
ApplicationId = invoice.Id,
Name = g.Key,
TaxRate = invoice.TaxRate,
Quantity = 1,
TaxUnitPrice = invoice.Details.FindAll(x => g.Select(x => x.DetailId).Contains(x.Id)).Sum(x => x.ApplyAmount),
Category = DetailCategory.InvoiceIssuance
};
invDetail.TaxAmount = invDetail.TaxUnitPrice * invoice.TaxRate;
invDetail.UnitPrice = invDetail.TaxUnitPrice - invDetail.TaxAmount;
invDetail.Amount = invDetail.TaxUnitPrice * invDetail.Quantity;
invoice.InvoiceDetails.Add(invDetail);
foreach (var item in g)
@ -487,13 +493,14 @@ namespace DS.WMS.Core.Invoice.Method
Id = SnowFlakeSingle.Instance.NextId(),
ApplicationId = invoice.Id,
Name = goodsName,
Quantity = 1,
TaxRate = invoice.TaxRate,
TaxUnitPrice = detail.ApplyAmount,
Category = DetailCategory.InvoiceIssuance
};
invDetail.TaxAmount = invDetail.TaxUnitPrice * invoice.TaxRate;
invDetail.UnitPrice = invDetail.TaxUnitPrice - invDetail.TaxAmount;
invDetail.Amount = invDetail.TaxUnitPrice * invDetail.Quantity;
invoice.InvoiceDetails.Add(invDetail);
relationList.Add(new ApplicationDetailRelation
@ -566,7 +573,7 @@ namespace DS.WMS.Core.Invoice.Method
var details = await TenantDb.Queryable<ApplicationDetail>().Where(x => ids.Contains(x.ApplicationId))
.Select(x => new { x.ApplicationId, x.Currency, x.ApplyAmount, x.OriginalAmount }).ToListAsync();
var invDetails = await TenantDb.Queryable<InvoiceDetail>().Where(x => ids.Contains(x.ApplicationId))
.Select(x => new { x.ApplicationId, x.TaxUnitPrice }).ToListAsync();
.Select(x => new { x.ApplicationId, x.Amount }).ToListAsync();
foreach (var invoice in invoices)
{
@ -577,7 +584,7 @@ namespace DS.WMS.Core.Invoice.Method
invoice.OriginalAmount = currDetails.Sum(x => x.OriginalAmount);
invoice.OtherInvoiceAmount = currDetails.FindAll(x => x.Currency != RMB_CODE).Sum(x => x.OriginalAmount);
invoice.InvoiceAmount = invDetails.FindAll(x => x.ApplicationId == invoice.Id).Sum(x => x.TaxUnitPrice);
invoice.InvoiceAmount = invDetails.FindAll(x => x.ApplicationId == invoice.Id).Sum(x => x.Amount);
}
return await TenantDb.Updateable(invoices).UpdateColumns(x => new
@ -638,7 +645,7 @@ namespace DS.WMS.Core.Invoice.Method
var apps = await TenantDb.Queryable<TEntity>().Where(x => ids.Contains(x.Id)).Select(x => new TEntity
{
Id = x.Id,
Type = x.Type,
Mode = x.Mode,
IsLocked = x.IsLocked
}).ToListAsync();
@ -709,7 +716,7 @@ namespace DS.WMS.Core.Invoice.Method
var invoices = await TenantDb.Queryable<TEntity>().Where(x => invIds.Contains(x.Id)).Select(x => new TEntity
{
Id = x.Id,
Type = x.Type,
Mode = x.Mode,
IsLocked = x.IsLocked
}).ToListAsync();
@ -749,11 +756,11 @@ namespace DS.WMS.Core.Invoice.Method
try
{
var invDetails = await TenantDb.Queryable<InvoiceDetail>().Where(x => ids.Contains(x.Id))
.Select(x => new { x.ApplicationId, x.TaxUnitPrice }).ToListAsync();
.Select(x => new { x.ApplicationId, x.Amount }).ToListAsync();
var groups = invDetails.GroupBy(x => x.ApplicationId);
foreach (var g in groups)
{
var list = g.Select(x => new TEntity { Id = g.Key, InvoiceAmount = g.Sum(x => x.TaxUnitPrice) }).ToList();
var list = g.Select(x => new TEntity { Id = g.Key, InvoiceAmount = g.Sum(x => x.Amount) }).ToList();
//更新发票主表的开票金额
await TenantDb.Updateable(list).PublicSetColumns(x => x.InvoiceAmount, "-")
.UpdateColumns(x => new { x.InvoiceAmount }).ExecuteCommandAsync();
@ -828,7 +835,7 @@ namespace DS.WMS.Core.Invoice.Method
}).ExecuteCommandAsync();
//删除明细之间的关系
await TenantDb.Deleteable<ApplicationDetailRelation>().Where(x => excludeIds.Contains(x.DetailId)).ExecuteCommandAsync();
}
else if (deleteOption == DeleteOption.Entire)
{
@ -846,7 +853,7 @@ namespace DS.WMS.Core.Invoice.Method
var updateable = TenantDb.Updateable(fees).PublicSetColumns(x => x.InvoiceAmount, "-");
if (item.Type == InvoiceType.Applcation)
if (item.Mode == InvoiceMode.Applcation)
updateable = updateable.PublicSetColumns(x => x.OrderInvSettlementAmount, "-")
.UpdateColumns(x => new { x.OrderInvSettlementAmount });

@ -0,0 +1,20 @@
using DS.WMS.Core.Fee.Method;
namespace DS.WMS.Core.Op.Method.Task
{
/// <summary>
/// 海运出口任务服务
/// </summary>
public class SeaExportTaskService : FeeServiceBase
{
/// <summary>
/// 初始化
/// </summary>
/// <param name="provider"></param>
public SeaExportTaskService(IServiceProvider provider) : base(provider)
{
}
}
}

@ -3113,3 +3113,10 @@
2024-07-19 15:00:10.8983 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config
2024-07-19 15:00:10.8983 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-19 15:00:10.8983 Info Configuration initialized.
2024-07-22 08:57:09.8146 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-22 08:57:09.8521 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-22 08:57:09.8521 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-22 08:57:09.8917 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-22 08:57:09.9055 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config
2024-07-22 08:57:09.9055 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-22 08:57:09.9319 Info Configuration initialized.

@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>D:\Publish\DS8\FeeApi</_PublishTargetUrl>
<History>True|2024-07-12T09:35:11.1225017Z||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;True|2024-05-27T15:16:32.9413631+08:00||;True|2024-05-27T15:03:42.9803879+08:00||;True|2024-05-27T08:49:54.3933663+08:00||;True|2024-05-27T08:46:13.5862236+08:00||;True|2024-05-23T17:19:32.8154451+08:00||;True|2024-05-23T17:19:01.4587615+08:00||;True|2024-05-22T16:52:42.2166228+08:00||;True|2024-05-22T15:19:49.1773202+08:00||;True|2024-05-22T15:13:31.9485525+08:00||;True|2024-05-22T13:29:02.1355808+08:00||;True|2024-05-22T09:48:40.8753914+08:00||;True|2024-05-22T09:25:06.2068137+08:00||;True|2024-05-22T09:18:53.0759815+08:00||;True|2024-05-21T17:13:36.4091775+08:00||;True|2024-05-21T14:41:18.8486299+08:00||;True|2024-05-21T11:04:27.3649637+08:00||;</History>
<History>True|2024-07-22T00:59:23.3235603Z||;True|2024-07-12T17:35:11.1225017+08:00||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;True|2024-05-27T15:16:32.9413631+08:00||;True|2024-05-27T15:03:42.9803879+08:00||;True|2024-05-27T08:49:54.3933663+08:00||;True|2024-05-27T08:46:13.5862236+08:00||;True|2024-05-23T17:19:32.8154451+08:00||;True|2024-05-23T17:19:01.4587615+08:00||;True|2024-05-22T16:52:42.2166228+08:00||;True|2024-05-22T15:19:49.1773202+08:00||;True|2024-05-22T15:13:31.9485525+08:00||;True|2024-05-22T13:29:02.1355808+08:00||;True|2024-05-22T09:48:40.8753914+08:00||;True|2024-05-22T09:25:06.2068137+08:00||;True|2024-05-22T09:18:53.0759815+08:00||;True|2024-05-21T17:13:36.4091775+08:00||;True|2024-05-21T14:41:18.8486299+08:00||;True|2024-05-21T11:04:27.3649637+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

@ -1,61 +1,66 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"JwtSettings": {
"Issuer": "vol.core.owner",
"Audience": "vol.core",
"User": "C5ABA9E202D94C43A3CA66002BF77FAF",
"SecretKey": "sdfsdfsrty45634kkhllghtdgdfss345t678fs"
},
"Cors": {
"PolicyName": "WMSCore.API",
"Url": "http://localhost:8000,http://localhost:5999,http://localhost:8088,http://localhost:5173,http://0.0.0.0:5999,http://0.0.0.0:9995,http://localhost:9995,http://60.209.125.238:9995,http://localhost:3000,https://localhost:3100,http://47.104.255.182:3100,http://47.104.255.182:3110,https://localhost:3110,http://localhost:8080,http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084"
},
"DBInfo": {
"DefaultDbConnId": "1288018625843826688",
"DefaultDbType": 0,
"DefaultDbString": "server=60.209.125.238;port=32006;uid=root;pwd=Djy@Mysql.test;database=shippingweb8_dev",
"DBS": [
{
"ConnId": "1288018625843826680",
"DBType": 0,
"Enabled": false,
"HitRate": 40,
"Connection": "server=60.209.125.238;port=32006;uid=root;pwd=Djy@Mysql.test;database=shippingweb8_log"
}
]
},
"SwaggerDoc": {
"ContactName": "WmsFeeAPI",
"ContactEmail": "Wms API.Core@xxx.com",
"ContactUrl": "https://www.xxx.com",
"Version": "1.0",
"Title": "Wms Fee API",
"Description": "Wms Fee API"
},
"Middleware": {
"RecordAccessLogs": {
"Enabled": true,
"IgnoreApis": "/api/permission/getnavigationbar,/api/monitor/getids4users,/api/monitor/getaccesslogs,/api/monitor/server,/api/monitor/getactiveusers,/api/monitor/server,"
}
},
"FileSettings": {
"BasePath": "", //使
"RelativePath": "LinkAttach",
"FileType": [ ".xls", ".xlsx", ".pdf", ".txt", ".pms" ]
},
"PrintService": {
"IP": "60.209.125.238",
"Port": "3009",
"AccessKey": "1777229107311022080",
"AccessSecret": "d816e6fe938f24e2f205db129d31286a",
"GetModuleListUrl": "/printApi/OpenPrint/GetPrintModuleList",
"GetTemplateListUrl": "/printApi/OpenPrint/GetPrintTemplateList",
"GetJsonPrintInfoUrl": "/printApi/OpenPrint/GetOpenJsonPrintInfo"
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"JwtSettings": {
"Issuer": "vol.core.owner",
"Audience": "vol.core",
"User": "C5ABA9E202D94C43A3CA66002BF77FAF",
"SecretKey": "sdfsdfsrty45634kkhllghtdgdfss345t678fs"
},
"Cors": {
"PolicyName": "WMSCore.API",
"Url": "http://localhost:8000,http://localhost:5999,http://localhost:8088,http://localhost:5173,http://0.0.0.0:5999,http://0.0.0.0:9995,http://localhost:9995,http://60.209.125.238:9995,http://localhost:3000,https://localhost:3100,http://47.104.255.182:3100,http://47.104.255.182:3110,https://localhost:3110,http://localhost:8080,http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084"
},
"DBInfo": {
"DefaultDbConnId": "1288018625843826688",
"DefaultDbType": 0,
"DefaultDbString": "server=60.209.125.238;port=32006;uid=root;pwd=Djy@Mysql.test;database=shippingweb8_dev",
"DBS": [
{
"ConnId": "1288018625843826680",
"DBType": 0,
"Enabled": false,
"HitRate": 40,
"Connection": "server=60.209.125.238;port=32006;uid=root;pwd=Djy@Mysql.test;database=shippingweb8_log"
}
]
},
"SwaggerDoc": {
"ContactName": "WmsFeeAPI",
"ContactEmail": "Wms API.Core@xxx.com",
"ContactUrl": "https://www.xxx.com",
"Version": "1.0",
"Title": "Wms Fee API",
"Description": "Wms Fee API"
},
"Middleware": {
"RecordAccessLogs": {
"Enabled": true,
"IgnoreApis": "/api/permission/getnavigationbar,/api/monitor/getids4users,/api/monitor/getaccesslogs,/api/monitor/server,/api/monitor/getactiveusers,/api/monitor/server,"
}
},
"FileSettings": {
"BasePath": "", //使
"RelativePath": "LinkAttach",
"FileType": [ ".xls", ".xlsx", ".pdf", ".txt", ".pms" ]
},
"PrintService": {
"IP": "60.209.125.238",
"Port": "3009",
"AccessKey": "1777229107311022080",
"AccessSecret": "d816e6fe938f24e2f205db129d31286a",
"GetModuleListUrl": "/printApi/OpenPrint/GetPrintModuleList",
"GetTemplateListUrl": "/printApi/OpenPrint/GetPrintTemplateList",
"GetJsonPrintInfoUrl": "/printApi/OpenPrint/GetOpenJsonPrintInfo"
},
"InvoiceApi": {
"UserKey": "",
"UserSecret": "",
"BaseUrl": "http://60.209.125.238:26650"
}
}

Loading…
Cancel
Save