更新带附件的列表项时发生冲突问题

时间:2018-03-30 06:42:33

标签: javascript sharepoint-2013

我创建了一个自定义表单,其中包含动态子表单。 例如:自定义表单由3个部分组成:

  1. 父母表格。
  2. 附件控制
  3. 带有添加/删除按钮的子表单,用于创建多个子表单。
  4. 这里我的脚本如何用于添加数据:父表单被提交并且它使用jsom返回项目ID。并且基于该项目ID,附件被添加到父表单,子表单数据被添加到另一个列表中。但有时,我在添加附件时遇到冲突问题,这里是代码:

    if (flag == true) {
            oLoader = SP.UI.ModalDialog.showWaitScreenWithNoClose("Working on it", "Creating a new Request...");
            var data = [];
            var fileArray = [];
            $("#attachFilesContainer input:file").each(function () {
                if ($(this)[0].files[0]) {
                    fileArray.push({ "Attachment": $(this)[0].files[0] });
                }
            });
            arraycount += fileArray.length;
    
            data.push({
                "Column_x0020_Name": $("#txtAccountNumber").val(),
                "Warehouse_x0020_Code": $("#wareHousedrpdown option:selected").text(),
                "Facility": $("#Facilitydrpdown option:selected").text(),
                "Internal_x002f_External": $("#InternalExteralDrpdown :selected").text(),
                "Requested_x0020_Completion_x0020": newReqDate,//$("#txtRequestedCompletionDate").datepicker('getDate').format('MM/dd/yyyy'),  //$("#txtRequestedCompletionDate").val(),
                "Account_x0020_Management_x0020_A": AccountName,
                "Quote_x0020_Required_x003f_": $("#drpQuoteRequired :selected").text(),
                "Files": fileArray
            });
    
            createItemWithAttachments("Parent", data).then(
               function () {
               
               			oLoader.close(); 
               			window.location.replace(_spPageContextInfo.webAbsoluteUrl + "/Lists/Parent/AllItems.aspx");
    
       
    	               //if (oLoader.close) setTimeout(function () { oLoader.close(); window.location.replace(_spPageContextInfo.webAbsoluteUrl + "/Lists/Test/AllItems.aspx"); }, 3000);
                   //alert('Item created with Multiple attachments');
               },
               
                     
               function (sender, args) {
                   console.log('Error occured' + args.get_message());
               }
               
           )
           		//oLoader.close(); 
               //window.location.replace(_spPageContextInfo.webAbsoluteUrl + "/Lists/Parent/AllItems.aspx");
    
    
    
    
        }
        
        function createSubformItem(listName,i) {
        var listItem = {
              __metadata: { "type": "SP.Data.SubFormListItem" },
              			"ParentID": id,
    					"Start_x0020_SKU":$("input[id='txtStartSKU" + i + "']").val(),
    					"Qty_x0020_Requested":$("input[id='txtQtyRequested" + i + "']").val(),
    					"UOM":$("#UOMdrpdown" + i + " option:selected").val(),
    					"SSRType":$("#SSRTypedrpdown" + i + " option:selected").val()!="null" ? { "__metadata": { "type": "Collection(Edm.String)" }, "results": $("#SSRTypedrpdown"+i+"").val() } : { "__metadata": { "type": "Collection(Edm.String)" }, "results": [""] },
    					"Hold_x0020_Type":$("#SSRHoldTypedrpdown" + i + " option:selected").val(),
    					"End_x0020_SKU":$("input[id='txtEndSKU" + i + "']").val(),
    					"Billing_x0020_UOM":$("#BillingUOMdrpdown" + i + " option:selected").val(),
    					"Price_x0020_per_x0020_UOM":$("input[id='txtPricePerUOM" + i + "']").val(),
    					"Instructions":$("textarea[title='Instructions" + i + "']").val(),
                                         	 
        };
        return $.ajax({
            url:"http://devapp/app/_api/web/lists/getbytitle('SubForm')/items",
            type: "POST",
            contentType: "application/json;odata=verbose",
            data: JSON.stringify(listItem),
            headers: {
                "Accept": "application/json;odata=verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").val()
            }
        });
    }
    
    var createItemWithAttachments = function (listName, listValues) {
        var fileCountCheck = 0;
        var fileNames;
        var context = new SP.ClientContext.get_current();
        var dfd = $.Deferred();
        var targetList = context.get_web().get_lists().getByTitle(listName);
        context.load(targetList);
        var singleUser = listValues[0].Account_x0020_Management_x0020_A != "" ? SP.FieldUserValue.fromUser(listValues[0].Account_x0020_Management_x0020_A) : null;
        var itemCreateInfo = new SP.ListItemCreationInformation();
        var listItem = targetList.addItem(itemCreateInfo);
        listItem.set_item("Account_x0020_Number", listValues[0].Account_x0020_Number);
        listItem.set_item("Warehouse_x0020_Code", listValues[0].Warehouse_x0020_Code);
        listItem.set_item("Facility", listValues[0].Facility);
        listItem.set_item("Internal_x002f_External", listValues[0].Internal_x002f_External);
        listItem.set_item("Requested_x0020_Completion_x0020", listValues[0].Requested_x0020_Completion_x0020);
        listItem.set_item("Account_x0020_Management_x0020_A", singleUser);
        listItem.set_item("Quote_x0020_Required_x003f_", listValues[0].Quote_x0020_Required_x003f_);
    
        listItem.update();
        for (i = 0; i <= count; i++) 
        			{
    
               			createSubformItem("SubForm",i);
               		
               		}
    
        context.executeQueryAsync(
            function () {
                id = listItem.get_id();
                if (listValues[0].Files.length != 0) {
                    if (fileCountCheck <= listValues[0].Files.length - 1) {
                        loopFileUpload(listName, id, listValues, fileCountCheck).then(
                            function () {
                            },
                            function (sender, args) {
                                console.log("Error uploading");
                                dfd.reject(sender, args);
                            }
                        );
                    }
                }
                else {
                    dfd.resolve(fileCountCheck);
                }
            },
            function (sender, args) {
                console.log('Error occured' + args.get_message());
            }
        );
        return dfd.promise();
    }
    
    /*End of */
    
    
    function loopFileUpload(listName, id, listValues, fileCountCheck) {
        var dfd = $.Deferred();
        uploadFile(listName, id, listValues[0].Files[fileCountCheck].Attachment).then(
            function (data) {
                var objcontext = new SP.ClientContext();
                var targetList = objcontext.get_web().get_lists().getByTitle(listName);
                var listItem = targetList.getItemById(id);
                objcontext.load(listItem);
                objcontext.executeQueryAsync(function () {
                    console.log("Reload List Item- Success");
                    fileCountCheck++;
                    if (fileCountCheck <= listValues[0].Files.length - 1) {
                        loopFileUpload(listName, id, listValues, fileCountCheck);
                    } else {
                        console.log(fileCountCheck + ": Files uploaded");
                        attcount += fileCountCheck;
                        if (arraycount == attcount) {
    	                 for (i = 0; i <= count; i++) 
    	    			{
    	           			createSubformItem("SubForm",i);
    	           		
    	           		}
               			oLoader.close(); 
               			window.location.replace(_spPageContextInfo.webAbsoluteUrl + "/Lists/ParentList/AllItems.aspx");
                            
                        }
                        
                    }
                },
                function (sender, args) {
                    console.log("Reload List Item- Fail" + args.get_message());
                });
    
            },
            function (sender, args) {
                console.log("Not uploaded");
                dfd.reject(sender, args);
            }
       );
        return dfd.promise();
    }
    function uploadFile(listName, id, file) {
        var deferred = $.Deferred();
        var fileName = file.name;
        getFileBuffer(file).then(
            function (buffer) {
                var bytes = new Uint8Array(buffer);
                var binary = '';
                for (var b = 0; b < bytes.length; b++) {
                    binary += String.fromCharCode(bytes[b]);
                }
                var scriptbase = _spPageContextInfo.webServerRelativeUrl + "/_layouts/15/";
                console.log(' File size:' + bytes.length);
                $.getScript(scriptbase + "SP.RequestExecutor.js", function () {
                    var createitem = new SP.RequestExecutor(_spPageContextInfo.webServerRelativeUrl);
                    createitem.executeAsync({
                        url: _spPageContextInfo.webServerRelativeUrl + "/_api/web/lists/GetByTitle('" + listName + "')/items(" + id + ")/AttachmentFiles/add(FileName='" + file.name + "')",
                        method: "POST",
                        binaryStringRequestBody: true,
                        body: binary,
                        success: fsucc,
                        error: ferr,
                        state: "Update"
                    });
                    function fsucc(data) {
                        console.log(data + ' uploaded successfully');
                        deferred.resolve(data);
                    }
                    function ferr(data) {
                        console.log(fileName + "not uploaded error");
                        deferred.reject(data);
                    }
                });
    
            },
            function (err) {
                deferred.reject(err);
            }
        );
        return deferred.promise();
    }
    function getFileBuffer(file) {
        var deferred = $.Deferred();
        var reader = new FileReader();
        reader.onload = function (e) {
            deferred.resolve(e.target.result);
        }
        reader.onerror = function (e) {
            deferred.reject(e.target.error);
        }
        reader.readAsArrayBuffer(file);
        return deferred.promise();
    }

1 个答案:

答案 0 :(得分:1)

问题是在SharePoint完成处理具有较大文件的项目之前上载另一个附件。因此,当您尝试对项目执行另一个操作(添加其他附件等)时,会达到争用条件,SharePoint会抛出错误。当附件文件较小时,该过程有足够的时间在您开始下一次上载之前完成。

您需要找到一种方法来检查项目是否已完成处理。这样做的一种方法可能是获取并检查项目的etag,并确保在发送另一个POST之前它已经增加了正确的次数。