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("数据不存在,请检查"); } } } }