单据转换插件问题
金蝶云社区-愚公移山
愚公移山
0人赞赏了该文章 1,064次浏览 未经作者许可,禁止转载编辑于2015年09月28日 20:15:53

应用场景:
1、生产管理系统中先将生产加工所需原材料调拔到车间在制仓库。
2、生产加工完成入库,录入“加工入库单”,在对“加工入库单”进行审核时,按照“加工配料单”(类似于生产BOM)计算所需原材料,自动产生“加工消耗单”。
3、当生产加工的产品没有设置有“加工配料单”时,计算“加工消耗单”时,就以加工成的产品本身作为消耗材料
4、通过审核“加工消耗单”,扣减车间在制仓的原材料库存。

需求:
审核“加工入库单”时,通过“自动下推”产生“加工消耗单”,中间耗用材料的算法通过单据转换插件实现。
下面是单据转换插件的全部源代码:
[System.ComponentModel.Description("加工入库单转加工消耗单插件")]
public class jgrktojkxh : AbstractConvertPlugIn
{
public override void OnGetSourceData(Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args.GetSourceDataEventArgs e)
{
e.SourceData = GetSplitSourceData(e.SourceBusinessInfo, e.SourceData);
}
private DynamicObjectCollection GetSplitSourceData(BusinessInfo billInfo, DynamicObjectCollection sourceData)
{
string sql = "", partno = "0";
Double qty = 0, mustqty = 0, bomfz = 0, bomfm = 0, dz = 0;
DataSet ds = null;
DynamicObjectCollection newSourceData = new DynamicObjectCollection(sourceData.DynamicCollectionItemPropertyType);
foreach (var oneSourceData in sourceData)
{
DynamicObject newOneSource = (DynamicObject)ObjectUtils.CreateCopy(oneSourceData);//深度拷贝
partno = newOneSource["FMaterialId"].ToString();
qty = Convert.ToDouble(newOneSource["FRealQty"].ToString());
StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("select a.f_ajl_subpartno,a.f_ajl_fz,a.f_ajl_fm,a.F_AJL_DZ,c.FBaseUnitId,d.FSTOREUNITID,d.FAUXUNITID from AJL_t_jgpld_body a inner join (select top 1 fid from AJL_t_jgpld where FPARTNO='{0}' ", partno));
sb.AppendLine(" and FDOCUMENTSTATUS ='C' and FFORBIDSTATUS ='A' order by FNUMBER desc) b on a.FID =b.FID ");
sb.AppendLine(" inner join t_BD_MaterialBase c on a.f_ajl_subpartno=c.FMATERIALID ");
sb.AppendLine(" inner join t_BD_MaterialStock d on a.f_ajl_subpartno=d.FMATERIALID ");
sql = sb.ToString();
ds = Kingdee.BOS.App.Data.DBUtils.ExecuteDataSet(this.Context, sql);
if (ds.Tables[0].Rows.Count != 0)
{
foreach (DataRow testRow in ds.Tables[0].Rows)
{
bomfz = Convert.ToDouble(testRow["f_ajl_fz"].ToString());
bomfm = Convert.ToDouble(testRow["f_ajl_fm"].ToString());
dz = Convert.ToDouble(testRow["F_AJL_DZ"].ToString());
mustqty = qty * bomfz / bomfm;
newOneSource["FMaterialId"] = testRow["f_ajl_subpartno"].ToString(); //原材料编号
newOneSource["FBomId"] = "0";
newOneSource["FUnitID"] = testRow["FBaseUnitId"].ToString(); ;//单位
newOneSource["FStockUnitId"] = testRow["FSTOREUNITID"].ToString(); ; //库存单位
newOneSource["FBaseUnitId"] = testRow["FBaseUnitId"].ToString(); ; //基本单位
newOneSource["FExtAuxUnitId"] = testRow["FAUXUNITID"].ToString(); ; //辅助单位
newOneSource["FRealQty"] = mustqty; //入库数量
newOneSource["F_AJL_Dz"]= dz;
newOneSource["F_AJL_ZlPrice"] = 0; //重量单价
newOneSource["F_AJL_ZZ"] = mustqty * dz;
newSourceData.Add(newOneSource);//添加源行
}
}
else { newSourceData.Add(newOneSource); }//无加工配料单
}
return newSourceData;
}
}

以上的代码中,按“加工配料单”产生新的源单数据,当“加工配料单”有多条原材料时,每执行
newSourceData.Add(newOneSource);//添加源行
时会将原来添加的行修改成最后添加行的内容,最终结果是返回多条完全一样的SourceData

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0