金蝶云星空_k3cloud自定义WEBAPI-生产用料清单下推退料单
ERP与IMS系统集成,需要IMS将退料单传给ERP,传入的参数如下:
public class PRD_PickMtrlReturnInfo
{
/// <summary>
/// 访问令牌
/// </summary>
public string ACCESSTOKEN { get; set; }
/// <summary>
/// 单据编号
/// </summary>
public string FBILLNO { get; set; }
/// <summary>
/// 源单编号
/// </summary>
public string FSrcId { get; set; }
public List<PRD_PickMtrlEntry2> FDetailEntity { get; set; }
}
public class PRD_PickMtrlEntry2
{
/// <summary>
/// 明细内码
/// </summary>
public string FEntryId { get; set; }
/// <summary>
/// 源单明细内码
/// </summary>
public string FSrcEntryId { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string FMaterialId { get; set; }
/// <summary>
/// 实发数量(基本单位数量)
/// </summary>
public string FQty { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string FStockID { get; set; }
/// <summary>
/// 备注
/// </summary>
public string FEntrtyMemo { get; set; }
/// <summary>
/// 退料类型
/// </summary>
public string FReturnType { get; set; } //良品退料1 来料不良退料2 作业不良退料3
/// <summary>
/// 退料原因
/// </summary>
public string FReturnReason { get; set; }
/// <summary>
/// 不更新未领
/// </summary>
public string FISUPDATEQTY { get; set; }
/// <summary>
/// 用于同料号多行更新标记
/// </summary>
public bool IsUsed { get; set; } = false;
}
这里引用的ACCESSTOKEN 是金蝶实施时开发自定义开发的接口,这里不做说明。
建立一个返回类:用于传送返回处理结果给调用端
/// <summary>
/// 调用金蝶金蝶接口共通返回参数实体
/// </summary>
public class CommonReturnEntity
{
//0:成功(重复数据);2:TOKEN失效;500:内部服务器错误;1006:业务数据错误
public string Code { get; set; }
public string IMSsage { get; set; }
public Data Datas { get; set; }
public string AccessToken { get; set; }
public string Data { get; set; }
}
public class Data
{
public string FBillNo { get; set; } //单据编号
}
云星空下推生成下游单据据默认单行分录只能生成一行分录,退料时可能因为退料类型的不同,退料单需要两行同时关料用料清单的一行。这里就需要我们自定义复制行来完成。我的实现代码如下:
/// <summary>
///IMS生产退料入库集成至金蝶 生产用料清单下推生产退料单
/// </summary>
/// <param name="ctx"></param>
/// <param name="data"></param>
/// <returns></returns>
public CommonReturnEntity Push_PRD_ReturnMtrl(Context ctx, PRD_PickMtrlReturnInfo data)
{
CommonReturnEntity returnEntity = new CommonReturnEntity { Code = "0", IMSsage = "成功" };
string convertRuleKey = "PRD_PPBOM2RETURNMTRL"; //单据转换规则
string FormKey = "PRD_PPBOM"; //源单标识
string tableName = "T_PRD_PPBOM"; //源单表名
string tableNameEntry = "T_PRD_PPBOMENTRY"; //源单明细表名
string sourceBillTypeId = "(All)"; //源单单据类型
string entryEntityKey = "FEntity"; //源单明细标识
string targetFormId = "PRD_ReturnMtrl"; //目标单标识
string targetEntryOrm = "Entity"; //目标单明细ORM实体
string qty = "FAPPQty"; //目标单数量标识
string entrtyMemo = "FEntrtyMemo"; //目标单备注标识
//timelog login = new timelog();
//DateTime FStartTime = DateTime.Now;//开始时间
//login.FStartTime = Convert.ToString(FStartTime);
try
{
returnEntity = ConvertBillReturn(ctx, data, FormKey, tableName, tableNameEntry, entryEntityKey, sourceBillTypeId, targetFormId, convertRuleKey, targetEntryOrm, qty, entrtyMemo);
}
catch (Exception e)
{
returnEntity.Code = "1006";
returnEntity.IMSsage = e.Message;
}
finally
{
AddLoge(ctx, "生产用料清单下推生产退料单", "Push_PRD_ReturnMtrl", returnEntity.Code
, returnEntity.IMSsage, data.FBILLNO,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), JsonConvert.SerializeObject(data)
, JsonConvert.SerializeObject(returnEntity), ctx.UserName, "ims");
}
return returnEntity;
}
public CommonReturnEntity ConvertBillReturn(Context ctx, PRD_PickMtrlReturnInfo data, string FormKey, string tableName, string tableNameEntry, string entryEntityKey, string sourceBillTypeId, string targetFormId
, string convertRuleKey, string targetEntryOrm, string qty, string entrtyMemo)
{
CommonReturnEntity returnEntity = new CommonReturnEntity { Code = "0", IMSsage = "成功" };
#region 数据合法性校验
if (string.IsNullOrWhiteSpace(data.FSrcId))
return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "源单编号不能为空!" };
if (data.FDetailEntity == null || data.FDetailEntity.Count == 0)
return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "明细信息不能为空!" };
int i = 0;
foreach (var item in data.FDetailEntity)
{
i++;
if (item.FSrcEntryId == null || string.IsNullOrWhiteSpace(item.FSrcEntryId))
return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = string.Format("第{0}行,源单明细内码不能为空!", i) };
}
string sql = string.Format(@"/*dialect*/ select t1.FPrdOrgId,t1.FEntrustOrgId,t1.FID,t1.FBILLNO,t2.FSEQ,t2.FENTRYID
from {0} t1
inner join {1} t2 on t1.FID=t2.FID
where t1.FBILLNO='{2}'", tableName, tableNameEntry, data.FSrcId);
var obj = DBUtils.ExecuteDynamicObject(ctx, sql);
if (obj == null || obj.Count == 0)
return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "未查询到该上游单据编号:" + data.FSrcId + "!" };
#endregion
#region 下推
using (KDTransactionScope trans = new KDTransactionScope(System.Transactions.TransactionScopeOption.Required))
{
List<ListSelectedRow> selectedRows = new List<ListSelectedRow>();
foreach (var rowObj in obj)
{
if (data.FDetailEntity.Select(s => s.FSrcEntryId).ToList().Contains(rowObj["FENTRYID"].ToString()))
{
int selectedSeq = (int)rowObj["FSEQ"];
ListSelectedRow listSelectedRow = new ListSelectedRow(
rowObj["FID"].ToString(),
rowObj["FENTRYID"].ToString(),
selectedSeq,
FormKey);
listSelectedRow.EntryEntityKey = entryEntityKey;
selectedRows.Add(listSelectedRow);
}
}
//Logger.Info("生产用料清单下推生产退料单", JsonConvert.SerializeObject(selectedRows));
ConvertOption convertOption = new ConvertOption();
convertOption.TargetOrgId = Convert.ToInt64(obj[0]["FEntrustOrgId"]) == 0 ? Convert.ToInt64(obj[0]["FPrdOrgId"]) : Convert.ToInt64(obj[0]["FEntrustOrgId"]); //目标组织ID
convertOption.sourceFormId = FormKey; //源单唯一标识
convertOption.sourceBillTypeId = sourceBillTypeId;
convertOption.targetFormId = targetFormId; //目标单标识
convertOption.ConvertRuleKey = convertRuleKey; //单据转换规则标识
convertOption.IsDraft = true; //暂存
convertOption.IsSave = false; //保存
convertOption.IsAudit = false; //审核
convertOption.Option = OperateOption.Create();
convertOption.BizSelectRows = selectedRows.ToArray();
//下推结果
PushResult result_push = GSBAppServiceContext.BillConvertService.ConvertBills(ctx, convertOption);
IOperationResult results = result_push.result;
//不成功时返回结果
if (!results.IsSuccess)
return returnEntity = new CommonReturnEntity { Code = "1", IMSsage = Returns(results) };
//获取下推成功退料单数据包
DynamicObject[] TargetBillData = result_push.TargetBillData;
foreach (var billItem in TargetBillData)
{
//退料单分录
var entrys = billItem["Entity"] as DynamicObjectCollection;
//定义一个需要复制行记录列表
List<Tuple<int, int>> linkCopyCount = new List<Tuple<int, int>>();
int index = 0;
foreach (var entryItem in entrys)
{
DynamicObjectCollection links = entryItem["FEntity_Link"] as DynamicObjectCollection;
//从link数据找到上游单据分录id,不考虑合并情况
string srcEntryId = Convert.ToString(links[0]["SId"]);
var recEntryData = data.FDetailEntity.Where(p => p.FSrcEntryId == srcEntryId).ToList();
int needCopyCount = recEntryData.Count - 1;
if (recEntryData.Count > 0)
{
linkCopyCount.Add(new Tuple<int, int>(index, needCopyCount));
}
index++;
}
//关联复制数据
foreach (var tupleItem in linkCopyCount)
{
int indexSeq = tupleItem.Item1;
DynamicObject needCopyDy = entrys[indexSeq];
for (int ii = 0; ii < tupleItem.Item2; ii++)
{
DynamicObject copyedDy = (DynamicObject)Kingdee.BOS.Orm.OrmUtils.Clone(needCopyDy);
copyedDy["seq"] = entrys.Count + 1;
entrys.Add(copyedDy);
}
}
}
//单据暂存,暂存后才能调用单据视图对数据进行更新
results = GSBAppServiceContext.BillConvertService.DraftBillData(ctx,targetFormId,TargetBillData);
//获取单据暂存ID
long Fsaveid = Convert.ToInt64(results.OperateResult[0].PKValue);
OperateOption saveOption = OperateOption.Create();
saveOption.SetIgnoreWarning(true);
saveOption.SetIgnoreInteractionFlag(true);
//创建单据视图
IBillView billView = FourSDataManagerUtil.CreateBillView(ctx, targetFormId, Fsaveid);
((IBillViewService)billView).LoadData();
DynamicFormViewPlugInProxy eventProxyPush = billView.GetService<DynamicFormViewPlugInProxy>();
IDynamicFormViewService dynamicFormViewPush = billView as IDynamicFormViewService;
//获取单据视图单据体数据
DynamicObjectCollection BillDataEntitys = billView.Model.DataObject["Entity"] as DynamicObjectCollection;
//利用值更新赋值单据编码
dynamicFormViewPush.UpdateValue("FBILLNO", 0, data.FBILLNO);
//利用值更新赋值数据来源
dynamicFormViewPush.UpdateValue("F_BHR_SJLY", 0, "1");
//单据体更新
int rowindex = 0;
foreach (var item in BillDataEntitys)
{
//获取link数据明细
DynamicObjectCollection links = item["FEntity_Link"] as DynamicObjectCollection;
//从link数据找到上游单据分录id,不考虑合并情况
string srcEntryId = Convert.ToString(links[0]["SId"]);
//根据关联明细ID 获取传入参数明细行数据
var recEntryData = data.FDetailEntity.Where(p => p.FSrcEntryId == srcEntryId && p.IsUsed == false).FirstOrDefault();//.ToList();
if (recEntryData == null)
{
continue;
}
//更新传入参数明细行使用状态
recEntryData.IsUsed = true;
//更新明细行字段
dynamicFormViewPush.UpdateValue("F_BHR_EntryId", rowindex, recEntryData.FEntryId);
if (recEntryData.FMaterialId != null && recEntryData.FMaterialId != "")
dynamicFormViewPush.SetItemValueByNumber("FMaterialId", recEntryData.FMaterialId, rowindex);
dynamicFormViewPush.UpdateValue("FReturnType", rowindex, recEntryData.FReturnType);
if (recEntryData.FStockID != null && recEntryData.FStockID != "")
dynamicFormViewPush.SetItemValueByNumber("FStockID", recEntryData.FStockID, rowindex);
dynamicFormViewPush.UpdateValue("FAPPQty", rowindex, recEntryData.FQty);
//dynamicFormViewPush.UpdateValue(FEntrtyMemo, rowindex, recEntryData.FEntrtyMemo);
dynamicFormViewPush.SetItemValueByNumber("FReturnReason", recEntryData.FReturnReason, rowindex);
//当退料类型为作业不良退时 不更新未领无效
if (recEntryData.FISUPDATEQTY == "1"&&recEntryData.FReturnType!="3")
dynamicFormViewPush.UpdateValue("FIsUpdateQty",rowindex,true);
rowindex++;
}
DynamicObjectCollection BillDataEntitys2 = billView.Model.DataObject["Entity"] as DynamicObjectCollection;
Logger.Info("dynamicObjects", JsonConvert.SerializeObject(BillDataEntitys2));
#region 保存提交审核
// GSBAppServiceContext.BillConvertService.DraftBillData(ctx, targetFormId, new DynamicObject[] { billView.Model.DataObject });
IOperationResult sResult = FourSDataManagerUtil.SaveBill(ctx, billView, saveOption);
if (!sResult.IsSuccess)
{
returnEntity.IMSsage = Returns(sResult, "未知原因保存失败");
return returnEntity;
}
#endregion
//提交,释放网控
sResult = AppServiceContext.SubmitService.Submit(ctx, billView.BusinessInfo, new object[] { Fsaveid }, "Submit", saveOption);
//不成功时返回结果
if (!sResult.IsSuccess)
{
returnEntity.IMSsage=Returns(sResult, "未知原因提交失败");
return returnEntity;
}
ClearNetWorkCtrlRS(ctx, targetFormId, Fsaveid);
var Result = BusinessDataServiceHelper.Audit(ctx, billView.BusinessInfo,new object[] { Fsaveid},saveOption);
trans.Complete();
}
#endregion
return returnEntity;
}