单据审核plpgsql函数
根据存货总线设计要求,存货类单据填写完成后流转到【审核】步骤,前端查看后认为没有问题时,对所操作单据标记审核,审核后登记。
在标记审核时,将审核指令发送到后台数据库中,由后台函数完成审核标记或相关处理。
一般地,审核标记前可能需要对单据做以下处理:
1、验证:对当前步骤操作前单据状态进行检验。
2、运算:需要进行的计算类操作。
3、正确完成后返回当前用户,否则返回提示信息。
其中一部分单据允许新增,如销售订单、采购订单,有的单据禁止新增,如出库单等。
单据审核函数代码
CREATE OR REPLACE FUNCTION public.x9_djsp( ssdqyh character varying, ssbjmc character varying, ssdjmc character varying, ssdjoid character varying, ssczmc character varying, ssspfx boolean) RETURNS character varying LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ DECLARE ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理 rs VARCHAR; ssxhff bool;ssnrwid INT; ssczry varchar(100);ssny char(6);ssrwgn varchar(30); -- 用于生成任务记录 sshtbh varchar(30);ssckmc varchar(50); ssjjzl varchar(10);ssgymc varchar(50);sschxh varchar;sschdh varchar(20); sstskm varchar(50); BEGIN rs:=''; IF $6 = false THEN -- 反向操作 取消 -- 反向操作不需要处理。 RETURN $1; END IF; IF $5 = '审核' THEN -- 审批前可以进行自定义验证 -- 存货单据 需求、计划、完成、交付 先验证货号(CHXH),本系统使用自动货号。再验证仓库名称 IF $3 = '销售订单' OR $3 = '需求计算单' OR $3 = '采购订单' OR $3 = '委外订单' OR $3 = '生产计划单' OR $3 = '盘点入库单' OR $3 = '采购入库单' OR $3 = '完工入库单' OR $3 = '委外入库单' OR $3 = '销售出库单' OR $3 = '领用出库单' OR $3 = '委外出库单' THEN ssxhff:=x9_chxh_dj($1,$3,$4); IF ssxhff = false THEN -- 货号审核后验证存货属性、存量控制、价格管理并加标记,要求登记前全部完成设置 UPDATE mlchxm SET sxyzbj = (CASE WHEN bzdw <> '' AND mjsl <= 0 AND sxsh = false THEN '*' ELSE '' END) || (CASE WHEN mllb <> '自制' AND ghdw = '' AND sxsh = false THEN '*' ELSE '' END) || (CASE WHEN mllb = '自制' AND scdw = '' AND sxsh = false THEN '*' ELSE '' END) WHERE sxsh = false; UPDATE mlchxm SET clyzbj = (CASE WHEN bzcl <= 0 AND clsh = false THEN '*' ELSE '' END) || (CASE WHEN jhpl = 0 THEN '*' ELSE '' END) WHERE clsh = false; UPDATE mlchxm SET jgyzbj = (CASE WHEN mllb = '外协' AND jgdj <= 0 AND jgsh = false THEN '*' ELSE '' END) || (CASE WHEN jhjj <= 0 AND jgsh = false THEN '*' ELSE '' END) WHERE xmsh = false OR jgsh = false; -- 验证包装单位 IF exists(SELECT oid FROM djchm WHERE oid = $4 AND bzdw <> '' AND (mjsl = 0 OR bzjs = 0)) THEN rs:='单据' || $4 || '存在未正确填写每件数量或包装件数的数据行'; RETURN rs; END IF; -- 出入库类单据验证仓库名称 position('om' in 'Thomas') IF position('入库' IN $3) > 0 OR position('出库' IN $3) > 0 THEN SELECT ckmc INTO ssckmc FROM djcho WHERE oid = $4; IF exists(SELECT x.ckmc FROM djchm m INNER JOIN mlchxm x ON m.chxh = x.chxh WHERE m.oid = $4 AND x.ckmc <> ssckmc) THEN UPDATE djchm m SET bz = x.ckmc||' '||m.bz FROM mlchxm x WHERE m.chxh = x.chxh AND m.oid = $4 AND x.ckmc <> ssckmc; rs:= '单据' || $4 || '中某些行不属于仓库' || ssckmc || '请按不同仓库分别填制出入库类单据'; RETURN rs; END IF; END IF; UPDATE djcho SET shrq = CURRENT_DATE WHERE oid = $4; rs:=$1 ; ELSE rs:='存货序号审核未能通过'; END IF; RETURN rs; END IF; RETURN ''; EXCEPTION WHEN others THEN GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail, sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context; CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt); RETURN ssmsg; END; $BODY$; 本段代码在postgresql15.1中运行通过。
单据头表结构
djcho字段列表: oid varchar 30 计划单号 textread djmc varchar 60 单据名称 textread ny bpchar 6 年月 textread rq date 0 日期 dateedit yyyy-MM-dd dqbz varchar 40 当前步骤 textread ywlb varchar 40 业务类别 textedit wldw varchar 200 往来单位 buttonedit jswb varchar 40 结算外币 textread scbm varchar 100 生产部门 listedit ckmc varchar 100 仓库名称 listedit htbh varchar 50 合同编号 textedit jfrq date 0 交付日期 dateedit yyyy-MM-dd ywy varchar 60 业务员 comboedit glbj varchar 100 关联标记 textedit bz varchar 100 备注 textedit tzr varchar 20 制表人 textread shr varchar 20 审核人 textread djr varchar 20 登记人 textread
单据体表结构
djchm字段列表: mid int4 32 计划序号 textread oid varchar 30 计划单号 textread djmc varchar 60 单据名称 textread ny bpchar 6 年月 textread dqbz varchar 40 当前步骤 textread chxh varchar 20 货号 buttonedit chdh varchar 30 存货代号 buttonedit chmc varchar 100 存货名称 textread xh1 varchar 100 型号 buttonedit xh2 varchar 100 规格 buttonggxh xh3 varchar 400 参数 textedit gg1 varchar 100 颜色 comboedit edit gg2 varchar 100 材质 textedit gg3 varchar 100 图号 textedit bzdw varchar 40 包装 notenter mjsl numeric 16 每件 textedit 0.00;0.00;# jldw varchar 20 单位 notenter bzjs int4 32 件数 textedit 0;0;# xqsl numeric 16 需求数量 textedit #,###.00;-#,###.00;# xqdj numeric 16 需求单价 textedit #,###.00;-#,###.00;# xqje numeric 16 需求金额 textedit #,###.00;-#,###.00;# jhsl numeric 16 计划数量 textread #,###.00;-#,###.00;# jhdj numeric 16 计划单价 textedit #,###.00;-#,###.00;# jhje numeric 16 计划金额 textedit #,###.00;-#,###.00;# rksl numeric 16 入库数量 textedit #,###.00;-#,###.00;# rkdj numeric 16 入库单价 textedit #,###.00;-#,###.00;# rkje numeric 16 入库金额 textedit #,###.00;-#,###.00;# cksl numeric 16 出库数量 textedit #,###.00;-#,###.00;# ckdj numeric 16 出库单价 textedit #,###.00;-#,###.00;# ckje numeric 16 出库金额 textedit #,###.00;-#,###.00;# jgsl numeric 16 加工数量 textedit #,###.00;-#,###.00;# jgdj numeric 16 加工单价 textedit #,###.00;-#,###.00;# jgje numeric 16 加工金额 textedit #,###.00;-#,###.00;# xssl numeric 16 销售数量 textedit #,###.00;-#,###.00;# xsdj numeric 16 销售单价 textedit #,###.00;-#,###.00;# xsje numeric 16 销售金额 textedit #,###.00;-#,###.00;# wbje numeric 16 外币金额 textedit #,###.00;-#,###.00;# zzsl numeric 16 税率 textedit n2 zzse numeric 16 税额 textedit n2 wbse numeric 16 外币税额 textedit n2 tp1 varchar 400 图片 fileedit clyt varchar 20 材料用途 textread djrq timestamp 0 登记日期 dateedit yyyy-MM-dd bz varchar 400 备注 buttontextedit mhh int4 32 行号 textedit sfsh bool 0 是否审核 checkedit sfdj bool 0 是否登记 checkread
存货细目表结构
mlchxm字段列表: chxh varchar 20 货号 textedit sjdh varchar 20 上级代号 textedit bjdh varchar 20 本级代号 textedit jc int4 32 级次 textedit chdh varchar 30 存货代号 textread chmc varchar 100 存货名称 textread xh1 varchar 100 型号 textedit xh2 varchar 100 规格 textedit xh3 varchar 400 参数 textedit gg1 varchar 100 颜色 comboedit edit gg2 varchar 100 材质 textedit gg3 varchar 100 图号 textedit bzdw varchar 40 包装 textread mjsl numeric 16 每件 textedit 0.00;0.00;'' jldw varchar 40 单位 textread jhjj numeric 16 计划进价 textedit n2 jhsj numeric 16 计划售价 textedit n2 bzcl numeric 16 标准存量 textedit n2 jgdj numeric 16 加工单价 textedit n2 jhpl numeric 16 计划批量 textedit n2 mllb varchar 20 材料类别 textedit zjm varchar 100 助记码 textedit ckmc varchar 100 仓库名称 listedit scdw varchar 100 生产部门 buttonedit ghdw varchar 200 供货单位 buttonedit sydw varchar 100 使用单位 textedit sxyzbj varchar 10 属性验证标记 textedit sxsh bool 0 是否审核 checkedit sxshry varchar 40 审核人员 textedit jgyzbj varchar 10 价格验证标记 textedit jgsh bool 0 价格审核 checkedit jgshry varchar 40 审核人员 textedit clyzbj varchar 10 存量验证标记 textedit clsh bool 0 存量审核 checkedit clshry varchar 40 存量审核人员 textedit xmsh bool 0 细目审核 checkedit xmshry varchar 40 细目审核人员 textedit sfsd bool 0 是否锁定 checkedit sfqy bool 0 是否启用 checkedit
实际使用中,可能还会涉及更多的表,此略。
本人新设计的存货总线物料管理方案,规范并简化了物料管理的信息管理方式,可能更直观、更快速地操作并反映物料状况,易于完成需求计算。具体请参考相关文章。如有需要可参考,亦可联系作者。