RoadFlow2.1 临时演示

WorkFlow.cs 79KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5. using System.Drawing;
  6. using System.Collections;
  7. //using Oracle.ManagedDataAccess.Client;
  8. using System.Data.OracleClient;
  9. namespace RoadFlow.Platform
  10. {
  11. public class WorkFlow
  12. {
  13. private RoadFlow.Data.Interface.IWorkFlow dataWorkFlow;
  14. public WorkFlow()
  15. {
  16. this.dataWorkFlow = Data.Factory.Factory.GetWorkFlow();
  17. }
  18. /// <summary>
  19. /// 新增
  20. /// </summary>
  21. public int Add(RoadFlow.Data.Model.WorkFlow model)
  22. {
  23. return dataWorkFlow.Add(model);
  24. }
  25. /// <summary>
  26. /// 更新
  27. /// </summary>
  28. public int Update(RoadFlow.Data.Model.WorkFlow model)
  29. {
  30. return dataWorkFlow.Update(model);
  31. }
  32. /// <summary>
  33. /// 查询所有记录
  34. /// </summary>
  35. public List<RoadFlow.Data.Model.WorkFlow> GetAll()
  36. {
  37. return dataWorkFlow.GetAll();
  38. }
  39. /// <summary>
  40. /// 查询单条记录
  41. /// </summary>
  42. public RoadFlow.Data.Model.WorkFlow Get(Guid id)
  43. {
  44. return dataWorkFlow.Get(id);
  45. }
  46. /// <summary>
  47. /// 删除
  48. /// </summary>
  49. public int Delete(Guid id)
  50. {
  51. return dataWorkFlow.Delete(id);
  52. }
  53. /// <summary>
  54. /// 查询记录条数
  55. /// </summary>
  56. public long GetCount()
  57. {
  58. return dataWorkFlow.GetCount();
  59. }
  60. /// <summary>
  61. /// 查询所有类型
  62. /// </summary>
  63. public List<string> GetAllTypes()
  64. {
  65. return dataWorkFlow.GetAllTypes();
  66. }
  67. /// <summary>
  68. /// 得到所有类型的下拉选择项
  69. /// </summary>
  70. /// <returns></returns>
  71. public string GetAllTypesOptions(string value="")
  72. {
  73. var types = GetAllTypes();
  74. StringBuilder options = new StringBuilder();
  75. foreach (var type in types)
  76. {
  77. options.AppendFormat("<option value=\"{0}\" {1}>{0}</option>", type, type == value ? "selected=\"selected\"" : "");
  78. }
  79. return options.ToString();
  80. }
  81. /// <summary>
  82. /// 得到流程状态显示
  83. /// </summary>
  84. /// <param name="status"></param>
  85. /// <returns></returns>
  86. public string GetStatusTitle(int status)
  87. {
  88. string title = string.Empty;
  89. switch (status)
  90. {
  91. case 1:
  92. title = "设计中";
  93. break;
  94. case 2:
  95. title = "已安装";
  96. break;
  97. case 3:
  98. title = "已卸载";
  99. break;
  100. case 4:
  101. title = "已删除";
  102. break;
  103. case 5:
  104. title = "等待他人处理";
  105. break;
  106. }
  107. return title;
  108. }
  109. /// <summary>
  110. /// 保存一个流程
  111. /// </summary>
  112. /// <param name="jsonString"></param>
  113. /// <returns>返回1 表示成功 其它为具体错误信息</returns>
  114. public string SaveFlow(string jsonString)
  115. {
  116. var jsonData = LitJson.JsonMapper.ToObject(jsonString);
  117. string id = jsonData["id"].ToString();
  118. string name = jsonData["name"].ToString();
  119. string type = jsonData["type"].ToString();
  120. Guid flowID;
  121. if (!id.IsGuid(out flowID))
  122. {
  123. return "请先新建或打开流程!";
  124. }
  125. else if (name.IsNullOrEmpty())
  126. {
  127. return "流程名称不能为空!";
  128. }
  129. else
  130. {
  131. RoadFlow.Platform.WorkFlow bwf = new RoadFlow.Platform.WorkFlow();
  132. RoadFlow.Data.Model.WorkFlow wf = bwf.Get(flowID);
  133. bool isAdd = false;
  134. if (wf == null)
  135. {
  136. wf = new RoadFlow.Data.Model.WorkFlow();
  137. isAdd = true;
  138. wf.ID = flowID;
  139. wf.CreateDate = RoadFlow.Utility.DateTimeNew.Now;
  140. wf.CreateUserID = RoadFlow.Platform.Users.CurrentUserID;
  141. wf.Status = 1;
  142. }
  143. wf.DesignJSON = jsonString;
  144. wf.InstanceManager = jsonData["instanceManager"].ToString();
  145. wf.Manager = jsonData["manager"].ToString();
  146. wf.Name = name.Trim();
  147. wf.Type = type.IsGuid() ? type.ToGuid() : new Dictionary().GetIDByCode("FlowTypes");
  148. try
  149. {
  150. if (isAdd)
  151. {
  152. bwf.Add(wf);
  153. }
  154. else
  155. {
  156. bwf.Update(wf);
  157. }
  158. return "1";
  159. }
  160. catch (Exception err)
  161. {
  162. return err.Message;
  163. }
  164. }
  165. }
  166. /// <summary>
  167. /// 安装一个流程
  168. /// </summary>
  169. /// <param name="jsonString"></param>
  170. /// <param name="isMvc">是否是mvc程序,用于区分应用程序库连接</param>
  171. /// <returns>返回1 表示成功 其它为具体错误信息</returns>
  172. public string InstallFlow(string jsonString, bool isMvc = true)
  173. {
  174. string saveInfo = SaveFlow(jsonString);
  175. if ("1" != saveInfo)
  176. {
  177. return saveInfo;
  178. }
  179. string errMsg;
  180. RoadFlow.Data.Model.WorkFlowInstalled wfInstalled = GetWorkFlowRunModel(jsonString, out errMsg);
  181. if (wfInstalled == null)
  182. {
  183. return errMsg;
  184. }
  185. else
  186. {
  187. RoadFlow.Data.Model.WorkFlow wf = dataWorkFlow.Get(wfInstalled.ID);
  188. if (wf == null)
  189. {
  190. return "流程实体为空";
  191. }
  192. else
  193. {
  194. using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
  195. {
  196. wf.InstallDate = wfInstalled.InstallTime;
  197. wf.InstallUserID = wfInstalled.InstallUser.ToGuid();
  198. wf.RunJSON = wfInstalled.RunJSON;
  199. wf.Status = 2;
  200. dataWorkFlow.Update(wf);
  201. wfInstalled.Status = 2;
  202. #region 添加到应用程序库
  203. RoadFlow.Platform.AppLibrary bappLibrary = new AppLibrary();
  204. RoadFlow.Data.Model.AppLibrary app = bappLibrary.GetByCode(wfInstalled.ID.ToString());
  205. bool isAdd = false;
  206. if (app == null)
  207. {
  208. isAdd = true;
  209. app = new RoadFlow.Data.Model.AppLibrary();
  210. app.ID = Guid.NewGuid();
  211. }
  212. app.Address = isMvc ? "WorkFlowRun/Index" : "Platform/WorkFlowRun/Default.aspx";
  213. app.Code = wfInstalled.ID.ToString();
  214. app.Note = "流程应用";
  215. app.OpenMode = 0;
  216. app.Params = "flowid=" + wfInstalled.ID.ToString();
  217. app.Title = wfInstalled.Name;
  218. app.Type = wfInstalled.Type.IsGuid() ? wfInstalled.Type.ToGuid() : new Dictionary().GetIDByCode("FlowTypes");
  219. if (isAdd)
  220. {
  221. bappLibrary.Add(app);
  222. }
  223. else
  224. {
  225. bappLibrary.Update(app);
  226. }
  227. bappLibrary.ClearCache();
  228. new RoadFlow.Platform.RoleApp().ClearAllDataTableCache();
  229. #endregion
  230. RoadFlow.Cache.IO.Opation.Set(getCacheKey(wfInstalled.ID), wfInstalled);
  231. scope.Complete();
  232. return "1";
  233. }
  234. }
  235. }
  236. }
  237. /// <summary>
  238. /// 流程另存为
  239. /// </summary>
  240. /// <param name="flowID">流程ID</param>
  241. /// <param name="newName">新流程名称</param>
  242. /// <returns>返回另存后的流程实体</returns>
  243. public RoadFlow.Data.Model.WorkFlow SaveAs(Guid flowID, string newName)
  244. {
  245. RoadFlow.Data.Model.WorkFlow wf = dataWorkFlow.Get(flowID);
  246. if (wf == null || newName.IsNullOrEmpty())
  247. {
  248. return wf;
  249. }
  250. else
  251. {
  252. wf.ID = Guid.NewGuid();
  253. wf.Name = newName.Trim();
  254. wf.CreateDate = RoadFlow.Utility.DateTimeNew.Now;
  255. wf.CreateUserID = Platform.Users.CurrentUserID;
  256. wf.InstallDate = null;
  257. wf.InstallUserID = null;
  258. wf.RunJSON = null;
  259. wf.Status = 1;
  260. if (!wf.DesignJSON.IsNullOrEmpty())
  261. {
  262. LitJson.JsonData json = LitJson.JsonMapper.ToObject(wf.DesignJSON);
  263. json["id"] = wf.ID.ToString();
  264. json["name"] = wf.Name;
  265. LitJson.JsonData steps = json["steps"];
  266. LitJson.JsonData lines = json["lines"];
  267. foreach (LitJson.JsonData step in steps)
  268. {
  269. string oldStepid = step["id"].ToString();
  270. string stepid = Guid.NewGuid().ToString();
  271. step["id"] = stepid;
  272. foreach (LitJson.JsonData line in lines)
  273. {
  274. if (line["from"].ToString() == oldStepid)
  275. {
  276. line["from"] = stepid;
  277. }
  278. if (line["to"].ToString() == oldStepid)
  279. {
  280. line["to"] = stepid;
  281. }
  282. }
  283. }
  284. foreach (LitJson.JsonData line in lines)
  285. {
  286. line["id"] = Guid.NewGuid().ToString();
  287. }
  288. wf.DesignJSON = json.ToJson();
  289. }
  290. dataWorkFlow.Add(wf);
  291. }
  292. return wf;
  293. }
  294. /// <summary>
  295. /// 得到一个流程的缓存键
  296. /// </summary>
  297. /// <param name="flowID"></param>
  298. /// <returns></returns>
  299. private string getCacheKey(Guid flowID)
  300. {
  301. return string.Concat(RoadFlow.Utility.Keys.CacheKeys.WorkFlowInstalled_.ToString(), flowID.ToString("N"));
  302. }
  303. /// <summary>
  304. /// 得到流程运行时实体
  305. /// </summary>
  306. /// <param name="flowID">流程ID</param>
  307. /// <returns></returns>
  308. public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(string flowID, bool cache = true)
  309. {
  310. Guid fid;
  311. return flowID.IsGuid(out fid) ? GetWorkFlowRunModel(fid, cache) : null;
  312. }
  313. /// <summary>
  314. /// 得到流程运行时实体
  315. /// </summary>
  316. /// <param name="flowID">流程ID</param>
  317. /// <returns></returns>
  318. public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(Guid flowID, bool cache = true)
  319. {
  320. if (!cache)
  321. {
  322. return getWorkFlowRunFromDesign(flowID);
  323. }
  324. else
  325. {
  326. string key = getCacheKey(flowID);
  327. object obj = RoadFlow.Cache.IO.Opation.Get(key);
  328. if (obj == null)
  329. {
  330. var wfi = getWorkFlowRunFromDesign(flowID);
  331. RoadFlow.Cache.IO.Opation.Set(key, wfi);
  332. return wfi;
  333. }
  334. else
  335. {
  336. return obj as RoadFlow.Data.Model.WorkFlowInstalled;
  337. }
  338. }
  339. }
  340. private RoadFlow.Data.Model.WorkFlowInstalled getWorkFlowRunFromDesign(Guid flowID)
  341. {
  342. var wf = Get(flowID);
  343. if (wf == null || wf.RunJSON.IsNullOrEmpty())
  344. {
  345. return null;
  346. }
  347. string msg;
  348. var wfi = GetWorkFlowRunModel(wf.RunJSON, out msg);
  349. return wfi;
  350. }
  351. /// <summary>
  352. /// 清除一个流程的运行时实体缓存
  353. /// </summary>
  354. /// <param name="flowID"></param>
  355. public void ClearWorkFlowCache(Guid flowID)
  356. {
  357. string key = getCacheKey(flowID);
  358. RoadFlow.Cache.IO.Opation.Remove(key);
  359. }
  360. /// <summary>
  361. /// 刷新一个流程运行时实体
  362. /// </summary>
  363. /// <param name="flowID"></param>
  364. public void RefreshWrokFlowCache(Guid flowID)
  365. {
  366. string key = getCacheKey(flowID);
  367. RoadFlow.Cache.IO.Opation.Set(key, GetWorkFlowRunModel(flowID, false));
  368. }
  369. /// <summary>
  370. /// 得到一个流程运行时实体
  371. /// </summary>
  372. /// <param name="jsonString">流程设计json字符串</param>
  373. /// <returns>流程已安装实体类(如果返回为空则表示验证失败,流程设计不完整)</returns>
  374. public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(string jsonString, out string errMsg)
  375. {
  376. errMsg = "";
  377. RoadFlow.Data.Model.WorkFlowInstalled wfInstalled = new RoadFlow.Data.Model.WorkFlowInstalled();
  378. var json = LitJson.JsonMapper.ToObject(jsonString);
  379. #region 载入基本信息
  380. string id = json["id"].ToString();
  381. if (!id.IsGuid())
  382. {
  383. errMsg = "流程ID错误";
  384. return null;
  385. }
  386. else
  387. {
  388. wfInstalled.ID = id.ToGuid();
  389. }
  390. string name = json["name"].ToString();
  391. if (name.IsNullOrEmpty())
  392. {
  393. errMsg = "流程名称为空";
  394. return null;
  395. }
  396. else
  397. {
  398. wfInstalled.Name = name.Trim();
  399. }
  400. string type = json["type"].ToString();
  401. wfInstalled.Type = type.IsNullOrEmpty() ? new Dictionary().GetIDByCode("FlowTypes").ToString() : type.Trim();
  402. string manager = json["manager"].ToString();
  403. if (manager.IsNullOrEmpty())
  404. {
  405. errMsg = "流程管理者为空";
  406. return null;
  407. }
  408. else
  409. {
  410. wfInstalled.Manager = manager;
  411. }
  412. string instanceManager = json["instanceManager"].ToString();
  413. if (instanceManager.IsNullOrEmpty())
  414. {
  415. errMsg = "流程实例管理者为空";
  416. return null;
  417. }
  418. else
  419. {
  420. wfInstalled.Manager = instanceManager;
  421. }
  422. wfInstalled.RemoveCompleted = json["removeCompleted"].ToString().ToInt();
  423. wfInstalled.Debug = json["debug"].ToString().ToInt();
  424. wfInstalled.DebugUsers = new RoadFlow.Platform.Organize().GetAllUsers(json["debugUsers"].ToString());
  425. wfInstalled.Note = json["note"].ToString();
  426. wfInstalled.FlowType = json.ContainsKey("flowType") ? json["flowType"].ToString().ToInt() : 0;
  427. List<RoadFlow.Data.Model.WorkFlowInstalledSub.DataBases> dataBases = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.DataBases>();
  428. var dbs = json["databases"];
  429. if (dbs.IsArray)
  430. {
  431. foreach (LitJson.JsonData db in dbs)
  432. {
  433. dataBases.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.DataBases()
  434. {
  435. LinkID = db["link"].ToString().ToGuid(),
  436. LinkName = db["linkName"].ToString(),
  437. Table = db["table"].ToString(),
  438. PrimaryKey = db["primaryKey"].ToString()
  439. });
  440. }
  441. }
  442. wfInstalled.DataBases = dataBases;
  443. var titleField = json["titleField"];
  444. if (titleField.IsObject)
  445. {
  446. wfInstalled.TitleField = new RoadFlow.Data.Model.WorkFlowInstalledSub.TitleField()
  447. {
  448. Field = titleField["field"].ToString(),
  449. LinkID = titleField["link"].ToString().ToGuid(),
  450. LinkName = "",
  451. Table = titleField["table"].ToString()
  452. };
  453. }
  454. #endregion
  455. #region 载入步骤信息
  456. List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> stepsList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step>();
  457. LitJson.JsonData steps = json["steps"];
  458. if (steps.IsArray)
  459. {
  460. foreach (LitJson.JsonData step in steps)
  461. {
  462. #region 行为
  463. LitJson.JsonData behavior = step["behavior"];
  464. RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Behavior behavior1 = new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Behavior();
  465. if (behavior.IsObject)
  466. {
  467. behavior1.BackModel = behavior["backModel"].ToString().ToInt();
  468. behavior1.BackStepID = behavior["backStep"].ToString().ToGuid();
  469. behavior1.BackType = behavior["backType"].ToString().ToInt();
  470. behavior1.DefaultHandler = behavior["defaultHandler"].ToString();
  471. behavior1.FlowType = behavior["flowType"].ToString().ToInt();
  472. behavior1.HandlerStepID = behavior["handlerStep"].ToString().ToGuid();
  473. behavior1.HandlerType = behavior["handlerType"].ToString().ToInt();
  474. behavior1.HanlderModel = behavior["hanlderModel"].ToString().ToInt(3);
  475. behavior1.Percentage = behavior["percentage"].ToString().IsDecimal() ? behavior["percentage"].ToString().ToDecimal() : decimal.MinusOne;
  476. behavior1.RunSelect = behavior["runSelect"].ToString().ToInt();
  477. behavior1.SelectRange = behavior["selectRange"].ToString();
  478. behavior1.ValueField = behavior["valueField"].ToString();
  479. behavior1.Countersignature = behavior.ContainsKey("countersignature") ? behavior["countersignature"].ToString().ToInt() : 0;
  480. behavior1.CountersignaturePercentage = behavior.ContainsKey("countersignaturePercentage") ? behavior["countersignaturePercentage"].ToString().ToDecimal() : decimal.MinusOne;
  481. behavior1.SubFlowStrategy = behavior.ContainsKey("subflowstrategy") ? behavior["subflowstrategy"].ToString().ToInt() : int.MinValue;
  482. behavior1.CopyFor = behavior.ContainsKey("copyFor") ? behavior["copyFor"].ToString() : "";
  483. }
  484. #endregion
  485. #region 按钮
  486. LitJson.JsonData buttons = step["buttons"];
  487. List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button> buttionList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button>();
  488. if (buttons.IsArray)
  489. {
  490. foreach (LitJson.JsonData button in buttons)
  491. {
  492. string butID = button["id"].ToString();
  493. if (butID.IsGuid())
  494. {
  495. var buttonModel = new WorkFlowButtons().Get(butID.ToGuid(), true);
  496. if (buttonModel == null)
  497. {
  498. continue;
  499. }
  500. buttionList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  501. {
  502. ID = butID,
  503. Note = buttonModel.Note.IsNullOrEmpty() ? "" : buttonModel.Note.Replace("\"", "'"),
  504. Sort = button["sort"].ToString().ToInt()
  505. });
  506. }
  507. else
  508. {
  509. buttionList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  510. {
  511. ID = butID,
  512. Note = "",
  513. Sort = button["sort"].ToString().ToInt()
  514. });
  515. }
  516. }
  517. }
  518. if (buttionList.Count == 0)
  519. {
  520. errMsg = string.Format("步骤[{0}]未设置按钮", step["name"].ToString());
  521. return null;
  522. }
  523. #endregion
  524. #region 事件
  525. LitJson.JsonData event1 = step["event"];
  526. RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Event event2 = new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Event();
  527. if (event1.IsObject)
  528. {
  529. event2.BackAfter = event1["backAfter"].ToString();
  530. event2.BackBefore = event1["backBefore"].ToString();
  531. event2.SubmitAfter = event1["submitAfter"].ToString();
  532. event2.SubmitBefore = event1["submitBefore"].ToString();
  533. event2.SubFlowActivationBefore = event1.ContainsKey("subflowActivationBefore") ? event1["subflowActivationBefore"].ToString() : "";
  534. event2.SubFlowCompletedBefore = event1.ContainsKey("subflowCompletedBefore") ? event1["subflowCompletedBefore"].ToString() : "";
  535. }
  536. #endregion
  537. #region 表单
  538. LitJson.JsonData forms = step["forms"];
  539. List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Form> formList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Form>();
  540. if (forms.IsArray)
  541. {
  542. foreach (LitJson.JsonData form in forms)
  543. {
  544. formList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Form()
  545. {
  546. ID = form["id"].ToString().ToGuid(),
  547. Name = form["name"].ToString(),
  548. Sort = form["srot"].ToString().ToInt()
  549. });
  550. }
  551. }
  552. if (formList.Count == 0)
  553. {
  554. errMsg = string.Format("步骤[{0}]未设置表单", step["name"].ToString());
  555. return null;
  556. }
  557. #endregion
  558. #region 字段状态
  559. LitJson.JsonData fieldStatus = step["fieldStatus"];
  560. List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.FieldStatus> fieldStatusList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.FieldStatus>();
  561. if (fieldStatus.IsArray)
  562. {
  563. foreach (LitJson.JsonData field in fieldStatus)
  564. {
  565. fieldStatusList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.FieldStatus()
  566. {
  567. Check = field["check"].ToString().ToInt(),
  568. Field = field["field"].ToString(),
  569. Status1 = field["status"].ToString().ToInt()
  570. });
  571. }
  572. }
  573. #endregion
  574. #region 坐标/基本信息
  575. LitJson.JsonData position = step["position"];
  576. decimal x = 0, y = 0;
  577. if (position.IsObject)
  578. {
  579. x = position["x"].ToString().ToDecimal();
  580. y = position["y"].ToString().ToDecimal();
  581. }
  582. stepsList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.Step()
  583. {
  584. Archives = step["archives"].ToString().ToInt(),
  585. ArchivesParams = step["archivesParams"].ToString(),
  586. Behavior = behavior1,
  587. Buttons = buttionList,
  588. Event = event2,
  589. ExpiredPrompt = step["expiredPrompt"].ToString().ToInt(),
  590. Forms = formList,
  591. FieldStatus = fieldStatusList,
  592. ID = step["id"].ToString().ToGuid(),
  593. Type = step.ContainsKey("type") ? step["type"].ToString() : "normal",
  594. LimitTime = step["limitTime"].ToString().ToDecimal(),
  595. Name = step["name"].ToString(),
  596. Note = step["note"].ToString(),
  597. OpinionDisplay = step["opinionDisplay"].ToString().ToInt(),
  598. OtherTime = step["otherTime"].ToString().ToDecimal(),
  599. SignatureType = step["signatureType"].ToString().ToInt(),
  600. WorkTime = step["workTime"].ToString().ToDecimal(),
  601. SubFlowID = step.ContainsKey("subflow") ? step["subflow"].ToString() : "",
  602. Position_x = x,
  603. Position_y = y
  604. });
  605. #endregion
  606. }
  607. }
  608. if (1 == wfInstalled.FlowType)
  609. {
  610. }
  611. wfInstalled.Steps = stepsList;
  612. if (stepsList.Count == 0)
  613. {
  614. errMsg = "流程至少需要一个步骤";
  615. return null;
  616. }
  617. #endregion
  618. #region 载入连线信息
  619. List<RoadFlow.Data.Model.WorkFlowInstalledSub.Line> linesList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.Line>();
  620. LitJson.JsonData lines = json.ContainsKey("lines") ? json["lines"] : null;
  621. if (lines != null && lines.IsArray)
  622. {
  623. foreach (LitJson.JsonData line in lines)
  624. {
  625. linesList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.Line()
  626. {
  627. ID = line["id"].ToString().ToGuid(),
  628. FromID = line["from"].ToString().ToGuid(),
  629. ToID = line["to"].ToString().ToGuid(),
  630. CustomMethod = line["customMethod"].ToString(),
  631. SqlWhere = line["sql"].ToString(),
  632. NoAccordMsg = line.ContainsKey("noaccordMsg") ? line["noaccordMsg"].ToString() : "",
  633. Organize_SenderIn = line.ContainsKey("organize_senderin") ? line["organize_senderin"].ToString() : "",
  634. Organize_SenderNotIn = line.ContainsKey("organize_sendernotin") ? line["organize_sendernotin"].ToString() : "",
  635. Organize_SponsorIn = line.ContainsKey("organize_sponsorin") ? line["organize_sponsorin"].ToString() : "",
  636. Organize_SponsorNotIn = line.ContainsKey("organize_sponsornotin") ? line["organize_sponsornotin"].ToString() : "",
  637. Organize_SenderLeader = line.ContainsKey("organize_senderleader") ? line["organize_senderleader"].ToString() : "",
  638. Organize_SenderChargeLeader = line.ContainsKey("organize_senderchargeleader") ? line["organize_senderchargeleader"].ToString() : "",
  639. Organize_SponsorLeader = line.ContainsKey("organize_sponsorleader") ? line["organize_sponsorleader"].ToString() : "",
  640. Organize_SponsorChargeLeader = line.ContainsKey("organize_sponsorchargeleader") ? line["organize_sponsorchargeleader"].ToString() : "",
  641. Organize_NotSenderLeader = line.ContainsKey("organize_notsenderleader") ? line["organize_notsenderleader"].ToString() : "",
  642. Organize_NotSenderChargeLeader = line.ContainsKey("organize_notsenderchargeleader") ? line["organize_notsenderchargeleader"].ToString() : "",
  643. Organize_NotSponsorLeader = line.ContainsKey("organize_notsponsorleader") ? line["organize_notsponsorleader"].ToString() : "",
  644. Organize_NotSponsorChargeLeader = line.ContainsKey("organize_notsponsorchargeleader") ? line["organize_notsponsorchargeleader"].ToString() : ""
  645. });
  646. }
  647. }
  648. wfInstalled.Lines = linesList;
  649. #endregion
  650. #region 载入其它信息
  651. //得到第一步
  652. List<Guid> firstStepIDList = new List<Guid>();
  653. foreach (var step in wfInstalled.Steps)
  654. {
  655. if (wfInstalled.Lines.Where(p => p.ToID == step.ID).Count() == 0)
  656. {
  657. firstStepIDList.Add(step.ID);
  658. }
  659. }
  660. if (firstStepIDList.Count==0)
  661. {
  662. errMsg = "流程没有开始步骤";
  663. return null;
  664. }
  665. /*
  666. else if (firstStepIDList.Count > 1)
  667. {
  668. errMsg = "流程有多个开始步骤";
  669. return null;
  670. }
  671. Guid lastStepID = Guid.Empty;
  672. foreach (var step in wfInstalled.Steps)
  673. {
  674. if (wfInstalled.Lines.Where(p => p.FromID == step.ID).Count() == 0)
  675. {
  676. lastStepID = step.ID;
  677. break;
  678. }
  679. }
  680. if (lastStepID == Guid.Empty)
  681. {
  682. errMsg = "流程没有结束步骤";
  683. return null;
  684. }
  685. */
  686. var wf = dataWorkFlow.Get(wfInstalled.ID);
  687. if (wf != null)
  688. {
  689. wfInstalled.CreateTime = wf.CreateDate;
  690. wfInstalled.CreateUser = wf.CreateUserID.ToString();
  691. wfInstalled.DesignJSON = wf.DesignJSON;
  692. wfInstalled.FirstStepID = firstStepIDList.First();
  693. wfInstalled.InstallTime = RoadFlow.Utility.DateTimeNew.Now;
  694. wfInstalled.InstallUser = Platform.Users.CurrentUserID.ToString();
  695. wfInstalled.RunJSON = jsonString;
  696. wfInstalled.Status = wf.Status;
  697. }
  698. #endregion
  699. return wfInstalled;
  700. }
  701. /// <summary>
  702. /// 得到一个流程步骤的前面所有步骤集合
  703. /// </summary>
  704. /// <param name="flowID"></param>
  705. /// <param name="stepID"></param>
  706. /// <returns></returns>
  707. public List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> GetAllPrevSteps(Guid flowID, Guid stepID)
  708. {
  709. List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> stepList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step>();
  710. var wfInstalled = GetWorkFlowRunModel(flowID);
  711. if (wfInstalled == null)
  712. {
  713. return stepList;
  714. }
  715. addPrevSteps(stepList, wfInstalled, stepID);
  716. return stepList.Distinct().ToList();
  717. }
  718. private void addPrevSteps(List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> list, RoadFlow.Data.Model.WorkFlowInstalled wfInstalled, Guid stepID)
  719. {
  720. if (wfInstalled == null) return;
  721. var lines = wfInstalled.Lines.Where(p => p.ToID == stepID);
  722. foreach (var line in lines)
  723. {
  724. var step = wfInstalled.Steps.Where(p => p.ID == line.FromID);
  725. if (step.Count() > 0)
  726. {
  727. list.Add(step.First());
  728. addPrevSteps(list, wfInstalled, step.First().ID);
  729. }
  730. }
  731. }
  732. /// <summary>
  733. /// 得到一个流程步骤的前面步骤集合
  734. /// </summary>
  735. /// <param name="flowID"></param>
  736. /// <param name="stepID"></param>
  737. /// <returns></returns>
  738. public List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> GetPrevSteps(Guid flowID, Guid stepID)
  739. {
  740. List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> stepList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step>();
  741. var wfInstalled = GetWorkFlowRunModel(flowID);
  742. if (wfInstalled == null)
  743. {
  744. return stepList;
  745. }
  746. var lines = wfInstalled.Lines.Where(p => p.ToID == stepID);
  747. foreach (var line in lines)
  748. {
  749. var step = wfInstalled.Steps.Where(p => p.ID == line.FromID);
  750. if (step.Count() > 0)
  751. {
  752. stepList.Add(step.First());
  753. }
  754. }
  755. return stepList;
  756. }
  757. /// <summary>
  758. /// 得到一个流程当前步骤的后续步骤集合
  759. /// </summary>
  760. /// <param name="flowID"></param>
  761. /// <param name="stepID"></param>
  762. /// <returns></returns>
  763. public List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> GetNextSteps(Guid flowID, Guid stepID)
  764. {
  765. List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step> stepList = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.Step>();
  766. var wfInstalled = GetWorkFlowRunModel(flowID);
  767. if (wfInstalled == null)
  768. {
  769. return stepList;
  770. }
  771. var lines = wfInstalled.Lines.Where(p => p.FromID == stepID);
  772. foreach (var line in lines)
  773. {
  774. var step = wfInstalled.Steps.Where(p => p.ID == line.ToID);
  775. if (step.Count() > 0)
  776. {
  777. stepList.Add(step.First());
  778. }
  779. }
  780. return stepList;
  781. }
  782. /// <summary>
  783. /// 根据步骤ID得到步骤名称
  784. /// </summary>
  785. /// <param name="stepID"></param>
  786. /// <param name="flowID"></param>
  787. /// <param name="flowName"></param>
  788. /// <param name="defaultFirstStepName">如果步骤为空是否返回第一步的名称</param>
  789. /// <returns></returns>
  790. public string GetStepName(Guid stepID, Guid flowID, out string flowName, bool defaultFirstStepName = false)
  791. {
  792. flowName = "";
  793. var wfInstalled = GetWorkFlowRunModel(flowID);
  794. if (wfInstalled == null) return "";
  795. if (stepID == Guid.Empty && defaultFirstStepName)
  796. {
  797. stepID = wfInstalled.FirstStepID;
  798. }
  799. flowName = wfInstalled.Name;
  800. var steps = wfInstalled.Steps.Where(p => p.ID == stepID);
  801. return steps.Count() > 0 ? steps.First().Name : "";
  802. }
  803. /// <summary>
  804. /// 根据步骤ID得到步骤名称
  805. /// </summary>
  806. /// <param name="stepID"></param>
  807. /// <param name="flowID"></param>
  808. /// <param name="defautFirstStepName">如果步骤ID为空是否默认为第一步</param>
  809. /// <returns></returns>
  810. public string GetStepName(Guid stepID, Guid flowID, bool defautFirstStepName=false)
  811. {
  812. string temp;
  813. return GetStepName(stepID, flowID, out temp, defautFirstStepName);
  814. }
  815. /// <summary>
  816. /// 根据步骤ID得到步骤名称
  817. /// </summary>
  818. /// <param name="stepID"></param>
  819. /// <param name="flowID"></param>
  820. /// <param name="defautFirstStepName">如果步骤ID为空是否默认为第一步</param>
  821. /// <returns></returns>
  822. public string GetStepName(Guid stepID, RoadFlow.Data.Model.WorkFlowInstalled wfinstalled, bool defautFirstStepName = false)
  823. {
  824. if (wfinstalled == null) return "";
  825. if (stepID == Guid.Empty && defautFirstStepName)
  826. {
  827. stepID = wfinstalled.FirstStepID;
  828. }
  829. var steps = wfinstalled.Steps.Where(p => p.ID == stepID);
  830. return steps.Count() > 0 ? steps.First().Name : "";
  831. }
  832. /// <summary>
  833. /// 得到流程名称
  834. /// </summary>
  835. /// <param name="flowID"></param>
  836. /// <returns></returns>
  837. public string GetFlowName(Guid flowID)
  838. {
  839. var flow = GetWorkFlowRunModel(flowID);
  840. return flow != null ? flow.Name : "";
  841. }
  842. /// <summary>
  843. /// 查询所有ID和名称
  844. /// </summary>
  845. public Dictionary<Guid,string> GetAllIDAndName()
  846. {
  847. return dataWorkFlow.GetAllIDAndName();
  848. }
  849. /// <summary>
  850. /// 得到所有流程选择项
  851. /// </summary>
  852. /// <returns></returns>
  853. public string GetOptions(string value = "")
  854. {
  855. var dicts = GetAllIDAndName();
  856. StringBuilder options = new StringBuilder();
  857. foreach (var dict in dicts.OrderBy(p=>p.Value))
  858. {
  859. options.AppendFormat("<option value=\"{0}\" {1}>{2}</option>", dict.Key,
  860. ("," + value + ",").Contains("," + dict.Key.ToString() + ",") ? "selected=\"selected\"" : "", dict.Value);
  861. }
  862. return options.ToString();
  863. }
  864. /// <summary>
  865. /// 得到一个人员可管理实例的所有流程选择项
  866. /// </summary>
  867. /// <returns></returns>
  868. public string GetOptions(Dictionary<Guid,string> flows, string typeid, string value = "")
  869. {
  870. var dicts = flows;
  871. StringBuilder options = new StringBuilder();
  872. foreach (var dict in dicts)
  873. {
  874. options.AppendFormat("<option value=\"{0}\" {1}>{2}</option>", dict.Key,
  875. dict.Key.ToString() == value ? "selected=\"selected\"" : "", dict.Value);
  876. }
  877. return options.ToString();
  878. }
  879. /// <summary>
  880. /// 得到一个人员可管理实例的流程ID和名称列表
  881. /// </summary>
  882. /// <param name="userID"></param>
  883. /// <param name="typeID">分类ID</param>
  884. /// <returns></returns>
  885. public Dictionary<Guid,string> GetInstanceManageFlowIDList(Guid userID, string typeID="")
  886. {
  887. var flows = this.GetAll();
  888. Organize borg = new Organize();
  889. Dictionary<Guid, string> flowids = new Dictionary<Guid, string>();
  890. foreach (var flow in flows)
  891. {
  892. if (typeID.IsGuid() && !GetAllChildsIDString(typeID.ToGuid()).Contains(flow.Type.ToString(), StringComparison.CurrentCultureIgnoreCase))
  893. {
  894. continue;
  895. }
  896. if (borg.GetAllUsers(flow.InstanceManager).Exists(p => p.ID == userID))
  897. {
  898. flowids.Add(flow.ID, flow.Name);
  899. }
  900. }
  901. return flowids;
  902. }
  903. /// <summary>
  904. /// 生成印章图片
  905. /// </summary>
  906. /// <param name="UserName"></param>
  907. /// <returns></returns>
  908. public Bitmap CreateSignImage(string UserName)
  909. {
  910. if (UserName.IsNullOrEmpty())
  911. {
  912. return null;
  913. }
  914. System.Random rand = new Random(UserName.GetHashCode());
  915. Size ImageSize = Size.Empty;
  916. Font myFont = new Font("隶书", 16);
  917. // 计算图片大小
  918. using (Bitmap bmp1 = new Bitmap(5, 5))
  919. {
  920. using (Graphics g = Graphics.FromImage(bmp1))
  921. {
  922. SizeF size = g.MeasureString(UserName, myFont, 10000);
  923. ImageSize.Width = (int)size.Width + 4;
  924. ImageSize.Height = (int)size.Height;
  925. }
  926. }
  927. // 创建图片
  928. Bitmap bmp = new Bitmap(ImageSize.Width, ImageSize.Height);
  929. // 绘制文本
  930. using (Graphics g = Graphics.FromImage(bmp))
  931. {
  932. g.Clear(Color.White);
  933. using (StringFormat f = new StringFormat())
  934. {
  935. f.Alignment = StringAlignment.Center;
  936. f.LineAlignment = StringAlignment.Center;
  937. f.FormatFlags = StringFormatFlags.NoWrap;
  938. g.DrawString(
  939. UserName,
  940. myFont,
  941. Brushes.Red,
  942. new RectangleF(
  943. 0,
  944. 0,
  945. ImageSize.Width,
  946. ImageSize.Height),
  947. f);
  948. }
  949. }
  950. // 随机制造噪点 (用户名绑定)
  951. Color c = Color.Red;
  952. int x, y;
  953. int num = ImageSize.Width * ImageSize.Height * 8 / 100;
  954. for (int iCount = 0; iCount < num; iCount++)
  955. {
  956. x = rand.Next(0, 4);
  957. y = rand.Next(ImageSize.Height);
  958. bmp.SetPixel(x, y, c);
  959. x = rand.Next(ImageSize.Width - 4, ImageSize.Width);
  960. y = rand.Next(ImageSize.Height);
  961. bmp.SetPixel(x, y, c);
  962. }
  963. int num1 = ImageSize.Width * ImageSize.Height * 20 / 100;
  964. for (int iCount = 0; iCount < num1; iCount++)
  965. {
  966. x = rand.Next(ImageSize.Width);
  967. y = rand.Next(0, 4);
  968. bmp.SetPixel(x, y, c);
  969. x = rand.Next(ImageSize.Width);
  970. y = rand.Next(ImageSize.Height - 4, ImageSize.Height);
  971. bmp.SetPixel(x, y, c);
  972. }
  973. int num2 = ImageSize.Width * ImageSize.Height / 150;
  974. for (int iCount = 0; iCount < num2; iCount++)
  975. {
  976. x = rand.Next(ImageSize.Width);
  977. y = rand.Next(ImageSize.Height);
  978. bmp.SetPixel(x, y, c);
  979. }
  980. myFont.Dispose();
  981. return bmp;
  982. }
  983. /// <summary>
  984. /// 得到流程运行时自动标题
  985. /// </summary>
  986. /// <param name="flowID"></param>
  987. /// <param name="stepID"></param>
  988. /// <returns></returns>
  989. public string GetAutoTitle(string flowID, string stepID)
  990. {
  991. string flowName;
  992. string stepName = GetStepName(stepID.ToGuid(), flowID.ToGuid(), out flowName, true);
  993. return string.Format("<div class='flowautotitle'>{0} - {1}</div>", flowName, stepName);
  994. }
  995. /// <summary>
  996. /// 得到默认任务标题
  997. /// </summary>
  998. /// <param name="flowID"></param>
  999. /// <param name="stepID"></param>
  1000. /// <returns></returns>
  1001. public string GetAutoTaskTitle(string flowID, string stepID, string groupID = "")
  1002. {
  1003. var wfrun = GetWorkFlowRunModel(flowID);
  1004. if (wfrun == null) return "";
  1005. string flowName = wfrun.Name;
  1006. string senderName = "";
  1007. Guid gid;
  1008. if (groupID.IsGuid(out gid) || gid==Guid.Empty)
  1009. {
  1010. var fqz = new WorkFlowTask().GetFirstSnderID(flowID.ToGuid(), gid);
  1011. senderName = new Users().GetName(fqz);
  1012. }
  1013. if (senderName.IsNullOrEmpty())
  1014. {
  1015. senderName = Users.CurrentUserName;
  1016. }
  1017. return string.Concat(flowName, "(", senderName, ")");
  1018. }
  1019. /// <summary>
  1020. /// 保存表单数据
  1021. /// </summary>
  1022. public string SaveFromData(string instanceid, RoadFlow.Data.Model.WorkFlowCustomEventParams eventParams)
  1023. {
  1024. //保存自定义表单内容
  1025. string form_CustomSaveMethod = System.Web.HttpContext.Current.Request.Form["Form_CustomSaveMethod"];
  1026. if (!form_CustomSaveMethod.IsNullOrEmpty())
  1027. {
  1028. return new WorkFlowTask().ExecuteFlowCustomEvent(form_CustomSaveMethod, eventParams).ToString();
  1029. }
  1030. if ("1" != System.Web.HttpContext.Current.Request.Form["Form_AutoSaveData"])
  1031. {
  1032. return instanceid;
  1033. }
  1034. RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection();
  1035. string dbconnid = System.Web.HttpContext.Current.Request.Form["Form_DBConnID"];
  1036. string dbtable = System.Web.HttpContext.Current.Request.Form["Form_DBTable"];
  1037. string dbtablepk = System.Web.HttpContext.Current.Request.Form["Form_DBTablePk"];
  1038. string dbtabletitle = System.Web.HttpContext.Current.Request.Form["Form_DBTableTitle"];
  1039. if (!dbconnid.IsGuid())
  1040. {
  1041. return instanceid;
  1042. }
  1043. RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(dbconnid.ToGuid());
  1044. if (dbconn == null)
  1045. {
  1046. return instanceid;
  1047. }
  1048. using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn))
  1049. {
  1050. if (conn == null)
  1051. {
  1052. return instanceid;
  1053. }
  1054. try
  1055. {
  1056. conn.Open();
  1057. }
  1058. catch (Exception ex)
  1059. {
  1060. System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message);
  1061. RoadFlow.Platform.Log.Add(ex);
  1062. }
  1063. string sql = string.Empty;
  1064. List<System.Data.IDataParameter> parList = new List<System.Data.IDataParameter>();
  1065. if(instanceid.IsNullOrEmpty())
  1066. {
  1067. sql = string.Format("SELECT * FROM {0} WHERE 1=0", dbtable);
  1068. }
  1069. else
  1070. {
  1071. switch (dbconn.Type)
  1072. {
  1073. case "SqlServer":
  1074. sql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", dbtable, dbtablepk);
  1075. parList.Add(new System.Data.SqlClient.SqlParameter("@pk", instanceid));
  1076. break;
  1077. case "Oracle":
  1078. sql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", dbtable, dbtablepk);
  1079. parList.Add(new OracleParameter(":pk", instanceid));
  1080. break;
  1081. }
  1082. }
  1083. System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray());
  1084. System.Data.DataSet ds = new System.Data.DataSet();
  1085. dataAdapter.Fill(ds);
  1086. System.Data.DataTable schemaDt = bdbconn.GetTableSchema(conn, dbtable, dbconn.Type);
  1087. System.Data.DataTable dt = ds.Tables[0];
  1088. bool isNew = dt.Rows.Count == 0;
  1089. if (isNew)
  1090. {
  1091. dt.Rows.Add(dt.NewRow());
  1092. }
  1093. //设置主键值(应用于参数中有instanceid而对应业务表中没有数据时保存会出错)
  1094. if (!instanceid.IsNullOrEmpty())
  1095. {
  1096. dt.Rows[0][dbtablepk] = instanceid;
  1097. }
  1098. #region 保存主表数据
  1099. for (int i = 0; i < dt.Columns.Count; i++)
  1100. {
  1101. string colnumName = dt.Columns[i].ColumnName;
  1102. if (string.Compare(colnumName, dbtablepk, true) == 0)
  1103. {
  1104. continue;
  1105. }
  1106. string name = string.Concat(dbtable, ".", dt.Columns[i].ColumnName);
  1107. string value = System.Web.HttpContext.Current.Request.Form[name];
  1108. if (value == null && !isNew)
  1109. {
  1110. continue;
  1111. }
  1112. var colnum = dt.Columns[i];
  1113. string colnumDataType = colnum.DataType.FullName;
  1114. object defaultValue;
  1115. System.Data.DataRow[] schemaDrs = schemaDt.Select(string.Format("f_name='{0}'", colnumName));
  1116. bool hasDefault = false;//列是否有默认值
  1117. bool hasNull = false;//列是否可以为空
  1118. bool isSet = getColnumIsValue(colnumDataType, value, out defaultValue);
  1119. switch (dbconn.Type)
  1120. {
  1121. case "SqlServer":
  1122. hasDefault = schemaDrs.Length > 0 && schemaDrs[0]["cdefault"].ToString() != "0";
  1123. hasNull = schemaDrs.Length > 0 && schemaDrs[0]["is_null"].ToString() != "0";
  1124. break;
  1125. case "Oracle":
  1126. hasDefault = schemaDrs.Length > 0 && !schemaDrs[0]["cdefault"].ToString().IsNullOrEmpty();
  1127. hasNull = schemaDrs.Length > 0 && schemaDrs[0]["is_null"].ToString() != "0";
  1128. break;
  1129. }
  1130. if (isSet)
  1131. {
  1132. dt.Rows[0][colnumName] = value;
  1133. }
  1134. else
  1135. {
  1136. if (!hasDefault)
  1137. {
  1138. if (hasNull)
  1139. {
  1140. dt.Rows[0][colnumName] = DBNull.Value;
  1141. }
  1142. else
  1143. {
  1144. dt.Rows[0][colnumName] = defaultValue;
  1145. }
  1146. }
  1147. }
  1148. }
  1149. #endregion
  1150. #region 设置主键值
  1151. bool isIdentity = false;
  1152. if (isNew)
  1153. {
  1154. if (instanceid.IsNullOrEmpty())
  1155. {
  1156. var pkColnum = dt.Columns[dbtablepk];
  1157. System.Data.DataRow[] schemaDrs = schemaDt.Select(string.Format("f_name='{0}'", dbtablepk));
  1158. if (schemaDrs.Length > 0)
  1159. {
  1160. isIdentity = false;
  1161. bool isDefault = false;
  1162. bool isGuid = false;
  1163. switch (dbconn.Type)
  1164. {
  1165. case "SqlServer":
  1166. isIdentity = schemaDrs[0]["isidentity"].ToString() == "1";
  1167. isDefault = schemaDrs[0]["cdefault"].ToString() != "0";
  1168. isGuid = pkColnum.DataType.FullName == "System.Guid";
  1169. break;
  1170. case "Oracle":
  1171. isIdentity = schemaDrs[0]["isidentity"].ToString() == "1";
  1172. isDefault = !schemaDrs[0]["cdefault"].ToString().IsNullOrEmpty();
  1173. isGuid = pkColnum.DataType.FullName == "System.String";
  1174. break;
  1175. }
  1176. if (!isIdentity && isGuid)
  1177. {
  1178. instanceid = Guid.NewGuid().ToString();
  1179. dt.Rows[0][dbtablepk] = instanceid;
  1180. }
  1181. }
  1182. }
  1183. else
  1184. {
  1185. //dt.Rows[0][dbtablepk] = instanceid;
  1186. }
  1187. }
  1188. #endregion
  1189. #region 执行保存
  1190. switch (dbconn.Type)
  1191. {
  1192. case "SqlServer":
  1193. System.Data.SqlClient.SqlCommandBuilder scb = new System.Data.SqlClient.SqlCommandBuilder((System.Data.SqlClient.SqlDataAdapter)dataAdapter);
  1194. break;
  1195. //case "Oracle":
  1196. // OracleCommandBuilder ocb = new OracleCommandBuilder((OracleDataAdapter)dataAdapter);
  1197. // break;
  1198. }
  1199. dataAdapter.Update(ds);
  1200. #endregion
  1201. #region 如果是新增,又是自增列则查询刚插入的自增列值
  1202. if (isNew && isIdentity)
  1203. {
  1204. switch (dbconn.Type)
  1205. {
  1206. case "SqlServer":
  1207. string identitysql = "SELECT @@IDENTITY";
  1208. using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(identitysql, (System.Data.SqlClient.SqlConnection)conn))
  1209. {
  1210. object obj = cmd.ExecuteScalar();
  1211. if (obj != null)
  1212. {
  1213. instanceid = obj.ToString();
  1214. dt.Rows[0][dbtablepk] = instanceid;
  1215. }
  1216. }
  1217. break;
  1218. case "Oracle":
  1219. string identitysql1 = string.Format("SELECT {0}_{1}_SEQ.currval FROM dual", dbtable, dbtablepk);
  1220. using (OracleCommand cmd = new OracleCommand(identitysql1, (OracleConnection)conn))
  1221. {
  1222. object obj = cmd.ExecuteScalar();
  1223. if (obj != null)
  1224. {
  1225. instanceid = obj.ToString();
  1226. dt.Rows[0][dbtablepk] = instanceid;
  1227. }
  1228. }
  1229. break;
  1230. }
  1231. }
  1232. #endregion
  1233. #region 保存从表数据
  1234. string flowSubTableIDString = System.Web.HttpContext.Current.Request.Form["flowsubtable_id"] ?? "";
  1235. string[] flowSubTableIDArray = flowSubTableIDString.Split(',');
  1236. foreach (string flowSubTableID in flowSubTableIDArray)
  1237. {
  1238. string secondtable = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtable"];
  1239. string primarytablefiled = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_primarytablefiled"];
  1240. string secondtableprimarykey = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtableprimarykey"];
  1241. string secondtablerelationfield = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtablerelationfield"];
  1242. if (secondtable.IsNullOrEmpty() || primarytablefiled.IsNullOrEmpty() || secondtableprimarykey.IsNullOrEmpty() || secondtablerelationfield.IsNullOrEmpty())
  1243. {
  1244. continue;
  1245. }
  1246. string primyarTableFeldValue = dt.Rows[0][primarytablefiled].ToString();
  1247. if (primyarTableFeldValue.IsNullOrEmpty())
  1248. {
  1249. continue;
  1250. }
  1251. string subSql = string.Empty;
  1252. List<System.Data.IDataParameter> parList1 = new List<System.Data.IDataParameter>();
  1253. switch (dbconn.Type)
  1254. {
  1255. case "SqlServer":
  1256. subSql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", secondtable, secondtablerelationfield);
  1257. parList1.Add(new System.Data.SqlClient.SqlParameter("@pk", primyarTableFeldValue));
  1258. break;
  1259. case "Oracle":
  1260. subSql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", secondtable, secondtablerelationfield);
  1261. parList1.Add(new OracleParameter(":pk", primyarTableFeldValue));
  1262. break;
  1263. }
  1264. string[] colGuidArray = (System.Web.HttpContext.Current.Request.Form["hidden_guid_" + flowSubTableID] ?? "").Split(',');
  1265. System.Data.IDbDataAdapter dataAdapter1 = bdbconn.GetDataAdapter(conn, dbconn.Type, subSql, parList1.ToArray());
  1266. System.Data.DataSet ds1 = new System.Data.DataSet();
  1267. dataAdapter1.Fill(ds1);
  1268. System.Data.DataTable schemaDt1 = bdbconn.GetTableSchema(conn, secondtable, dbconn.Type);
  1269. System.Data.DataTable dt1 = ds1.Tables[0];
  1270. bool isInitNew = dt1.Rows.Count == 0;
  1271. foreach (string colGuid in colGuidArray)
  1272. {
  1273. bool isNew1 = true;
  1274. System.Data.DataRow dr1 = null;
  1275. foreach (System.Data.DataRow dr in dt1.Rows)
  1276. {
  1277. if (string.Compare(dr[secondtableprimarykey].ToString(), colGuid, 0) == 0)
  1278. {
  1279. dr1 = dr;
  1280. isNew1 = false;
  1281. break;
  1282. }
  1283. }
  1284. if (isNew1)
  1285. {
  1286. dr1 = dt1.NewRow();
  1287. dr1[secondtablerelationfield] = primyarTableFeldValue;
  1288. dt1.Rows.Add(dr1);
  1289. isNew1 = true;
  1290. }
  1291. #region 循环保存列数据
  1292. for (int i = 0; i < dt1.Columns.Count; i++)
  1293. {
  1294. string colnumName1 = dt1.Columns[i].ColumnName;
  1295. if (string.Compare(colnumName1, secondtableprimarykey, true) == 0
  1296. || string.Compare(colnumName1, secondtablerelationfield,0) ==0 )
  1297. {
  1298. continue;
  1299. }
  1300. string value1 = System.Web.HttpContext.Current.Request.Form[flowSubTableID + "_" + colGuid + "_" + secondtable + "_" + colnumName1];
  1301. if (value1 == null && !isNew1)
  1302. {
  1303. continue;
  1304. }
  1305. var colnum1 = dt1.Columns[i];
  1306. string colnumDataType1 = colnum1.DataType.FullName;
  1307. object defaultValue1 = string.Empty;
  1308. System.Data.DataRow[] schemaDrs1 = schemaDt1.Select(string.Format("f_name='{0}'", colnumName1));
  1309. bool hasDefault1 = schemaDrs1.Length > 0 && schemaDrs1[0]["cdefault"].ToString() != "0";//列是否有默认值
  1310. bool hasNull1 = schemaDrs1.Length > 0 && schemaDrs1[0]["is_null"].ToString() != "0";//列是否可以为空
  1311. bool isSet1 = getColnumIsValue(colnumDataType1, value1, out defaultValue1);
  1312. if (isSet1)
  1313. {
  1314. dr1[colnumName1] = value1;
  1315. }
  1316. else
  1317. {
  1318. if (!hasDefault1)
  1319. {
  1320. if (hasNull1)
  1321. {
  1322. dr1[colnumName1] = DBNull.Value;
  1323. }
  1324. else
  1325. {
  1326. dr1[colnumName1] = defaultValue1;
  1327. }
  1328. }
  1329. }
  1330. }
  1331. #endregion
  1332. }
  1333. #region 删除多余行
  1334. if (!isInitNew)
  1335. {
  1336. for (int i = 0; i < dt1.Rows.Count; i++)
  1337. {
  1338. bool isIn = false;
  1339. foreach (string colGuid in colGuidArray)
  1340. {
  1341. if (dt1.Rows[i][secondtableprimarykey].ToString().IsNullOrEmpty() || string.Compare(dt1.Rows[i][secondtableprimarykey].ToString(), colGuid, 0) == 0)
  1342. {
  1343. isIn = true;
  1344. break;
  1345. }
  1346. }
  1347. if (!isIn)
  1348. {
  1349. dt1.Rows[i].Delete();
  1350. }
  1351. }
  1352. }
  1353. #endregion
  1354. #region 检查从表如果数据库类型是Oracle并且主键是VARCHAR2,则要设置默认值(Oracle不能自动生成guid)
  1355. if ("Oracle" == dbconn.Type)
  1356. {
  1357. System.Data.DataRow[] schemaDrs2 = schemaDt1.Select(string.Format("f_name='{0}'", secondtableprimarykey));
  1358. bool isIdentity1 = schemaDrs2.Length>0 && schemaDrs2[0]["isidentity"].ToString() == "1";
  1359. if (!isIdentity)
  1360. {
  1361. foreach (System.Data.DataRow dr in dt1.Rows)
  1362. {
  1363. if (dr.RowState == System.Data.DataRowState.Added)
  1364. {
  1365. dr[secondtableprimarykey] = Guid.NewGuid();
  1366. }
  1367. }
  1368. }
  1369. }
  1370. #endregion
  1371. #region 执行保存
  1372. switch (dbconn.Type)
  1373. {
  1374. case "SqlServer":
  1375. System.Data.SqlClient.SqlCommandBuilder scb1 = new System.Data.SqlClient.SqlCommandBuilder((System.Data.SqlClient.SqlDataAdapter)dataAdapter1);
  1376. break;
  1377. //case "Oracle":
  1378. // OracleCommandBuilder ocb1 = new OracleCommandBuilder((OracleDataAdapter)dataAdapter1);
  1379. // break;
  1380. }
  1381. dataAdapter1.Update(ds1);
  1382. #endregion
  1383. }
  1384. #endregion
  1385. return instanceid;
  1386. }
  1387. }
  1388. /// <summary>
  1389. /// 判断列是否有值
  1390. /// </summary>
  1391. /// <param name="colnumDataType"></param>
  1392. /// <param name="value"></param>
  1393. /// <param name="defaultValue">默认值</param>
  1394. /// <returns></returns>
  1395. private bool getColnumIsValue(string colnumDataType, string value, out object defaultValue)
  1396. {
  1397. bool isSet = false;
  1398. defaultValue = null;
  1399. switch (colnumDataType)
  1400. {
  1401. case "System.Int16":
  1402. case "System.Int32":
  1403. case "System.Int64":
  1404. case "System.UInt16":
  1405. case "System.UInt32":
  1406. case "System.UInt64":
  1407. isSet = value.IsInt();
  1408. defaultValue = int.MinValue;
  1409. break;
  1410. case "System.String":
  1411. isSet = value != null;
  1412. defaultValue = "";
  1413. break;
  1414. case "System.Guid":
  1415. isSet = value.IsGuid();
  1416. defaultValue = Guid.Empty;
  1417. break;
  1418. case "System.Decimal":
  1419. isSet = value.IsDecimal();
  1420. defaultValue = decimal.MinValue;
  1421. break;
  1422. case "System.Double":
  1423. case "System.Single":
  1424. isSet = value.IsDouble();
  1425. defaultValue = double.MinValue;
  1426. break;
  1427. case "System.DateTime":
  1428. isSet = value.IsDateTime();
  1429. defaultValue = DateTime.MinValue;
  1430. break;
  1431. case "System.Object":
  1432. isSet = value != null;
  1433. defaultValue = "";
  1434. break;
  1435. case "System.Boolean":
  1436. isSet = value != null && (value.ToString().ToLower() == "false"
  1437. || value.ToString().ToLower() == "true");
  1438. defaultValue = 0;
  1439. break;
  1440. }
  1441. return isSet;
  1442. }
  1443. /// <summary>
  1444. /// 得到实例数据
  1445. /// </summary>
  1446. /// <param name="connid"></param>
  1447. /// <param name="table"></param>
  1448. /// <param name="pk"></param>
  1449. /// <param name="instanceid"></param>
  1450. /// <returns></returns>
  1451. public LitJson.JsonData GetFormData(string connid, string table, string pk, string instanceid, string filedStatus = "")
  1452. {
  1453. LitJson.JsonData jsonData = new LitJson.JsonData();
  1454. if (instanceid.IsNullOrEmpty())
  1455. {
  1456. return jsonData;
  1457. }
  1458. RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection();
  1459. RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(connid.ToGuid());
  1460. if (dbconn == null)
  1461. {
  1462. return "";
  1463. }
  1464. using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn))
  1465. {
  1466. if (conn == null)
  1467. {
  1468. return "";
  1469. }
  1470. try
  1471. {
  1472. conn.Open();
  1473. }
  1474. catch (Exception ex)
  1475. {
  1476. System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message);
  1477. RoadFlow.Platform.Log.Add(ex);
  1478. }
  1479. string sql = string.Empty;
  1480. List<System.Data.IDataParameter> parList = new List<System.Data.IDataParameter>();
  1481. switch (dbconn.Type)
  1482. {
  1483. case "SqlServer":
  1484. sql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", table, pk);
  1485. parList.Add(new System.Data.SqlClient.SqlParameter("@pk", instanceid));
  1486. break;
  1487. case "Oracle":
  1488. sql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", table, pk);
  1489. parList.Add(new OracleParameter(":pk", instanceid));
  1490. break;
  1491. }
  1492. System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray());
  1493. System.Data.DataSet ds = new System.Data.DataSet();
  1494. dataAdapter.Fill(ds);
  1495. if (dataAdapter.SelectCommand != null)
  1496. {
  1497. dataAdapter.SelectCommand.Dispose();
  1498. }
  1499. System.Data.DataTable dt = ds.Tables[0];
  1500. LitJson.JsonData json = null;
  1501. if (!filedStatus.IsNullOrEmpty())
  1502. {
  1503. json = LitJson.JsonMapper.ToObject(filedStatus);
  1504. }
  1505. if (dt.Rows.Count > 0)
  1506. {
  1507. System.Data.DataRow dr = dt.Rows[0];
  1508. for (int i = 0; i < dt.Columns.Count; i++)
  1509. {
  1510. bool isShow = true;
  1511. string fileName=table + "_" + dt.Columns[i].ColumnName;
  1512. if (json != null && json.ContainsKey(fileName))
  1513. {
  1514. string status = json[fileName].ToString();
  1515. if (!status.IsNullOrEmpty())
  1516. {
  1517. string[] statusArray = status.Split('_');
  1518. if (statusArray.Length == 2 && "2" == statusArray[0])
  1519. {
  1520. isShow = false;
  1521. }
  1522. }
  1523. }
  1524. //string value = dr[dt.Columns[i].ColumnName].ToString();
  1525. jsonData[fileName] = isShow ? dr[dt.Columns[i].ColumnName].ToString() : "";
  1526. }
  1527. }
  1528. }
  1529. return jsonData;
  1530. }
  1531. /// <summary>
  1532. /// 得到实例数据
  1533. /// </summary>
  1534. /// <param name="connid"></param>
  1535. /// <param name="table"></param>
  1536. /// <param name="pk"></param>
  1537. /// <param name="instanceid"></param>
  1538. /// <returns>json字符串</returns>
  1539. public string GetFormDataJsonString(string connid, string table, string pk, string instanceid)
  1540. {
  1541. LitJson.JsonData jsonData = GetFormData(connid, table, pk, instanceid);
  1542. return GetFormDataJsonString(jsonData);
  1543. }
  1544. /// <summary>
  1545. /// 得到实例数据
  1546. /// </summary>
  1547. /// <param name="jsonData"></param>
  1548. /// <returns>json字符串</returns>
  1549. public string GetFormDataJsonString(LitJson.JsonData jsonData)
  1550. {
  1551. string json = jsonData.ToJson();
  1552. return json.IsNullOrEmpty() ? "{}" : json;
  1553. }
  1554. /// <summary>
  1555. /// 得到从表数据
  1556. /// </summary>
  1557. /// <param name="connID">连接ID</param>
  1558. /// <param name="secondTable">从表名称</param>
  1559. /// <param name="relationField">关联字段</param>
  1560. /// <param name="fieldValue">关联字段值</param>
  1561. /// <param name="sortField">排序字段</param>
  1562. /// <returns></returns>
  1563. public LitJson.JsonData GetSubTableData(string connID, string secondTable, string relationField, string fieldValue, string sortField = "")
  1564. {
  1565. LitJson.JsonData jsonData = new LitJson.JsonData();
  1566. if (fieldValue.IsNullOrEmpty())
  1567. {
  1568. return jsonData;
  1569. }
  1570. RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection();
  1571. RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(connID.ToGuid());
  1572. if (dbconn == null)
  1573. {
  1574. return "";
  1575. }
  1576. using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn))
  1577. {
  1578. if (conn == null)
  1579. {
  1580. return "";
  1581. }
  1582. try
  1583. {
  1584. conn.Open();
  1585. }
  1586. catch (Exception ex)
  1587. {
  1588. System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message);
  1589. RoadFlow.Platform.Log.Add(ex);
  1590. }
  1591. string sql = string.Empty;
  1592. List<System.Data.IDataParameter> parList = new List<System.Data.IDataParameter>();
  1593. switch (dbconn.Type)
  1594. {
  1595. case "SqlServer":
  1596. sql = string.Format("SELECT * FROM {0} WHERE {1}=@fieldvalue {2}", secondTable, relationField,
  1597. (sortField.IsNullOrEmpty() ? "" : string.Concat("ORDER BY ", sortField)));
  1598. parList.Add(new System.Data.SqlClient.SqlParameter("@fieldvalue", fieldValue));
  1599. break;
  1600. case "Oracle":
  1601. sql = string.Format("SELECT * FROM {0} WHERE {1}=:fieldvalue {2}", secondTable, relationField,
  1602. (sortField.IsNullOrEmpty() ? "" : string.Concat("ORDER BY ", sortField)));
  1603. parList.Add(new OracleParameter(":fieldvalue", fieldValue));
  1604. break;
  1605. }
  1606. System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray());
  1607. System.Data.DataSet ds = new System.Data.DataSet();
  1608. dataAdapter.Fill(ds);
  1609. if (dataAdapter.SelectCommand != null)
  1610. {
  1611. dataAdapter.SelectCommand.Dispose();
  1612. }
  1613. System.Data.DataTable dt = ds.Tables[0];
  1614. //jsonData.SetJsonType(LitJson.JsonType.Array);
  1615. foreach (System.Data.DataRow dr in dt.Rows)
  1616. {
  1617. LitJson.JsonData data = new LitJson.JsonData();
  1618. for (int i = 0; i < dt.Columns.Count; i++)
  1619. {
  1620. data[secondTable + "_" + dt.Columns[i].ColumnName] = dr[dt.Columns[i].ColumnName].ToString();
  1621. }
  1622. jsonData.Add(data);
  1623. }
  1624. }
  1625. return jsonData;
  1626. }
  1627. /// <summary>
  1628. /// 得到实例某个字段的值
  1629. /// </summary>
  1630. /// <param name="jsonData"></param>
  1631. /// <param name="table"></param>
  1632. /// <param name="field"></param>
  1633. /// <returns></returns>
  1634. public string GetFromFieldData(LitJson.JsonData jsonData, string table, string field)
  1635. {
  1636. string value = string.Empty;
  1637. if (jsonData == null || table.IsNullOrEmpty() || field.IsNullOrEmpty())
  1638. {
  1639. return value;
  1640. }
  1641. var key = string.Concat(table, "_", field);
  1642. if (!jsonData.ContainsKey(key))
  1643. {
  1644. return value;
  1645. }
  1646. value = jsonData[key].ToString();
  1647. return value;
  1648. }
  1649. /// <summary>
  1650. /// 得到一个流程一个步骤的字段状态设置
  1651. /// </summary>
  1652. /// <param name="flowID"></param>
  1653. /// <param name="stepID"></param>
  1654. /// <returns></returns>
  1655. public string GetFieldStatus(string flowID, string stepID)
  1656. {
  1657. Guid fid, sid;
  1658. if(!flowID.IsGuid(out fid))
  1659. {
  1660. return "{}";
  1661. }
  1662. var wfinstance = GetWorkFlowRunModel(fid);
  1663. if (wfinstance == null)
  1664. {
  1665. return "{}";
  1666. }
  1667. if (!stepID.IsGuid(out sid))
  1668. {
  1669. sid=wfinstance.FirstStepID;
  1670. }
  1671. var steps = wfinstance.Steps.Where(p => p.ID == sid);
  1672. if (steps.Count() == 0)
  1673. {
  1674. return "{}";
  1675. }
  1676. var step = steps.First();
  1677. var fieldStatus = step.FieldStatus;
  1678. StringBuilder sb = new StringBuilder("{");
  1679. int count = fieldStatus.Count();
  1680. int i = 0;
  1681. foreach (var fs in fieldStatus)
  1682. {
  1683. var fields = fs.Field.Split('.');
  1684. if (fields.Length != 3)
  1685. {
  1686. continue;
  1687. }
  1688. var fieldName = fields[1] + "_" + fields[2];
  1689. sb.AppendFormat("\"{0}\":\"{1}\"", fieldName, string.Concat(fs.Status1, "_", fs.Check));
  1690. if (i++ < count - 1)
  1691. {
  1692. sb.Append(",");
  1693. }
  1694. }
  1695. return sb.ToString() + "}";
  1696. }
  1697. /// <summary>
  1698. /// 得到下级ID字符串
  1699. /// </summary>
  1700. /// <param name="id"></param>
  1701. /// <returns></returns>
  1702. public string GetAllChildsIDString(Guid id, bool isSelf = true)
  1703. {
  1704. return new Dictionary().GetAllChildsIDString(id, true);
  1705. }
  1706. /// <summary>
  1707. /// 得到类型选择项
  1708. /// </summary>
  1709. /// <returns></returns>
  1710. public string GetTypeOptions(string value = "")
  1711. {
  1712. return new Dictionary().GetOptionsByCode("FlowTypes", Dictionary.OptionValueField.ID, value);
  1713. }
  1714. /// <summary>
  1715. /// 查询所有记录
  1716. /// </summary>
  1717. public List<RoadFlow.Data.Model.WorkFlow> GetByTypes(string typeString)
  1718. {
  1719. return dataWorkFlow.GetByTypes(typeString);
  1720. }
  1721. /// <summary>
  1722. /// 得到一个类型下的流程ID
  1723. /// </summary>
  1724. /// <param name="typeID"></param>
  1725. /// <returns></returns>
  1726. public string GetFlowIDFromType(Guid typeID)
  1727. {
  1728. var flows = GetByTypes(GetAllChildsIDString(typeID));
  1729. StringBuilder sb = new StringBuilder();
  1730. foreach (var flow in flows)
  1731. {
  1732. sb.Append(flow.ID);
  1733. sb.Append(",");
  1734. }
  1735. return sb.ToString().TrimEnd(',');
  1736. }
  1737. /// <summary>
  1738. /// 得到流程类型选项
  1739. /// </summary>
  1740. /// <param name="type"></param>
  1741. /// <returns></returns>
  1742. public string GetFlowTypeOptions(string type)
  1743. {
  1744. List<System.Web.UI.WebControls.ListItem> items = new List<System.Web.UI.WebControls.ListItem>() {
  1745. new System.Web.UI.WebControls.ListItem("常规流程","0"){Selected="0"==type},
  1746. new System.Web.UI.WebControls.ListItem("自由流程","1"){Selected="1"==type}
  1747. };
  1748. return Utility.Tools.GetOptionsString(items.ToArray());
  1749. }
  1750. /// <summary>
  1751. /// 得到一个自由流程步骤实体
  1752. /// </summary>
  1753. /// <returns></returns>
  1754. public RoadFlow.Data.Model.WorkFlowInstalledSub.Step GetFreeFlowStep(RoadFlow.Data.Model.WorkFlowInstalled wfInstalled)
  1755. {
  1756. RoadFlow.Data.Model.WorkFlowInstalledSub.Step step = new Data.Model.WorkFlowInstalledSub.Step();
  1757. var firstSteps = wfInstalled.Steps.Where(p => p.ID == wfInstalled.FirstStepID);
  1758. if (firstSteps.Count() == 0)
  1759. {
  1760. return step;
  1761. }
  1762. step = firstSteps.First();
  1763. step.ID = Guid.NewGuid();
  1764. step.Name = wfInstalled.Name + "-审核";
  1765. step.Buttons = new List<RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button>() {
  1766. new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  1767. {
  1768. ID = "3B271F67-0433-4082-AD1A-8DF1B967B879",Note = "保存",Sort = 0
  1769. },
  1770. new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  1771. {
  1772. ID = "86B7FA6C-891F-4565-9309-81672D3BA80A",Note = "退回",Sort = 1
  1773. },
  1774. new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  1775. {
  1776. ID = "8982B97C-ADBA-4A3A-AFD9-9A3EF6FF12D8",Note = "发送",Sort = 2
  1777. },
  1778. new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  1779. {
  1780. ID = "other_splitline",Note = "",Sort = 3
  1781. },
  1782. new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button()
  1783. {
  1784. ID = "954EFFA8-03B8-461A-AAA8-8727D090DCB9",Note = "结束流程",Sort = 4
  1785. }
  1786. };
  1787. return step;
  1788. }
  1789. }
  1790. }