起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: lhb963

【结贴】实现类似‘提交任务’的功能,中怎么判断要显示的内容。

[复制链接]
发表于 2007-9-18 16:38:44 | 显示全部楼层
过滤已经结束流程的最后一个活动环节对应的任务:

1、在流程表中筛选出已经结束的流程
2、根据1的结果,在任务表中筛选出结束的流程对应的任务
3、2中对特定的一个流程会筛选出多个任务,按照任务表的中的时间字段作为条件(如:完成时间、最后修改时间等),筛选时间最大的已完成任务
这样就可以得到已结束流程的最后一个任务。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 17:46:48 | 显示全部楼层
意思我明白了,但是请你根据这个帖子来告诉我们具体怎么改,需要在那里加这些条件,而且请告诉我们流程表中的那个id和任务表中的id对应。谢谢。
回复 支持 反对

使用道具 举报

发表于 2007-9-18 17:53:36 | 显示全部楼层
问题1,具体改哪里你需要自己构建。已经有必要的数据来源,其他就是程序员自己的设计了,何况还有了平台自带的那些工作台的例子。
问题2,我们的用户文档有流程表任务表的关系图。我给抓下来了。

snap1.png

11.5 KB, 下载次数: 96

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-21 11:08:33 | 显示全部楼层
还是没有搞定啊。
你能不能像1楼里那个链接的帖子里给弄个清楚点的操作步骤啊。现在还是不知道我自己写的sql语句要放到那里才能让他执行。没有出现我要的效果(每完成一个流程显示一个任务名称,是完成的流程里的最后一个任务显示的名称。如:流程结束:xxxxxxx)
回复 支持 反对

使用道具 举报

发表于 2007-9-21 11:14:49 | 显示全部楼层
我怎么知道要放到那里才能让他执行?如果我自己做,我会自己定义一个数据集,把sql定义到它里面,
取出完成的任务。楼主自己做的新功能,程序架构我肯定不清楚。

如果你参看了那个链接,似乎zfang给的代码很清楚了吧。过滤是在代码里面添加的。不是直接设置的。
回复 支持 反对

使用道具 举报

发表于 2007-9-21 11:23:27 | 显示全部楼层
平台自带的待办是这么实现的.

业务模型\协同系统\任务\任务中心信息\任务导航(待办)
procedure TNEEDPROCESSNAV.FormDocCreate(Sender: TObject);
begin
  Inherited;
  FilterTypeStr := TRTLConsts.NeedProcessTaskTypeStr;  
{业务模型\协同系统\公共资源\协同常量库
static function TRTLConsts.NeedProcessTaskTypeStr: string;
begin
  Result := 'ftNeedProcess';
end;
}
end;
回复 支持 反对

使用道具 举报

发表于 2007-9-21 11:27:01 | 显示全部楼层
procedure TTaskNav.FilterTypeChanged;
begin
  case FilterType of
    TFilterType.ftNeedProcess:
    begin
      FFilterBuilder.ProcessStates := [TProcessState.psProcess];
      TaskDataSet.SQLFilter := FFilterBuilder.GetFilter;
      TaskDataSet.SQLFiltered := True;
    end;
    TFilterType.ftPost:
    begin
      FFilterBuilder.ProcessStates := [TProcessState.psPost];
      TaskDataSet.SQLFilter := FFilterBuilder.GetFilter;
      TaskDataSet.SQLFiltered := True;
    end;
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-9-21 11:33:28 | 显示全部楼层
业务模型\协同系统\任务\任务中心资源
function TFilterBuilder.GetFilter: string;
begin
  Result := AddFilter('', GetDateRangeFilter);
  Result := AddFilter(Result, GetOrgFilter);
//  Result := AddFilter(Result, GetStateFilter);
end;


function TFilterBuilder.GetOrgFilter: string;
const
  SSOrgURLIn = 'T1.FSORGURL IN(%s) OR (T1.FSPERSON = ''%s'')';
  SSOrgURLIn_Pos = 'T1.FSORGURL IN(%s) OR ((T1.FSDEPT = ''%s'') AND ' +
    '(T1.FSPOSITION = ''%s'') AND (T1.FSPERSON = ''%s''))';

  SROrgURLAndPersonIn = 'TTASKMESSAGE.FRORGURL IN(%s) OR (TTASKMESSAGE.FRPERSON = ''%s'') ';
  SROrgURLAndPersonIn_Pos = 'TTASKMESSAGE.FRORGURL IN(%s) OR ((TTASKMESSAGE.FRDEPT = ''%s'') AND ' +
    '(TTASKMESSAGE.FRPOSITION = ''%s'') AND (TTASKMESSAGE.FRPERSON = ''%s''))';
  SROrgURLIn = 'TTASKMESSAGE.FRORGURL IN(%s) ';
  SROrgURLLike = 'TTASKMESSAGE.FRORGURL LIKE ''%s%%''';
  SRPositionWhere = 'TTASKMESSAGE.FRPOSITION = ''%s''';
  SRStateIn = 'TTASKMESSAGE.FSTATE IN(%s)';
  SRSQL = 'SELECT TTASKMESSAGE.FTASKGUID FROM TTASKMESSAGE WHERE %s';
  SSStateIn = 'T1.FSTATE IN(%s)';
  SSSQL = 'SELECT T1.FGUID FROM TTASK T1 WHERE %s';
  SMain = 'TTASK.FGUID IN(%s)';
  SUnionMian = 'TTASK.FGUID IN((%s) UNION (%S))';
var
  lRStates: TTaskMessageStates;
  lSStates: TTaskStates;
  lROrgList, lSOrgList: TStringList;
  lReceived, lSent, lROrgURLIn, lSOrgURLIn, lOperatorID: string;
  lDept, lPos, lPer: string;
begin
  lRStates := [];
  lSStates := [];
  lROrgList := nil;
  lSOrgList := nil;
  lReceived := '';
  lSent := '';
  lOperatorID := TContextUtils.GetOperator(FContext).ID;

  // 本人待办
  if (TProcessState.psProcess in FProcessStates) or (FProcessStates = []) then
  begin
    lRStates := TTaskMessage.NeedProcessTaskMessageStates;

    if FOrgTypes <> [TOrgType.otPerson, TOrgType.otDept] then
    begin
      if TOrgType.otPerson in FOrgTypes then
        lROrgList := PersonMemberURLs
      else if TOrgType.otDept in FOrgTypes then
        lROrgList := PersonMemberParentURLs
      else
        Assert(False, '尚未支持');
    end
    else
      lROrgList := PersonMemberAndParentURLs;
  end;

  // 本人已办
  if (TProcessState.psFinish in FProcessStates) or (FProcessStates = []) then
  begin
    lRStates := lRStates + TTaskMessage.FinishedTaskMessageStates;
    if lROrgList = nil then
      lROrgList := PersonMemberURLs
    else
      ; // 已经设置 PersonMemberAndParentURLs
  end;

  // 本人提交待办
  if (TProcessState.psPost in FProcessStates) or (FProcessStates = []) then
  begin
    lSStates := TTask.CanProcessTaskStates;
    lSOrgList := PersonMemberURLs
  end;

  // 本人提交已办
  if (TProcessState.psPostFinished in FProcessStates) or (FProcessStates = []) then
  begin
    lSStates := lSStates + TTask.FinishedTaskStates;
    lSOrgList := PersonMemberURLs
  end;

  if lRStates <> [] then
  begin
    lReceived := SysUtils.Format(SRStateIn, [DoGetTaskMessageStatesQueryStr(lRStates)]);
  end;

  if lROrgList <> nil then
  begin
    // TODO: ??
    if not (TOrgType.otPerson in FOrgTypes) and (TOrgType.otDept in FOrgTypes) then
      lROrgURLIn := SysUtils.Format(SROrgURLIn, [DoGetQueryURLStr(lROrgList)])
    else
    begin
      if TOrgUtils.GetIsPersonMember(FContext) then
      begin
        TContextUtils.GetContextOperator(FContext, lDept, lPos, lPer);
        lROrgURLIn := SysUtils.Format(SROrgURLAndPersonIn_Pos, [DoGetQueryURLStr(lROrgList),
          lDept, lPos, lPer]);
      end
      else
        lROrgURLIn := SysUtils.Format(SROrgURLAndPersonIn, [DoGetQueryURLStr(lROrgList),
          lOperatorID]);
    end;

    if lReceived <> '' then
      lReceived := AddAndCondition(lReceived, lROrgURLIn)
    else
      lReceived := lROrgURLIn;
  end;

  if lSStates <> [] then
  begin
    lSent := SysUtils.Format(SSStateIn, [DoGetTaskStatesQueryStr(lSStates)]);
  end;

  if lSOrgList <> nil then
  begin
    if TOrgUtils.GetIsPersonMember(FContext) then
    begin
      TContextUtils.GetContextOperator(FContext, lDept, lPos, lPer);
      lSOrgURLIn := SysUtils.Format(SSOrgURLIn_Pos, [DoGetQueryURLStr(lSOrgList), lDept, lPos, lPer]);
    end
    else
      lSOrgURLIn := SysUtils.Format(SSOrgURLIn, [DoGetQueryURLStr(lSOrgList), lOperatorID]);

    if lSent <> '' then
      lSent := AddAndCondition(lSent, lSOrgURLIn)
    else
      lSent := lSOrgURLIn;
  end;

  if lReceived <> '' then
    lReceived := SysUtils.Format(SRSQL, [lReceived]);
  if lSent <> '' then
    lSent := SysUtils.Format(SSSQL, [lSent]);

  if (lReceived <> '') or (lSent <> '') then
  begin
    if (lReceived <> '') and (lSent <> '') then
      Result := SysUtils.Format(SUnionMian, [lReceived, lSent])
    else begin
      if lReceived <> '' then
        Result := SysUtils.Format(SMain, [lReceived])
      else
        Result := SysUtils.Format(SMain, [lSent]);
    end;
  end
  else
    Result := '';
end;
回复 支持 反对

使用道具 举报

发表于 2007-9-21 11:35:01 | 显示全部楼层
业务模型\协同系统\任务\任务中心信息\任务导航(基类)


function TTaskNav.GetTaskDataSet: TSQLDataSet;
begin
  Result := DataSetBrokerTaskIndex.DataSet as TSQLDataSet;
end;

所以他用的是 业务模型\协同系统\任务\任务中心信息  的  任务索引[TaskIndex]  数据集
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-27 13:44:16 | 显示全部楼层
先结吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-28 12:54 , Processed in 0.048949 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表