目标:
创建生产任务时,系统自动根据各产品的BOM,进行MRP运算,统计出所需物料,并根据库存计算缺货数。
前期准备:
1.准备好产品、物料、BOM、生产任务、生产任务明细、生产任务需求物料数据表;
2.提前录好基础数据;
实现步骤:
1.新建一个功能,命名为新建生产任务;
2.编辑功能流程
①第一步新增生产任务,使用新增数据的步骤;
②第二步新增生产任务明细,使用新增集合的步骤,其中产品属性可以设置“固定”,以实现多选的效果;
③第三步则需要通过编程的方式,进行MRP运算;
async function runProcess($model = model, $plugin = plugin, $params) {
let list = $params.list;//生产任务明细
let itemid = $params.item._id;//生产任务id
let require_list = [];
/*物料需求列表
[
{
id:"物料id",
demand:"总需求数量"
}
]
*/
for (let i = 0; i < list.length; i++) {//遍历生产任务明细collection
let quantity = list[i]["5fd1cc619f7ebc78933d9a2b"];//计划生产量
//查询产品的BOM列表
let bom_list = await $plugin.data.queryData("5fd1cb6c04284278923ac9a7", {
"5fd1cb8404284278923ac9a8": list[i]["5fd1cc429f7ebc78933d9a2a"]
});
for (let j = 0; j < bom_list.length; j++) {//遍历bom列表
//查询物料需求列表中是否已有物料
let itemIndex = require_list.findIndex((item) => {
return item.id == bom_list[j]["5fd1cb9204284278923ac9a9"];
});
if (itemIndex > 0) {
//物料重复,去重,增加数量
require_list[itemIndex]["demand"] = new Number(require_list[itemIndex]["demand"]) + new Number(quantity) * new Number(bom_list[j]["5fd1cb9804284278923ac9aa"]);//产品计划生产量*物料用量
} else {
//新物料
require_list.push({
id: bom_list[j]["5fd1cb9204284278923ac9a9"],//物料id
demand: new Number(quantity) * new Number(bom_list[j]["5fd1cb9804284278923ac9aa"])//产品计划生产量*物料用量
});
}
}
}
for (let i = 0; i < require_list.length; i++) {//去重完后,录入到需求物料表
let form = {
"5fd1cc8d04284278923ac9ad":itemid,//关联生产任务
"5fd1ccad9f7ebc78933d9a2c":require_list[i]["id"],//物料
"5fd1ccb39f7ebc78933d9a2d":require_list[i]["demand"]//总需求数量
};
//保存数据
await $plugin.data.saveData("5fd1cc8204284278923ac9ac",form);
}
}
④经过前面三步,已经计算好所有需要的物料以及用量,接下来就需要计算缺货数,第四步使用获取集合的步骤,获取已经创建好的需求物料列表;
⑤第五步通过关联获取集合的步骤,获取第四步的集合进行计算缺货数;