本文以云星空版本 PT-146930 [8.1.0.20221110] 为背景编写,销售订单想要做新变更单流程时(销售管理系统参数中的变更方式为启用订单新变更单),默认销售订单必须是审核状态下才能变更的,未审核的销售订单,其'订单变更'菜单项是灰显的,这是通版默认逻辑(BOSDIE里通过'单据状态'字段的状态列表控制),列表菜单'订单变更'则通过列表插件代码控制,如下图1-1和图1-2所示:
图1-1
图1-2
当销售订单已审核时,可以点击'订单变更菜单',此时弹出销售订单新变更单界面(新变更单只是弹出还未保存),这个时候如果去反审核销售订单,是会有冲突拦住的(这是通过销售订单表单插件中的BeforeDoOperation代码控制的提示),如下图1-3所示:
图1-3
上图1-3中的拦截提示是比较合理,但是当客户去冲突列表中删除网控时,就能反审核销售订单成功(销售订单反审核成功后,它上面的单据状态变成重新审核,审核人和审核日期则为空),这时如果去保存销售订单新变更单并提交,审核再生效,销售订单新变更单上的生效操作会导致销售订单的单据状态由重新审核变成已审核(因为单据状态字段会从变更单中同步到销售订单中),但没有审核人和审核日期,如下图2-1和图2-2所示:
图2-1
图2-2
这里最大的问题就是在于用户强制删除了上图2-2中的订单变更网控,导致用户在销售订单新变更单编辑界面(变更单尚未保存)存在时也能反审核销售订单,因此用户要注意不应该删除网控,如果真的不小心删除变更网控怎么办呢?建议按照下文在销售订单新变更单保存或审核操作上添加个Python服务端插件,当对应的销售订单被反审核时拦住变更单的保存或审核,首先扩展销售订单新变更单,在保存操作上添加一个Python插件,如下图3-1所示:
图3-1
上图中的Python脚本如下(请使用附件中的代码,不要直接在论坛上复制Python脚本):
# -*- coding: utf-8 -*-
# 销售订单新变更单保存操作服务端插件
import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.Core import *
from System import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System.Collections.Generic import *
from Kingdee.BOS.App.Data import *
def BeginOperationTransaction(e):
if e.DataEntitys is not None and e.DataEntitys.Length > 0:
saleOrderIds = ["0"];
for dataEntity in e.DataEntitys:
saleOrderIds.append(str(dataEntity["PKIDX"]));
strSQL = "SELECT FBILLNO FROM T_SAL_ORDER WHERE FID IN ({0}) AND FDOCUMENTSTATUS <> 'C' ";
strSQL = String.Format(strSQL, ', '.join(saleOrderIds));
name = DBUtils.ExecuteScalar[String](this.Context, strSQL, String.Empty);
if name is not None and name != '':
e.CancelOperation = True;
e.CancelFormService = True;
raise Exception("销售订单 " + name + " 未审核(可能是删除网控后反审核了),变更单无法保存或审核!")
BOS IDE中保存Python插件代码后,当销售订单新变更单保存时,如果对应的销售订单被反审核了,则会有校验,提示信息如下图3-2所示:
图3-2
KingdeeXSaleOrderSave.zip(0.82KB)
推荐阅读