Ejemplo n.º 1
0
        public unsafe void Prepare(IReadService readService,
                                   out OperationStartupData data)
        {
            // We must make sure we can terminate if too many streams.
            Block block = readService.Read(BlockType.NodeHeaderBlock, versionNode);

            fixed(byte *p = block.Data)
            {
                NodeVersionHeader *header = (NodeVersionHeader *)p;

                if (header->StreamCount + 1 > BlockHelper.MaxTypedStreamsInNode(readService.BlockSize))
                {
                    throw new InvalidOperationException("Number of typed stream in node is more that "
                                                        + BlockHelper.MaxTypedStreamsInNode(readService.BlockSize) + " which is the limit"
                                                        + " at block size " + readService.BlockSize.ToString());
                }
            }

            // We need one allocation if typed stream is single object, otherwise two.
            if ((options & StreamOptions.SingleObject) != 0)
            {
                data = new OperationStartupData(versionNode, 1);
            }
            else
            {
                data = new OperationStartupData(versionNode, 2);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Internal prepare
        /// </summary>
        /// <param name="readService"></param>
        /// <param name="data"></param>
        /// <param name="subOps"></param>
        unsafe void PrepareInternal(IReadService readService, List <DeleteChild> subOps)
        {
            // We inspect children.
            ulong childrenTS;
            Block block = readService.Read(BlockType.NodeHeaderBlock, commonAddress);

            fixed(byte *p = block.Data)
            {
                NodeCommonHeader *header = (NodeCommonHeader *)p;

                childrenTS = header->ChildrenBTree;
            }

            // We check children count.
            BPlusTree         tree    = new BPlusTree(childrenTS);
            List <ObjectInfo> objects = tree.ListAll(readService);

            // We update stage index/count.
            for (int j = 0; j < objects.Count; j++)
            {
                BlockStream childTagStream = BlockStream.FromBase(objects[j].Address, readService);
                ChildTag    childTag       = Common.DeserializeFromArray(childTagStream.Read(objects[j].Size)) as ChildTag;

                foreach (KeyValuePair <string, ulong> child in childTag.Children)
                {
                    DeleteChild subOp = new DeleteChild(child.Value, childrenTS, child.Key);
                    subOps.Add(subOp);
                }
            }

            subOps.Add(this);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Gets the index of the typed stream.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="block">The block.</param>
        /// <param name="service">The service.</param>
        /// <param name="typedStreamBlock">The typed stream block.</param>
        /// <returns></returns>
        public static unsafe uint GetTypedStreamIndex(string name, Block block,
                                                      IReadService service, out Block typedStreamBlock, out ulong address)
        {
            int nameHash = name.GetHashCode();

            fixed(byte *p = block.Data)
            {
                NodeVersionHeader *header = (NodeVersionHeader *)p;
                TSData *           data   = (TSData *)&header->TypedStreamData[0];


                for (uint i = 0; i < header->StreamCount; i++)
                {
                    if (nameHash == data[i].Hash)
                    {
                        // We check it if it is the correct one.
                        typedStreamBlock = service.Read(BlockType.TypedStreamHeader, data[i].Address);

                        if (IsTypedStreamWithType(typedStreamBlock, name))
                        {
                            address = data[i].Address;
                            return(i);
                        }
                    }
                }
            }

            // Noone found.
            typedStreamBlock = null;
            address          = 0;
            return(uint.MaxValue);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Reads this instance.
        /// </summary>
        /// <returns></returns>
        public unsafe byte[] Read(ulong size)
        {
            // We prepare variables.
            byte[] data = new byte[size];
            ulong  i    = 0;

            // Begin loop.
            for (ulong addr = blocks[0]; addr != 0;)
            {
                uint  seq;
                ulong next;

                // Read header first.
                Block headerBlock = service.Read(BlockType.BigObjectData, addr);
                fixed(byte *p = headerBlock.Data)
                {
                    BlockLinkHeader *header = (BlockLinkHeader *)p;

                    next = header->NextBlock;
                    seq  = header->Sequential;
                }

                // First block special.
                for (uint j = (uint)sizeof(BlockLinkHeader); j < headerBlock.Data.Length && i < size; i++, j++)
                {
                    data[i] = headerBlock.Data[j];
                }

                // All sequential blocks.
                for (uint k = 1; k < seq; k++)
                {
                    Block dataBlock = service.Read(BlockType.BigObjectData, addr + k);

                    for (uint z = 0; z < dataBlock.Data.Length && i < size; i++, z++)
                    {
                        data[i] = dataBlock.Data[z];
                    }
                }

                // Next iteration.
                addr = next;
            }

            return(data);
        }
        public void Prepare(IReadService readService, out OperationStartupData data)
        {
            // We must extract new default.
            if (newDefaultIndex == uint.MaxValue)
            {
                Block block = readService.Read(BlockType.NodeHeaderBlock, rootAddress);
                Block unused;
                newDefaultIndex = NodeVersionHelper.GetTypedStreamIndex(newDefault, block, readService, out unused);
            }

            data = new OperationStartupData(0, 0);
        }
Ejemplo n.º 6
0
        public void Prepare(IReadService readService, out OperationStartupData data)
        {
            // We must resolve which TS to delete.
            if (tsToDeleteIndex == uint.MaxValue)
            {
                Block block = readService.Read(BlockType.NodeHeaderBlock, nodeVersionAddress);
                Block unused;
                tsToDeleteIndex = NodeVersionHelper.GetTypedStreamIndex(tsToDelete, block, readService, out unused);
            }

            data = new OperationStartupData(0, 0);
        }
Ejemplo n.º 7
0
        public unsafe void Prepare(IReadService readService, out OperationStartupData data)
        {
            Block block = readService.Read(BlockType.NodeHeaderBlock, commonAddress);

            fixed(byte *p = block.Data)
            {
                NodeCommonHeader *header = (NodeCommonHeader *)p;

                version     = header->CurrentVersionNumber;
                versionTree = new BPlusTree(header->VersionsBTree);
            }

            // We estimate how must we need.
            uint allocations = 15; //< Approximate estimate.

            data = new OperationStartupData(commonAddress, allocations, true);
        }
        /// <summary>
        /// 更新库存交易单单身
        /// </summary>
        /// <param name="employeeNo">扫描人员</param>
        /// <param name="scanType">扫描类型1.有箱条码 2.无箱条码</param>
        /// <param name="reportDatetime">上传时间</param>
        /// <param name="pickingDepartmentNo">领料部门</param>
        /// <param name="recommendedOperations">建议执行作业</param>
        /// <param name="recommendedFunction">A.新增  S.过帐</param>
        /// <param name="scanDocNo">扫描单号</param>
        /// <param name="collScan">参数集合</param>
        /// <returns>新生成的单号DocNo</returns>
        public DependencyObjectCollection DoUpdateTransactionDoc(string employeeNo, string scanType, DateTime reportDatetime,
                                                                 string pickingDepartmentNo, string recommendedOperations, string recommendedFunction,
                                                                 string scanDocNo, DependencyObjectCollection collScan)
        {
            #region 参数检查
            if (Maths.IsEmpty(recommendedOperations))
            {
                throw new BusinessRuleException(InfoEncodeSrv.GetMessage("A111201", "recommended_operations"));//‘入参【recommended_operations】未传值’
            }
            if (Maths.IsEmpty(recommendedFunction))
            {
                throw new BusinessRuleException(InfoEncodeSrv.GetMessage("A111201", "recommended_function"));//‘入参【recommended_function】未传值’
            }

            #endregion

            #region 准备临时表的列映射与数据
            _collDocNos = CreateReturnCollection();
            List <string> lstDocNos = new List <string>();
            _lstQueryProperties = new List <QueryProperty>();
            //DataTable dtTempScan = null;//临时表Scan的DataTable结构
            DataTable dtTempScanDetail = null;                                             //临时表ScanDetail的DataTable结构
            List <BulkCopyColumnMapping> lstColumnMappingsScanDetail = null;               //临时表ScanDetail的映射列
            CreateTempTableMapping(ref dtTempScanDetail, ref lstColumnMappingsScanDetail); //创建临时表#Table_scan的列映射
            InsertTempTableData(dtTempScanDetail, collScan, lstDocNos);                    //插入DataTable数据
            #endregion

            using (var transService = GetService <ITransactionService>()) {
                using (var myConnectionSr = GetService <IConnectionService>()) {
                    InitParameters();//初始化全局变量

                    #region 7.1更新出入库单实体

                    //创建临时表Scan与ScanDetail
                    CreateTempTableScanDetail();
                    _querySrv.BulkCopy(dtTempScanDetail, _TEMP_SCAN_DETAIL.Name, lstColumnMappingsScanDetail.ToArray()); //批量插入数据到临时表ScanDetail

                    int    decimalPlace = 8;                                                                             //金额小数位数
                    int    carryMode    = 1;                                                                             //金额取位模式
                    object companyId    = Maths.GuidDefaultValue();
                    DependencyObjectCollection collPalnt = QueryPlant();
                    if (collPalnt.Count > 0)
                    {
                        companyId = collPalnt[0]["COMPANY_ID"];

                        //调用系统参数服务 获取 记账本位币
                        object currencyId = _sysParameterSrv.GetValue("FUNCTION_CURRENCY_ID", companyId);

                        //Call 货币单价金额取位服务
                        ICurrencyPrecisionService currencyPrecisionSrv = GetServiceForThisTypeKey <ICurrencyPrecisionService>();
                        object[] arrPrecision = currencyPrecisionSrv.GetPrecision(companyId, currencyId);
                        decimalPlace = arrPrecision[0].ToInt32();
                        carryMode    = arrPrecision[1].ToInt32();
                    }

                    UpdateTransactionDocD(decimalPlace, carryMode); //更新库存交易单单身
                    UpdateTransactionDoc();                         //更新库存交易单单头
                    DependencyObjectCollection collParaFil = QueryParaFil();
                    if (collParaFil.Count > 0 && collParaFil[0]["BC_LINE_MANAGEMENT"].ToBoolean())
                    {
                        DeleteBcLine(); //删除条码交易明细 BC_LINE
                        InsertBcLine(); //插入条码交易明细 BC_LINE
                    }

                    #endregion

                    //7.2审核

                    //保存单据
                    DependencyObjectCollection collTransactionDoc = QueryDoc(lstDocNos);
                    IReadService readSrv  = GetService <IReadService>("TRANSACTION_DOC");
                    object[]     entities = readSrv.Read(collTransactionDoc.Select(c => c["TRANSACTION_DOC_ID"]).ToArray());
                    if (entities != null && entities.Length > 0)
                    {
                        ISaveService saveSrv = GetService <ISaveService>("TRANSACTION_DOC");
                        saveSrv.Save(entities);
                    }

                    //保存时没有自动审核的,需要重新审核

                    entities = readSrv.Read(collTransactionDoc.Where(c => c["AUTO_APPROVE"].ToBoolean() == false).Select(c => c["TRANSACTION_DOC_ID"]).ToArray());
                    IConfirmService confirmService = GetService <IConfirmService>("TRANSACTION_DOC");
                    ILogOnService   logOnSrv       = GetService <ILogOnService>();
                    foreach (DependencyObject obj in entities)
                    {
                        ConfirmContext context = new ConfirmContext(obj.Oid, logOnSrv.CurrentUserId, reportDatetime.ToDate());
                        confirmService.Execute(context);
                    }
                }

                transService.Complete(); //事务提交
            }
            return(_collDocNos);
        }
Ejemplo n.º 9
0
 public void Execute(string pathToFolder, string sourceFileName, string resultFileName)
 {
     _lines = _readService.Read(pathToFolder + sourceFileName);
     _words = _splitService.Split(_lines);
     _writeService.Write(_words, pathToFolder, resultFileName);
 }
Ejemplo n.º 10
0
        /// <summary>
        /// 更新领退料单
        /// </summary>
        /// <param name="employeeNo">扫描人员</param>
        /// <param name="scanType">扫描类型 1.有箱条码 2.无箱条码</param>
        /// <param name="reportDatetime">上传时间</param>
        /// <param name="pickingDepartmentNo">领料部门</param>
        /// <param name="recommendedOperations">建议执行作业</param>
        /// <param name="recommendedFunction">A.新增  S.过帐</param>
        /// <param name="scanDocNo">扫描单号</param>
        /// <param name="collection">接口传入的领料单单身数据集合</param>
        public DependencyObjectCollection UpdateIssueReceipt(string employeeNo, string scanType, DateTime reportDatetime, string pickingDepartmentNo
                                                             , string recommendedOperations, string recommendedFunction, string scanDocNo, DependencyObjectCollection collection)
        {
            DependencyObjectCollection rtnColl = CreateReturnCollection();

            #region 参数检查
            if (Maths.IsEmpty(recommendedOperations))
            {
                throw new BusinessRuleException(EncodeSrv.GetMessage("A111201", new object[] { "recommended_operations" }));
            }
            if (Maths.IsEmpty(recommendedFunction))
            {
                throw new BusinessRuleException(EncodeSrv.GetMessage("A111201", new object[] { "recommended_function" }));
            }
            #endregion

            //创建临时表需要的DataTable和Mapping信息
            DataTable issueReceiptD = null;
            List <BulkCopyColumnMapping> issueReceiptDMap = null;
            this.CreateRelateTable(ref issueReceiptD,
                                   ref issueReceiptDMap);
            List <string> docNos = new List <string>();  //记录单身的单号,保存时需要,可以避免后续再查

            //组织数据BulkCopy需要的DataTable数据
            InsertDataTable(issueReceiptD, collection, docNos);

            #region 更新逻辑
            using (ITransactionService trans = this.GetService <ITransactionService>()) {
                IQueryService querySrv = this.GetService <IQueryService>();

                //新增临时表
                IDataEntityType issueReceiptDTmp = CreateIssueReceiptDTmpTable(querySrv);

                //批量新增到临时表
                querySrv.BulkCopy(issueReceiptD, issueReceiptDTmp.Name, issueReceiptDMap.ToArray());
                if (issueReceiptD.Rows.Count <= 00 || issueReceiptD.Rows.Count <= 0)  //没有数据值不再往下执行
                {
                    return(rtnColl);
                }
                DataRow[] drs = issueReceiptD.Select("BARCODE_NO<>\'\'");

                //利用临时表批量更新相关数据
                //20170905 add by wangyq for P001-170717001  =================begin===================
                if (recommendedOperations == "7-5")
                {
                    UpdateBcCheckStatus(querySrv, issueReceiptDTmp);
                }
                else
                {
                    //20170905 add by wangyq for P001-170717001  =================end===================
                    UpdateIssueReceiptD(querySrv, issueReceiptDTmp);
                }//20170905 add by wangyq for P001-170717001
                if (drs.Length > 0)  //条码不为""的记录大于0时,才执行如下更新,避免多余的性能损失
                {
                    bool bcLintFlag = UtilsClass.IsBCLineManagement(querySrv);
                    if (bcLintFlag)
                    {
                        DeleteBCLine(querySrv, issueReceiptDTmp);  //先删除
                        InsertBCLine(querySrv, issueReceiptDTmp);  //再重新生成
                    }
                }

                //保存
                DependencyObjectCollection ids = GetIssueReceipt(docNos);
                IReadService readSrv           = this.GetService <IReadService>("ISSUE_RECEIPT");
                object[]     entities          = readSrv.Read(ids.Select(c => c["ISSUE_RECEIPT_ID"]).ToArray());
                if (entities != null && entities.Length > 0)
                {
                    ISaveService saveSrv = this.GetService <ISaveService>("ISSUE_RECEIPT");
                    saveSrv.Save(entities);
                }

                //保存时没有自动审核的,需要重新审核
                entities = readSrv.Read(ids.Where(c => !c["AUTO_APPROVE"].ToBoolean()).Select(c => c["ISSUE_RECEIPT_ID"]).ToArray());
                IConfirmService confirmService = this.GetService <IConfirmService>("ISSUE_RECEIPT");
                ILogOnService   logOnSrv       = this.GetService <ILogOnService>();
                foreach (DependencyObject obj in entities)
                {
                    ConfirmContext context = new ConfirmContext(obj.Oid, logOnSrv.CurrentUserId, reportDatetime.ToDate());
                    confirmService.Execute(context);
                }

                trans.Complete();
            }
            #endregion

            #region 组织返回结果

            foreach (string item in docNos)
            {
                DependencyObject obj = rtnColl.AddNew();
                obj["doc_no"] = item;
            }

            #endregion

            return(rtnColl);
        }
        public DependencyObjectCollection UpdateSalesIssue(string employeeNo, string scanType, DateTime reportDatetime, string pickingDepartmentNo
                                                           , string recommendedOperations, string recommendedFunction, string scanDocNo, DependencyObjectCollection collection)
        {
            DependencyObjectCollection rtnColl = CreateReturnCollection();

            #region 参数检查
            IInfoEncodeContainer encodeSrv = this.GetService <IInfoEncodeContainer>();
            if (Maths.IsEmpty(recommendedOperations))
            {
                throw new BusinessRuleException(encodeSrv.GetMessage("A111201", new object[] { "recommended_operations" }));
            }
            if (Maths.IsEmpty(recommendedFunction))
            {
                throw new BusinessRuleException(encodeSrv.GetMessage("A111201", new object[] { "recommended_function" }));
            }
            #endregion

            //创建临时表需要的DataTable和Mapping信息
            DataTable dtEntityD = new DataTable();
            List <BulkCopyColumnMapping> entityDMap = new List <BulkCopyColumnMapping>();
            CreateRelateTable(dtEntityD, entityDMap);
            List <string> docNos = new List <string>();  //记录单身的单号,保存时需要,可以避免后续再查

            //组织数据BulkCopy需要的DataTable数据
            InsertDataTable(dtEntityD, collection, docNos);
            if (dtEntityD.Rows.Count <= 0)
            {
                return(rtnColl);
            }

            #region 更新逻辑
            using (ITransactionService trans = this.GetService <ITransactionService>()) {
                using (IConnectionService connService = this.GetService <IConnectionService>()) {
                    IQueryService querySrv = this.GetService <IQueryService>();
                    //新增临时表
                    IDataEntityType dtTemp = CreateDTmpTable(querySrv);

                    //批量新增到临时表
                    querySrv.BulkCopy(dtEntityD, dtTemp.Name, entityDMap.ToArray());
                    //利用临时表批量更新相关数据
                    UpdateSalesIssueD(querySrv, dtTemp);

                    DataRow[] drs = dtEntityD.Select("BARCODE_NO<>\'\'");
                    if (drs.Length > 0)    //条码不为""的记录大于0时,才执行如下更新,避免多余的性能损失
                    {
                        ICreateService createService = this.GetService <ICreateService>("PARA_FIL");
                        if (createService != null)  //PARA_FIL实体存在,服务端可以这么判断
                        {
                            bool bcLintFlag = UtilsClass.IsBCLineManagement(querySrv);
                            if (bcLintFlag)
                            {
                                DeleteBCLine(querySrv, dtTemp);  //先删除
                                InsertBCLine(querySrv, dtTemp);  //再重新生成
                            }
                        }
                    }
                }

                //保存
                DependencyObjectCollection ids = GetSalesIssue(docNos);
                IReadService readSrv           = this.GetService <IReadService>("SALES_ISSUE");
                object[]     entities          = readSrv.Read(ids.Select(c => c["SALES_ISSUE_ID"]).ToArray());
                if (entities != null && entities.Length > 0)
                {
                    ISaveService saveSrv = this.GetService <ISaveService>("SALES_ISSUE");
                    saveSrv.Save(entities);
                }

                //保存时没有自动审核的,需要重新审核
                entities = readSrv.Read(ids.Where(c => !c["AUTO_APPROVE"].ToBoolean()).Select(c => c["SALES_ISSUE_ID"]).ToArray());
                IConfirmService confirmService = this.GetService <IConfirmService>("SALES_ISSUE");
                ILogOnService   logOnSrv       = this.GetService <ILogOnService>();
                foreach (DependencyObject obj in entities)
                {
                    ConfirmContext context = new ConfirmContext(obj.Oid, logOnSrv.CurrentUserId, reportDatetime.ToDate());
                    confirmService.Execute(context);
                }

                trans.Complete();
            }
            #endregion

            #region 组织返回结果

            foreach (string item in docNos)
            {
                DependencyObject obj = rtnColl.AddNew();
                obj["doc_no"] = item;
            }

            #endregion

            return(rtnColl);
        }
        private string InsertPoArrivalInspection(string receiptNo, DependencyObjectCollection receiptList, List <int> paiSequenceNumber, Dictionary <int, object> docIdDt)
        {
            //获取生成到货检验单基础数据
            DataTable poArrivalInspection = GetInsertPoArrivalInspection(receiptNo, paiSequenceNumber);
            //把查询数据以序号为Key,存入字典中。方便后期直接根据序号拿数据
            Dictionary <int, DataRow> poArrivalDictionary = new Dictionary <int, DataRow>();

            foreach (DataRow item in poArrivalInspection.Rows)
            {
                if (!poArrivalDictionary.ContainsKey(item["SequenceNumber"].ToInt32()))
                {
                    poArrivalDictionary.Add(item["SequenceNumber"].ToInt32(), item);
                }
            }
            //创建生成采购到货检验单缓存临时表
            DataTable poArrivalInspectionInfo = poArrivalInspection.Clone(); //复制表结构

            poArrivalInspectionInfo.TableName = "PO_ARRIVAL_INSPECTION";
            //创建生成采购到货检验单计数单身缓存临时表
            DataTable poArrivalInspectionDInfo = CreatePoArrivalInspectionDInfo();
            //创建生成采购到货检验单计量单身缓存临时表
            DataTable poArrivalInspectionD1Info = CreatePoArrivalInspectionD1Info();
            //创建计数品质检验不良原因缓存临时表
            DataTable defectiveReasonsAiId = CreateDefectiveReasonsAiIdInfo();

            IPrimaryKeyService             keyService              = GetService <IPrimaryKeyService>(TypeKey);                                                     //生成主键服务
            IDocumentNumberGenerateService docNumService           = GetService <IDocumentNumberGenerateService>("PO_ARRIVAL_INSPECTION");                         //自动编号服务
            ICreateInspectionService       createInspectionService = GetService <ICreateInspectionService>("PO_ARRIVAL_INSPECTION");                               //顺序检查服务
            IGenerateOrDeletePurchaseArivalQCResultService generatePurchaseArivalQc = GetService <IGenerateOrDeletePurchaseArivalQCResultService>("PO_QC_RESULT"); //生成/删除采购质检业务信息服务

            IItemQtyConversionService   itemQtyConversionService = GetService <IItemQtyConversionService>(TypeKey);
            ILogOnService               loginService             = GetService <ILogOnService>();
            List <DocmentInfo>          listDocuments            = new List <DocmentInfo>();
            Dictionary <string, string> salesReturnDocNo         = new Dictionary <string, string>(); //记录产生的单号用于批量生成的时候防止重复单号
            const decimal               defaultDecimal           = 0m;
            string resutQcNo = string.Empty;                                                          //返回结果单号

            //循环入参数据,分别给到货检验单、货检验单计数单身、货检验单计量单身身临时表插入数据
            foreach (DependencyObject receiptListItem in receiptList)
            {
                object poArrivalInspectionId = keyService.CreateId(); //主键
                if (poArrivalDictionary.ContainsKey(receiptListItem["seq"].ToInt32()))
                {
                    #region 到货检验单临时表插入数据
                    //获取生单基础数据
                    DataRow dr = poArrivalDictionary[receiptListItem["seq"].ToInt32()];

                    //获取单据性质
                    object docId = Maths.GuidDefaultValue();
                    if (docIdDt.ContainsKey(dr["SequenceNumber"].ToInt32()))
                    {
                        docId = docIdDt[dr["SequenceNumber"].ToInt32()];
                    }
                    if (dr["PURCHASE_TYPE"].ToStringExtension() == "1" || dr["PURCHASE_TYPE"].ToStringExtension() == "5")
                    {
                        dr["CATEGORY"] = "Q1";
                    }
                    else if (dr["PURCHASE_TYPE"].ToStringExtension() == "2" || dr["PURCHASE_TYPE"].ToStringExtension() == "3")
                    {
                        dr["CATEGORY"] = "Q2";
                    }

                    //计算列赋值
                    dr["PO_ARRIVAL_INSPECTION_ID"] = poArrivalInspectionId;                         //主键
                    dr["DOC_ID"]   = docId;                                                         //单据类型
                    dr["DOC_DATE"] = DateTime.Now.Date;                                             //单据日期

                    dr["DOC_NO"] = docNumService.NextNumber(dr["DOC_ID"], dr["DOC_DATE"].ToDate()); //单号
                    if (!salesReturnDocNo.ContainsKey(dr["DOC_NO"].ToString()))
                    {
                        salesReturnDocNo.Add(dr["DOC_NO"].ToString(), dr["DOC_NO"].ToString());
                    }
                    else
                    {
                        string oldDocNo = salesReturnDocNo[dr["DOC_NO"].ToString()]; //取得字典中存储的最大单号
                        string docNo    = NewDocNo(oldDocNo);                        //产生新单号
                        salesReturnDocNo[dr["DOC_NO"].ToString()] = docNo;           //更新字段中单号
                        dr["DOC_NO"] = docNo;                                        //当前笔单号重新赋值
                    }

                    object[] createInspection = createInspectionService.GetInspectionId(dr["ITEM_ID"],
                                                                                        dr["Owner_Org_ROid"],
                                                                                        dr["ITEM_FEATURE_ID"], dr["OPERATION_ID"]);
                    if (!Maths.IsEmpty(createInspection))
                    {
                        dr["INSPECTION_PLAN_ID"] = createInspection[0]; //质检方案ID
                        dr["INSPECTION_TIMES"]   = createInspection[1]; //最大抽样次数
                    }

                    dr["INSPECTION_QTY"]      = receiptListItem["receipt_qty"];                                                                                      //送检数量
                    dr["INSPECTION_DUE_DATE"] = Maths.AddTimeValue(dr["ARRIVAL_DATE"].ToDate(), 1,
                                                                   dr["INSPECT_DAYS"].ToInt32());                                                                    //检验期限
                    dr["INVENTORY_QTY"] = itemQtyConversionService.GetConvertedQty(dr["ITEM_ID"],
                                                                                   dr["INSPECTION_UNIT_ID"], dr["INSPECTION_QTY"].ToDecimal(), dr["STOCK_UNIT_ID"]); //库存单位数量
                    dr["SECOND_QTY"] = itemQtyConversionService.GetConvertedQty(dr["ITEM_ID"], dr["INSPECTION_UNIT_ID"],
                                                                                dr["INSPECTION_QTY"].ToDecimal(), dr["SECOND_UNIT_ID"]);                             //库存单位数量
                    dr["ACCEPTABLE_QTY"]  = receiptListItem["ok_qty"];                                                                                               //送检数量
                    dr["UNQUALIFIED_QTY"] = receiptListItem["unqualified_qty"];                                                                                      //不合格数量
                    dr["DESTROYED_QTY"]   = receiptListItem["checkdestroy_qty"];                                                                                     //破坏数量
                    //判定结果
                    if (receiptListItem["result_type"].ToStringExtension() == "Y")
                    {
                        dr["DECISION"] = "1";
                    }
                    else
                    {
                        dr["DECISION"] = "2";
                    }

                    //后道工序
                    if (!Maths.IsEmpty(dr["MO_ROUTING_D_ID"]))
                    {
                        DependencyObject moRouting = GetMoRouting(dr["MO_ROUTING_D_ID"]);
                        dr["TO_MO_ROUTING_D_ID"] = moRouting["MO_ROUTING_D_ID"];
                        dr["TO_OPERATION_ID"]    = moRouting["OPERATION_ID"];
                    }

                    dr["Owner_Emp"]  = GetEmployeeInfo(loginService.CurrentUserId);
                    dr["Owner_Dept"] = GetAdminUnitInfo(dr["Owner_Emp"]);
                    //系统管理字段
                    AddManagementData(dr, loginService);
                    poArrivalInspectionInfo.Rows.Add(dr.ItemArray);

                    #endregion

                    #region 到货检验单计数单身临时表插入数据

                    DependencyObjectCollection qcList = receiptListItem["qc_list"] as DependencyObjectCollection;
                    if (qcList == null)
                    {
                        continue;                 //不存在qc_list集合数据跳出循环
                    }
                    foreach (var qcListItem in qcList)
                    {
                        if (qcListItem["qc_seq"].ToInt32() == 0)
                        {
                            continue;                                     //序号为0的数据是默认数据只是为了json结构完整插入的,虚无插入E10系统
                        }
                        DataRow qcListDr = poArrivalInspectionDInfo.NewRow();
                        qcListDr["PO_ARRIVAL_INSPECTION_D_ID"] = keyService.CreateId(); //主键
                        qcListDr["ParentId"]           = poArrivalInspectionId;         //父主键
                        qcListDr["SEQUENCE"]           = qcListItem["qc_seq"];
                        qcListDr["DEFECT_CLASS"]       = qcListItem["defect_level"];
                        qcListDr["INSPECTION_QTY"]     = qcListItem["test_qty"];
                        qcListDr["INSPECTION_QQ"]      = qcListItem["return_qty"];
                        qcListDr["INSPECTION_ITEM_ID"] = GetInspectionItem(qcListItem["test_no"], dr["Owner_Org_ROid"]);
                        qcListDr["INSPECTION_AC"]      = qcListItem["acceptable_qty"];
                        qcListDr["INSPECTION_RE"]      = qcListItem["rejected_qty"];
                        if (receiptListItem["result_type"].ToStringExtension() == "Y")
                        {
                            qcListDr["DECISION"] = true;
                        }
                        else
                        {
                            qcListDr["DECISION"] = false;
                        }
                        qcListDr["IMPACT_RESULT"] = true;
                        qcListDr["REMARK"]        = string.Empty;

                        qcListDr["DEFECTIVE_REASONS_ID"] = Maths.GuidDefaultValue();
                        //系统管理字段
                        AddManagementData(qcListDr, loginService);


                        DependencyObjectCollection reasonlist = qcListItem["reason_list"] as DependencyObjectCollection;
                        if (reasonlist == null)
                        {
                            continue;
                        }
                        //defect_qty为0且reason_no为空的数据是默认数据只是为了json结构完整插入的,不需要插入E10系统
                        if (reasonlist.Count == 1 && (!Maths.IsEmpty(reasonlist[0]["reason_no"]) || reasonlist[0]["defect_qty"].ToInt32() != 0))
                        {
                            qcListDr["DEFECTIVE_REASONS_ID"] = GetDefectiveReasonsId(reasonlist[0]["reason_no"].ToStringExtension());
                        }
                        else
                        {
                            //defect_qty为0且reason_no为空的数据是默认数据只是为了json结构完整插入的,不需要插入E10系统
                            if (!Maths.IsEmpty(reasonlist[0]["reason_no"]) || reasonlist[0]["defect_qty"].ToInt32() != 0)
                            {
                                foreach (DependencyObject reasonlistItem in reasonlist)
                                {
                                    DataRow reasonlistDr = defectiveReasonsAiId.NewRow();
                                    reasonlistDr["DEFECTIVE_REASONS_AI_ID"] = keyService.CreateId();               //主键
                                    reasonlistDr["ParentId"]             = qcListDr["PO_ARRIVAL_INSPECTION_D_ID"]; //父主键
                                    reasonlistDr["DEFECTS"]              = reasonlistItem["defect_qty"];
                                    reasonlistDr["REMARK"]               = string.Empty;
                                    reasonlistDr["DEFECTIVE_REASONS_ID"] =
                                        GetDefectiveReasonsId(reasonlistItem["reason_no"].ToStringExtension());
                                    //系统管理字段
                                    AddManagementData(reasonlistDr, loginService);
                                    defectiveReasonsAiId.Rows.Add(reasonlistDr.ItemArray);

                                    //子单身第一笔时把不良原因主键赋值给单身不良原因
                                    if (reasonlist.IndexOf(reasonlistItem) == 0)
                                    {
                                        qcListDr["DEFECTIVE_REASONS_ID"] = reasonlistDr["DEFECTIVE_REASONS_ID"];
                                    }
                                }
                            }
                        }
                        //把对应数据添加至预生单缓存中
                        poArrivalInspectionDInfo.Rows.Add(qcListDr.ItemArray);
                    }

                    #endregion

                    #region 到货检验单计量单身临时表插入数据

                    DependencyObjectCollection collection =
                        createInspectionService.CreateInspection(dr["INSPECTION_PLAN_ID"], dr["OPERATION_ID"]);
                    foreach (DependencyObject item in collection)
                    {
                        if (item["INSPECTION_TYPE"].Equals("VI")) //collection.检验类型=‘VI’
                        {
                            DataRow itemDr = poArrivalInspectionD1Info.NewRow();
                            itemDr["PO_ARRIVAL_INSPECTION_D1_ID"] = keyService.CreateId();
                            itemDr["ParentId"] = poArrivalInspectionId;
                            itemDr["SEQUENCE"] = item["SEQUENCE"]; //检验顺序
                            DependencyObject inspectionPlantD = GetInspectionPlantD(dr["INSPECTION_PLAN_ID"],
                                                                                    item["INSPECTION_ITEM_ID"]);
                            itemDr["DEFECT_CLASS"]         = inspectionPlantD["DEFECT_CLASS"];
                            itemDr["INSPECTION_QTY"]       = defaultDecimal;
                            itemDr["INSPECTION_QQ"]        = defaultDecimal;
                            itemDr["DECISION"]             = false;
                            itemDr["IMPACT_RESULT"]        = inspectionPlantD["IMPACT_RESULT"];
                            itemDr["REMARK"]               = string.Empty;
                            itemDr["INSPECTION_ITEM_ID"]   = item["INSPECTION_ITEM_ID"]; //检验项目
                            itemDr["DEFECTIVE_REASONS_ID"] = Maths.GuidDefaultValue();
                            itemDr["ACCEPTANCE_CONSTANT"]  = defaultDecimal;
                            itemDr["SS"] = defaultDecimal;
                            itemDr["XX"] = defaultDecimal;
                            //系统管理字段
                            AddManagementData(itemDr, loginService);
                            poArrivalInspectionD1Info.Rows.Add(itemDr.ItemArray);
                        }
                    }

                    #endregion

                    //记录单据信息
                    DocmentInfo docmentInfo = new DocmentInfo();
                    docmentInfo.Id         = dr["PO_ARRIVAL_INSPECTION_ID"];
                    docmentInfo.OwnerOrgId = dr["Owner_Org_ROid"];
                    docmentInfo.DocId      = dr["DOC_ID"];
                    docmentInfo.DocNo      = dr["DOC_NO"].ToStringExtension();
                    listDocuments.Add(docmentInfo);

                    if (Maths.IsEmpty(resutQcNo))
                    {
                        resutQcNo = dr["DOC_NO"].ToStringExtension();
                    }
                    else
                    {
                        resutQcNo += "," + dr["DOC_NO"].ToStringExtension();
                    }
                }
            }
            #region 将数据统一插入数据库中

            using (ITransactionService trans = GetService <ITransactionService>()) {
                IQueryService querySrv = GetService <IQueryService>();
                //生成采购到货检验单
                if (poArrivalInspectionInfo.Rows.Count > 0)
                {
                    poArrivalInspectionInfo.Columns.Remove("SequenceNumber");
                    poArrivalInspectionInfo.Columns.Remove("ARRIVAL_DATE");
                    poArrivalInspectionInfo.Columns.Remove("INSPECT_DAYS");
                    poArrivalInspectionInfo.Columns.Remove("STOCK_UNIT_ID");
                    poArrivalInspectionInfo.Columns.Remove("SECOND_UNIT_ID");
                    poArrivalInspectionInfo.Columns.Remove("PURCHASE_TYPE");
                    BulkCopyAll(poArrivalInspectionInfo, querySrv);
                }
                //生成采购到货检验单计数单身
                if (poArrivalInspectionDInfo.Rows.Count > 0)
                {
                    BulkCopyAll(poArrivalInspectionDInfo, querySrv);
                }
                //生成采购到货检验单计量单身
                if (poArrivalInspectionD1Info.Rows.Count > 0)
                {
                    BulkCopyAll(poArrivalInspectionD1Info, querySrv);
                }
                //生成计数品质检验不良原因
                if (defectiveReasonsAiId.Rows.Count > 0)
                {
                    BulkCopyAll(defectiveReasonsAiId, querySrv);
                }

                //EFNET签核
                var infos = listDocuments.GroupBy(c => new { DOC_ID = c.DocId, OwnerOrgID = c.OwnerOrgId });
                foreach (var item in infos)
                {
                    IEFNETStatusStatusService efnetSrv = GetService <IEFNETStatusStatusService>();
                    efnetSrv.GetFormFlow("PO_ARRIVAL_INSPECTION.I01", item.Key.DOC_ID, item.Key.OwnerOrgID,
                                         item.Select(c => c.Id).ToArray());
                }

                //保存单据
                IReadService readSrv  = GetService <IReadService>("PO_ARRIVAL_INSPECTION");
                object[]     entities = readSrv.Read(listDocuments.Select(c => c.Id).Distinct().ToArray());
                if (entities != null && entities.Length > 0)
                {
                    ISaveService saveSrv = GetService <ISaveService>("PO_ARRIVAL_INSPECTION");
                    saveSrv.Save(entities);
                }

                trans.Complete();
            }

            #endregion
            return(resutQcNo);
        }