起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 171|回复: 6

代码发送协同任务问题。

[复制链接]
发表于 2009-3-13 10:05:18 | 显示全部楼层 |阅读模式
使用协同任务 发送任务给多个人 创建一条任务多条消息。代码如下:
procedure TDDAQXHWG.SendTask(lMembers: TStringList);
var
  lTask: TTask;
  lSender: TOrgUnit;
  lStorage: TTaskDBStorage;
  lTaskBizData: TTaskbizData;
  i,j: integer;
  lExpr: string;
  lOrgURLs: TOrgURLs;
begin
  // 接受人
  lSender := SystemUtils.TContextUtils.GetPersonMember(Context);
  lTask:= TTask.Create;
  lTask.New(TTaskDefineInfo.Instance(Context).GetTaskTypeInfo('SELFNOTIFY'));
  lTask.FlowGUID := jscommon.CreateGUIDStr;

  lTask.SenderDeptID := lSender.Parent.Parent.id;
  lTask.SenderPositionID := lSender.Parent.ID;
  lTask.SenderID := lSender.ID;
  lTask.State := TTaskState.tsStarted;
  lTask.FuncURL := 'Biz:\DLSCJYYYXT\FDQCHJYJGCXFUNC.FUNC';
  lTaskBizData := TTaskBizData.Create;
  lTaskBizData.BizDataKey[0].BizField := 'Biz:\DLSCJYYYXT\DLJYSJK.DATABASE\BASE_RESULT.TABLE\TRADECODE.Field';
  lTaskBizData.BizDataKey[0].Value := DataSetBroker1.dataset.FieldByName('TradeCode').asstring;
  lTask.BizDatas.Add(lTaskBizData);
  lTask.Subject := DataSetBroker2.DataSet.FieldByname('DESCRI').asstring+
    '[编号:'+DataSetBroker2.DataSet.FieldByname('TradeCode').asstring+']交易结果,请查收并及时确认反馈!';
  lTask.ExecuteMode := TTaskExecuteMode.emSimultaneous;
  for i:=0 to lmembers.count -1 do
  begin
    lOrgURLs:= TOrgURLs.Create;
    try
      lExpr := 'OrgChildren(OrgKey('''+lMembers.Strings+''',''JYY'',''''),'+
        'OrgCondition(''*.psm'','''',''''),true,true)';
      org.Orgsys.Orgsystem.GetOrgURLsByOrgExpr(lExpr,lOrgURLs);
      for j:=0 to lOrgURLs.Count-1 do
      begin
        lTask.TaskMessages.AddTaskMessage(nil, lOrgURLs.Items[j],
          TTaskmessagestate.tmsSend, 0, False);
      end;
    finally
      lOrgUrls.Free;
    end;
  end;

  lStorage:= TTaskDBStorage.Create;
  lStorage.Save(lTask);
end;


结束消息代码如下:

procedure TMAINFORM.BizFormShow(Sender: TObject);
var
  lTask: TTask;
  lStorage: TTaskDBStorage;
  i: integer;
begin
  lTask := TTaskServices.FindCurrentTask(Context);
  if lTask <> nil then
  begin
    //结束任务
    lStorage := TTaskDBStorage.Create;
    for i := 0 to lTask.TaskMessages.Count -1 do
    begin
      if Sysutils.SameText(
        KDcommonLib.TKDcommonLib.GetUserID(Context),
        lTask.TaskMessages.Items.ReceiverID) then
        lTask.TaskMessages.Items.State := TTaskMessageState.tmsFinished;
    end;
    lStorage.Save(ltask);
    //关闭功能
    systemcore.TSystemCore.FuncManager.TerminateFunc(FuncBroker.Func,True);
  end;
end;

所有的消息都完成后,任务的状态还是尚未处理状态 ,任务的状态应当是已完成状态呀!! 是否缺陷,还是用法不对。
版本2918
回复

使用道具 举报

发表于 2009-3-13 10:43:07 | 显示全部楼层
楼主,你上面的代码仅仅把任务消息的状态置成完成了,任务的状态没置。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-13 11:14:08 | 显示全部楼层
如果直接置任务状态,处理完一个消息后,其他人就处理不了了,lStorage.Save(ltask)这句应该是在所有消息处理完后自动置任务状态的吧,现在不是。
回复 支持 反对

使用道具 举报

发表于 2009-3-13 11:18:14 | 显示全部楼层
应该不会。
你代码判断一下,该任务是否所有的任务消息都完成了,如果都完成了就把任务状态置完成。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-13 11:37:54 | 显示全部楼层
这个不应该是在外边来判断的啊,你们看一下是不是个缺陷。
回复 支持 反对

使用道具 举报

发表于 2009-3-13 11:51:52 | 显示全部楼层
楼主,是这样的,问过开发人员。
这个问题可以说是缺陷也可以说不是。
因为如果任务是有多个任务消息的情况下,有的任务消息是完成,有的是中止,那这个任务最终是完成还是终止呢?所以这个还是请楼主自己代码中去实现比较好(也就是说,平台目前没有去做这个实现)
回复 支持 反对

使用道具 举报

发表于 2009-3-20 13:53:56 | 显示全部楼层
??
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-24 04:18 , Processed in 0.044555 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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