[已解决]移动单据上传附件前,先删除原来的附件。数据异常
金蝶云社区-Flong
Flong
0人赞赏了该文章 1,640次浏览 未经作者许可,禁止转载编辑于2017年03月22日 14:42:22

开发了移动单据,上传附件,附件保存到数据库中。 因为存在修改单据时,重新上传附件的情况。 所以,我在上传附件时,先清空该单据ID对应的附件,然后保存当前的附件。
但使用过程中,部分用户反馈首次上传时,选择了附件,但Cloud单据中没有看到附件。是不是执行删除附件时,把本次上传的附件也清空了? 但是我代码上,删除是在保存之前的。 麻烦各位看一下是怎么回事?

[code]

public override void AfterMobileUpload(MobileUploadEventArgs e)
{
string id = this.View.Model.DataObject["FId"].ToString().Trim();

if (string.IsNullOrEmpty(id))
return;
// 获取文件上传的临时目录
string tempDirPath = HttpContext.Current.Request.PhysicalApplicationPath + KeyConst.TEMPFILEPATH;
// 获取附件表的元数据类
var formMetadata = (FormMetadata)MetaDataServiceHelper.Load(this.Context, FormIdConst.BOS_Attachment);

List dynList = new List();
StringBuilder sb = new StringBuilder();
foreach (FiledUploadEntity file in e.FileNameArray)
{
// 检查文件是否上传成功
if (!file.IsSuccess)
{
continue;
}

// 检查文件是否存在
var fileName = System.IO.Path.Combine(tempDirPath, file.FileName);

if (!System.IO.File.Exists(fileName))
{
continue;
}
/**
* 此处几个关键属性解读:
* 1. AttachmentSize 系统统一按照KB单位进行显示,所以需要除以1024
* 2. EntryKey 单据体的标识,这里我们只演示单据头,考虑到各位数据库都不同,不能保持为null,至少应输入空格
* 3. EntryInterID 关联的单据体ID,这里我们只演示单据头,所以固定设置为-1
* 4. BillType 关联的模型的FormId
* 5. BillNo 关联的单据编号,用于确定此附件是属于哪张单据
* 6. BillStatus 关联的单据状态
* 7. InterID 关联的单据/基础资料ID,附件列表就是根据这个ID进行加载
* 8. FileStorage 文件存储类型,0为数据库;1为文件服务器;
*/

var dataBuff = System.IO.File.ReadAllBytes(fileName);
var dyn = new DynamicObject(formMetadata.BusinessInfo.GetDynamicObjectType());

// 数据库的方式是直接保存附件数据

dyn["Attachment"] = dataBuff;
dyn["FileStorage"] = '0';// 数据库,参照属性解读

// 上传文件服务器成功后才加入列表
dyn["AttachmentName"] = file.FileName;
dyn["AttachmentSize"] = Math.Round(dataBuff.Length / 1024.0, 2);
dyn["ExtName"] = System.IO.Path.GetExtension(file.FileName);
dyn["EntryKey"] = ' ';// 参照属性解读
dyn["EntryInterID"] = -1;// 参照属性解读

//// 而实际插件开发可以从移动单据中获取到这些数据
dyn["BillType"] = this.View.BillView.BusinessInfo.GetForm().Id;
dyn["BillNo"] = this.View.Model.DataObject["FNumber"];
dyn["FBillStatus"] = "A";// this.View.Model.DataObject["DocumentStatus"];
dyn["InterID"] = this.View.Model.DataObject["FId"];

dyn["CreateMen_Id"] = Convert.ToInt32(this.Context.UserId);
dyn["ModifyTime"] = dyn["CreateTime"] = TimeServiceHelper.GetSystemDateTime(this.Context);

dynList.Add(dyn);
}

//保存之前,先清空附件
DeleteFile(id);

if (dynList.Count > 0)
{
// 所有数据加载完成后再一次性保存全部
BusinessDataServiceHelper.Save(this.Context, dynList.ToArray());
}

base.AfterMobileUpload(e);
this.View.Refresh();
AccessoryData data = new AccessoryData()
{
FormId = SourceBillMetadata.BusinessInfo.GetForm().Id,
BillId = "Test",
Data = null
};
//清空附件内容
this.View.GetControl("F_PAEZ_FileUpdate").SetValue(data);
}


private void DeleteFile(string fInterID)
{
string sql = string.Format(@" delete from T_BAS_ATTACHMENT where FInterID={0}", fInterID);
int i = Kingdee.BOS.ServiceHelper.DBServiceHelper.Execute(this.Context, sql);

}

[/code]