
【场景】自定义记录打印次数
【案例】采购订单,列表和单据,记录打印次数
<0>对象、单据、模板打印次数表
```sql
--ksql
/****** 对象、单据、模板打印次数记录表 ******/
/****** 表结构 ******/
IF NOT EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'T_Test_NotePrintRecord')
CREATE TABLE T_Test_NotePrintRecord
(
FID VARCHAR(36) DEFAULT ' ' NOT NULL,
FOBJECTID VARCHAR(50) DEFAULT ' ' NOT NULL,
FINTERID VARCHAR(50) DEFAULT ' ' NOT NULL,
FTEMPTELAEID NVARCHAR(50) DEFAULT ' ' NOT NULL,
FCOUNT INT DEFAULT 0 NOT NULL
);
/****** 索引 ******/
IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'IDX_Test_NotePrintRecord')
CREATE INDEX IDX_Test_NotePrintRecord ON T_Test_NotePrintRecord ( FOBJECTID, FINTERID, FTEMPTELAEID);
/****** 主键 ******/
IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'T_Test_NotePrintRecord')
EXEC p_AlterPK 'PK_Test_NotePrintRecord', 'T_Test_NotePrintRecord', 'FID', '1';
/****** 锁记录 ******/
INSERT T_Test_NotePrintRecord(FID) Values('LOCK')
```
<1>表单插件、列表插件

```csharp
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.Metadata;
using System;
using System.Collections.Generic;
using System.Transactions;
namespace DynamicFormPlugIn.NotePrint
{
public class NotePrintRecordHandler
{
private readonly AbstractDynamicFormPlugIn PlugIn;
public NotePrintRecordHandler(AbstractDynamicFormPlugIn plugIn)
{
PlugIn = plugIn;
}
public void Execute(BeforeNotePrintEventArgs e)
{
//<0>把预览界面的打印取消,预览界面的打印目前无法插件干预
e.ShowPreviewButton = false;
//<1> 仅针对打印操作记录
if (!IsPrintOp(e.PrintType))
return;
var templateBillCntMap = GetPrintBillSet(e, PlugIn.View.BillBusinessInfo);
if(!UpdatePrintCount(templateBillCntMap))
{
e.Cancel = true;
}
//<2>如果需要控制次数,可针对不满足的取消打印
//e.Cancel = true;
}
///
/// 是否打印操作
///
/// <param name="printType"></param>
/// <returns></returns>
private static bool IsPrintOp(string printType)
{
if (printType == null)
return false;
const string print = "print";
const string PrintMerge = "PrintMerge";
if (string.Equals(printType, print, StringComparison.OrdinalIgnoreCase) ||
string.Equals(printType, PrintMerge, StringComparison.OrdinalIgnoreCase))
return true;
return false;
}
///
/// 获取 模板、单据内码的打印次数
///
/// <param name="e"></param>
/// <param name="billBusinessInfo"></param>
/// <returns></returns>
private static Dictionary<string, Dictionary<string, int>> GetPrintBillSet(BeforeNotePrintEventArgs e, BusinessInfo billBusinessInfo)
{
string curFormId = billBusinessInfo.GetForm().Id;
Dictionary<string, Dictionary<string, int>> templateBillCntMap = new Dictionary<string, Dictionary<string, int>>();
foreach (var printJob in e.PrintJobs)
{
if (printJob == null || printJob.PrintJobItems == null)
continue;
//不是当前表单的任务不处理,理论上应该都是相同表单的,但是有可能二开会指向其他表单
if (!string.Equals(printJob.FormId, curFormId))
continue;
foreach (var printJobItem in printJob.PrintJobItems)
{
if (printJobItem == null)
continue;
//任务中包含单据内码和模板ID,这里只需要记录单据内码
if (!templateBillCntMap.ContainsKey(printJobItem.TemplateId))
{
templateBillCntMap[printJobItem.TemplateId] = new Dictionary<string, int>();
}
if (!templateBillCntMap[printJobItem.TemplateId].ContainsKey(printJobItem.BillId))
{
templateBillCntMap[printJobItem.TemplateId][printJobItem.BillId] = 1;
}
else
{
templateBillCntMap[printJobItem.TemplateId][printJobItem.BillId] += 1;
}
}
}
return templateBillCntMap;
}
///
/// 更新模板打印次数
///
/// <param name="templateBillCntMap"></param>