初始提交:QuickTeam 工单接口导入工具

用「WCF + 通用存储过程网关」接口替代 Selenium(D://Learning//Python//工单自动化)导入工单:
单 Sprint 12 个项目 175s 跑完(旧方案 25~35 分钟),失败可断点续跑且不重复建单。

- 分层:transport(HTTP/协议)/ api(存储过程语义)/ domain(纯规则)/
  workflow(阶段编排)/ store(SQLite 台账)/ report / CLI
- 幂等:台账驱动断点续跑;dry-run 与跳过行不污染进度;--rollback-on-fail 清理半成品
- 命令:plan / apply / report / status,真实写入需 --yes
- tools:只读探针、存储过程源码导出(sp_helptext)、导入诊断
- docs:调研与设计文档(含联调踩到的 5 个坑)+ 6 个关键存储过程源码

实测:Sprint 2026 Sprint 10 的 12 个项目全部完成建单→导入→确认→推送 TFS,
工单 225134–225145,35 个功能模块,重跑 plan 全部 skip-pushed。69 个单测通过。
This commit is contained in:
chenshoulin
2026-11-05 19:14:25 +08:00
commit 58850314cf
32 changed files with 4590 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
-- =============================================␍
-- Author: <Author,,Name>␍
-- Create date: <Create Date,,>␍
-- Description: <Description,,>␍
-- =============================================␍
CREATE PROCEDURE [QuickTeam].[usp_GetWorkSheetsById] ␍
@ProjectId nvarchar(50),␍
@isReclaimed bit=0␍
AS␍
BEGIN␍
SELECT␍
WorksheetId,␍
convert(nvarchar,sum([PaymentPercent])) as PaymentPercent␍
into #receiv␍
FROM [QuickTeam].[QuickTeam].[WorksheetPayment] group by WorksheetId␍
␍
select t.*␍
,(case ␍
when t.Finished='02' or t.Finished='03' then N'无回款'␍
else ␍
case when rs.StatusAlia=N'回款已经确认' and PaymentPercent is null then N'开票已经确认'␍
else iif(rs.StatusAlia=N'回款已经确认',rs.StatusAlia+N'(累计回款:'+r.PaymentPercent+'%)',rs.StatusAlia) end␍
end␍
) as 'ReceiveStatusName'␍
--,rs.StatusAlia␍
--,iif(rs.StatusAlia=N'回款已经确认',rs.StatusAlia+N'(累计回款:'+r.PaymentPercent+'%)',rs.StatusAlia) as 'ReceiveStatusName'␍
,s.ServiceTypeAlias, r.PaymentPercent,e.Effort,f.Effort CurrentEffort from (␍
select ws.*,''as VersionId,'' as VersionCode,'' as VersionStatus,'' as NextOperator,'' as Operator from [QuickTeam].[QuickTeam].[WorkSheet] ws␍
union␍
select ␍
ws.[WorkSheetId]␍
,wv.VersionCode as WorkSheetCode␍
,ws.[ProjectId]␍
,ws.[ProjectName]␍
,ws.[SystemName]␍
,ws.[Evaluator]␍
,ws.[TechnicalLeader]␍
,ws.[CustomerLeader]␍
,ws.[StartTime]␍
,ws.[EndTime]␍
,wv.[UpdateTime]␍
,ws.[Status]␍
,ws.ReceiveStatus␍
,ws.Finished␍
,ws.Finishtime␍
,ws.[ServiceType]␍
,ws.[ImplementContent]␍
,ws.[OtherInstructions]␍
,ws.CurrentVersionId␍
,ws.isMerge␍
,ws.DeleteFlag␍
,ws.Operation ␍
,ws.OperateUserName␍
,ws.isReclaimed␍
,ws.BelongTeam␍
,wv.VersionId,wv.VersionCode,wv.VersionStatus,wv.NextOperator,wv.Operator from [QuickTeam].[QuickTeam].[WorkSheet] ws ␍
join [QuickTeam].[WorkSheetVersion] wv␍
on ws.WorkSheetId=wv.WorkSheetId ␍
␍
) as t␍
left join #receiv r on r.WorksheetId=t.WorkSheetId␍
left join (␍
select distinct ServiceType,ServiceTypeAlias from ␍
QuickTeam.ServiceTypeTaskName) s␍
on t.ServiceType=s.ServiceType␍
left join QuickTeam.WorkSheetReceiveStatus rs on t.receiveStatus=rs.statusid␍
left join (SELECT [VersionId]␍
,sum([Effort]) [Effort]␍
FROM [QuickTeam].[QuickTeam].[WorkSheetTask] group by VersionId) e on t.VersionId=e.VersionId␍
left join (SELECT [VersionId]␍
,sum([Effort]) [Effort]␍
FROM [QuickTeam].[QuickTeam].[WorkSheetTask] group by VersionId) f on t.CurrentVersionId=f.VersionId␍
where projectid=@ProjectId AND t.DeleteFlag<>1 and isReclaimed=@isReclaimed␍
order by Finished ,WorkSheetId,VersionId␍
␍
drop table #receiv␍
END␍