Compare commits

...

66 Commits

Author SHA1 Message Date
李狗蛋
3f3d5f50f1 修改生产用料清单批改 2025-12-18 11:25:51 +08:00
李狗蛋
c33b6fa817 1 2025-12-18 11:10:16 +08:00
e6cad1ce9d Merge branch 'main' of http://8.130.121.29:3000/Develop/Piolot_Order_TH 2025-11-21 20:06:27 +08:00
2bf48230f3 修改开票校验币别区分的问题 2025-11-21 20:06:25 +08:00
e748b0eef5 施工安装费的税率取值ID错了 2025-11-12 14:44:35 +08:00
0dbacffcf3 0 2025-10-31 13:47:27 +08:00
9bb3fb4696 0 2025-10-27 23:51:36 +08:00
3237265dfd 修复发票超额控制问题 2025-10-27 23:16:14 +08:00
5881d9e9c7 1 2025-09-29 11:06:52 +08:00
0f875c3f5b 111 2025-09-28 09:52:09 +08:00
1d53dd3b1e Merge branch 'main' of http://8.130.121.29:3000/TianHua/Piolot_Order_TH into main 2025-09-22 18:44:58 +08:00
097a0080da 231 2025-09-22 18:44:50 +08:00
0212355b60 0 2025-09-17 16:20:39 +08:00
e35d42d8b7 1 2025-09-16 16:04:27 +08:00
8f51207b8f 1 2025-09-16 14:53:46 +08:00
6038bd74a6 11 2025-09-11 15:15:39 +08:00
0efd00598d 22 2025-09-08 20:25:24 +08:00
2746c06d05 1 2025-09-08 19:57:35 +08:00
668f8c1764 0 2025-08-28 11:32:45 +08:00
7641be96f6 0 2025-08-28 11:06:55 +08:00
Administrator
beae48f7b1 0 2025-08-28 11:03:35 +08:00
7789d7daaa 0 2025-08-28 10:35:38 +08:00
Administrator
3a2c12479e 修改开票校验逻辑 2025-08-16 17:59:22 +08:00
Administrator
ebfc3de501 Merge branch 'main' of http://8.130.121.29:3000/Develop/Piolot_Order_TH 2025-08-16 17:48:10 +08:00
Administrator
8d3314e44d 0 2025-08-16 17:48:03 +08:00
5099b4ee8f 新增K3退货金额、云星空退货金额、整单可开票金额 2025-08-16 17:47:20 +08:00
eebdd72801 0 2025-08-13 15:01:00 +08:00
463f2de4c8 0 2025-08-08 15:40:32 +08:00
ea3156ca3b 0 2025-08-08 11:33:15 +08:00
Administrator
69e8aceed5 0 2025-08-08 11:13:12 +08:00
d040b97cbc 0 2025-08-08 10:36:02 +08:00
Administrator
ec10996079 0 2025-08-08 10:21:37 +08:00
6bab550029 0 2025-08-08 09:00:56 +08:00
Administrator
85e89f085c 0 2025-08-07 23:08:45 +08:00
a1aee2395a 0 2025-08-07 22:11:39 +08:00
dea0808695 Merge branch 'main' of http://8.130.121.29:3000/Develop/Piolot_Order_TH 2025-08-07 16:27:14 +08:00
1b8bd160bf 0 2025-08-07 16:27:12 +08:00
Administrator
c729422bab 1 2025-08-07 16:21:57 +08:00
28a978ae7c 0 2025-08-07 15:48:59 +08:00
6255c510c6 修改销售订单累计开票金额取值逻辑,
修改销售发票提交校验逻辑
2025-08-07 15:47:30 +08:00
a33073e02d 0 2025-08-06 16:28:24 +08:00
liangjunyu
a8730899ec Merge branch 'main' of http://8.130.121.29:3000/Develop/Piolot_Order_TH 2025-08-06 09:08:54 +08:00
liangjunyu
4b7653c73f Revert "1.修正获取应收核销金额,有可能为空时出现的错误"
This reverts commit d86002c12c.
2025-08-06 09:08:43 +08:00
f8aacb3921 0 2025-08-05 23:41:16 +08:00
8746a2087b 0 2025-08-05 13:54:07 +08:00
f16c20d8ee 0 2025-08-05 09:06:37 +08:00
30565561d6 1 2025-08-02 19:41:08 +08:00
ee9d4c67dc 更新 SAL_ORDER/DataChage.cs
1
2025-08-02 19:32:49 +08:00
liangjunyu
d86002c12c 1.修正获取应收核销金额,有可能为空时出现的错误 2025-08-02 18:46:36 +08:00
Administrator
3ea7c1837d 0 2025-08-02 02:30:43 +08:00
a18026e5bc 新增定时属性销售订单累计核销金额字段,
修复发票反审核时没有刷新累计开票金额字段的问题,
修改累计开票金额取数逻辑

TODO:销售发票提交校验逻辑修改
2025-07-31 17:39:21 +08:00
b47838589d 新增自定义接口,获取销售订单收款金额 2025-07-31 09:20:10 +08:00
Administrator
fba3a60b18 0 2025-07-30 17:28:36 +08:00
b01c363223 0 2025-07-30 16:57:55 +08:00
72eebf5edb 新增销售订单获取收款金额API 2025-07-30 16:50:24 +08:00
b83a4c0773 新增项目预算利润表完成加载后自动将实施成本带入实施明细行中 2025-07-29 19:50:50 +08:00
1bc4c6481a 0 2025-07-29 16:26:46 +08:00
Administrator
f770a1efc6 0 2025-07-29 16:25:07 +08:00
6a877b99f9 0 2025-07-29 14:25:59 +08:00
a2cdfd59bf Merge branch 'main' of http://8.130.121.29:3000/TianHua/Piolot_Order_TH into main
# Conflicts:
#	.vs/GZ_LTHPilot_ORDER/v17/.suo
#	.vs/GZ_LTHPilot_ORDER/v17/DocumentLayout.backup.json
#	.vs/GZ_LTHPilot_ORDER/v17/DocumentLayout.json
#	bin/Debug/GZ_LTHPilot_ORDER.pdb
#	bin/Debug/Newtonsoft.Json.dll
#	obj/Debug/GZ_LTHPilot_ORDER.csproj.AssemblyReference.cache
#	obj/Debug/GZ_LTHPilot_ORDER.csproj.CoreCompileInputs.cache
#	obj/Debug/GZ_LTHPilot_ORDER.csproj.FileListAbsolute.txt
#	obj/Debug/GZ_LTHPilot_ORDER.dll
#	obj/Debug/GZ_LTHPilot_ORDER.pdb
2025-07-28 14:13:09 +08:00
Administrator
ab95245949 0 2025-07-26 17:57:34 +08:00
55b7645565 0 2025-07-26 17:46:44 +08:00
783eedcd29 0 2025-07-26 17:44:44 +08:00
e102feca00 0 2025-07-26 17:43:46 +08:00
a84bde40f2 0 2025-07-26 17:42:43 +08:00
839dd633d3 1 2025-07-26 10:52:50 +08:00
350 changed files with 1654 additions and 497750 deletions

14
Config/ContextConfig.cs Normal file
View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Config
{
internal class ContextConfig
{
public static string DefaultUserName = "ERP6";
public static int DefaultUserId = 131409;
}
}

4
Copy.txt Normal file
View File

@@ -0,0 +1,4 @@
copy $(TargetPath) "D:\Program Files (x86)\Kingdee\K3Cloud\WebSite\Bin\$(TargetFileName)"
copy $(TargetPath) "D:\kingdee\K3Cloud\WebSite\Bin\$(TargetFileName)"

View File

@@ -132,6 +132,10 @@
<Reference Include="Kingdee.BOS.DataEntity">
<HintPath>..\..\派诺-斌哥\git\6、程序\GZ_KD_Parino\dll\Kingdee.BOS.DataEntity.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.ServiceFacade.KDServiceFx, Version=9.0.78.3, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>Library\Kingdee.BOS.ServiceFacade.KDServiceFx.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.ServiceHelper">
<HintPath>..\..\派诺-斌哥\git\6、程序\GZ_KD_Parino\dll\Kingdee.BOS.ServiceHelper.dll</HintPath>
</Reference>
@@ -328,17 +332,31 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Config\ContextConfig.cs" />
<Compile Include="Models\K3Request\ReportDataParam.cs" />
<Compile Include="Models\K3Result\KingdeeResult.cs" />
<Compile Include="Models\K3Result\ListResult.cs" />
<Compile Include="Models\K3Result\Model\K3CloudResponseStatus.cs" />
<Compile Include="Models\K3Result\Model\K3CloudResult.cs" />
<Compile Include="Models\K3Result\Model\K3CloudResultInfo.cs" />
<Compile Include="Models\K3Result\Model\K3CloudSuccessEntity.cs" />
<Compile Include="Models\VO\SaleExecuteOut.cs" />
<Compile Include="PRD_PPBOMCHANGE\PLTH.cs" />
<Compile Include="PRD_PPBOMCHANGE\PLTHForm.cs" />
<Compile Include="PRD_PPBOMCHANGE\PLTHWL.cs" />
<Compile Include="PUR_POORDER\HQKC.cs" />
<Compile Include="SAL_DELIVERYNOTICE\PushCeLue.cs" />
<Compile Include="SAL_ORDERList\ListUpFJ.cs" />
<Compile Include="SAL_ORDER\ServicePlugIn\UnAudit.cs" />
<Compile Include="SAL_ORDER\ServicePlugIn\Audit.cs" />
<Compile Include="SAL_ORDER\DataChage.cs" />
<Compile Include="SAL_ORDER\SaveWL.cs" />
<Compile Include="ScheduleService\SaleOrderReceiveAmount.cs" />
<Compile Include="ScheduleService\SaleOrderSumSicsAmountRefresh.cs" />
<Compile Include="Service\SaleOrderService.cs" />
<Compile Include="Service\SaleSicsService.cs" />
<Compile Include="Services\OrgService.cs" />
<Compile Include="Services\SaleOrderService.cs" />
<Compile Include="Services\SaleSicsService.cs" />
<Compile Include="Services\TempTableService.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\Audit.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\Submit.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\UnAudit.cs" />
@@ -362,6 +380,9 @@
<Compile Include="SQL\SqlManage.cs" />
<Compile Include="SUB_PPBOM\AuditPOM.cs" />
<Compile Include="T_IV_SALESIC\UnAuditS_Order.cs" />
<Compile Include="Utils\ContextUtil.cs" />
<Compile Include="Utils\LogUtil.cs" />
<Compile Include="WebApiService\SaleOrderApiService.cs" />
<Compile Include="XMYSLRB\AfterSave.cs" />
<Compile Include="XMYSLRB\OnLoadLR.cs" />
<Compile Include="XMYSLRB\Save.cs" />
@@ -373,12 +394,14 @@
<WCFMetadata Include="Connected Services\" />
</ItemGroup>
<ItemGroup>
<Content Include="Copy.txt" />
<Content Include="Library\Kingdee.BOS.App.Core.dll" />
<Content Include="Library\Kingdee.BOS.App.dll" />
<Content Include="Library\Kingdee.BOS.Contracts.dll" />
<Content Include="Library\Kingdee.BOS.Core.dll" />
<Content Include="Library\Kingdee.BOS.DataEntity.dll" />
<Content Include="Library\Kingdee.BOS.dll" />
<Content Include="Library\Kingdee.BOS.ServiceFacade.KDServiceFx.dll" />
<Content Include="Library\Kingdee.BOS.ServiceHelper.dll" />
<Content Include="Library\Kingdee.BOS.VerificationHelper.dll" />
<Content Include="Library\Kingdee.BOS.Web.dll" />
@@ -423,6 +446,7 @@
</Target>
<Import Project="packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets" Condition="Exists('packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets')" />
<PropertyGroup>
<PostBuildEvent>copy $(TargetPath) "D:\Program Files (x86)\Kingdee\K3Cloud\WebSite\Bin\$(TargetFileName)"</PostBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Models.K3Request
{
public class ReportDataParam
{
public bool ReturnJsonData { get; set; }
public string FieldKeys { get; set; }
public string SchemeId { get; set; }
public int StartRow { get; set; }
public int Limit { get; set; }
public bool IsVerifyBaseDataField { get; set; }
public object[] FilterString { get; set; }
public Model Model { get; set; }
}
public class Model
{
public string FSaleOrgList { get; set; }
public string FSoFromDate { get; set; }
public string FSoToDate { get; set; }
public string FSaleOFrom { get; set; }
public string FSaleOTo { get; set; }
public string FFormCloseStatus { get; set; }
public string FFormStatus { get; set; }
public string FPriceFrom { get; set; }
public string FBusCloseStatus { get; set; }
public bool FMergingSOHeader { get; set; }
public bool FIncludedUnfilledOrders { get; set; }
public bool FIsRecWithMat { get; set; }
public string FSuite { get; set; }
public string FSetAccountType { get; set; }
public bool FIsGroup { get; set; }
public bool FIncludedFree { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using GZ_LTHPilot_ORDER.Models.K3Result.Model;
namespace GZ_LTHPilot_ORDER.Models.K3Result
{
/// <summary>
/// 金蝶云星空返回类
/// </summary>
public class KingdeeResult<T>
{
/// <summary>
/// 返回对象
/// </summary>
public K3CloudResult<T> Result { get; set; }
}
}

View File

@@ -0,0 +1,25 @@
using System.Collections.Generic;
namespace GZ_LTHPilot_ORDER.Models.K3Result
{
/// <summary>
/// 列表查询输出类
/// </summary>
public class ListResult
{
/// <summary>
/// 列表
/// </summary>
public List<dynamic> List { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="list"></param>
public ListResult(List<dynamic> list)
{
List = list;
}
}
}

View File

@@ -0,0 +1,35 @@
using System.Collections.Generic;
namespace GZ_LTHPilot_ORDER.Models.K3Result.Model
{
/// <summary>
/// 响应对象
/// </summary>
public class K3CloudResponseStatus
{
/// <summary>
/// 错误代码
/// </summary>
public int ErrorCode { get; set; }
/// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 错误信息列表
/// </summary>
public List<K3CloudResultInfo> Errors { get; set; }
/// <summary>
/// 成功实体
/// </summary>
public List<K3CloudSuccessEntity> SuccessEntitys { get; set; }
/// <summary>
/// 成功消息
/// </summary>
public List<K3CloudResultInfo> SuccessMessages { get; set; }
/// <summary>
/// 消息代码
/// </summary>
public int MsgCode { get; set; }
}
}

View File

@@ -0,0 +1,53 @@
using System.Collections.Generic;
namespace GZ_LTHPilot_ORDER.Models.K3Result.Model
{
/// <summary>
/// 返回类
/// </summary>
public class K3CloudResult<T>
{
/// <summary>
/// 响应对象
/// </summary>
public K3CloudResponseStatus ResponseStatus { get; set; }
/// <summary>
/// 转换响应对象
/// </summary>
public K3CloudResponseStatus ConvertResponseStatus { get; set; }
/// <summary>
/// 返回结果,用于查看单据
/// </summary>
public object Result { get; set; }
/// <summary>
/// 开始索引
/// </summary>
public long? StartIndex { get; set; }
/// <summary>
/// 是否最后
/// </summary>
public bool? IsLast { get; set; }
/// <summary>
/// 文件大小
/// </summary>
public long? FileSize { get; set; }
/// <summary>
/// 文件名称
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件内容Base64
/// </summary>
public string FilePart { get; set; }
/// <summary>
/// 返回数据行数
/// </summary>
public int? RowCount { get; set; }
public List<T> Rows { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
namespace GZ_LTHPilot_ORDER.Models.K3Result.Model
{
/// <summary>
/// 金蝶云星空查看错误信息类
/// </summary>
public class K3CloudResultInfo
{
/// <summary>
/// 字段名称
/// </summary>
public string FieldName { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 序号
/// </summary>
public int DIndex { get; set; }
}
}

View File

@@ -0,0 +1,25 @@
namespace GZ_LTHPilot_ORDER.Models.K3Result.Model
{
/// <summary>
/// 成功实体
/// </summary>
public class K3CloudSuccessEntity
{
/// <summary>
/// 单据Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 单据编号
/// </summary>
public string Number { get; set; }
/// <summary>
/// 实体索引
/// </summary>
public int DIndex { get; set; }
/// <summary>
/// 分录Id
/// </summary>
public object EntryIds { get; set; }
}
}

View File

@@ -0,0 +1,18 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Models.VO
{
public class SaleExecuteOut
{
public string FSALEORGNAME { get; set; }
public string FBILLNO { get; set; }
public string FDate { get; set; }
public string FALLMATCHAMOUNT { get; set; }
}
}

View File

@@ -25,6 +25,7 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOM
var Billobj = Row.DataEntity;
//获取生产用料清单的组织
var PPBOMFPrdOrgFname = SqlManage.SqlManage.GetPRD_PPBOMFWorkshopID(this.Context, Convert.ToString(Billobj["ID"]));
if (PPBOMFPrdOrgFname[0]["OEGFNAME"].ToString() == "珠海派诺")
{
//获取生产用料清单的生产车间
@@ -36,7 +37,7 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOM
var PPBOMFStockFNameS = SqlManage.SqlManage.GetPRD_PPBOMFStockID(this.Context, Convert.ToString(PPBOMFWorkshopFname[0]["FID"]));
foreach (var PPBOMFStockFName in PPBOMFStockFNameS)
{
if (PPBOMFStockFName["FNAME"].ToString() == "半成品仓")
if (PPBOMFStockFName["FNAME"].ToString() == "半成品仓" || PPBOMFStockFName["FNAME"].ToString() == "成品仓" || PPBOMFStockFName["FNAME"].ToString() == "组装测试包装车间仓库")
{
SqlManage.SqlManage.UpdatePRD_PPBOMFIsKeyComponent(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]));
}
@@ -46,14 +47,18 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOM
}
if (PPBOMFStockFName["FNAME"].ToString() == "包装结构件仓" || PPBOMFStockFName["FNAME"].ToString() == "装配结构件仓")
{
SqlManage.SqlManage.UpdatePRD_PPBOMFIssueTypeAndFBackFlushType(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]), Convert.ToString(PPBOMFWorkshopFname[0]["FPrdOrgId"]));
SqlManage.SqlManage.UpdateFSRCTRANSSTOCKID(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]));
//SqlManage.SqlManage.UpdatePRD_PPBOMFIssueTypeAndFBackFlushType(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]), Convert.ToString(PPBOMFWorkshopFname[0]["FPrdOrgId"]));
//SqlManage.SqlManage.UpdateFSRCTRANSSTOCKID(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]));
SqlManage.SqlManage.UpdateFSTOCKID(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]));
}
if (PPBOMFStockFName["FNAME"].ToString() == "装配结构件仓") {
//针对装配结构件仓E.02 / E.07.00 / E.12开头物料发料方式设置为不发料,其他物料全部设置为直接发料
SqlManage.SqlManage.UpdateFSTOCKID_1(this.Context, Convert.ToString(PPBOMFStockFName["FENTRYID"]));
}
}
//当物料为M开头发料方式设置为调拨倒冲倒冲时机设置为入库倒冲拨出组织设置为珠海派诺拨出组织为空
//仓库设置为 : 68
SqlManage.SqlManage.UpdatePRD_PPBOMLIkeM(this.Context, Convert.ToString(Billobj["Id"]));
//SqlManage.SqlManage.UpdatePRD_PPBOMLIkeM(this.Context, Convert.ToString(Billobj["Id"]));
}
}
@@ -67,7 +72,10 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOM
SqlManage.SqlManage.UpdatePRD_PPBOMFIDFIsKeyComponent(this.Context, PPBOMFPrdOrgFname[0]["FID"].ToString());
}
}
//设置物料编码为E.01.00.00052 编码设置发料方式为不发料
SqlManage.SqlManage.UpdateWLE(this.Context, Convert.ToString(Billobj["ID"]));
}
}

View File

@@ -94,9 +94,11 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOMCHANGE
变更类型为变更后将分子赋值为0*/
if (Convert.ToString(entityObj["ChangeType"]) == "3")
{
//this.View.ShowMessage("12345");
//变更类型为变更后分子赋值为0
this.View.Model.SetValue("FNumerator", 0, Convert.ToInt32(entityObj["Seq"]) - 1);
}
this.View.Model.SetValue("FIssueType", 7, Convert.ToInt32(entityObj["Seq"]) - 1);
}
/*变更类型为新增将物料编码替换为动态窗口选择的物料FID*/
if (Convert.ToString(entityObj["ChangeType"]) == "1")
{

View File

@@ -37,13 +37,19 @@ namespace GZ_LTHPilot_ORDER.SAL_ORDER
var FSaleOrgId = this.View.Model.GetValue("FSaleOrgId");
this.View.Model.SetValue("F_SaleOrgId", FSaleOrgId);
}
else if (SqlDS[0]["FDATAVALUE"].ToString().Contains("BMS"))
{
this.View.Model.SetValue("F_SaleOrgId", "100302");
}
else
{
this.View.Model.SetValue("F_SaleOrgId", "100302");
}
}
this.View.UpdateView("F_SaleOrgId");
}
this.View.UpdateView("F_SaleOrgId");
}
}
}

View File

@@ -0,0 +1,62 @@
using GZ_LTHPilot_ORDER.Service;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.SAL_ORDER.ServicePlugIn
{
[Description("服务插件:销售订单审核,刷新销售订单整单可开票金额和退货金额金额字段"), HotUpdate]
public class Audit : AbstractOperationServicePlugIn
{
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_totalinvoiceAmount"); // 整单可开票金额
e.FieldKeys.Add("F_allreturnAmount"); // 云星空退货金额
e.FieldKeys.Add("F_sourorderno"); // 源单编号
e.FieldKeys.Add("FSALEORGID"); // 销售组织
e.FieldKeys.Add("FRETURNTYPE"); // 退补类型
e.FieldKeys.Add("F_sourpapercontract"); // 源头纸质合同号#
e.FieldKeys.Add("F_contractnumber"); // 纸质合同号
}
/// <summary>
/// 审核插件执行后插件、事务提交后事件
/// </summary>
/// <param name="e"></param>
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
base.AfterExecuteOperationTransaction(e);
SaleOrderService saleOrderService = new SaleOrderService(this.Context);
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售组织
var contractNo = bill["F_contractnumber"].ToString(); // 纸质合同号
var srcContractNo = bill["F_sourpapercontract"].ToString(); // 源头纸质合同号
var saleOrderAmont = saleOrderService.GetSaleOrderAmount(orgId, contractNo); // 本单累计可开票金额
var k3RetrunAmount = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo); // 本单云星空退货金额
var retrunAmount = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo); // 本单k3退货金额
saleOrderService.UpdateSaleOrderOrderAmountAndRetrunAmount(orgId, contractNo, saleOrderAmont, retrunAmount, k3RetrunAmount);
if (srcContractNo.IsNullOrEmpty())
{
continue;
}
var srcSaleOrderAmont = saleOrderService.GetSaleOrderAmount(orgId, srcContractNo); // 源单累计可开票金额
var srcK3RetrunAmount = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, srcContractNo); // 源单云星空退货金额
var srcRetrunAmount = saleOrderService.GetSaleOrderRetrunAmount(orgId, srcContractNo); // 源单k3退货金额
saleOrderService.UpdateSaleOrderOrderAmountAndRetrunAmount(orgId, srcContractNo, srcSaleOrderAmont, srcRetrunAmount, srcK3RetrunAmount);
}
}
}
}

View File

@@ -0,0 +1,62 @@
using GZ_LTHPilot_ORDER.Service;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.SAL_ORDER.ServicePlugIn
{
[Description("服务插件:销售订单反审核,刷新销售订单和源单整单可开票金额和退货金额金额字段"), HotUpdate]
public class UnAudit : AbstractOperationServicePlugIn
{
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_totalinvoiceAmount"); // 整单可开票金额
e.FieldKeys.Add("F_allreturnAmount"); // 云星空退货金额
e.FieldKeys.Add("F_sourorderno"); // 源单编号
e.FieldKeys.Add("FSALEORGID"); // 销售组织
e.FieldKeys.Add("FRETURNTYPE"); // 退补类型
e.FieldKeys.Add("F_sourpapercontract"); // 源头纸质合同号#
e.FieldKeys.Add("F_contractnumber"); // 纸质合同号
}
/// <summary>
/// 审核插件执行后插件、事务提交后事件
/// </summary>
/// <param name="e"></param>
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
base.AfterExecuteOperationTransaction(e);
SaleOrderService saleOrderService = new SaleOrderService(this.Context);
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售组织
var contractNo = bill["F_contractnumber"].ToString(); // 纸质合同号
var srcContractNo = bill["F_sourpapercontract"].ToString(); // 源头纸质合同号
var saleOrderAmont = saleOrderService.GetSaleOrderAmount(orgId, contractNo); // 本单累计可开票金额
var k3RetrunAmount = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo); // 本单云星空退货金额
var retrunAmount = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo); // 本单k3退货金额
saleOrderService.UpdateSaleOrderOrderAmountAndRetrunAmount(orgId, contractNo, saleOrderAmont, retrunAmount, k3RetrunAmount);
if (srcContractNo.IsNullOrEmpty())
{
continue;
}
var srcSaleOrderAmont = saleOrderService.GetSaleOrderAmount(orgId, srcContractNo); // 源单累计可开票金额
var srcK3RetrunAmount = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, srcContractNo); // 源单云星空退货金额
var srcRetrunAmount = saleOrderService.GetSaleOrderRetrunAmount(orgId, srcContractNo); // 源单k3退货金额
saleOrderService.UpdateSaleOrderOrderAmountAndRetrunAmount(orgId, srcContractNo, srcSaleOrderAmont, srcRetrunAmount, srcK3RetrunAmount);
}
}
}
}

View File

@@ -57,12 +57,28 @@ namespace GZ_LTHPilot_ORDER.SqlManage
//返回对象
return DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
}
//生产用料清单明细物料编码为E.01.00.00052 编码设置发料方式为不发料
public static void UpdateWLE(Context ctx, string FENTRYID)
{
string sql = string.Format(@"/*dialect*/
UPDATE B
SET B.FIssueType = '1'
FROM T_PRD_PPBOMENTRY A
INNER JOIN T_BD_MATERIAL C ON A.FMATERIALID = C.FMATERIALID AND C.FNUMBER = 'E.01.00.00052'
INNER JOIN T_PRD_PPBOMENTRY_C B ON A.FID = B.FID
WHERE A.FID = '{0}'
", FENTRYID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
}
//生产用料清单明细为半成品仓,更改是否关键件字段
public static void UpdatePRD_PPBOMFIsKeyComponent(Context ctx, string FENTRYID)
{
string sql = string.Format(@"/*dialect*/
update T_PRD_PPBOMENTRY_C
SET FIsKeyComponent = '1'
SET FIssueType = '1'
WHERE FENTRYID = '{0}'
", FENTRYID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
@@ -97,23 +113,38 @@ namespace GZ_LTHPilot_ORDER.SqlManage
", FENTRYID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
}
//生产用料清单明细为包装结构件仓和装配结构件仓,更改完拔出仓库为仓库修改仓库为仓库编码为68的
//生产用料清单明细为包装结构件仓和装配结构件仓,发料方式更改为直接领料
public static void UpdateFSTOCKID(Context ctx, string FENTRYID)
{
string sql = string.Format(@"/*dialect*/
update T_PRD_PPBOMENTRY_C
SET FSTOCKID = '1442951'
SET FIssueType = '1'
WHERE FENTRYID = '{0}'
", FENTRYID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
}
public static void UpdateFSTOCKID_1(Context ctx, string FENTRYID)
{
string sql = string.Format(@"/*dialect*/
UPDATE C
SET C.FIssueType = '7'
FROM T_PRD_PPBOMENTRY A
INNER JOIN T_BD_MATERIAL B ON A.FMATERIALID = B.FMATERIALID
INNER JOIN T_PRD_PPBOMENTRY_C C ON A.FENTRYID = C.FENTRYID
WHERE C.FENTRYID = '{0}'
AND (B.FNUMBER LIKE 'E.02%' OR B.FNUMBER LIKE 'E.07.00%' OR B.FNUMBER LIKE 'E.12%')
", FENTRYID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
}
//生产用料清单生产组织为珠海派诺,生产车间为:焊接车间、贴片车间、储能车间;生产车间,更改是否关键件字段,过滤条件为FID
public static void UpdatePRD_PPBOMFIDFIsKeyComponent(Context ctx, string FID)
{
string sql = string.Format(@"/*dialect*/
update T_PRD_PPBOMENTRY_C
SET FIsKeyComponent = '1'
SET FIssueType = '1'
WHERE FID = '{0}'
", FID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);
@@ -152,7 +183,7 @@ namespace GZ_LTHPilot_ORDER.SqlManage
{
string sql = string.Format(@"/*dialect*/
update T_SUB_PPBOMENTRY_C
SET FIsKeyComponent = '1'
SET FIssueType = '1'
WHERE FID = '{0}'
", FID);
DBServiceHelper.ExecuteDynamicObject(ctx, sql.ToString(), null, null, CommandType.Text, null);

View File

@@ -0,0 +1,172 @@
using DocumentFormat.OpenXml.Bibliography;
using Gatedge.Enpower.BOS.PlugIn.Utils;
using GZ_LTHPilot_ORDER.Models.VO;
using GZ_LTHPilot_ORDER.Service;
using GZ_LTHPilot_ORDER.Services;
using GZ_LTHPilot_ORDER.Utils;
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
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 NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace GZ_LTHPilot_ORDER.ScheduleService
{
[Description("定时刷新销售订单累计核销金额#"), HotUpdate]
public class SaleOrderReceiveAmount : IScheduleService
{
/// <summary>
/// 查询周期单位:月
/// </summary>
int Cycle = 12;
public void Run(Context oldCtx, Schedule schedule)
{
ContextUtil contextUtil = new ContextUtil(oldCtx);
var ctx = contextUtil.GetDefaultContext();
TempTableService tempTableService = new TempTableService(ctx);
OrgService orgService = new OrgService(ctx);
SaleOrderService saleOrderService = new SaleOrderService(ctx);
var orgList = orgService.GetOrgList();
var tableName = tempTableService.CreateTempTable();
CreateTempTable(ctx, tableName);
var advanceAays = GetAdvanceAays(schedule);
var planStartDate = DateTime.Now;
Dictionary<string, string> orgDict = new Dictionary<string, string>();
var orgIdList = orgList
.Where(n => n["FORGID"].ToString() != "100302")
.Where(n => n["FORGID"].ToString() != "1485290")
.ToList();
orgIdList.ForEach(n => orgDict.Add(n["FNAME"].ToString(), n["FORGID"].ToString()));
var saleOrgIds = string.Join(",", orgDict.Values);
// 循环查询销售订单执行明细表,每次查询一个月的数据, 将数据插入自定义临时表中
var startDate = planStartDate.AddDays(-advanceAays);
var endDate = startDate.AddMonths(Cycle);
// 如果开始时间大于计划开始时间,说明结束了
while (startDate <= planStartDate.AddMonths(1))
{
var receiveAmountList = saleOrderService.GetSaleOrderReceiveAmountByDate(saleOrgIds, startDate, endDate);
if (receiveAmountList.Count > 0)
{
InsertDataToTempTable(ctx, tableName, orgDict, receiveAmountList);
}
startDate = startDate.AddMonths(Cycle);
endDate = startDate.AddMonths(Cycle);
}
UpdateSaleOrderReceiveAmount(ctx, tableName);
tempTableService.DropTempTable(tableName);
}
/// <summary>
/// 更新销售订单累计核销金额
/// </summary>
/// <param name="ctx"></param>
/// <param name="tableName"></param>
/// <returns></returns>
private int UpdateSaleOrderReceiveAmount(Context ctx, string tableName)
{
var sql = $@"/*dialect*/UPDATE t1
SET
t1.F_AMOUNT = FAMOUNT
FROM
T_SAL_ORDER t1
INNER JOIN {tableName} t2 ON t1.FSALEORGID = t2.FORGID
AND t1.FBILLNO = t2.FBILLNO
";
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
/// 将查询的数据插入临时表
/// </summary>
/// <param name="ctx"></param>
/// <param name="tableName"></param>
/// <param name="orgId"></param>
/// <param name="saleExecuteOuts"></param>
/// <returns></returns>
private int InsertDataToTempTable(Context ctx, string tableName, Dictionary<string, string> orgDict, List<SaleExecuteOut> saleExecuteOuts)
{
var values = saleExecuteOuts.Select(n => $"({orgDict[n.FSALEORGNAME]},'{n.FSALEORGNAME}','{n.FBILLNO}',{n.FALLMATCHAMOUNT.ToString()},'{n.FDate}')").ToList();
var index = 0;
var line = 0;
var pageSize = 100;
while (values.Count > index)
{
var valuesString = string.Join(",", values.Where(n => values.IndexOf(n) >= index && values.IndexOf(n) < index + pageSize));
var sqlTemp = $@"/*dialect*/INSERT INTO
{tableName} (FORGID, FORGNAME, FBILLNO, FAMOUNT, FDATE)
VALUES
{valuesString}
";
line += DBServiceHelper.Execute(ctx, sqlTemp);
index += pageSize;
}
return line;
}
/// <summary>
/// 创建临时表
/// </summary>
/// <param name="ctx"></param>
/// <param name="tableName"></param>
private void CreateTempTable(Context ctx, string tableName)
{
var sql = $@"/*dialect*/CREATE TABLE
{tableName} (
FORGID int,
FORGNAME NVARCHAR (100),
FBILLNO NVARCHAR (100),
FAMOUNT DECIMAL(18, 10),
FDATE DATETIME,
);
";
DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
/// 参数获取提前天
/// </summary>
/// <param name="schedule"></param>
/// <returns></returns>
private int GetAdvanceAays(Schedule schedule)
{
// 参数获取提前天
var advanceAaysStr = schedule.Parameters;
int advanceAays;
try
{
advanceAays = Convert.ToInt32(advanceAaysStr);
if (advanceAays < 0)
{
throw new Exception();
}
}
catch (Exception)
{
throw new Exception("获取参数提前天失败参数格式为整数且大于等于0");
}
return advanceAays;
}
}
}

View File

@@ -5,64 +5,21 @@ using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
using Kingdee.BOS.Util;
using Kingdee.K3.FIN.App.Core.Match.Object;
using Kingdee.K3.SCM.Common.BusinessEntity.Sales;
using System;
using System.ComponentModel;
namespace GZ_LTHPilot_ORDER.ScheduleService
{
[Description("定时刷新#"), HotUpdate]
[Description("刷新所有销售订单累计开票金额#"), HotUpdate]
public class SaleOrderSumSicsAmountRefresh : IScheduleService
{
public void Run(Context ctx, Schedule schedule)
{
var advanceAays = GetAdvanceAays(schedule);
// 提前天的日期
var approvedDate = DateTime.Now.Date.AddDays(-advanceAays - 1);
// 销售发票服务
SaleSicsService saleSicsService = new SaleSicsService(ctx);
// TODO 获取前一天的发票数据
var sicsList = saleSicsService.GetSaleSiceListByApprovedDate(approvedDate);
SaleOrderService saleOrderService = new SaleOrderService(ctx);
foreach (var sice in sicsList)
{
var saleOrgId = sice["FSALEORGID"].ToString();
var contractNo = sice["contractNo"].ToString();
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(saleOrgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
var saleOrder = saleOrderList[0];
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
/// <summary>
/// 参数获取提前天
/// </summary>
/// <param name="schedule"></param>
/// <returns></returns>
private int GetAdvanceAays(Schedule schedule)
{
// 参数获取提前天
var advanceAaysStr = schedule.Parameters;
int advanceAays;
try
{
advanceAays = Convert.ToInt32(advanceAaysStr);
if (advanceAays < 0)
{
throw new Exception();
}
}
catch (Exception)
{
throw new Exception("获取参数提前天失败参数格式为整数且大于等于0");
}
return advanceAays;
// 刷新所有销售订单累计开票金额#
saleSicsService.UpdateSaleOrderSumSicsamountAll();
}
}
}

View File

@@ -1,47 +0,0 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using System;
using System.Collections.Generic;
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>
/// 根据纸质合同号、组织获取销售订单
/// </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;
}
}
}

View File

@@ -1,107 +0,0 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.FIN.App.Core.Match.Object;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Service
{
/// <summary>
/// 销售发票服务类
/// </summary>
public class SaleSicsService
{
private Context ctx;
public SaleSicsService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// 刷新销售订单累计开票金额
/// </summary>
/// <param name="saleOrderId"></param>
/// <returns></returns>
public int UpdateSaleOrderSumSicsamountBySaleOrder(DynamicObject saleOrder)
{
// 销售订单ID
var saleOrderId = saleOrder["FID"].ToString();
// 纸质合同号
var contractNo = saleOrder["F_CONTRACTNUMBER"].ToString();
// 销售组织Id
var saleOrgId = saleOrder["FSALEORGID"].ToString();
var sqlTemp = @"/*dialect*/UPDATE t1
SET
t1.F_INVOICEAMOUNT = TEMP1.FAFTERTOTALTAX
FROM
T_SAL_ORDER t1
INNER JOIN (
SELECT
FSALEORGID,
F_PaperNumber,
SUM(FAFTERTOTALTAX) FAFTERTOTALTAX
FROM
(
SELECT
FSALEORGID, -- 销售组织
F_PaperNumber, -- 纸质合同号
ISNULL (FAFTERTOTALTAX, 0) FAFTERTOTALTAX -- 价税合计本币
FROM
T_IV_SALESIC
WHERE
1 = 1
AND FDOCUMENTSTATUS = 'C'
AND FCANCELSTATUS = 'A'
AND FSALEORGID = '{0}'
AND F_PaperNumber = '{1}'
UNION ALL
SELECT
'100302' FSALEORGID, -- 销售组织
合同号 F_PaperNumber, -- 纸质合同号
SUM(ISNULL (专票金额, 0) + ISNULL (普票金额, 0)) FAFTERTOTALTAX -- 价税合计本币
FROm
dbo.oldk3seorder0701
WHERE
1 = 1
AND 合同号 = '{1}'
GROUP BY
合同号
) temp02
GROUP BY
FSALEORGID,
F_PaperNumber
) TEMP1 ON t1.F_CONTRACTNUMBER = TEMP1.F_PaperNumber
AND t1.FSALEORGID = TEMP1.FSALEORGID
WHERE
t1.FID = '{2}'
";
var sql = string.Format(sqlTemp, saleOrgId, contractNo, saleOrderId);
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
///
/// </summary>
/// <param name="approvedDate"></param>
/// <returns></returns>
public DynamicObjectCollection GetSaleSiceListByApprovedDate(DateTime approvedDate)
{
var sqlTemp = @"/*dialect*/SELECT DISTINCT
t1.FSALEORGID,
ISNULL(t1.F_PaperNumber, '') contractNo
FROM
T_IV_SALESIC t1
WHERE
1 = 1
AND t1.FAPPROVEDATE > '{0}'
";
var sql = string.Format(sqlTemp, approvedDate.ToString("yyyy-MM-dd HH:mm:dd"));
return DBServiceHelper.ExecuteDynamicObject(ctx, sql);
}
}
}

33
Services/OrgService.cs Normal file
View File

@@ -0,0 +1,33 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Services
{
public class OrgService
{
public Context ctx;
public OrgService(Context ctx)
{
this.ctx = ctx;
}
public DynamicObjectCollection GetOrgList()
{
var sql = @"/*dialect*/SELECT
t0.FORGID,
t0l.FNAME,
*
FROM
T_ORG_ORGANIZATIONS t0
LEFT JOIN T_ORG_ORGANIZATIONS_L t0L ON t0.FORGID = t0L.FORGID
AND FLOCALEID = 2052
";
return DBServiceHelper.ExecuteDynamicObject(this.ctx, sql);
}
}
}

View File

@@ -0,0 +1,371 @@
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"]);
}
}
}

167
Services/SaleSicsService.cs Normal file
View File

@@ -0,0 +1,167 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.FIN.App.Core.Match.Object;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Service
{
/// <summary>
/// 销售发票服务类
/// </summary>
public class SaleSicsService
{
private Context ctx;
public SaleSicsService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// 刷新销售订单累计开票金额
/// </summary>
/// <param name="saleOrderId"></param>
/// <returns></returns>
public int UpdateSaleOrderSumSicsamountBySaleOrder(DynamicObject saleOrder)
{
// 销售订单ID
var saleOrderId = saleOrder["FID"].ToString();
// 纸质合同号
var contractNo = saleOrder["F_CONTRACTNUMBER"].ToString();
// 销售组织Id
var saleOrgId = saleOrder["FSALEORGID"].ToString();
var sqlTemp = @"/*dialect*/UPDATE t1
SET
t1.F_INVOICEAMOUNT = ISNULL (TEMP1.FAFTERTOTALTAXFOR, 0)
FROM
T_SAL_ORDER t1
INNER JOIN T_SAL_ORDERFIN t1fin ON t1.FID = t1fin.FID
LEFT JOIN (
SELECT
FSALEORGID,
F_PaperNumber,
SUM(FAFTERTOTALTAX) FAFTERTOTALTAX, -- 价税合计本币
SUM(FAFTERTOTALTAXFOR) FAFTERTOTALTAXFOR -- 价税合计原币
FROM
(
SELECT
v1.FSALEORGID, -- 销售组织
v1e.F_CONTRACTNO F_PaperNumber, -- 纸质合同号
ISNULL (v1e_o.FALLAMOUNT, 0) FAFTERTOTALTAX, -- 价税合计本币
ISNULL (v1e.FALLAMOUNTFOR, 0) FAFTERTOTALTAXFOR -- 价税合计
FROM
T_IV_SALESIC v1
INNER JOIN T_IV_SALESICENTRY v1e ON v1.FID = v1e.FID
LEFT JOIN T_IV_SALESICENTRY_O v1e_o ON v1e_o.FENTRYID = v1e.FENTRYID
WHERE
1 = 1
AND v1.FDOCUMENTSTATUS = 'C'
AND v1.FCANCELSTATUS = 'A'
AND v1.F_SFQC = 0
AND v1.FSALEORGID = '{0}'
AND v1e.F_CONTRACTNO = '{1}'
UNION ALL
SELECT
'100302' FSALEORGID, -- 销售组织
合同号 F_PaperNumber, -- 纸质合同号
SUM(ISNULL (发票金额, 0)) FAFTERTOTALTAX, -- 价税合计本币
SUM(ISNULL (发票原币金额, 0)) FAFTERTOTALTAXFOR -- 价税合计
FROM
oldk3ICSale0802
WHERE
1 = 1
AND 合同号 = '{1}'
GROUP BY
合同号
) temp02
GROUP BY
FSALEORGID,
F_PaperNumber
) TEMP1 ON t1.F_CONTRACTNUMBER = TEMP1.F_PaperNumber
AND t1.FSALEORGID = TEMP1.FSALEORGID
WHERE
t1.FID = '{2}'
";
var sql = string.Format(sqlTemp, saleOrgId, contractNo, saleOrderId);
return DBServiceHelper.Execute(ctx, sql);
}
public int UpdateSaleOrderSumSicsamountAll()
{
var sql = @"/*dialect*/UPDATE t1
SET
t1.F_INVOICEAMOUNT = ISNULL (TEMP1.FAFTERTOTALTAXFOR, 0)
FROM
T_SAL_ORDER t1
INNER JOIN T_SAL_ORDERFIN t1fin ON t1.FID = t1fin.FID
LEFT JOIN (
SELECT
FSALEORGID,
F_PaperNumber,
SUM(FAFTERTOTALTAX) FAFTERTOTALTAX, -- 价税合计本币
SUM(FAFTERTOTALTAXFOR) FAFTERTOTALTAXFOR -- 价税合计原币
FROM
(
SELECT
v1.FSALEORGID, -- 销售组织
v1e.F_CONTRACTNO F_PaperNumber, -- 纸质合同号
ISNULL (v1e_o.FALLAMOUNT, 0) FAFTERTOTALTAX, -- 价税合计本币
ISNULL (v1e.FALLAMOUNTFOR, 0) FAFTERTOTALTAXFOR -- 价税合计
FROM
T_IV_SALESIC v1
INNER JOIN T_IV_SALESICENTRY v1e ON v1.FID = v1e.FID
LEFT JOIN T_IV_SALESICENTRY_O v1e_o ON v1e_o.FENTRYID = v1e.FENTRYID
WHERE
1 = 1
AND v1.FDOCUMENTSTATUS = 'C'
AND v1.FCANCELSTATUS = 'A'
AND v1.F_SFQC = 0
UNION ALL
SELECT
'100302' FSALEORGID, -- 销售组织
合同号 F_PaperNumber, -- 纸质合同号
SUM(ISNULL (发票金额, 0)) FAFTERTOTALTAX, -- 价税合计本币
SUM(ISNULL (发票原币金额, 0)) FAFTERTOTALTAXFOR -- 价税合计
FROM
oldk3ICSale0802
WHERE
1 = 1
GROUP BY
合同号
) temp02
GROUP BY
FSALEORGID,
F_PaperNumber
) TEMP1 ON t1.F_CONTRACTNUMBER = TEMP1.F_PaperNumber
AND t1.FSALEORGID = TEMP1.FSALEORGID
";
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
///
/// </summary>
/// <param name="approvedDate"></param>
/// <returns></returns>
public DynamicObjectCollection GetSaleSiceListByApprovedDate(DateTime approvedDate)
{
var sqlTemp = @"/*dialect*/SELECT DISTINCT
t1.FSALEORGID,
ISNULL(t1.F_PaperNumber, '') contractNo
FROM
T_IV_SALESIC t1
WHERE
1 = 1
AND t1.FAPPROVEDATE > '{0}'
";
var sql = string.Format(sqlTemp, approvedDate.ToString("yyyy-MM-dd HH:mm:dd"));
return DBServiceHelper.ExecuteDynamicObject(ctx, sql);
}
}
}

View File

@@ -0,0 +1,47 @@
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Services
{
internal class TempTableService
{
private Context ctx;
public TempTableService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// 删除临时表
/// </summary>
/// <param name="ctx"></param>
/// <param name="tempTable"></param>
public void DropTempTable(string tableName)
{
if (!tableName.IsNullOrEmptyOrWhiteSpace())
{
IDBService dbservice = ServiceHelper.GetService<IDBService>();
dbservice.DeleteTemporaryTableName(ctx, new string[] { tableName });
}
}
/// <summary>
/// 创建临时表
/// </summary>
/// <param name="ctx"></param>
/// <returns></returns>
public string CreateTempTable()
{
IDBService dbservice = ServiceHelper.GetService<IDBService>();
string[] temptables = dbservice.CreateTemporaryTableName(ctx, 1);
return temptables[0];
}
}
}

View File

@@ -19,6 +19,9 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
e.FieldKeys.Add("F_contractno");
e.FieldKeys.Add("FALLAMOUNTFOR");
e.FieldKeys.Add("FSALEORGID");
}
@@ -32,28 +35,34 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
var orgId = org["Id"].ToString(); // 销售组织
var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
// 根据合同号分组
var grouped = entryList.GroupBy(n => n["F_contractno"].ToString());
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 发票服务
SaleSicsService saleSicsService = new SaleSicsService(this.Context);
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
foreach (var group in grouped)
{
// 纸质合同号
var contractNo = group.Key;
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
continue;
}
foreach (var saleOrder in saleOrderList)
{
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
}
}
}

View File

@@ -7,6 +7,7 @@ using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -19,58 +20,178 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
e.FieldKeys.Add("FAFTERTOTALTAX");
e.FieldKeys.Add("F_contractno");
e.FieldKeys.Add("FALLAMOUNTFOR");
e.FieldKeys.Add("FSALEORGID");
}
private class SALESIC
{
/// <summary>
/// 组织Id
/// </summary>
public string OrgId { get; set; }
/// <summary>
/// 纸质合同号
/// </summary>
public string ContractNo { get; set; }
/// <summary>
/// 价税合计原币
/// </summary>
public decimal AllAmountFor { get; set; }
/// <summary>
/// 单据Id
/// </summary>
public string BillId { get; set; }
}
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
base.BeforeExecuteOperationTransaction(e);
//throw new Exception("asdfas");
var entryListUnion = new List<SALESIC>();
foreach (var bill in e.SelectedRows)
{
var billId = bill["Id"].ToString();
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
var FAFTERTOTALTAX = Convert.ToDecimal(bill["FAFTERTOTALTAX"]); // 发票单头价税合计本币
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
var orgId = org["Id"].ToString(); // 销售组织
var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
// 添加所有分录到集合
foreach (var item in entryList)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
entryListUnion.Add(new SALESIC()
{
BillId = billId,
OrgId = orgId,
ContractNo = item["F_contractno"].ToString(),
AllAmountFor = Convert.ToDecimal(item["ALLAMOUNTFOR"])
});
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 销售订单价税合计
var saleOrderAmount = Convert.ToDecimal(saleOrder["FBILLALLAMOUNT_LC"]);
// 销售订单累计开票金额
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计
if (saleOrderAmount < saleOrderINVOICEAMOUNT + FAFTERTOTALTAX)
}
var entryGrouped = entryListUnion.GroupBy(n => new
{
n.ContractNo,
n.OrgId
});
foreach (var item in entryGrouped)
{
// 纸质合同号
var contractNo = item.Key.ContractNo;
var orgId = item.Key.OrgId;
// 校验原单是否超额
var srcVerifResult = SrcExcessVerification(orgId, contractNo);
if (srcVerifResult != null)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(new OperateResult()
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($"纸质合同号:'{contractNo}' ,销售订单价税合计本币:{saleOrderAmount} ,累计开票金额:{saleOrderINVOICEAMOUNT},本次开票金额:{FAFTERTOTALTAX},已超额,不允许提交"),
SuccessStatus = false
});
operationResult.OperateResult.Add(srcVerifResult);
this.OperationResult.MergeResult(operationResult);
}
// 发票单体价税合计原币
var SumALLAMOUNTFOR = item.Sum(n => n.AllAmountFor);
var billIds = item.Select(n => n.BillId).ToList();
// TODO 校验是否超额
var verifResult = ExcessVerification(orgId, contractNo, SumALLAMOUNTFOR, billIds);
if (verifResult != null)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(verifResult);
this.OperationResult.MergeResult(operationResult);
}
}
}
/// <summary>
/// 校验源头单据是否超额
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <param name="amount"></param>
/// <returns></returns>
private OperateResult SrcExcessVerification(string orgId, string contractNo)
{
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
return null;
}
var saleOrder = saleOrderList[0];
// 源纸质合同号
var srcContractNo = saleOrder["F_SOURPAPERCONTRACT"]?.ToString();
// 如果原纸质合同号为空,则认为是源头单, 加上源单合同号 = 纸质合同号 是防止纸质合同号变更出错导致死递归
if (srcContractNo.IsNullOrEmptyOrWhiteSpace() || srcContractNo.Trim() == contractNo.Trim())
{
return null;
}
// 校验源单是否超额
var srcVerifResult = ExcessVerification(orgId, srcContractNo, 0, null);
if (srcVerifResult != null)
{
return srcVerifResult;
}
// 递归校验
return SrcExcessVerification(orgId, srcContractNo);
}
/// <summary>
/// 超额校验,如果校验不通过会返回OperateResult实例通过返回null
/// </summary>
/// <param name="orgId">销售组织</param>
/// <param name="contractNo">合同号</param>
/// <param name="amount">开票金额</param>
/// <param name="billIds">本次操作单据ID</param>
/// <returns></returns>
private OperateResult ExcessVerification(string orgId, string contractNo, decimal amount, List<string> billIds)
{
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
return null;
}
var saleOrderNoList = saleOrderList.Select(n => n["FBILLNO"].ToString()).ToList();
var saleOrderNoString = string.Join(",\n\r", saleOrderNoList);
var saleOrder = saleOrderList[0];
// 已提交发票金额(原币)
var submitedAmount = saleOrderService.GetSubmitedAmount(orgId, contractNo, billIds);
// 销售订单价税合计(原币)
var saleOrderAmount = saleOrderService.GetSaleOrderAmount(orgId, contractNo);
// 销售订单累计开票金额(原币)
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 销售订单退货金额(原币)
var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo);
var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo);
// 销售订单退货金额(原币)
var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud;
// 校验销售订单累计开票金额 + 本次开票金额 + 已提交发票金额 <= 销售订单价税合计
if ((saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount + submitedAmount) && amount >= 0)
{
return new OperateResult()
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($@" 销售纸质合同号:'{contractNo}'
销售订单:'{saleOrderNoString}' , 开票超额。
不满足条件:整单可开票金额 >= 累计开票金额 + 本次开票金额 + 已提交发票金额。
整单可开票金额:{(saleOrderAmount - saleOrderReturnAmountK3Cloud - saleOrderReturnAmountK3).ToString("0.00")}
{saleOrderINVOICEAMOUNT.ToString("0.00")}
{amount.ToString("0.00")}
{submitedAmount.ToString("0.00")}"),
SuccessStatus = false
};
}
return null;
}
}
}

View File

@@ -19,8 +19,12 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
e.FieldKeys.Add("F_contractno");
e.FieldKeys.Add("FALLAMOUNTFOR");
e.FieldKeys.Add("FSALEORGID");
}
/// <summary>
/// 审核插件执行后插件、事务提交后事件
/// </summary>
@@ -31,28 +35,34 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
var orgId = org["Id"].ToString(); // 销售组织
var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
// 根据合同号分组
var grouped = entryList.GroupBy(n => n["F_contractno"].ToString());
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 发票服务
SaleSicsService saleSicsService = new SaleSicsService(this.Context);
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
foreach (var group in grouped)
{
// 纸质合同号
var contractNo = group.Key;
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
continue;
}
foreach (var saleOrder in saleOrderList)
{
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
}
}
}

38
Utils/ContextUtil.cs Normal file
View File

@@ -0,0 +1,38 @@
using GZ_LTHPilot_ORDER.Config;
using Kingdee.BOS;
using Kingdee.BOS.ServiceHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Utils
{
public class ContextUtil
{
Context ctx { get; set; }
public ContextUtil(Context ctx)
{
this.ctx = ctx;
}
public Context GetDefaultContext()
{
var userName = ContextConfig.DefaultUserName;
var userId = ContextConfig.DefaultUserId;
return GetNewContext(userId, userName);
}
public Context GetNewContext(long userId, string userName)
{
Context newCtx = DataCenterService.GetDataCenterContextByID(ctx.DBId);
newCtx.UserId = userId;
newCtx.UserName = userName;
newCtx.ServiceType = WebType.WebSite;
newCtx.CurrentOrganizationInfo.ID = 1;
return newCtx;
}
}
}

65
Utils/LogUtil.cs Normal file
View File

@@ -0,0 +1,65 @@
using Kingdee.BOS.Log;
using System;
using System.IO;
namespace Gatedge.Enpower.BOS.PlugIn.Utils
{
internal class LogUtil
{
//private const string LogPath = "GzLog\\";
private const string LogPath = "C:\\Kingdee_Gatedge_Log\\";
public static void Log(string logName, string logInfo)
{
var log = logInfo + "\r\n--------------------------------------------------------\r\n";
var path = LogPath + logName;
var fileName = GetFileName();
var fullPath = path + fileName;
WriteLog(fullPath, log);
}
public static void Log(string[] logNames, string logInfo)
{
var log = logInfo + "\r\n--------------------------------------------------------\r\n";
var pathName = string.Join("\\", logNames);
var path = LogPath + pathName;
var fileName = GetFileName();
var fullPath = path + fileName;
WriteLog(fullPath, log);
}
private static string GetFileName()
{
var dateTime = DateTime.Now;
var fileName = "\\KD_Gatedge_" + dateTime.ToString("yyyy-MM-dd_HH-mm-ss") + ".log";
//return "\\" + string.Empty;
return fileName;
}
private static void WriteLog(string path, string logInfo)
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate);
StreamWriter streamWriter = new StreamWriter(fileStream);
fileStream.Position = fileStream.Length;
streamWriter.Write(logInfo);
streamWriter.Flush();
streamWriter.Close();
fileStream.Close();
Logger.Info(path, logInfo);
}
/// <summary>
/// 删除早于该时间前的日志
/// </summary>
/// <param name="dateTime"></param>
private static void RemoveLog(DateTime dateTime)
{
}
}
}

View File

@@ -0,0 +1,45 @@

using GZ_LTHPilot_ORDER.Models.VO;
using GZ_LTHPilot_ORDER.Service;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.ServiceFacade.KDServiceFx;
using Kingdee.BOS.Util;
using Kingdee.BOS;
using Kingdee.BOS.WebApi.Client;
using Kingdee.BOS.WebApi.ServicesStub;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.WebApiService
{
[Description("商品类型"), HotUpdate]
public class SaleOrderApiService : AbstractWebApiBusinessService
{
public SaleOrderApiService(KDServiceContext context) : base(context)
{
}
public SaleExecuteOut GetSaleOrderReceiveAmount(string orgId, string billNo)
{
SaleOrderService saleOrderService = new SaleOrderService(this.KDContext.Session.AppContext);
var amount = saleOrderService.GetSaleOrderReceiveAmount(orgId, billNo);
var result = new SaleExecuteOut()
{
FBILLNO = billNo,
FALLMATCHAMOUNT = amount.ToString()
};
return result;
}
public List<SaleExecuteOut> GetSaleOrderReceiveAmountByDate(string orgId, DateTime startDate, DateTime endDate)
{
SaleOrderService saleOrderService = new SaleOrderService(this.KDContext.Session.AppContext);
return saleOrderService.GetSaleOrderReceiveAmountByDate(orgId, startDate, endDate);
}
}
}

View File

@@ -1,6 +1,7 @@
using FarPoint.Excel;
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.ServiceHelper.ManagementCenter;
using Kingdee.BOS.Util;
@@ -10,11 +11,13 @@ using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static IronPython.Modules._ast;
using static Kingdee.K3.SCM.App.Core.Validation.InvAccountValidation.InvAccountConsumeSumBillValidator;
namespace GZ_LTHPilot_ORDER.XMYSLRB
{
[Description("表单插件:当项目预算利润表完成加载后,自动新增成本明细行"), HotUpdate]
public class OnLoadLR : AbstractDynamicFormPlugIn
public class OnLoadLR : AbstractBillPlugIn
{
public override void OnLoad(EventArgs e)
{
@@ -25,10 +28,14 @@ namespace GZ_LTHPilot_ORDER.XMYSLRB
{
return;
}
string sql = string.Format(@"SELECT COUNT(B.FDATAVALUE) AS 'HJ' FROM T_BAS_ASSISTANTDATAENTRY A
INNER JOIN T_BAS_ASSISTANTDATAENTRY_L B ON A.FENTRYID = B.FENTRYID
WHERE FID = '682c386fbcca09'
AND FDocumentStatus = 'C'");
string sql = string.Format(@"/*dialect*/SELECT
COUNT(B.FDATAVALUE) AS 'HJ'
FROM
T_BAS_ASSISTANTDATAENTRY A
INNER JOIN T_BAS_ASSISTANTDATAENTRY_L B ON A.FENTRYID = B.FENTRYID
WHERE
A.FID = '682c386fbcca09'
AND A.FDocumentStatus = 'C'");
var sqlDS = DBUtils.ExecuteDynamicObject(this.Context, sql);
var Count = 0;
if (sqlDS.Count != 0)
@@ -43,20 +50,36 @@ namespace GZ_LTHPilot_ORDER.XMYSLRB
INNER JOIN T_BAS_ASSISTANTDATAENTRY_L B ON A.FENTRYID = B.FENTRYID
WHERE FID = '682c386fbcca09'AND FDocumentStatus = 'C'");
sqlDS = DBUtils.ExecuteDynamicObject(this.Context, sql);
if (sqlDS.Count != 0)
if (sqlDS.Count == 0)
{
for (int i = 0; i < Count; i++)
return;
}
var SGCB_STR = this.View.Model.GetValue("F_SGCB")?.ToString();
decimal SGCB;
var SGCB_STRIsNumber = decimal.TryParse(SGCB_STR, out SGCB);
for (int i = 0; i < Count; i++)
{
this.View.Model.SetItemValueByID("F_VRYF_Assistant_qtr", Convert.ToString(sqlDS[i]["FENTRYID"]), i);
// 实施安装费,将税率设置为6将单头上的施工成本带出
if (Convert.ToString(sqlDS[i]["FENTRYID"]) == "682e83afbd70b6")
{
this.View.Model.SetItemValueByID("F_VRYF_Assistant_qtr", Convert.ToString(sqlDS[i]["FENTRYID"]), i);
if (Convert.ToString(sqlDS[i]["FENTRYID"]) == "682e83afbd70b6")
this.View.Model.SetValue("F_VRYF_Decimal_qtr", 6, i);
if (SGCB_STRIsNumber)
{
this.View.Model.SetItemValueByID("F_VRYF_Decimal_qtr", 6, i);
}
else if (Convert.ToString(sqlDS[i]["FENTRYID"]) == "682e83e4bd70cb")
{
this.View.Model.SetItemValueByID("F_VRYF_Decimal_qtr", 6, i);
this.View.Model.SetValue("F_VRYF_Amount_xk9", SGCB, i);
}
}
// 外包费将税率设置为6
else if (Convert.ToString(sqlDS[i]["FENTRYID"]) == "682e83e4bd70cb")
{
this.View.Model.SetValue("F_VRYF_Decimal_qtr", 6, i);
}
}
}
public override void AfterBindData(EventArgs e)
@@ -74,7 +97,7 @@ namespace GZ_LTHPilot_ORDER.XMYSLRB
{
this.View.GetFieldEditor("F_VRYF_Decimal_qtr", i).Enabled = false;
}
}
for (int i = 0; i < sqlDS.Count; i++)
{

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Buffers</name>
</assembly>
<members>
<member name="T:System.Buffers.ArrayPool`1">
<summary>Provides a resource pool that enables reusing instances of type <see cref="T[]"></see>.</summary>
<typeparam name="T">The type of the objects that are in the resource pool.</typeparam>
</member>
<member name="M:System.Buffers.ArrayPool`1.#ctor">
<summary>Initializes a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create(System.Int32,System.Int32)">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class using the specifed configuration.</summary>
<param name="maxArrayLength">The maximum length of an array instance that may be stored in the pool.</param>
<param name="maxArraysPerBucket">The maximum number of array instances that may be stored in each bucket in the pool. The pool groups arrays of similar lengths into buckets for faster access.</param>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class with the specified configuration.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Rent(System.Int32)">
<summary>Retrieves a buffer that is at least the requested length.</summary>
<param name="minimumLength">The minimum length of the array.</param>
<returns>An array of type <see cref="T[]"></see> that is at least <paramref name="minimumLength">minimumLength</paramref> in length.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)">
<summary>Returns an array to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method on the same <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<param name="array">A buffer to return to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method.</param>
<param name="clearArray">Indicates whether the contents of the buffer should be cleared before reuse. If <paramref name="clearArray">clearArray</paramref> is set to true, and if the pool will store the buffer to enable subsequent reuse, the <see cref="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)"></see> method will clear the <paramref name="array">array</paramref> of its contents so that a subsequent caller using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method will not see the content of the previous caller. If <paramref name="clearArray">clearArray</paramref> is set to false or if the pool will release the buffer, the array&amp;#39;s contents are left unchanged.</param>
</member>
<member name="P:System.Buffers.ArrayPool`1.Shared">
<summary>Gets a shared <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<returns>A shared <see cref="System.Buffers.ArrayPool`1"></see> instance.</returns>
</member>
</members>
</doc>

Some files were not shown because too many files have changed in this diff Show More