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 { /// /// 销售订单服务类 /// public class SaleOrderService { private Context ctx; public SaleOrderService(Context ctx) { this.ctx = ctx; } /// /// K3退货金额原币取数逻辑:K3退货金额除以销售订单汇率=K3退货金额原币 /// /// 纸质合同号 /// 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"]); } /// /// 云星空的退货金额取数逻辑:取已审核的退货通知单的表头字段 ”源头销售订单单号#“ =本销售订单编号的退货通知单原币价税合计金额 /// /// /// /// 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"]); } /// /// 订单明细正数的物料原币价税合计(只取退补类型不等于“退回“的物料明细) /// /// /// /// 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"]); } /// /// 根据纸质合同号、组织获取销售订单 /// /// 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; } /// /// 获取销售订单收款金额 /// /// 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>(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 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>(resultString); if (result.Result.RowCount == 0) { return new List(); } 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; } /// /// 更新销售订单K3退货金额,云星空退货金额,累计可开票金额, /// /// 销售组织 /// 纸质合同号 /// 订单金额 /// 云星空退货金额 /// K3退货金额 /// 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); } /// /// 获取已提交发票金额 /// /// /// /// internal decimal GetSubmitedAmount(string orgId, string contractNo) { var sqlTemp = $@"/*dialect*/SELECT ISNULL (SUM(t1e_O.FALLAMOUNT), 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}' "; 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"]); } } }