Piolot_Order_TH/Services/SaleOrderService.cs

372 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Gatedge.Enpower.BOS.PlugIn.Utils;
using GZ_LTHPilot_ORDER.Models.K3Request;
using GZ_LTHPilot_ORDER.Models.K3Result;
using GZ_LTHPilot_ORDER.Models.VO;
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.BOS.WebApi.FormService;
using Kingdee.K3.FIN.App.Core.Match.Object;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Service
{
/// <summary>
/// 销售订单服务类
/// </summary>
public class SaleOrderService
{
private Context ctx;
public SaleOrderService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// K3退货金额原币取数逻辑K3退货金额除以销售订单汇率=K3退货金额原币
/// </summary>
/// <param name="contractNo">纸质合同号</param>
/// <returns></returns>
public decimal GetK3SaleOrderRetrunAmount(string orgId, string contractNo)
{
var sqlTemp = @"/*dialect*/WITH
K3returnAmount AS (
SELECT
t2.F_CONTRACTNUMBER,
ROUND(ISNULL (SUM(退货金额), 0) / t2fin.FEXCHANGERATE, 2) K3returnAmount
FROM
oldk3seorder0701 t1
Inner join T_SAL_ORDER t2 on t1.合同号 = t2.F_CONTRACTNUMBER
and t2.FSALEORGID = '100302'
inner join T_SAL_ORDERFIN t2fin on t2.fid = t2fin.fid
WHERE
1 = 1
AND t2.FSALEORGID = '{0}'
AND t2.F_CONTRACTNUMBER = '{1}'
GROUP BY
t2.FSALEORGID,
t2.F_CONTRACTNUMBER,
t2fin.FEXCHANGERATE
)
SELECT
*
FROM
K3returnAmount
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
if (result.Count == 0)
{
return 0;
}
return Convert.ToDecimal(result[0]["K3returnAmount"]);
}
/// <summary>
/// 云星空的退货金额取数逻辑:取已审核的退货通知单的表头字段 ”源头销售订单单号#“ =本销售订单编号的退货通知单原币价税合计金额
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <returns></returns>
public decimal GetSaleOrderRetrunAmount(string orgId, string contractNo)
{
var sqlTemp = @"/*dialect*/WITH
returnAmount AS (
SELECT
t2.F_CONTRACTNUMBER,
t2.FSALEORGID,
ISNULL (SUM(t1e_f.FALLAMOUNT), 0) returnAmount
FROM
T_SAL_ORDER t1 -- 下游单据
INNER join T_SAL_ORDERENTRY t1e -- 下游单据分录
ON t1.FID = t1e.FID
INNER JOIN T_SAL_ORDERENTRY_F t1e_f ON t1e.FENTRYID = t1e_f.FENTRYID
Inner join T_SAL_ORDER t2 -- 上游单据
ON t1.F_SOURORDERNO = t2.FBILLNO
AND t1.FSALEORGID = t1.FSALEORGID
WHERE
1 = 1
AND t1.FBUSINESSTYPE = 'RETURNSO' -- 退货订单
AND t2.FDOCUMENTSTATUS = 'C'
AND t1.FDOCUMENTSTATUS = 'C'
AND t1e.FRETURNTYPE = 'RETURN' -- 退货类型
AND t2.FSALEORGID = '{0}'
AND t2.F_CONTRACTNUMBER = '{1}'
GROUP BY
t2.F_CONTRACTNUMBER,
t2.FSALEORGID
)
SELECT
*
FROM
returnAmount
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
if (result.Count == 0)
{
return 0;
}
return -Convert.ToDecimal(result[0]["returnAmount"]);
}
/// <summary>
/// 订单明细正数的物料原币价税合计(只取退补类型不等于“退回“的物料明细)
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <returns></returns>
public decimal GetSaleOrderAmount(string orgId, string contractNo)
{
var sqlTemp = @"/*dialect*/WITH
SaleOrderAmount AS (
SELECT
t1.F_CONTRACTNUMBER,
t1.FSALEORGID,
ISNULL (SUM(t1e_f.FALLAMOUNT), 0) OrderAmount
FROM
T_SAL_ORDER t1
INNER JOIN T_SAL_ORDERENTRY t1e ON t1.FID = t1e.FID
INNER JOIN T_SAL_ORDERENTRY_F t1e_f ON t1e.FENTRYID = t1e_f.FENTRYID
WHERE
1 = 1
AND t1.FDOCUMENTSTATUS = 'C'
AND t1.FCANCELSTATUS = 'A'
AND t1e.FRETURNTYPE <> 'RETURN' -- 退补类型不等于退货
AND t1.FSALEORGID = '{0}'
AND t1.F_CONTRACTNUMBER = '{1}'
GROUP BY
t1.F_CONTRACTNUMBER,
t1.FSALEORGID
)
SELECT
*
FROM
SaleOrderAmount
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
if (result.Count == 0)
{
return 0;
}
return Convert.ToDecimal(result[0]["OrderAmount"]);
}
/// <summary>
/// 根据纸质合同号、组织获取销售订单
/// </summary>
/// <returns></returns>
public DynamicObjectCollection GetSaleOrderByOrgIdAndContractNo(string orgId, string contractNo)
{
var sqlTemp = @"/*dialect*/SELECT
*
FROM
T_SAL_ORDER t1
LEFT JOIN T_SAL_ORDERFIN t1fin ON t1.FID = t1fin.FID
WHERE
1 = 1
AND t1.FDOCUMENTSTATUS = 'C'
AND t1.FCANCELSTATUS = 'A'
AND t1.FSALEORGID = '{0}'
AND t1.F_CONTRACTNUMBER = '{1}'
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var resultData = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
return resultData;
}
/// <summary>
/// 获取销售订单收款金额
/// </summary>
/// <returns></returns>
public decimal GetSaleOrderReceiveAmount(string orgId, string billNo)
{
var saleOrder = this.GetSaleOrderByBillNoAndOrgId(orgId, billNo);
var date = Convert.ToDateTime(saleOrder["FDATE"]);
ReportDataParam param = new ReportDataParam()
{
ReturnJsonData = true,
FieldKeys = "FSALEORGNAME,FBILLNO,FDate,FALLMATCHAMOUNT",
IsVerifyBaseDataField = true,
Model = new Model()
{
FSaleOrgList = orgId,
FSoFromDate = date.AddDays(-30).ToString("yyyy-MM-dd HH:mm:ss"),
FSoToDate = date.AddDays(30).ToString("yyyy-MM-dd HH:mm:ss"),
FSaleOFrom = billNo,
FSaleOTo = billNo,
FFormCloseStatus = "ALL",
FFormStatus = "ALL",
FPriceFrom = "SALORDERBILL",
FBusCloseStatus = "ALL",
FMergingSOHeader = true,
FIncludedUnfilledOrders = true,
FIsRecWithMat = true,
FSuite = "All",
FSetAccountType = "ALL",
FIsGroup = false,
FIncludedFree = true
}
};
var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
var paramString = JsonConvert.SerializeObject(param, Formatting.Indented, jsonSetting);
var resultDict = WebApiServiceCall.GetSysReportData(this.ctx, "SAL_DetailReport", paramString);
var resultString = JsonConvert.SerializeObject(resultDict);
var result = JsonConvert.DeserializeObject<KingdeeResult<SaleExecuteOut>>(resultString);
var rows = result.Result.Rows;
var dataRow = rows.Where(n => n.FBILLNO == billNo).ToList();
if (dataRow.Count() == 0)
{
return 0m;
}
if (dataRow[0].FALLMATCHAMOUNT.IsNullOrEmptyOrWhiteSpace())
{
return 0m;
}
return Convert.ToDecimal(dataRow[0].FALLMATCHAMOUNT);
}
public DynamicObject GetSaleOrderByBillNoAndOrgId(string orgId, string billNo)
{
var sqlTemp = @"/*dialect*/SELECT
*
FROM
T_SAL_ORDER t1
WHERE
1 = 1
AND t1.FSALEORGID = '{0}'
AND t1.FBILLNO = '{1}'
";
var sql = string.Format(sqlTemp, orgId, billNo);
var result = DBServiceHelper.ExecuteDynamicObject(this.ctx, sql);
if (result.Count == 0)
{
throw new Exception($"组织:{orgId},没有找到编号为 {billNo} 的销售订单");
}
return result[0];
}
public List<SaleExecuteOut> GetSaleOrderReceiveAmountByDate(string orgId, DateTime startDate, DateTime endDate)
{
ReportDataParam param = new ReportDataParam()
{
ReturnJsonData = true,
FieldKeys = "FSALEORGNAME,FBILLNO,FDate,FALLMATCHAMOUNT",
IsVerifyBaseDataField = true,
Model = new Model()
{
FSaleOrgList = orgId,
FSoFromDate = startDate.ToString("yyyy-MM-dd HH:mm:ss"),
FSoToDate = endDate.ToString("yyyy-MM-dd HH:mm:ss"),
FFormCloseStatus = "ALL",
FFormStatus = "ALL",
FPriceFrom = "SALORDERBILL",
FBusCloseStatus = "ALL",
FMergingSOHeader = true,
FIncludedUnfilledOrders = true,
FIsRecWithMat = true,
FSuite = "All",
FSetAccountType = "ALL",
FIsGroup = false,
FIncludedFree = true
}
};
var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
var paramString = JsonConvert.SerializeObject(param, Formatting.Indented, jsonSetting);
//LogUtil.Log("paramString", paramString);
var resultDict = WebApiServiceCall.GetSysReportData(this.ctx, "SAL_DetailReport", paramString);
var resultString = JsonConvert.SerializeObject(resultDict);
//LogUtil.Log("resultString", resultString);
var result = JsonConvert.DeserializeObject<KingdeeResult<SaleExecuteOut>>(resultString);
if (result.Result.RowCount == 0)
{
return new List<SaleExecuteOut>();
}
var rows = result.Result.Rows;
var dataRow = rows.Where(n => n.FBILLNO.Trim() != string.Empty).Select(n => new SaleExecuteOut
{
FBILLNO = n.FBILLNO,
FDate = n.FDate,
FSALEORGNAME = n.FSALEORGNAME,
FALLMATCHAMOUNT = n.FALLMATCHAMOUNT.IsNullOrEmptyOrWhiteSpace() ? "0" : n.FALLMATCHAMOUNT.Replace(",", "").Trim(),
}).ToList();
return dataRow;
}
/// <summary>
/// 更新销售订单K3退货金额云星空退货金额累计可开票金额
/// </summary>
/// <param name="orgId">销售组织</param>
/// <param name="contractNo">纸质合同号</param>
/// <param name="orderAmount">订单金额</param>
/// <param name="retrunAmount">云星空退货金额</param>
/// <param name="k3retrunAmount">K3退货金额</param>
/// <returns></returns>
public int UpdateSaleOrderOrderAmountAndRetrunAmount(string orgId, string contractNo, decimal orderAmount, decimal retrunAmount, decimal k3retrunAmount)
{
var sqlTemp = @"/*dialect*/UPDATE t1
SET
t1.F_K3returnAmount = {2}, -- k3退货金额
t1.F_ALLRETURNAMOUNT = {3}, -- 退货金额
t1.F_TOTALINVOICEAMOUNT = {4} - {2} - {3} -- 订单总金额-云星空退货金额-K3WISE退货金额
FROM
T_SAL_ORDER t1
WHERE
1 = 1
AND t1.FSALEORGID = '{0}'
AND t1.F_CONTRACTNUMBER = '{1}'
";
var sql = string.Format(sqlTemp, orgId, contractNo, k3retrunAmount, retrunAmount, orderAmount);
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
/// 获取已提交发票金额
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <param name="billIds"></param>
/// <returns></returns>
internal decimal GetSubmitedAmount(string orgId, string contractNo, List<string> billIds)
{
var billIdFilter = string.Empty;
if (billIds != null && billIds.Count > 0)
{
var billIdString = string.Join(",", billIds.Select(n => "'" + n + "'"));
billIdFilter = $@" AND t1.FID NOT IN ({billIdString}) ";
}
var sqlTemp = $@"/*dialect*/SELECT
ISNULL (SUM(t1e.FALLAMOUNTFOR), 0) AS SubmitAmount
FROM
T_IV_SALESIC t1
LEFT JOIN T_IV_SALESICENTRY t1e ON t1.FID = t1e.FID
LEFT JOIN T_IV_SALESICENTRY_O t1e_O ON t1e.FENTRYID = t1e_O.FENTRYID
WHERE
1 = 1
AND t1.FDOCUMENTSTATUS = 'B'
AND t1e.F_CONTRACTNO = '{contractNo}'
AND t1.FSALEORGID = '{orgId}'
{billIdFilter}
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
if (result.Count == 0)
{
return 0;
}
return Convert.ToDecimal(result[0]["SubmitAmount"]);
}
}
}