ng_cws_client.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package ng_cws_client
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "git.sxidc.com/go-tools/utils/slice"
  6. "git.sxidc.com/service-supports/cws-sdk/service"
  7. "git.sxidc.com/service-supports/cws-sdk/service/request"
  8. "git.sxidc.com/service-supports/cws-sdk/service/response"
  9. "git.sxidc.com/service-supports/cws-sdk/utils"
  10. "git.sxidc.com/service-supports/cws-sdk/utils/http_client"
  11. "git.sxidc.com/service-supports/cws-sdk/utils/request_util"
  12. "strings"
  13. "time"
  14. )
  15. var NGCwsClient *http_client.Client
  16. var cwsUrl string
  17. var cwsTimeOut time.Duration
  18. func Init(url string, timeout time.Duration) error {
  19. if utils.IsStringEmpty(url) {
  20. return errors.New("未配置CWS地址")
  21. }
  22. NGCwsClient = http_client.New()
  23. cwsTimeOut = timeout
  24. //判断是否有 /
  25. if !strings.HasSuffix(url, "/") {
  26. url = url + "/"
  27. }
  28. cwsUrl = url
  29. return nil
  30. }
  31. func Destroy() {
  32. http_client.Destroy(NGCwsClient)
  33. }
  34. func StartWorkFlowByBusinessType(reqParams *request.StartWorkFlowByBusinessTypeRequest) (string, error) {
  35. //根据业务类型获取流程模型ID
  36. workflowTemplateId, err := getWorkTemplateInfoByBusinessTypeApi(reqParams.BusinessType, reqParams.TenantID)
  37. if err != nil {
  38. return "", err
  39. }
  40. if utils.IsStringEmpty(workflowTemplateId) {
  41. return "", errors.New("该业务类型未配置流程")
  42. }
  43. //发起流程前校验 获取人员组织信息
  44. customStructureInfo, err := LaunchWorkflowPrepare(&request.LaunchWorkflowPrepareParams{
  45. WorkflowTemplateID: workflowTemplateId,
  46. CreateUserID: reqParams.CreateUserID,
  47. TenantID: reqParams.TenantID,
  48. })
  49. if err != nil {
  50. return "", err
  51. }
  52. jsonBytes, err := json.Marshal(reqParams.Data)
  53. if err != nil {
  54. return "", err
  55. }
  56. businessEntityObjectStr := string(jsonBytes)
  57. workflowId, err := StartWorkflow(&request.StartWorkflowRequest{
  58. ID: reqParams.ID,
  59. WorkflowTemplateID: workflowTemplateId,
  60. LaunchUserName: reqParams.LaunchUserName,
  61. Matter: reqParams.Matter,
  62. BusinessEntityObject: businessEntityObjectStr,
  63. BusinessObject: businessEntityObjectStr,
  64. UserStructureID: customStructureInfo.ID,
  65. CreateUserID: reqParams.CreateUserID,
  66. TenantID: reqParams.TenantID,
  67. })
  68. if err != nil {
  69. return "", err
  70. }
  71. return workflowId, nil
  72. }
  73. func StartWorkFlowWithoutPrepareByBusinessType(reqParams *request.StartWorkFlowWithoutPrepareByBusinessTypeRequest) (string, error) {
  74. //根据业务类型获取流程模型ID
  75. workflowTemplateId, err := getWorkTemplateInfoByBusinessTypeApi(reqParams.BusinessType, reqParams.TenantID)
  76. if err != nil {
  77. return "", err
  78. }
  79. if utils.IsStringEmpty(workflowTemplateId) {
  80. return "", errors.New("该业务类型未配置流程")
  81. }
  82. jsonBytes, err := json.Marshal(reqParams.Data)
  83. if err != nil {
  84. return "", err
  85. }
  86. businessEntityObjectStr := string(jsonBytes)
  87. workflowId, err := StartWorkflow(&request.StartWorkflowRequest{
  88. ID: reqParams.ID,
  89. WorkflowTemplateID: workflowTemplateId,
  90. LaunchUserName: reqParams.LaunchUserName,
  91. Matter: reqParams.Matter,
  92. BusinessEntityObject: businessEntityObjectStr,
  93. BusinessObject: businessEntityObjectStr,
  94. UserStructureID: reqParams.UserStructureID,
  95. CreateUserID: reqParams.CreateUserID,
  96. TenantID: reqParams.TenantID,
  97. ChoiceApproveInfos: reqParams.ChoiceApproveInfos,
  98. })
  99. if err != nil {
  100. return "", err
  101. }
  102. return workflowId, nil
  103. }
  104. func StartWorkflowTemplate(reqParams *request.StartWorkflowTemplateRequest) (string, error) {
  105. if utils.IsStringEmpty(cwsUrl) {
  106. return "", errors.New("未配置CWS地址")
  107. }
  108. //发起流程前校验 获取人员组织信息
  109. customStructureInfo, err := LaunchWorkflowTemplatePrepare(&request.LaunchWorkflowTemplatePrepareParams{
  110. StructureRootID: reqParams.StructureRootID,
  111. CreateUserID: reqParams.CreateUserID,
  112. TenantID: reqParams.TenantID,
  113. })
  114. if err != nil {
  115. return "", err
  116. }
  117. jsonBytes, err := json.Marshal(reqParams.Data)
  118. if err != nil {
  119. return "", err
  120. }
  121. businessEntityObjectStr := string(jsonBytes)
  122. reqJsonParams := &request.StartWorkflowTemplateRequest{
  123. StructureRootID: reqParams.StructureRootID,
  124. WorkflowTemplateName: reqParams.WorkflowTemplateName,
  125. Process: reqParams.Process,
  126. LaunchUserName: reqParams.LaunchUserName,
  127. Matter: reqParams.Matter,
  128. BusinessEntityObject: businessEntityObjectStr,
  129. BusinessObject: businessEntityObjectStr,
  130. UserStructureID: customStructureInfo.ID,
  131. CreateUserID: reqParams.CreateUserID,
  132. TenantID: reqParams.TenantID,
  133. }
  134. if err != nil {
  135. return "", err
  136. }
  137. requestJson, err := json.Marshal(reqJsonParams)
  138. if err != nil {
  139. return "", err
  140. }
  141. postResponse, err := NGCwsClient.NewRequest(http_client.WithNewRequestTimeout(cwsTimeOut)).
  142. Post(cwsUrl+service.StartWorkFlowTemplateMethodName, requestJson)
  143. if err != nil {
  144. return "", err
  145. }
  146. resp := new(response.InfoResponse[string])
  147. err = postResponse.Json(resp)
  148. if err != nil {
  149. return "", err
  150. }
  151. if !resp.Success {
  152. return "", errors.New(resp.Msg)
  153. }
  154. return resp.Info, nil
  155. }
  156. func StartWorkflow(reqParams *request.StartWorkflowRequest) (string, error) {
  157. if utils.IsStringEmpty(cwsUrl) {
  158. return "", errors.New("未配置CWS地址")
  159. }
  160. reqMap := request_util.StructToMap(reqParams)
  161. for nodeID, userIDs := range reqParams.ChoiceApproveInfos {
  162. reqMap[nodeID] = userIDs
  163. }
  164. requestJson, err := json.Marshal(reqMap)
  165. if err != nil {
  166. return "", err
  167. }
  168. postResponse, err := NGCwsClient.NewRequest(http_client.WithNewRequestTimeout(cwsTimeOut)).
  169. Post(cwsUrl+service.StartWorkFlowMethodName, requestJson)
  170. if err != nil {
  171. return "", err
  172. }
  173. resp := new(response.InfoResponse[string])
  174. err = postResponse.Json(resp)
  175. if err != nil {
  176. return "", err
  177. }
  178. if !resp.Success {
  179. return "", errors.New(resp.Msg)
  180. }
  181. return resp.Info, nil
  182. }
  183. func LaunchWorkflowTemplatePrepare(reqParams *request.LaunchWorkflowTemplatePrepareParams) (*response.CustomStructureInfo, error) {
  184. requestJson, err := json.Marshal(reqParams)
  185. if err != nil {
  186. return nil, err
  187. }
  188. postResponse, err := NGCwsClient.NewRequest(http_client.WithNewRequestTimeout(cwsTimeOut)).
  189. Post(cwsUrl+service.StartWorkFlowTemplatePrepareMethodName, requestJson)
  190. if err != nil {
  191. return nil, err
  192. }
  193. resp := new(response.InfosResponse[response.PrepareInfo])
  194. err = postResponse.Json(resp)
  195. if err != nil {
  196. return nil, err
  197. }
  198. if !resp.Success {
  199. return nil, errors.New(resp.Msg)
  200. }
  201. customStructureInfo := &response.CustomStructureInfo{}
  202. for _, info := range resp.Infos {
  203. if info.ID == "userStructureId" {
  204. customStructureInfo.ID = info.Options[0].Value
  205. break
  206. }
  207. }
  208. return customStructureInfo, nil
  209. }
  210. func LaunchWorkflowPrepare(reqParams *request.LaunchWorkflowPrepareParams) (*response.CustomStructureInfo, error) {
  211. resp, err := launchWorkflowPrepareApi(reqParams)
  212. if err != nil {
  213. return nil, err
  214. }
  215. customStructureInfo := &response.CustomStructureInfo{}
  216. for _, info := range resp.Infos {
  217. if info.ID == "userStructureId" {
  218. customStructureInfo.ID = info.Options[0].Value
  219. break
  220. }
  221. }
  222. return customStructureInfo, nil
  223. }
  224. func LaunchWorkflowByBusinessTypePrepare(tenantID string, businessType string, createUserID string) ([]response.PrepareInfo, error) {
  225. //根据业务类型获取流程模型ID
  226. workflowTemplateId, err := getWorkTemplateInfoByBusinessTypeApi(businessType, tenantID)
  227. if err != nil {
  228. return nil, err
  229. }
  230. if utils.IsStringEmpty(workflowTemplateId) {
  231. return nil, errors.New("该业务类型未配置流程")
  232. }
  233. //发起流程前校验 获取人员组织信息
  234. resp, err := launchWorkflowPrepareApi(&request.LaunchWorkflowPrepareParams{
  235. WorkflowTemplateID: workflowTemplateId,
  236. CreateUserID: createUserID,
  237. TenantID: tenantID,
  238. })
  239. if err != nil {
  240. return nil, err
  241. }
  242. return resp.Infos, nil
  243. }
  244. // 获取流程列表,租户ID必传
  245. func GetWorkflowList(reqParams *request.QueryMyWorkflowParams) (*response.InfosResponse[response.WorkflowInfo], error) {
  246. if utils.IsStringEmpty(cwsUrl) {
  247. return nil, errors.New("未配置CWS地址")
  248. }
  249. //根据业务类型获取流程模型ID
  250. workflowList, err := getWorkflowListApi(reqParams)
  251. if err != nil {
  252. return nil, err
  253. }
  254. return workflowList, nil
  255. }
  256. // 通过流程ID批量获取流程列表,租户ID必传
  257. func GetWorkflowListByWorkflowIdList(reqParams *request.QueryWorkflowByIDs) (*response.InfosResponse[response.WorkflowInfo], error) {
  258. if utils.IsStringEmpty(cwsUrl) {
  259. return nil, errors.New("未配置CWS地址")
  260. }
  261. //根据业务类型获取流程模型ID
  262. workflowList, err := getWorkflowListByWorkflowIdListApi(reqParams)
  263. if err != nil {
  264. return nil, err
  265. }
  266. return workflowList, nil
  267. }
  268. // 通过业务类别获取流程列表,租户ID必传
  269. func GetWorkflowListByBusinessType(tenantID string, businessType string, reqParams *request.QueryMyWorkflowParams) (*response.InfosResponse[response.WorkflowInfo], error) {
  270. if utils.IsStringEmpty(cwsUrl) {
  271. return nil, errors.New("未配置CWS地址")
  272. }
  273. //根据业务类型获取流程模型ID
  274. workflowTemplateId, err := getWorkTemplateInfoByBusinessTypeApi(businessType, tenantID)
  275. if err != nil {
  276. return nil, err
  277. }
  278. if utils.IsStringEmpty(workflowTemplateId) {
  279. return nil, errors.New("该业务类型未配置流程")
  280. }
  281. reqParams.TemplateID = workflowTemplateId
  282. reqParams.TenantID = tenantID
  283. workflowList, err := GetWorkflowList(reqParams)
  284. if err != nil {
  285. return nil, err
  286. }
  287. return workflowList, nil
  288. }
  289. func GetUserStructureID(prepareInfos []response.PrepareInfo) (string, error) {
  290. for _, info := range prepareInfos {
  291. if info.ID == "userStructureId" {
  292. return info.Options[0].Value, nil
  293. }
  294. }
  295. return "", errors.New("数据异常未找到userStructureId")
  296. }
  297. func ExtractDynamicValueMap(inputModelMap map[string]any, inputParamStruct any) (map[string]any, error) {
  298. jsonBytes, err := json.Marshal(inputParamStruct)
  299. if err != nil {
  300. return nil, err
  301. }
  302. paramMap := make(map[string]any)
  303. err = json.Unmarshal(jsonBytes, &paramMap)
  304. if err != nil {
  305. return nil, err
  306. }
  307. allValues := make([]string, 0)
  308. paramValues := make([]string, 0)
  309. for k := range inputModelMap {
  310. allValues = append(allValues, k)
  311. }
  312. for k := range paramMap {
  313. paramValues = append(paramValues, k)
  314. }
  315. extraKeys := slice.ExtractASubBSetValue(allValues, paramValues)
  316. dynamicValueMap := make(map[string]any)
  317. for _, key := range extraKeys {
  318. if inputModelAny, ok := inputModelMap[key]; ok {
  319. dynamicValueMap[key] = inputModelAny
  320. }
  321. }
  322. return dynamicValueMap, nil
  323. }