void OnSend(object sender, Mi e) { int count = 0; foreach (var lv in _pnl.Children.OfType <Lv>()) { AtvRecv ar = (AtvRecv)lv.Tag; ar.SelectedRecvs = null; if (lv.SelectedCount > 0) { count++; ar.SelectedRecvs = (from r in lv.SelectedRows select r.ID).ToList(); } else if (_info.AtvDef.TransKind == WfdAtvTransKind.全部) { Kit.Warn($"未选择{ar.Def.Name}的执行者!"); return; } } if (_info.AtvDef.TransKind == WfdAtvTransKind.自由选择 && count == 0) { Kit.Warn("请至少选择一个活动的执行者!"); return; } if (_info.AtvDef.TransKind == WfdAtvTransKind.独占式选择 && count == 0) { Kit.Warn("请选择一个活动的执行者!"); return; } if (_info.AtvDef.TransKind == WfdAtvTransKind.独占式选择 && count > 1) { Kit.Warn("只能选择一个活动的执行者!"); return; } Close(true); }
async Task Send() { // 先保存 if (!await _info.CmdSave.Save()) { return; } // 判断当前活动是否结束(需要多人同时完成该活动的情况) if (!await _info.AtvInst.IsFinished()) { // 活动未结束(不是最后一人),只结束当前工作项 await SaveWorkItem(false); return; } // 获得所有后续活动,包括同步 var nextAtvs = await AtCm.Query <WfdAtv>("流程-后续活动", new { atvid = _info.AtvDef.ID }); if (nextAtvs.Count == 0) { // 无后续活动,结束当前工作项和活动 await SaveWorkItem(true); return; } bool manualSend = false; var nextRecvs = new AtvRecvs(); foreach (var atv in nextAtvs) { switch (atv.Type) { case WfdAtvType.Normal: // 普通活动 var recv = await LoadRecvs(atv); if (recv.Recvs != null && recv.Recvs.Count > 0) { AtvRecv ar = new AtvRecv { Def = atv, IsRole = recv.IsRole, Recvs = recv.Recvs }; nextRecvs.Atvs.Add(ar); if (recv.IsManualSend) { manualSend = true; } } break; case WfdAtvType.Sync: // 同步活动 且 可激活后续活动时 if (await IsActive(atv)) { // 同步活动只支持一个后续活动! var syncNext = await AtCm.First <WfdAtv>("流程-后续活动", new { atvid = atv.ID }); if (syncNext != null) { recv = await LoadRecvs(syncNext); if (recv.Recvs != null && recv.Recvs.Count > 0) { nextRecvs.SyncAtv = new AtvSyncRecv { SyncDef = atv, Def = syncNext, IsRole = recv.IsRole, Recvs = recv.Recvs }; if (recv.IsManualSend) { manualSend = true; } } } } break; case WfdAtvType.Finish: // 结束活动 nextRecvs.FinishedAtv = new AtvFinishedRecv { Def = atv }; break; } } // 当后续迁移活动为独占式选择且后续活动多于一个时手动选择 if (!manualSend && _info.AtvDef.TransKind == WfdAtvTransKind.独占式选择 && nextRecvs.AtvCount > 1) { manualSend = true; } _info.NextRecvs = nextRecvs; // 触发外部自定义执行者范围事件 await _info.OnSending(); // 外部可以修改接收者列表 if (_info.NextRecvs != null && _info.NextRecvs.AtvCount > 0) { if (manualSend) { // 手动选择后发送 if (await new WfSendDlg().Show(_info)) { DoSend(true); } } else { DoSend(false); } } else { Kit.Warn("无后续活动接收者,请检查流程授权是否合理!"); } }
/// <summary> /// 每个活动接收者对应一个Lv /// </summary> /// <param name="p_ar"></param> /// <returns></returns> void CreateItem(AtvRecv p_ar) { // 分组栏 Grid grid = new Grid { Background = Res.浅灰背景, BorderBrush = Res.浅灰边框, BorderThickness = new Thickness(0, 1, 0, 1), ColumnDefinitions = { new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, new ColumnDefinition { Width = GridLength.Auto }, }, Children = { new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(10, 0, 10, 0), Children = { new TextBlock { FontFamily = Res.IconFont, Text = "\uE02D", VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 4, 0) }, new TextBlock { Text = p_ar.Def.Name, TextWrapping = TextWrapping.NoWrap, VerticalAlignment = VerticalAlignment.Center } } }, }, Height = 40, }; Lv lv = new Lv { View = Resources["ViewTemp"], ViewMode = ViewMode.Tile, Data = p_ar.Recvs, Tag = p_ar, Margin = new Thickness(0, 0, 0, 20) }; var sp = new StackPanel { Orientation = Orientation.Horizontal }; var btn = new Button { Content = "清除", Tag = lv, Background = Res.TransparentBrush }; btn.Click += OnClearSelection; sp.Children.Add(btn); if (p_ar.MultiSelection && p_ar.Recvs.Count > 1) { btn = new Button { Content = "全选", Tag = lv, Background = Res.TransparentBrush }; btn.Click += OnSelectAll; sp.Children.Add(btn); lv.SelectionMode = Base.SelectionMode.Multiple; } Grid.SetColumn(sp, 1); grid.Children.Add(sp); _pnl.Children.Add(grid); _pnl.Children.Add(lv); }