This commit is contained in:
PastSaid
2024-07-16 10:33:50 +08:00
parent e8a1f46c3d
commit fa480006a8
132 changed files with 20893 additions and 4519 deletions

View File

@@ -117,8 +117,9 @@ def DoDetection():
orgObj = this.View.Model.GetValue("FStockOrgId")
if orgObj["Id"] == 101542:
return True
# return False
return True
return False
# return True
def DoQueryBeforeCheck(materialId,stockId,dateVal,row):
flag = materialId == 0 or stockId == 0 or dateVal == ""
@@ -137,6 +138,8 @@ def DoQueryBeforeCheck(materialId,stockId,dateVal,row):
def GetMaterialReferPrice(rowList):
sqlL = """/*dialect*/
declare @val nvarchar(MAX)
SET @val = '{0}'
SELECT
rowSet2.[1] AS 'FMATERIALID'
,CONVERT(int,rowSet2.[2]) AS 'inRow'
@@ -146,7 +149,7 @@ SELECT
,rowSet2.[6] AS 'FSID'
,rowSet2.[7] AS 'FSTABLENAME'
INTO #TMP_DATA
FROM (SELECT 1 ID,CAST('<v>'+ REPLACE('{0}',';','</v><v>') + '</v>' AS XML) AS xmlVal
FROM (SELECT 1 ID,CAST('<v>'+ REPLACE(@val,';','</v><v>') + '</v>' AS XML) AS xmlVal
) AS valSet
OUTER APPLY (
SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN

View File

@@ -0,0 +1,300 @@
import clr
clr.AddReference("System")
clr.AddReference('System.Data')
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference('Kingdee.BOS.App')
clr.AddReference("Kingdee.BOS.ServiceHelper")
from Kingdee.BOS.Core import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn import *
from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args import *
from System import *
from System.Data import *
from System.Collections.Generic import *
from Kingdee.BOS.ServiceHelper import *
# 数据装换完毕后触发事件
def AfterConvert(e):
if this.OperationNumber == "Draw":
# raise Exception(JsonUtil.Serialize(e.TargetBusinessInfo))
billHead = e.Result.FindByEntityKey("FBillHead")[0].DataEntity
# raise Exception(JsonUtil.Serialize(billHead))
stockOrgObj_id = billHead["StockOrgId_Id"]
if stockOrgObj_id == 101542:
dateObjValue = billHead["Date"]
dateValue = "" if dateObjValue == None else str(dateObjValue)
dataList = List[str]()
entrys = billHead["BillEntry"]
for entry in entrys:
rowIndex = entry["Seq"] - 1
materialObjValue = entry["MaterialId_Id"]
materialValue = 0 if materialObjValue == None else materialObjValue
stockObjValue = entry["StockId_Id"];
stockValue = 0 if stockObjValue == None else stockObjValue
entityLinkObj = None;
entityLinkObjList = entry["FEntity_Link"]
if entityLinkObjList != None and entityLinkObjList.Count > 0:
entityLinkObj = entityLinkObjList[0]
sBillId = 0 if entityLinkObj == None else entityLinkObj["SBillId"];
sId = 0 if entityLinkObj == None else entityLinkObj["SId"];
sTableName = "" if entityLinkObj == None else entityLinkObj["STableName"];
if DoQueryBeforeCheck(materialValue, stockValue, dateValue):
dataList.Add("{0},{1},{2},{3},{4},{5},{6}".format(materialValue,rowIndex,stockValue,dateValue,sBillId,sId,sTableName));
else:
entry["FReferPrice"] = 0
entry["FReferAmount"] = 0
entry["FExplain"] = "没有找到价格"
if dataList.Count > 0:
GetMaterialReferPrice(";".join(dataList), entrys)
def DoQueryBeforeCheck(materialId,stockId,dateVal):
flag = materialId == 0 or stockId == 0 or dateVal == ""
return not flag
def GetMaterialReferPrice(rowList,entrys):
sqlL = """/*dialect*/
SELECT
rowSet2.[1] AS 'FMATERIALID'
,CONVERT(int,rowSet2.[2]) AS 'inRow'
,rowSet2.[3] AS 'FSTOCKID'
,rowSet2.[4] AS 'FDate'
,rowSet2.[5] AS 'FSBILLID'
,rowSet2.[6] AS 'FSID'
,rowSet2.[7] AS 'FSTABLENAME'
INTO #TMP_DATA
FROM (SELECT 1 ID,CAST('<v>'+ REPLACE('{0}',';','</v><v>') + '</v>' AS XML) AS xmlVal
) AS valSet
OUTER APPLY (
SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN
,CAST('<v>'+ REPLACE(T.C.value('.','varchar(100)'),',','</v><v>') + '</v>' AS XML) xmlVal
FROM valSet.xmlVal.nodes('/v') AS T(C)
) rowSet
OUTER APPLY (
SELECT TT2.* FROM (
SELECT T.C.value('.','varchar(100)') AS xmlVal
,ROW_NUMBER() OVER (ORDER BY rowSet.RN) RowNo
FROM rowSet.xmlVal.nodes('/v') AS T(C)
) TT
PIVOT (MAX(TT.xmlVal) FOR TT.RowNo IN ([1],[2],[3],[4],[5],[6],[7])) TT2
) rowSet2
/***********************************取上游单据start*****************************************/
SELECT t0e_lk.FMATERIALID
,(CASE t0e_lk.FSTABLENAME
WHEN 'T_STK_MISDELIVERYENTRY' THEN t1.FPRICE --其他出库(退货)-成本价
WHEN 'T_STK_INSTOCKENTRY' THEN t2.FPRICE --采购入库 -单价(不含税)
WHEN 'T_STK_STKTRANSFERINENTRY1' THEN t3.FPRICE --分步式调入 -参考单价
ELSE 0
END) AS 'newReferPrice'
,(CASE t0e_lk.FSTABLENAME
WHEN 'T_STK_MISDELIVERYENTRY' THEN '源_其他出库单:'+ t1.FBILLNO
WHEN 'T_STK_INSTOCKENTRY' THEN '源_采购入库单:'+ t2.FBILLNO
WHEN 'T_STK_STKTRANSFERINENTRY1' THEN (CASE t3.FPRICE WHEN 0 THEN '' ELSE '源_分步式调入单:'+ t3.FBILLNO END)
ELSE ''
END) AS 'newExplain'
,t0e_lk.FSTABLENAME
,t0e_lk.FDATE
,t0e_lk.FSTOCKID
,t0e_lk.inRow
,YEAR(t0e_lk.FDATE) * 100 + MONTH(t0e_lk.FDATE) AS DateNum
,t4.FMASTERID
,t4i.FINVPTYID
,t4i.FISAFFECTCOST
,t4i.FISENABLE
INTO #TMP_HAS_PARENT_MIS
FROM #TMP_DATA t0e_lk
OUTER APPLY (
SELECT t1.FBILLNO,t1e.FPRICE
FROM T_STK_MISDELIVERY t1 --其他出库单
INNER JOIN T_STK_MISDELIVERYENTRY t1e on t1.FID = t1e.FID
AND (t1e.FMATERIALID = t0e_lk.FMATERIALID AND t1e.FID = t0e_lk.FSBILLID AND t1e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_MISDELIVERYENTRY')
) t1
OUTER APPLY (
SELECT t2.FBILLNO,t2e_f.FPRICE
FROM T_STK_INSTOCK t2 --采购入库单
INNER JOIN T_STK_INSTOCKENTRY t2e on t2e.FID = t2.FID
INNER JOIN T_STK_INSTOCKENTRY_F t2e_f on t2e.FID = t2e_f.FID AND t2e.FENTRYID = t2e_f.FENTRYID
AND (t2e.FMATERIALID = t0e_lk.FMATERIALID AND t2e.FID = t0e_lk.FSBILLID AND t2e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_INSTOCKENTRY')
) t2
OUTER APPLY (
SELECT t3.FBILLNO
,t3e.F_GAT_DECIMAL AS FPRICE
-- ,(CASE LTRIM(RTRIM(t3e.FReferPrice)) WHEN '' THEN 0 ELSE CONVERT(decimal(23,6) ,t3e.FReferPrice) END) AS FPRICE
FROM T_STK_STKTRANSFERIN t3 --分步式调入
INNER JOIN T_STK_STKTRANSFERINENTRY t3e on t3.FID = t3e.FID
AND (t3e.FMATERIALID = t0e_lk.FMATERIALID AND t3e.FID = t0e_lk.FSBILLID AND t3e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_STKTRANSFERINENTRY1')
) t3
INNER JOIN T_BD_MATERIAL t4 on t4.FMATERIALID = t0e_lk.FMATERIALID
INNER JOIN T_BD_MATERIALINVPTY t4i on t0e_lk.FMATERIALID = t4i.FMATERIALID AND t4i.FINVPTYID = 10001 --AND t4i.FISENABLE = 1
WHERE 1 = 1
/***********************************取上游单据end********************************************/
/***********************************存货收发结存start***************************************************/
SELECT t0.FDATE
--,t0.FBILLNO,t0.FID,t0.FENTRYID
,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST,t0.FISENABLE
,t0.inRow
,ISNULL((CASE t0.newReferPrice WHEN 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN t2.FDATE ELSE t3.FDATE END)
ELSE t0.newExplain
END),'') AS 'newExplain'
,ISNULL((CASE t0.newReferPrice WHEN 0 THEN
(CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN t2.PRICE
ELSE (CASE WHEN t3.FQTY <> 0 THEN ROUND(t3.FAMOUNT/t3.FQTY,6) ELSE 0 END)
END)
ELSE t0.newReferPrice
END),0) AS 'newReferPrice'
INTO #TMP_结存单价_END_LIST
FROM #TMP_HAS_PARENT_MIS t0
OUTER APPLY(
SELECT TOP 1 tt1.FDATE
,(CASE WHEN tt1.FQTY <> 0 THEN ROUND(tt1.FAMOUNT/tt1.FQTY,6) ELSE 0 END) AS PRICE
FROM V_MATERIAL_INIVSTOCKDIMENSION tt1
WHERE 1 = 1
AND t0.FMASTERID = tt1.FMASTERID
AND t0.FSTOCKID = tt1.FSTOCKID
AND tt1.DateNum <= t0.DateNum
AND (t0.FISENABLE = 1 AND t0.FISAFFECTCOST = 1)
AND t0.newReferPrice = 0
AND tt1.FQTY > 0
ORDER BY tt1.FYEAR DESC,tt1.FPERIOD DESC
) t2
OUTER APPLY (
SELECT TOP 1 tt2.FYEAR,tt2.FPERIOD
,CONVERT(nvarchar(10),FYEAR) + '.' + CONVERT(nvarchar(10),FPERIOD) AS FDATE
,SUM(tt2.FAMOUNT) AS FAMOUNT,SUM(tt2.FQTY) AS FQTY
FROM V_MATERIAL_INIVSTOCKDIMENSION tt2
WHERE 1 = 1
AND t0.FMASTERID = tt2.FMASTERID
AND tt2.DateNum <= t0.DateNum
AND (t0.FISENABLE = 0 OR t0.FISAFFECTCOST = 0)
AND t0.newReferPrice = 0
GROUP BY tt2.FYEAR,tt2.FPERIOD
HAVING SUM(tt2.FQTY) > 0
ORDER BY tt2.FYEAR DESC,tt2.FPERIOD DESC
) t3
/*****************************************存货收发结存end***********************************************/
/*****************************************合同单价、采购入库单start**********************************************/
SELECT t0.FDATE
--,t0.FBILLNO,t0.FID,t0.FENTRYID
,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST
,t0.inRow
,ISNULL((CASE WHEN t0.newReferPrice = 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN t1.FPRICE ELSE t2.FPRICE END)
ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN t2.FPRICE ELSE t1.FPRICE END)
END)
ELSE t0.newReferPrice
END),0) AS 'newReferPrice'
,ISNULL((CASE WHEN t0.newReferPrice = 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN '取采购入库单单价,单据:'+t1.FBILLNO ELSE '取合同价,合同号为:'+t2.FBILLNO END)
ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN '取合同价,合同号为:'+t2.FBILLNO ELSE '取采购入库单单价,单据:'+t1.FBILLNO END)
END)
ELSE t0.newExplain
END),'没有找到价格') AS 'newExplain'
FROM #TMP_结存单价_END_LIST t0
OUTER APPLY (
SELECT TOP 1 tt0.FBILLNO,tt0e.FMATERIALID,tt0e.FSTOCKID
,tt0e_f.FPRICE,tt0e_f.FCOSTPRICE
FROM T_STK_INSTOCK tt0 --采购入库
INNER JOIN T_STK_INSTOCKENTRY tt0e on tt0.FID = tt0e.FID
INNER JOIN T_STK_INSTOCKENTRY_F tt0e_f on tt0e.FENTRYID = tt0e_f.FENTRYID
WHERE
tt0.FDOCUMENTSTATUS = 'C'
AND tt0.FCANCELSTATUS = 'A'
AND tt0.FSTOCKORGID = 101542
AND (tt0e_f.FPRICE != 0 OR tt0e_f.FCOSTPRICE <> 0)
AND t0.FMATERIALID = tt0e.FMATERIALID AND tt0e.FSTOCKID = t0.FSTOCKID
AND DATEDIFF(DAY,tt0.FDATE, t0.FDATE) > -1
ORDER BY tt0.FDATE DESC
) t1
LEFT JOIN (
SELECT
tt0e.F_QNV_BASE1 AS FMATERIALID
--,tt0e.F_QNV_DECIMAL3 AS FPRICE--综合单价
--,tt0e.F_QNV_DECIMAL1 AS FPRICE--含税单价
,tt0e.F_QNV_PRICE AS FPRICE--不含税单价
,tt0.F_QNV_TEXT2 AS FBILLNO
,tt1.FMASTERID
,ROW_NUMBER() OVER (PARTITION BY tt1.FMASTERID ORDER BY F_QNV_DATE2 DESC, tt1.FUSEORGID DESC) 'RN'
FROM QNV_t_Cust_Entry100003 tt0 --供应商年度合同
INNER JOIN QNV_t_Cust_Entry100004 tt0e on tt0.FID = tt0e.FID
INNER JOIN T_BD_MATERIAL tt1 on tt1.FMATERIALID = tt0e.F_QNV_BASE1
WHERE 1 = 1
AND tt0.FDOCUMENTSTATUS = 'C'
AND tt0e.F_QNV_PRICE != 0
) t2 on t0.FMASTERID = t2.FMASTERID AND t2.RN = 1
/*****************************************合同单价、采购入库单end**********************************************/
DROP TABLE #TMP_DATA
DROP TABLE #TMP_HAS_PARENT_MIS
DROP TABLE #TMP_结存单价_END_LIST
""".format(rowList)
res = DBServiceHelper.ExecuteDynamicObject(this.Context,sqlL)
if res != None and res.Count > 0:
for item in res:
rowIndex = item["inRow"]
referPriceVal = item["newReferPrice"]
newExplain = item["newExplain"]
# this.View.Model.SetValue("FReferPrice", referPriceVal, rowIndex)
# this.View.Model.SetValue("FExplain", newExplain, rowIndex)
entrys[rowIndex]["FReferPrice"] = referPriceVal
entrys[rowIndex]["FExplain"] = newExplain
fqty = this.View.Model.GetValue("FQty",rowIndex)
# this.View.Model.SetValue("FReferAmount", referPriceVal * fqty, rowIndex)
entrys[rowIndex]["FReferAmount"] = referPriceVal * fqty
# this.View.InvokeFieldUpdateService("FReferPrice", rowIndex)
materialId = str(item["FMATERIALID"])
dateVal = str(item["FDATE"])
stockId = str(item["FSTOCKID"])
entrys[rowIndex]["FInstockPrice"] = GetInstockPrice(rowIndex ,dateVal ,materialId,stockId)
# 获取采购申请单价
def GetInstockPrice(Row, Fdate, FmaterialId, stockValue):
# raise Exception(str(Row)+","+str(Fdate)+","+str(FmaterialId)+","+str(stockValue))
sqlL = """/*dialect*/
SELECT top 1
A.FBILLNO, CASE WHEN FPrice = 0 THEN round( C.FCostPrice ,2) else round( C.FPrice ,2) end as 'FPrice'
FROM T_STK_INSTOCK A
INNER JOIN T_STK_INSTOCKENTRY B ON A.FID = B.FID
INNER JOIN T_STK_INSTOCKENTRY_F C ON C.FENTRYID = B.FENTRYID
WHERE
A.FDOCUMENTSTATUS = 'C'
AND A.FCANCELSTATUS = 'A'
AND A.FSTOCKORGID = 101542
AND B.FMATERIALID = {1}
AND B.FSTOCKID = {2}
AND CONVERT(nvarchar(10),FDATE,23) <= '{0}'
AND CONVERT(nvarchar(10),FAPPROVEDATE,23) <= '{0}'
AND (c.FPrice <> 0 or c.FCostPrice <> 0)
ORDER BY FDATE DESC, FAPPROVEDATE DESC
""".format(Fdate, FmaterialId, stockValue)
# raise Exception(sqlL)
InstockPrice = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL)
_instockPriceVal = 0.01
if InstockPrice != None and InstockPrice.Count > 0:
_instockPriceVal = InstockPrice[0]["FPrice"]
else:
_instockPriceVal = 0
# this.View.Model.SetValue("FInstockPrice", _instockPriceVal, Row)
return _instockPriceVal

View File

@@ -23,6 +23,7 @@
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
</PropertyGroup>
<ItemGroup>
<Folder Include="STK_TRANSFERIN\" />
<Folder Include="PUR_Requisition\sql\" />
<Folder Include="STK_MisDelivery\" />
<Folder Include="PUR_Requisition\" />
@@ -30,6 +31,7 @@
<ItemGroup>
<Compile Include="PUR_Requisition\BillEventPlugInEx.py" />
<Compile Include="STK_MisDelivery\BillEventPlugInEx.py" />
<Compile Include="STK_TRANSFERIN\BillConvertEventPlugInEx.py" />
</ItemGroup>
<ItemGroup>
<Content Include="PUR_Requisition\sql\获取合同年度单价.sql" />

Binary file not shown.

View File

@@ -0,0 +1,15 @@
SELECT t0.FNUMBER,t0.FMATERIALID,t0_l.*,t1.,t0s.FTAXCATEGORYCODEID,t2.FID AS '税收分类编码ID',t2.FTAXPOLICY
--UPDATE t0s SET t0s.FTAXCATEGORYCODEID = t2.FID
-- ,t0s.FTAXDISCOUNTSTYPE = t2.FTAXPOLICY
-- ,t0s.FIsTaxEnjoy = CASE WHEN (LEN(t2.FTAXPOLICY) = 0) THEN 0 ELSE 1 END
FROM T_BD_MATERIAL t0
INNER JOIN T_BD_MATERIALSALE t0s on t0.FMATERIALID = t0s.FMATERIALID
INNER JOIN T_BD_MATERIAL_L t0_l on t0s.FMATERIALID = t0_l.FMATERIALID AND t0_l.FLOCALEID = 2052
INNER JOIN (
SELECT t1.,t1.
FROM EXCEL t1
GROUP BY t1.,t1.
) t1 on t0_l.FNAME = t1.
INNER JOIN T_IV_GTTAXCODE t2 on t2.FTAXCODE = t1.
WHERE 1=1
AND t0s.FTAXCATEGORYCODEID !=0

View File

@@ -0,0 +1,332 @@
using ExtensionMethods;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace ZHSW.STK_TRANSFERIN
{
[Description("其他出库单选单插件-分步式调入单"), HotUpdate]
public class BillConvertEventPlugInEx : AbstractConvertPlugIn
{
public override void AfterConvert(AfterConvertEventArgs e)
{
base.AfterConvert(e);
if (this.OperationNumber.Equals("Draw"))
{
var billHead = e.Result.FindByEntityKey("FBillHead")[0].DataEntity;
var stockOrgObj_id = billHead["StockOrgId_Id"].Long2Int();
if (stockOrgObj_id == 101542)
{
var dateObjValue = billHead["Date"];
var dateValue = dateObjValue == null ? "" : ((DateTime)dateObjValue).ToString("yyyy-MM-dd");
var dataList = new List<string>();
var entrys = billHead["BillEntry"] as DynamicObjectCollection;
foreach (var entry in entrys)
{
var rowIndex = entry["Seq"].Long2Int() - 1;
var materialObjValue = entry["MaterialId_Id"];
var materialValue = materialObjValue.Long2Int();
var stockObjValue = entry["StockId_Id"];
var stockValue = stockObjValue.Long2Int();
DynamicObject entityLinkObj = null;
var entityLinkObjList = (DynamicObjectCollection)entry["FEntity_Link"];
if (entityLinkObjList != null && entityLinkObjList.Count > 0)
entityLinkObj = entityLinkObjList[0];
var sBillId = entityLinkObj["SBillId"].Long2Int();
var sId = entityLinkObj["SId"].Long2Int();
var sTableName = entityLinkObj == null ? "" : entityLinkObj["STableName"].ToString();
if (DoQueryBeforeCheck(materialValue, stockValue, dateValue))
{
dataList.Add(string.Format("{0},{1},{2},{3},{4},{5},{6}", materialValue, rowIndex, stockValue, dateValue, sBillId, sId, sTableName));
}
else
{
entry["FReferPrice"] = 0;
entry["FReferAmount"] = 0;
entry["FExplain"] = "没有找到价格";
}
}
if (dataList.Count > 0)
GetMaterialReferPrice(string.Join(";", dataList), entrys.ToList());
}
}
}
/// <summary>
/// 取值
/// </summary>
/// <param name="rowList"></param>
/// <param name="entrys"></param>
private void GetMaterialReferPrice(string rowList, List<DynamicObject> entrys)
{
var sqlL = $@"/*dialect*/
SELECT
rowSet2.[1] AS 'FMATERIALID'
,CONVERT(int,rowSet2.[2]) AS 'inRow'
,rowSet2.[3] AS 'FSTOCKID'
,rowSet2.[4] AS 'FDate'
,rowSet2.[5] AS 'FSBILLID'
,rowSet2.[6] AS 'FSID'
,rowSet2.[7] AS 'FSTABLENAME'
INTO #TMP_DATA
FROM (SELECT 1 ID,CAST('<v>'+ REPLACE('{rowList}',';','</v><v>') + '</v>' AS XML) AS xmlVal
) AS valSet
OUTER APPLY (
SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN
,CAST('<v>'+ REPLACE(T.C.value('.','varchar(100)'),',','</v><v>') + '</v>' AS XML) xmlVal
FROM valSet.xmlVal.nodes('/v') AS T(C)
) rowSet
OUTER APPLY (
SELECT TT2.* FROM (
SELECT T.C.value('.','varchar(100)') AS xmlVal
,ROW_NUMBER() OVER (ORDER BY rowSet.RN) RowNo
FROM rowSet.xmlVal.nodes('/v') AS T(C)
) TT
PIVOT (MAX(TT.xmlVal) FOR TT.RowNo IN ([1],[2],[3],[4],[5],[6],[7])) TT2
) rowSet2
/***********************************取上游单据start*****************************************/
SELECT t0e_lk.FMATERIALID
,(CASE t0e_lk.FSTABLENAME
WHEN 'T_STK_MISDELIVERYENTRY' THEN t1.FPRICE --其他出库(退货)-成本价
WHEN 'T_STK_INSTOCKENTRY' THEN t2.FPRICE --采购入库 -单价(不含税)
WHEN 'T_STK_STKTRANSFERINENTRY1' THEN t3.FPRICE --分步式调入 -参考单价
ELSE 0
END) AS 'newReferPrice'
,(CASE t0e_lk.FSTABLENAME
WHEN 'T_STK_MISDELIVERYENTRY' THEN '源_其他出库单:'+ t1.FBILLNO
WHEN 'T_STK_INSTOCKENTRY' THEN '源_采购入库单:'+ t2.FBILLNO
WHEN 'T_STK_STKTRANSFERINENTRY1' THEN (CASE t3.FPRICE WHEN 0 THEN '' ELSE '源_分步式调入单:'+ t3.FBILLNO END)
ELSE ''
END) AS 'newExplain'
,t0e_lk.FSTABLENAME
,t0e_lk.FDATE
,t0e_lk.FSTOCKID
,t0e_lk.inRow
,YEAR(t0e_lk.FDATE) * 100 + MONTH(t0e_lk.FDATE) AS DateNum
,t4.FMASTERID
,t4i.FINVPTYID
,t4i.FISAFFECTCOST
,t4i.FISENABLE
INTO #TMP_HAS_PARENT_MIS
FROM #TMP_DATA t0e_lk
OUTER APPLY (
SELECT t1.FBILLNO,t1e.FPRICE
FROM T_STK_MISDELIVERY t1 --其他出库单
INNER JOIN T_STK_MISDELIVERYENTRY t1e on t1.FID = t1e.FID
AND (t1e.FMATERIALID = t0e_lk.FMATERIALID AND t1e.FID = t0e_lk.FSBILLID AND t1e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_MISDELIVERYENTRY')
) t1
OUTER APPLY (
SELECT t2.FBILLNO,t2e_f.FPRICE
FROM T_STK_INSTOCK t2 --采购入库单
INNER JOIN T_STK_INSTOCKENTRY t2e on t2e.FID = t2.FID
INNER JOIN T_STK_INSTOCKENTRY_F t2e_f on t2e.FID = t2e_f.FID AND t2e.FENTRYID = t2e_f.FENTRYID
AND (t2e.FMATERIALID = t0e_lk.FMATERIALID AND t2e.FID = t0e_lk.FSBILLID AND t2e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_INSTOCKENTRY')
) t2
OUTER APPLY (
SELECT t3.FBILLNO
,t3e.F_GAT_DECIMAL AS FPRICE
-- ,(CASE LTRIM(RTRIM(t3e.FReferPrice)) WHEN '' THEN 0 ELSE CONVERT(decimal(23,6) ,t3e.FReferPrice) END) AS FPRICE
FROM T_STK_STKTRANSFERIN t3 --分步式调入
INNER JOIN T_STK_STKTRANSFERINENTRY t3e on t3.FID = t3e.FID
AND (t3e.FMATERIALID = t0e_lk.FMATERIALID AND t3e.FID = t0e_lk.FSBILLID AND t3e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_STKTRANSFERINENTRY1')
) t3
INNER JOIN T_BD_MATERIAL t4 on t4.FMATERIALID = t0e_lk.FMATERIALID
INNER JOIN T_BD_MATERIALINVPTY t4i on t0e_lk.FMATERIALID = t4i.FMATERIALID AND t4i.FINVPTYID = 10001 --AND t4i.FISENABLE = 1
WHERE 1 = 1
/***********************************取上游单据end********************************************/
/***********************************存货收发结存start***************************************************/
SELECT t0.FDATE
--,t0.FBILLNO,t0.FID,t0.FENTRYID
,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST,t0.FISENABLE
,t0.inRow
,ISNULL((CASE t0.newReferPrice WHEN 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN t2.FDATE ELSE t3.FDATE END)
ELSE t0.newExplain
END),'') AS 'newExplain'
,ISNULL((CASE t0.newReferPrice WHEN 0 THEN
(CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN t2.PRICE
ELSE (CASE WHEN t3.FQTY <> 0 THEN ROUND(t3.FAMOUNT/t3.FQTY,6) ELSE 0 END)
END)
ELSE t0.newReferPrice
END),0) AS 'newReferPrice'
INTO #TMP_结存单价_END_LIST
FROM #TMP_HAS_PARENT_MIS t0
OUTER APPLY(
SELECT TOP 1 tt1.FDATE
,(CASE WHEN tt1.FQTY <> 0 THEN ROUND(tt1.FAMOUNT/tt1.FQTY,6) ELSE 0 END) AS PRICE
FROM V_MATERIAL_INIVSTOCKDIMENSION tt1
WHERE 1 = 1
AND t0.FMASTERID = tt1.FMASTERID
AND t0.FSTOCKID = tt1.FSTOCKID
AND tt1.DateNum <= t0.DateNum
AND (t0.FISENABLE = 1 AND t0.FISAFFECTCOST = 1)
AND t0.newReferPrice = 0
AND tt1.FQTY > 0
ORDER BY tt1.FYEAR DESC,tt1.FPERIOD DESC
) t2
OUTER APPLY (
SELECT TOP 1 tt2.FYEAR,tt2.FPERIOD
,CONVERT(nvarchar(10),FYEAR) + '.' + CONVERT(nvarchar(10),FPERIOD) AS FDATE
,SUM(tt2.FAMOUNT) AS FAMOUNT,SUM(tt2.FQTY) AS FQTY
FROM V_MATERIAL_INIVSTOCKDIMENSION tt2
WHERE 1 = 1
AND t0.FMASTERID = tt2.FMASTERID
AND tt2.DateNum <= t0.DateNum
AND (t0.FISENABLE = 0 OR t0.FISAFFECTCOST = 0)
AND t0.newReferPrice = 0
GROUP BY tt2.FYEAR,tt2.FPERIOD
HAVING SUM(tt2.FQTY) > 0
ORDER BY tt2.FYEAR DESC,tt2.FPERIOD DESC
) t3
/*****************************************存货收发结存end***********************************************/
/*****************************************合同单价、采购入库单start**********************************************/
SELECT t0.FDATE
--,t0.FBILLNO,t0.FID,t0.FENTRYID
,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST
,t0.inRow
,ISNULL((CASE WHEN t0.newReferPrice = 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN t1.FPRICE ELSE t2.FPRICE END)
ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN t2.FPRICE ELSE t1.FPRICE END)
END)
ELSE t0.newReferPrice
END),0) AS 'newReferPrice'
,ISNULL((CASE WHEN t0.newReferPrice = 0
THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1
THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN '取采购入库单单价,单据:'+t1.FBILLNO ELSE '取合同价,合同号为:'+t2.FBILLNO END)
ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN '取合同价,合同号为:'+t2.FBILLNO ELSE '取采购入库单单价,单据:'+t1.FBILLNO END)
END)
ELSE t0.newExplain
END),'没有找到价格') AS 'newExplain'
FROM #TMP_结存单价_END_LIST t0
OUTER APPLY (
SELECT TOP 1 tt0.FBILLNO,tt0e.FMATERIALID,tt0e.FSTOCKID
,tt0e_f.FPRICE,tt0e_f.FCOSTPRICE
FROM T_STK_INSTOCK tt0 --采购入库
INNER JOIN T_STK_INSTOCKENTRY tt0e on tt0.FID = tt0e.FID
INNER JOIN T_STK_INSTOCKENTRY_F tt0e_f on tt0e.FENTRYID = tt0e_f.FENTRYID
WHERE
tt0.FDOCUMENTSTATUS = 'C'
AND tt0.FCANCELSTATUS = 'A'
AND tt0.FSTOCKORGID = 101542
AND (tt0e_f.FPRICE != 0 OR tt0e_f.FCOSTPRICE <> 0)
AND t0.FMATERIALID = tt0e.FMATERIALID AND tt0e.FSTOCKID = t0.FSTOCKID
AND DATEDIFF(DAY,tt0.FDATE, t0.FDATE) > -1
ORDER BY tt0.FDATE DESC
) t1
LEFT JOIN (
SELECT
tt0e.F_QNV_BASE1 AS FMATERIALID
--,tt0e.F_QNV_DECIMAL3 AS FPRICE--综合单价
--,tt0e.F_QNV_DECIMAL1 AS FPRICE--含税单价
,tt0e.F_QNV_PRICE AS FPRICE--不含税单价
,tt0.F_QNV_TEXT2 AS FBILLNO
,tt1.FMASTERID
,ROW_NUMBER() OVER (PARTITION BY tt1.FMASTERID ORDER BY F_QNV_DATE2 DESC, tt1.FUSEORGID DESC) 'RN'
FROM QNV_t_Cust_Entry100003 tt0 --供应商年度合同
INNER JOIN QNV_t_Cust_Entry100004 tt0e on tt0.FID = tt0e.FID
INNER JOIN T_BD_MATERIAL tt1 on tt1.FMATERIALID = tt0e.F_QNV_BASE1
WHERE 1 = 1
AND tt0.FDOCUMENTSTATUS = 'C'
AND tt0e.F_QNV_PRICE != 0
) t2 on t0.FMASTERID = t2.FMASTERID AND t2.RN = 1
/*****************************************合同单价、采购入库单end**********************************************/
DROP TABLE #TMP_DATA
DROP TABLE #TMP_HAS_PARENT_MIS
DROP TABLE #TMP_结存单价_END_LIST
";
var res = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL);
if (res != null || res.Count > 0)
{
foreach (var item in res)
{
var rowIndex = item["inRow"].Long2Int();
var referPriceVal = item["newReferPrice"].ToDecimal();
var newExplain = item["newExplain"];
entrys[rowIndex]["FReferPrice"] = referPriceVal;
entrys[rowIndex]["FExplain"] = newExplain;
var fqty = entrys[rowIndex]["Qty"].ToDecimal();
entrys[rowIndex]["FReferAmount"] = referPriceVal * fqty;
var materialId = item["FMATERIALID"].ToString();
var dateVal = item["FDATE"].ToString();
var stockId = item["FSTOCKID"].Long2Int();
entrys[rowIndex]["FInstockPrice"] = GetInstockPrice(rowIndex, dateVal, materialId, stockId);
}
}
}
/// <summary>
/// 采购入库单价
/// </summary>
/// <param name="rowIndex"></param>
/// <param name="dateVal"></param>
/// <param name="materialId"></param>
/// <param name="stockId"></param>
/// <returns></returns>
private decimal GetInstockPrice(int rowIndex, string dateVal, string materialId, int stockId)
{
var sqlL = $@"/*dialect*/
SELECT top 1
A.FBILLNO, CASE WHEN FPrice = 0 THEN round( C.FCostPrice ,2) else round( C.FPrice ,2) end as 'FPrice'
FROM T_STK_INSTOCK A
INNER JOIN T_STK_INSTOCKENTRY B ON A.FID = B.FID
INNER JOIN T_STK_INSTOCKENTRY_F C ON C.FENTRYID = B.FENTRYID
WHERE
A.FDOCUMENTSTATUS = 'C'
AND A.FCANCELSTATUS = 'A'
AND A.FSTOCKORGID = 101542
AND B.FMATERIALID = {materialId}
AND B.FSTOCKID = {stockId}
AND CONVERT(nvarchar(10),FDATE,23) <= '{dateVal}'
AND CONVERT(nvarchar(10),FAPPROVEDATE,23) <= '{dateVal}'
AND (c.FPrice <> 0 or c.FCostPrice <> 0)
ORDER BY FDATE DESC, FAPPROVEDATE DESC
";
var InstockPrice = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL);
var _instockPriceVal = 0M;
if (InstockPrice != null && InstockPrice.Count > 0)
_instockPriceVal = InstockPrice[0]["FPrice"].ToDecimal();
return _instockPriceVal;
}
private bool DoQueryBeforeCheck(long materialId, long stockId, string dateVal)
{
var flag = materialId == 0 || stockId == 0 || dateVal == "";
return !flag;
}
}
}

View File

@@ -71,6 +71,7 @@
<Compile Include="SAL_OUTSTOCK\Utils\HttpWebHelper.cs" />
<Compile Include="SAL_OUTSTOCK\Utils\SHA256Helper.cs" />
<Compile Include="STK_MisDelivery\BillEventPlugInEx.cs" />
<Compile Include="STK_TRANSFERIN\BillConvertEventPlugInEx.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="SAL_OUTSTOCK\SQLServer\销售出库单子表信息.sql" />