using GZ.LJY000.Biori.PushService.UHIK_BAR_BarCodeScan;
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Const;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GZ.LJY000.Biori.UHIK_BAR_BarCodeScan.PushService
{
public class PushServicel : IBarCodeScanPushService
{
private Context Context { get; set; }
public PushServicel(Context context)
{
this.Context = context;
}
///
///
///
///
///
///
///
private DynamicObject GetConvertRuleId(string sourceFormId, string targetFormId)
{
//获取启用中的规则,按照是否默认,创建日期进行排序
var crSqlL = $@"/*dialect*/
SELECT TOP 1 FID
,FKERNELXML.query('//ConvertRule/Policies/DefaultConvertPolicy/SourceEntryKey').value('(SourceEntryKey)[1]','varchar(max)') as 'SourceEntryKey'
,FKERNELXML.query('//ConvertRule/Policies/DefaultConvertPolicy/TargetEntryKey').value('(TargetEntryKey)[1]','varchar(max)') as 'TargetEntryKey'
FROM T_META_CONVERTRULE t0
WHERE 1 = 1
AND t0.FSOURCEFORMID = '{sourceFormId}'
AND t0.FTARGETFORMID = '{targetFormId}'
AND t0.FSTATUS = 1
AND t0.FDEVTYPE = 0
ORDER BY t0.FISDEFAULT DESC,t0.FMODIFYDATE DESC
";
var resData = DBUtils.ExecuteDynamicObject(this.Context, crSqlL);
if (!(resData != null && resData.Count > 0))
throw new Exception($"需要转换源单据({sourceFormId})的目标单({targetFormId})据不存在转换规则!");
//转换规则
return resData.FirstOrDefault();
}
public void DoPush(PushServiceExplainArgs explainArgs, out long billId)
{
string sourceFormId = explainArgs.sourceFormId;
string targetFormId = explainArgs.targetFormId;
IConvertService service = ServiceHelper.GetService();
billId = 0;
var resData = GetConvertRuleId(sourceFormId, targetFormId);
var convertRuleId = resData["FID"].ToString(); ;
var ruleMeta = service.GetConvertRule(this.Context, convertRuleId);
if (ruleMeta == null)
throw new Exception($"需要转换源单据({sourceFormId})的目标单({targetFormId})据不存在转换规则!");
//获取元数据服务
IMetaDataService metadataService = ServiceHelper.GetService();
//获取ViewService
IViewService viewService = ServiceHelper.GetService();
//获取源单元数据
FormMetadata sourceMetada = metadataService.Load(this.Context, sourceFormId) as FormMetadata;
#region 获取数量转换字段
var sqlL = $@"/*dialect*/
IF EXISTS (SELECT 1 WHERE OBJECT_ID('tempdb..#查询结果') IS NOT NULL)
BEGIN
DROP TABLE [dbo].[#查询结果]
END
DECLARE @FromId varchar(100),@TargetFromId varchar(100)
SET @FromId = '{sourceFormId}'
SET @TargetFromId = '{targetFormId}'
CREATE TABLE #查询结果 (
FromId Nvarchar(100)
,FromName Nvarchar(100)
,HeadTableName Nvarchar(100)
,SourceEntryKey Nvarchar(100)
,TargetEntryKey Nvarchar(100)
,FFIELDKEY Nvarchar(100)
,TargetFromId Nvarchar(100)
,QtyFieldName Nvarchar(100)
,FKERNELXML xml
)
INSERT INTO #查询结果
SELECT t0.FID,t0_l.FNAME
,t0.FKERNELXML.query('//HeadEntity/TableName').value('(TableName)[1]','varchar(max)') as '单据头表名'
,REPLACE(t1e.FFIELDKEY,'FSeq','') AS 'SourceEntryKey'
,REPLACE(t2e.FFIELDKEY,'FSeq','') AS 'TargetEntryKey'
,t3e.FFIELDKEY
,@TargetFromId
,''
,t0.FKERNELXML
FROM T_META_OBJECTTYPE t0
INNER JOIN T_META_OBJECTTYPE_L t0_l on t0.FID = t0_l.FID AND t0_l.FLOCALEID = 2052
INNER JOIN T_BD_BARCODEITEMENTRY t1e on t1e.FBILLFORMID = t0.FID
INNER JOIN T_BD_BARCODEITEM t1 on t1.FID = t1e.FID AND t1.FBARCODEFIELDKEY = 'FBILLSEQ'
INNER JOIN T_BD_BARCODEITEMENTRY t2e on t2e.FID = t1.FID AND t2e.FBILLFORMID = @TargetFromId
INNER JOIN T_BD_BARCODEITEMENTRY t3e on t3e.FBILLFORMID = t2e.FBILLFORMID
INNER JOIN T_BD_BARCODEITEM t3 on t3.FID = t3e.FID AND t3.FBARCODEFIELDKEY = 'FQTY'
WHERE 1=1
AND t0.FID = @FromId
AND FISTEMPLATE = 0
AND FDEVTYPE != 2
AND FMODELTYPEID = 100
DECLARE @QtyFieldkey varchar(100)
SELECT @QtyFieldkey = FFIELDKEY
FROM #查询结果
EXEC (N'
UPDATE t2 SET t2.QtyFieldName = t0.FKERNELXML.query(''//QtyField[Key=""'+ @QtyFieldkey + '""]/PropertyName'').value(''(PropertyName)[1]'',''varchar(max)'')
FROM T_META_OBJECTTYPE t0
INNER JOIN T_BD_BARCODEITEMENTRY t1e on t1e.FBILLFORMID = t0.FID
INNER JOIN T_BD_BARCODEITEM t1 on t1.FID = t1e.FID AND t1.FBARCODEFIELDKEY = ''FQTY''
INNER JOIN #查询结果 t2 on t2.TargetFromId = t0.FID
WHERE 1 = 1
AND t0.FISTEMPLATE = 0
AND t0.FDEVTYPE != 2
AND t0.FMODELTYPEID = 100
')
SELECT* FROM #查询结果
";
var entryResData = DBUtils.ExecuteDynamicObject(this.Context, sqlL);
var entryRes = entryResData[0];
#endregion
#region 获取单据的entryId
//var scanEntity = this.View.Model.BillBusinessInfo.GetEntryEntity("FScanDetailEntity");
//var scanRows = this.View.Model.GetEntityDataObject(scanEntity);
var scanRows = explainArgs.scanRows;
var unionTableList = scanRows.Select(row => $" SELECT '{row["BillCode"]}' BillNo,{row["BillSeq"].Long2Int()} FSEQ,{row["Qty"]} Qty , {row["StockerId_Id"]} StockerId ").ToList();
var sql = $@"
SELECT *
INTO #seqSet
FROM (
{string.Join(" UNION ALL ", unionTableList)}
)tt
SELECT t0.FBILLNO,'' ID
,t0e.FENTRYID ENTRYID,t0e.FSEQ
,ss.Qty
FROM {entryRes["HeadTableName"].ToString()} t0
INNER JOIN {entryRes["HeadTableName"].ToString() + "Entry"} t0e on t0.FID = t0e.FID
INNER JOIN #seqSet ss on ss.BillNo = t0.FBILLNO AND ss.FSEQ = t0e.FSEQ
WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C'
";
var dbList = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{sql}");
#endregion
//目标单据类型
//var createdBillType = this.View.Model.GetValue("FCreatedBillType") as DynamicObject;
//var createdBillTypeId = createdBillType["Id"].ToString();
if (dbList != null && dbList.Count() > 0)
{
List selectedRows = dbList.Select(x => new ListSelectedRow(x["ID"].ToString(), x["ENTRYID"].ToString(), 0, sourceFormId) { EntryEntityKey = resData["SourceEntryKey"].ToString() }).ToList();
PushArgs pushArgs = new PushArgs(ruleMeta.Rule, selectedRows.ToArray());//下推入口参数
//目标单据类型
pushArgs.TargetBillTypeId = explainArgs.createdBillTypeId;
pushArgs.CustomParams = new Dictionary();
pushArgs.CustomParams.Add("ScanEntry", dbList);
OperateOption option = OperateOption.Create();//选项参数
//不按照整单下推
option.SetVariableValue(ConvertConst.SelectByBillId, false);
try
{
//源单数据转换目标数据
ConvertOperationResult convertResult = service.Push(this.Context, pushArgs, option);
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
FormMetadata destFormMetadata = metadataService.Load(this.Context, targetFormId) as FormMetadata;
string msg = string.Empty;
#region 自动保存
IOperationResult saveResult = null;
if (explainArgs.isAudit)
{
saveResult = ServiceHelper.GetService().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
}
else if (explainArgs.isSave)
{
saveResult = ServiceHelper.GetService().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
}
else
{
saveResult = ServiceHelper.GetService().Draft(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
}
if (!saveResult.IsSuccess)
{
if (saveResult.ValidationErrors != null && saveResult.ValidationErrors.Count > 0)
{
var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message));
throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + errorInfo);
}
throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + JsonUtil.SerializeWithOutNull(saveResult));
}
#endregion
object[] pkArray = (from p in destObjs select p[0]).ToArray();
billId = pkArray[0].Long2Int();
}
catch (Exception ex)
{
throw ex;
}
}
else
{
throw new Exception("数据不存在,请检查");
}
}
}
}