一、业务使用场景举例
作为进销存管理中的一个重要环节,企业在销售/借用/报废等涉及到出库业务的场景时,需要指定具体的出库仓库。创建出库单时,首先需要选择出库的仓库,然后从出库仓库的库存列表种选择待出库的产品,设置每类产品的出库数量等,生成出库单。与入库单一样,产品出库时可设置为同样需要经过严格的审批过程,方可出库。出库单的管理,能够帮助管理人员了解产品的销售和出库情况。
二、新建出库单

- 进入CRM,点击出库单,进入出库单列表页。
- 点击右上角的新建按钮,可新建预设业务类型或自定义业务类型的出库单。

- 新建出库单时,需要填写所属仓库(即出库仓库)、出库类型等信息。
- 出库单产品,可从库存添加,也可以从批次库存添加、序列号添加。
- 点击从库存添加时,会弹出库存对象的列表页,根据所属仓库进行过滤,只显示所属仓库下实际库存大于0的库存列表;选择了库存后,输入出库数量即可,对于开启了批次或者序列号管理的产品,还需要填写出库的批次或序列号。
- 点击从批次库存添加时,会弹出批次库存对象的列表页,根据所属仓库进行过滤,只显示所属仓库下批次库存大于0的批次库存列表;选择批次库存后,系统会自动将所选的批次,以及批次对应的产品及批次库存等信息,填入出库单产品列表,只需输入数量即可。
- 点击从序列号添加时,会弹出序列号对象的列表页,系统会根据所属仓库进行过滤,只显示所属仓库下的序列号,并过滤掉“已占用”、“已使用”的序列号,选择序列号后,系统会自动将所选的序列号,以及序列号对应的产品,填入出库单产品列表,数量固定为1。
- 出库单提交时,会校验出库仓库的库存,库存不足会无法通过校验。
- 出库单确认后,会扣减出库仓库的实际库存。
三、系统自动创建出库单
出库单既是业务单据,也是系统底层单据,任何会导致库存减少的业务单据,最终都会对应到出库单,通过系统自动生成出库单的方式,来减少库存,包括但不限于:
- 调拨单:调拨单确认后,系统会自动生成“调拨出库”业务类型的出库单。
- 盘点单:当盘点产生盘亏时,点击生成盘亏出库单,系统会自动生成“盘亏出库”业务类型的出库单。
- 发货单:发货单确认后,系统会自动生成“销售出库”业务类型的出库单。
- 备件消耗:当备件来源为备件库,当备件消耗确认后,系统会自动生成“备件类型”的出库单。
- 自定义对象:自定义对象如果想扣减库存,可以通过创建出库单(手动或者函数)并关联的方式,来减少相应出库仓库的库存。
四、库存校验函数配置指引
配置自定义函数,作为审批前置条件校验,避免实际库存不足导致出库相关业务单据被作废。
适用单据包括:调拨单、出库单、采购退货单。
1)进入自定义函数管理页面

2)点击右上角的“新建函数”,在弹出框中输入配置信息:


函数名称、Api Name可自定义,命名空间选择“校验函数”,返回值类型选择“ValidateResult”,绑定对象选择“调拨单”(出库单、采购退货单也适用)。
进入下一步后,将以下文本复制后粘贴到函数的输入框内,点击保存,即可完成函数的创建。
Map requestParam = [
"dataId":context.data._id,
"apiName":context.data.object_describe_api_name
];
Fx.log.info("requsetParam=" + requestParam)
def ret = Fx.proxy.callAPI("stock.flowCompletedCheckStock", null, requestParam)
Fx.log.info("ret=" + ret)
HttpResult data = ret.data as HttpResult
if(null == data) {
return "网络超时,请稍后重试"
}
def Map result = data.content as Map
Fx.log.info("result=" + result)
String msg = "校验成功";
Boolean isSuccess = true;
if(result == null || !result['result']['isSuccess']) {
msg = result['result']['message']
isSuccess = false
}
def validateResult = ValidateResult.build{
success = isSuccess
errorMessage = msg
}
return validateResult
3)在流程的审批节点配置自定义函数作为前置条件


前置条件选择“基于自定义函数”,然后选择刚刚配置的函数即可。