CommonHelper.cs 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. using DirectService.Tools;
  2. using JLHHJSvr.BLL;
  3. using JLHHJSvr.Com;
  4. using JLHHJSvr.LJException;
  5. using LJLib.DAL.SQL;
  6. using LJLib.SQLEX;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. using PhoneUI.BLL.L1BLL;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data;
  13. using System.Data.SqlClient;
  14. using System.Diagnostics;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Text.RegularExpressions;
  19. using System.Xml;
  20. namespace JLHHJSvr.Helper
  21. {
  22. internal class CommonHelper : HelperBase
  23. {
  24. public CommonDynamicSelectResponse ExecuteDynamicSelect(
  25. string dsname,
  26. JObject queryParams,
  27. int pageIndex = 1,
  28. int pageSize = 50,
  29. string orderStr = null,
  30. string dwName = null,
  31. string itemName = null,
  32. byte ifCompress = 0)
  33. {
  34. if (string.IsNullOrEmpty(dsname))
  35. {
  36. throw new ArgumentNullException("dsname");
  37. }
  38. if (queryParams == null)
  39. {
  40. throw new ArgumentNullException("queryparams");
  41. }
  42. if (context?.tokendata == null)
  43. {
  44. throw new InvalidOperationException("用户上下文或token为空");
  45. }
  46. var request = new CommonDynamicSelectRequest
  47. {
  48. dsname = dsname,
  49. queryparams = queryParams,
  50. orderstr = orderStr,
  51. pageindex = pageIndex,
  52. pagesize = pageSize,
  53. dwname = dwName,
  54. itemname = itemName,
  55. ifcompress = ifCompress
  56. };
  57. var rsltGroup = GetXmlResult(cmd, request.dsname, request, context.tokendata, false);
  58. return new CommonDynamicSelectResponse
  59. {
  60. datatable = rsltGroup.datatable,
  61. tableinfo = rsltGroup.tableinfo,
  62. totalcnt = rsltGroup.totalcnt,
  63. pageindex = rsltGroup.pageindex,
  64. pagesize = rsltGroup.pagesize
  65. };
  66. }
  67. public CommonDynamicSelectResponse ExecuteDynamicSelectWithContext(
  68. string dsname,
  69. JObject queryParams,
  70. int pageIndex = 1,
  71. int pageSize = 50,
  72. string orderStr = null,
  73. string dwName = null,
  74. string itemName = null,
  75. byte ifCompress = 0)
  76. {
  77. return ExecuteDynamicSelect(dsname, queryParams, pageIndex, pageSize, orderStr, dwName, itemName, ifCompress);
  78. }
  79. public List<T> ExecuteDynamicSelectToList<T>(
  80. string dsname,
  81. JObject queryParams,
  82. int pageIndex = 1,
  83. int pageSize = 50,
  84. string orderStr = null,
  85. string dwName = null,
  86. string itemName = null,
  87. byte ifCompress = 0)
  88. {
  89. var response = ExecuteDynamicSelect(dsname, queryParams, pageIndex, pageSize, orderStr, dwName, itemName, ifCompress);
  90. if (!string.IsNullOrEmpty(response.ErrMsg))
  91. {
  92. throw new Exception(response.ErrMsg);
  93. }
  94. return response.datatable?.ToObject<List<T>>() ?? new List<T>();
  95. }
  96. public List<T> ExecuteDynamicSelectToListWithContext<T>(
  97. string dsname,
  98. JObject queryParams,
  99. int pageIndex = 1,
  100. int pageSize = 50,
  101. string orderStr = null,
  102. string dwName = null,
  103. string itemName = null,
  104. byte ifCompress = 0)
  105. {
  106. return ExecuteDynamicSelectToList<T>(dsname, queryParams, pageIndex, pageSize, orderStr, dwName, itemName, ifCompress);
  107. }
  108. public List<KeyValuePair<string, string>> GetDictionaryData(
  109. string dsname,
  110. JObject queryParams = null,
  111. string valueField = "value",
  112. string labelField = "label",
  113. int pageSize = 1000)
  114. {
  115. var response = ExecuteDynamicSelect(dsname, queryParams ?? new JObject(), 1, pageSize);
  116. var result = new List<KeyValuePair<string, string>>();
  117. if (response.datatable == null)
  118. {
  119. return result;
  120. }
  121. foreach (var item in response.datatable)
  122. {
  123. var value = item[valueField]?.ToString() ?? string.Empty;
  124. var label = item[labelField]?.ToString() ?? string.Empty;
  125. if (!string.IsNullOrEmpty(value))
  126. {
  127. result.Add(new KeyValuePair<string, string>(value, label));
  128. }
  129. }
  130. return result;
  131. }
  132. public bool CheckDataExists(string dsname, JObject queryParams)
  133. {
  134. var response = ExecuteDynamicSelect(dsname, queryParams, 1, 1);
  135. return response.datatable != null && response.datatable.Count > 0;
  136. }
  137. public int GetDataCount(string dsname, JObject queryParams)
  138. {
  139. var response = ExecuteDynamicSelect(dsname, queryParams, 1, 1);
  140. return response.totalcnt;
  141. }
  142. private const string _mapperAppend = "_Mapper_";
  143. private Regex _staticParmReg = new Regex("[\\$]+[\\w]+[\\$]*");
  144. private Regex _listParmReg = new Regex("@@[\\w]+@@");
  145. private Dictionary<string, string> _xmlEscapeMap = new Dictionary<string, string>
  146. {
  147. {"&", "&amp;"},
  148. {"'", "&apos;"},
  149. {"\"", "&quot;"},
  150. {">", "&gt;"},
  151. {"<", "&lt;"},
  152. };
  153. private Regex _computeRefReg = new Regex("([A-Za-z_][\\w]+)([\\s]*)([(]*)");
  154. private QueryResult GetXmlResult(SqlCommand cmd, string dsname, CommonDynamicSelectRequest request, TokenData tokendata, bool ifmapper)
  155. {
  156. var rslt = new QueryResult();
  157. var rootPath = GlobalVar.App_Data + "\\DataStore\\";
  158. #if DEBUG
  159. rootPath = rootPath.Substring(0, rootPath.IndexOf("\\bin\\")) + "\\DataStore\\";
  160. #endif
  161. var filePath = rootPath + dsname + ".xml";
  162. if (!File.Exists(filePath))
  163. {
  164. throw new LJCommonException("缺失接口文件:" + dsname + ".xml");
  165. }
  166. var queryParams = request.queryparams;
  167. var wholexml = File.ReadAllText(filePath);
  168. var treatedsb = new StringBuilder();
  169. // 逐行扫描,检查全局变量与转义符
  170. var staticParmDic = new Dictionary<string, string>();
  171. using (StringReader reader = new StringReader(wholexml))
  172. {
  173. var incomment = false;
  174. string line;
  175. while ((line = reader.ReadLine()) != null)
  176. {
  177. var lineTrim = line.Trim();
  178. if (line.Contains("<!--"))
  179. {
  180. incomment = true;
  181. var commentStartIndex = line.IndexOf("<!--");
  182. if (commentStartIndex > 0)
  183. {
  184. treatedsb.AppendLine(line.Substring(0, commentStartIndex));
  185. }
  186. }
  187. if (incomment)
  188. {
  189. if (line.Contains("-->"))
  190. {
  191. incomment = false;
  192. var commenttail = line.Substring(line.IndexOf("-->") + 3);
  193. if (!string.IsNullOrEmpty(commenttail))
  194. {
  195. treatedsb.AppendLine(commenttail);
  196. }
  197. }
  198. continue;
  199. }
  200. // 处理$标记的全局变量
  201. var staticMatches = _staticParmReg.Matches(line);
  202. var staticMatchesStr = new HashSet<string>();
  203. foreach (var match in staticMatches)
  204. {
  205. var matchstr = match.ToString();
  206. staticMatchesStr.Add(matchstr);
  207. if (matchstr.StartsWith("$$"))
  208. {
  209. }
  210. else if (matchstr.StartsWith("$"))
  211. {
  212. var newname = "@" + matchstr.Substring(1);
  213. }
  214. }
  215. //$$开头$$结束为全局数组变量,直接作字符串替换
  216. foreach (var item in staticMatchesStr.Where(x => x.StartsWith("$$")))
  217. {
  218. if (!staticParmDic.ContainsKey(item))
  219. {
  220. var staticParm = item.Trim('$');
  221. var staticVal = string.Empty;
  222. if (staticParm == "user_deptstr")
  223. {
  224. var getPower = UserHelper.getPowerDept(cmd, tokendata.empid);
  225. if (getPower.Count == 0) getPower.Add(-1);
  226. staticVal = ListEx.getString(getPower);
  227. }else if (staticParm == "user_outrepstr")
  228. {
  229. var getPower = UserHelper.getPowerOutRep(cmd, tokendata.empid);
  230. if (getPower.Count == 0) getPower.Add("");
  231. staticVal = ListEx.getString(getPower);
  232. }
  233. staticVal = staticVal ?? string.Empty;
  234. staticParmDic[item] = staticVal.Trim(new[] { '(', ')' });
  235. }
  236. if (lineTrim.StartsWith("<") && lineTrim.EndsWith(">"))
  237. {
  238. //xml标签
  239. }
  240. else
  241. {
  242. var staticVal = staticParmDic[item];
  243. line = line.Replace(item, staticVal);
  244. }
  245. }
  246. // $开头的全局变量转换为@开头的变量
  247. foreach (var item in staticMatchesStr.Where(x => x.StartsWith("$") && !x.StartsWith("$$")))
  248. {
  249. var staticParm = item.Trim('$');
  250. if (!queryParams.ContainsKey(staticParm))
  251. {
  252. if (staticParm.StartsWith("user_"))
  253. {
  254. // 查询用户权限值
  255. var keyStr = staticParm.Substring("user_".Length);
  256. var userKeyStr = "0";
  257. cmd.CommandText = @"select " + keyStr + " from u_user_jlhprice where empid = @empid";
  258. cmd.Parameters.Clear();
  259. cmd.Parameters.AddWithValue("@empid", tokendata.userid);
  260. using (var UserReader = cmd.ExecuteReader())
  261. {
  262. if (UserReader.Read())
  263. {
  264. userKeyStr = Convert.ToString(UserReader[keyStr]).Trim();
  265. }
  266. }
  267. queryParams[staticParm] = userKeyStr;
  268. }
  269. else
  270. {
  271. throw new NotImplementedException(staticParm);
  272. }
  273. }
  274. line = line.Replace(item, "@" + item.Substring(1));
  275. }
  276. if (lineTrim.StartsWith("<") && lineTrim.EndsWith(">"))
  277. {
  278. //xml标签
  279. line = line.Replace(" $", " ");
  280. line = line.Replace(" @", " ");
  281. line = line.Replace("!=\"", "_notequals=\"");
  282. }
  283. else
  284. {
  285. // 处理@@标记的数组变量
  286. var listParmMatches = _listParmReg.Matches(line);
  287. foreach (var match in listParmMatches)
  288. {
  289. var matchstr = match.ToString();
  290. var pname = matchstr.Trim('@');
  291. if (!queryParams.ContainsKey(pname))
  292. {
  293. continue;
  294. //throw new LJCommonException($"未提供参数" + pname);
  295. }
  296. if (queryParams.GetValue(pname).Type != JTokenType.Array)
  297. {
  298. continue;
  299. }
  300. var listval = queryParams.Value<JArray>(pname).Select(x => "'" + x + "'");
  301. var pval = string.Join(",", listval);
  302. line = line.Replace(matchstr, pval);
  303. }
  304. // 处理转义字符
  305. foreach (var escapeItem in _xmlEscapeMap)
  306. {
  307. line = line.Replace(escapeItem.Key, escapeItem.Value);
  308. }
  309. }
  310. treatedsb.AppendLine(line);
  311. }
  312. }
  313. var treatedxml = treatedsb.ToString();
  314. var xmlDoc = new XmlDocument();
  315. xmlDoc.LoadXml(treatedxml);
  316. XmlNode selectNode = null;
  317. XmlNode rootNode = null;
  318. foreach (XmlNode rchild in xmlDoc.ChildNodes)
  319. {
  320. if (rchild.Name != "xml")
  321. {
  322. rootNode = rchild;
  323. break;
  324. }
  325. }
  326. if (rootNode == null)
  327. {
  328. throw new LJCommonException("格式错误,不存在根节点");
  329. }
  330. if (rootNode.Name == "data")
  331. {
  332. var dataChild = rootNode.FirstChild;
  333. if (dataChild == null)
  334. {
  335. throw new LJCommonException("格式错误,data不存在根节点");
  336. }
  337. if (dataChild.Name == "json")
  338. {
  339. var dataJson = dataChild.InnerText;
  340. rslt.datatable = JsonConvert.DeserializeObject<JArray>(dataJson);
  341. return rslt;
  342. }
  343. else
  344. {
  345. throw new LJCommonException("未支持的data节点:" + dataChild.Name);
  346. }
  347. }
  348. else if (rootNode.Name == "select")
  349. {
  350. selectNode = rootNode;
  351. }
  352. else
  353. {
  354. throw new LJCommonException("未支持的根节点:" + rootNode.Name);
  355. }
  356. var selectbase = string.Empty;
  357. var selectstr = selectNode.SelectSingleNode("selectstr")?.InnerText;
  358. var orderstr = selectNode.SelectSingleNode("orderstr")?.InnerText;
  359. var whereList = new List<string>();
  360. var whereNode = selectNode.SelectSingleNode("where");
  361. if (whereNode != null)
  362. {
  363. foreach (XmlNode whereChild in whereNode.ChildNodes)
  364. {
  365. if (whereChild.Name == "when")
  366. {
  367. var match = true;
  368. foreach (XmlAttribute attr in whereChild.Attributes)
  369. {
  370. var attrname = attr.Name;
  371. var attrval = attr.Value;
  372. JToken valjtoken = null;
  373. if (attrval.StartsWith("@"))
  374. {
  375. var pname = attrval.Replace("@", "");
  376. attrval = null;
  377. if (queryParams.ContainsKey(pname))
  378. {
  379. valjtoken = queryParams[pname];
  380. switch (valjtoken.Type)
  381. {
  382. case JTokenType.Null:
  383. case JTokenType.None:
  384. case JTokenType.Undefined:
  385. attrval = null;
  386. break;
  387. case JTokenType.Object:
  388. case JTokenType.Array:
  389. attrval = valjtoken.ToString();
  390. break;
  391. default:
  392. attrval = valjtoken.ToString();
  393. break;
  394. }
  395. }
  396. }
  397. if (attrname == "notnull")
  398. {
  399. if (attrval == null)
  400. {
  401. match = false;
  402. break;
  403. }
  404. }
  405. else if (attrname == "notempty")
  406. {
  407. if (valjtoken == null || string.IsNullOrEmpty(valjtoken.ToString()))
  408. {
  409. match = false;
  410. break;
  411. }
  412. if (valjtoken.Type == JTokenType.Array)
  413. {
  414. if ((valjtoken as JArray).Count == 0)
  415. {
  416. match = false;
  417. break;
  418. }
  419. }
  420. }
  421. else
  422. {
  423. var ifnot = false;
  424. var attrnameVal = attrname.TrimStart('@');
  425. if (attrnameVal.EndsWith("_notequals"))
  426. {
  427. ifnot = true;
  428. attrnameVal = attrnameVal.Substring(0, attrnameVal.IndexOf("_notequals"));
  429. }
  430. if (!queryParams.ContainsKey(attrnameVal))
  431. {
  432. throw new ArgumentException("queryparams." + attrnameVal);
  433. }
  434. attrnameVal = queryParams[attrnameVal].ToString();
  435. if (string.Equals(attrnameVal, attrval) != !ifnot)
  436. {
  437. match = false;
  438. break;
  439. }
  440. }
  441. }
  442. if (match)
  443. {
  444. whereList.Add(whereChild.InnerText.Trim());
  445. }
  446. }
  447. else
  448. {
  449. throw new NotImplementedException();
  450. }
  451. }
  452. }
  453. var wherestr = ListEx.GetWhereStr(whereList);
  454. var parmDic = new Dictionary<string, object>();
  455. foreach (var item in queryParams)
  456. {
  457. if (item.Value is JArray)
  458. {
  459. }
  460. else
  461. {
  462. parmDic[item.Key] = item.Value.ToString();
  463. }
  464. }
  465. var displayfields = selectNode.SelectSingleNode("displayfields");
  466. var uncomputefields = new Dictionary<string, string>();
  467. string rownumfield = null;
  468. foreach (XmlNode fieldNode in displayfields)
  469. {
  470. string field = null;
  471. XmlAttribute computeAttr = null;
  472. foreach (XmlAttribute attr in fieldNode.Attributes)
  473. {
  474. if (string.Equals(attr.Name, "field", StringComparison.OrdinalIgnoreCase))
  475. {
  476. field = attr.Value;
  477. }
  478. else if (string.Equals(attr.Name, "compute", StringComparison.OrdinalIgnoreCase))
  479. {
  480. computeAttr = attr;
  481. }
  482. }
  483. if (computeAttr != null)
  484. {
  485. var computeexpr = computeAttr.Value;
  486. if (!string.IsNullOrEmpty(computeexpr))
  487. {
  488. if (computeexpr.IndexOf("getrow(", StringComparison.OrdinalIgnoreCase) >= 0)
  489. {
  490. rownumfield = field;
  491. }
  492. else
  493. {
  494. uncomputefields[field] = computeexpr;
  495. }
  496. fieldNode.Attributes.Remove(computeAttr);
  497. }
  498. }
  499. }
  500. var parseResult = SqlStrHelper.ParseSelectStr(selectstr);
  501. if (parseResult.selectStr.ToUpper().Contains("DISTINCT"))
  502. {
  503. throw new NotImplementedException("未支持DISTINCT");
  504. }
  505. if (uncomputefields.Count > 0)
  506. {
  507. // 多次循环,防因嵌套解析失败
  508. var checkcnt = uncomputefields.Count;
  509. for (var i = 0; i < checkcnt; i++)
  510. {
  511. if (uncomputefields.Count == 0)
  512. {
  513. break;
  514. }
  515. var flist = uncomputefields.Keys.ToList();
  516. foreach (var compf in flist)
  517. {
  518. if (!uncomputefields.ContainsKey(compf))
  519. {
  520. continue;
  521. }
  522. var waitnext = false;
  523. var computeexpr = uncomputefields[compf];
  524. var refMatches = _computeRefReg.Matches(computeexpr);
  525. var refFields = new HashSet<string>();
  526. foreach (Match refmatch in refMatches)
  527. {
  528. if (string.IsNullOrEmpty(refmatch.Groups[3].ToString()))
  529. {
  530. var refField = refmatch.Groups[1].ToString();
  531. if (!parseResult.selectFieldsDic.ContainsKey(refField))
  532. {
  533. waitnext = true;
  534. break;
  535. }
  536. refFields.Add(refField);
  537. }
  538. }
  539. if (waitnext)
  540. {
  541. continue;
  542. }
  543. var refSorts = refFields.OrderByDescending(x => x.Length).ToList();
  544. var holderid = -1;
  545. foreach (var reff in refSorts)
  546. {
  547. holderid++;
  548. computeexpr = computeexpr.Replace(reff, "{" + holderid.ToString("000") + "}");
  549. }
  550. for (var hindex = 0; hindex <= holderid; hindex++)
  551. {
  552. var reff = refSorts[hindex];
  553. var refselect = parseResult.selectFieldsDic[reff];
  554. var asIndex = refselect.LastIndexOf(" as ", StringComparison.OrdinalIgnoreCase);
  555. if (asIndex > 0)
  556. {
  557. var asname = refselect.Substring(asIndex + " as ".Length).Trim();
  558. if (string.Equals(asname, reff, StringComparison.OrdinalIgnoreCase))
  559. {
  560. refselect = refselect.Substring(0, asIndex).Trim();
  561. }
  562. }
  563. computeexpr = computeexpr.Replace("{" + hindex.ToString("000") + "}", "(" + refselect + ")");
  564. }
  565. parseResult.selectFieldsDic[compf] = computeexpr + " AS " + compf;
  566. uncomputefields.Remove(compf);
  567. }
  568. }
  569. if (uncomputefields.Count > 0)
  570. {
  571. throw new LJCommonException($"解析计算列失败:[{string.Join(",", uncomputefields.Keys)}]");
  572. }
  573. }
  574. if (!string.IsNullOrEmpty(request.orderstr?.Trim()))
  575. {
  576. var orderArr = request.orderstr.Split(',');
  577. var orderlist = new List<string>();
  578. foreach (var orderitem in orderArr)
  579. {
  580. var orderfield = orderitem.Trim();
  581. var descIndex = orderfield.IndexOf(" desc");
  582. if (descIndex > 0)
  583. {
  584. orderfield = orderfield.Substring(0, descIndex).Trim();
  585. }
  586. var ascIndex = orderfield.IndexOf(" asc");
  587. if (ascIndex > 0)
  588. {
  589. orderfield = orderfield.Substring(0, ascIndex).Trim();
  590. }
  591. if (!parseResult.selectFieldsDic.ContainsKey(orderfield))
  592. {
  593. throw new LJCommonException($"排序失败,数据列中不包含[{orderfield}]");
  594. }
  595. var dbfield = parseResult.selectFieldsDic[orderfield];
  596. dbfield = RemoveAS(dbfield);
  597. if (descIndex > 0)
  598. {
  599. dbfield += " desc";
  600. }
  601. orderlist.Add(dbfield);
  602. }
  603. orderstr = string.Join(",", orderlist);
  604. }
  605. var mergesql = SqlStrHelper.BuildSelectStrL1(parseResult, string.Join(",", parseResult.selectFieldsDic.Keys), wherestr, orderstr, request.pageindex, request.pagesize);
  606. cmd.CommandText = mergesql;
  607. cmd.CommandType = CommandType.Text;
  608. cmd.Parameters.Clear();
  609. if (queryParams != null)
  610. {
  611. foreach (var item in queryParams)
  612. {
  613. if (item.Value == null)
  614. {
  615. cmd.Parameters.AddWithValue("@" + item.Key, DBNull.Value);
  616. }
  617. else
  618. {
  619. object pval = null;
  620. switch (item.Value.Type)
  621. {
  622. case JTokenType.Array:
  623. continue;
  624. case JTokenType.Integer:
  625. pval = Convert.ToInt64(item.Value);
  626. break;
  627. case JTokenType.Float:
  628. pval = Convert.ToDecimal(item.Value);
  629. break;
  630. case JTokenType.Boolean:
  631. pval = Convert.ToBoolean(item.Value);
  632. break;
  633. default:
  634. pval = item.Value.ToString();
  635. break;
  636. }
  637. cmd.Parameters.AddWithValue("@" + item.Key, pval);
  638. }
  639. }
  640. }
  641. rslt.datatable = new JArray();
  642. var dbcolnames = parseResult.selectFieldsDic.Keys.ToList();
  643. var rownum = (request.pageindex - 1) * request.pagesize;
  644. if (rownum < 0)
  645. {
  646. rownum = 0;
  647. }
  648. using (var reader = cmd.ExecuteReader())
  649. {
  650. while (reader.Read())
  651. {
  652. rownum++;
  653. var row = new JObject();
  654. if (rownumfield != null)
  655. {
  656. row.Add(rownumfield, rownum);
  657. }
  658. for (var i = 0; i < dbcolnames.Count; i++)
  659. {
  660. var p = dbcolnames[i];
  661. var dbval = reader[p];
  662. if (ifmapper)
  663. {
  664. if (i == 0)
  665. {
  666. p = "value";
  667. }
  668. else if (i == 1)
  669. {
  670. p = "label";
  671. }
  672. }
  673. if (dbval == DBNull.Value)
  674. {
  675. row.Add(p, null);
  676. }
  677. else if (dbval is string)
  678. {
  679. row.Add(p, (dbval as string).TrimEnd());
  680. }
  681. else if (dbval is DateTime)
  682. {
  683. row.Add(p, (DateTime)dbval);
  684. }
  685. else
  686. {
  687. row.Add(p, JToken.FromObject(dbval));
  688. }
  689. }
  690. rslt.datatable.Add(row);
  691. }
  692. }
  693. // 处理总行数
  694. if (!ifmapper)
  695. {
  696. string countstr = parseResult.selectStr + " COUNT(0) " + parseResult.fromStr;
  697. if (!string.IsNullOrEmpty(wherestr))
  698. {
  699. countstr += " WHERE " + wherestr;
  700. }
  701. cmd.CommandText = countstr;
  702. try
  703. {
  704. var totalcnt = Convert.ToInt32(cmd.ExecuteScalar());
  705. rslt.totalcnt = totalcnt;
  706. rslt.pageindex = request.pageindex;
  707. rslt.pagesize = request.pagesize;
  708. }
  709. catch (Exception ex)
  710. {
  711. throw new Exception(string.Format("ex:{0}\r\ncmd:{1}", ex, cmd.CommandText));
  712. }
  713. }
  714. #region 处理列信息,集成用户习惯
  715. //处理列信息,集成用户习惯
  716. if (request.pageindex <= 1 && !ifmapper)
  717. {
  718. var ufs = HelperBase.GetHelper<SysUserFileString>(cmd);
  719. var preferenceobj = new JObject();
  720. var preferencejson = BllHelper.GetValue(cmd,tokendata.userid, request.dwname, request.itemname, string.Empty, request.ifcompress == 1 ? true : false);
  721. if (string.IsNullOrEmpty(preferencejson))//如果没有自己的布局方案,尝试获取系统的布局方案
  722. {
  723. //preferencejson = BllHelper.GetValue(cmd,-1, request.dwname, request.itemname, string.Empty, request.ifcompress == 1 ? true : false);
  724. preferencejson = ufs.getSystemLayout(request.dwname, request.itemname, request.ifcompress);
  725. }
  726. //preferencejson = "{tableprop:{enabled:false,oSize:0,mode:\"default\"},columns:[{field:\"printid\",search:{order:1,labelposition:\"left\"}}]}";
  727. if (!string.IsNullOrEmpty(preferencejson))
  728. {
  729. try
  730. {
  731. preferenceobj = JsonConvert.DeserializeObject<JObject>(preferencejson);
  732. }
  733. catch (Exception e)
  734. {
  735. Trace.Write("解析json失败" + preferenceobj);
  736. }
  737. }
  738. var oldcolDic = new Dictionary<string, JObject>(StringComparer.OrdinalIgnoreCase);
  739. var colSortDic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
  740. var sortid = 0;
  741. if (preferenceobj.ContainsKey("columns"))
  742. {
  743. var oldcols = preferenceobj.GetValue("columns") as JArray;
  744. foreach (JObject col in oldcols)
  745. {
  746. var field = col["field"].ToString();
  747. oldcolDic[field] = col;
  748. sortid++;
  749. colSortDic[field] = sortid;
  750. }
  751. }
  752. var cols = new List<JObject>();
  753. var colSortDicDefault = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
  754. sortid = 0;
  755. foreach (XmlNode fieldNode in displayfields.ChildNodes)
  756. {
  757. var col = new JObject();
  758. string field = null;
  759. string mapper = null;
  760. foreach (XmlAttribute attr in fieldNode.Attributes)
  761. {
  762. if (string.Equals(attr.Name, "mapper", StringComparison.OrdinalIgnoreCase))
  763. {
  764. mapper = attr.Value;
  765. continue;
  766. }
  767. col.Add(attr.Name, attr.Value);
  768. if (string.Equals(attr.Name, "field", StringComparison.OrdinalIgnoreCase))
  769. {
  770. field = attr.Value;
  771. }
  772. }
  773. string dbField = null;
  774. var title = fieldNode.InnerText.Trim();
  775. if (field == rownumfield)
  776. {
  777. dbField = string.Empty;
  778. }
  779. else if (parseResult.selectFieldsDic.ContainsKey(field))
  780. {
  781. dbField = parseResult.selectFieldsDic[field];
  782. }
  783. else
  784. {
  785. throw new LJCommonException("语法错误:" + field + ":" + title + ",输出项无法匹配对应sql数据");
  786. }
  787. col.Add("title", title);
  788. handleCustomTitle(cmd, tokendata, col, dbField);
  789. if (!string.IsNullOrEmpty(field) && oldcolDic.ContainsKey(field))
  790. {
  791. var oldInfo = oldcolDic[field];
  792. foreach (var prop in oldInfo.Properties())
  793. {
  794. if (string.Equals(prop.Name, "field", StringComparison.OrdinalIgnoreCase))
  795. {
  796. continue;
  797. }
  798. if (string.Equals(prop.Name, "title", StringComparison.OrdinalIgnoreCase))
  799. {
  800. continue;
  801. }
  802. //col.Add(prop.Name, prop.Value);
  803. col[prop.Name] = prop.Value;
  804. }
  805. }
  806. if (mapper != null)
  807. {
  808. if (string.IsNullOrEmpty(mapper))
  809. {
  810. mapper = RemoveAS(dbField);
  811. if (mapper.StartsWith("'") || !Regex.IsMatch(mapper, "[a-zA-Z]"))
  812. {
  813. throw new LJCommonException($"列{col["field"]}对于常量字段,无法自动匹配Mapper,请直接指定具体Mapper");
  814. }
  815. }
  816. var mappername = mapper;
  817. if (mappername.Contains("."))
  818. {
  819. mappername = mappername.Substring(mappername.IndexOf(".") + 1);
  820. }
  821. var mapperMatched = false;
  822. mapperMatched = File.Exists(rootPath + _mapperAppend + mappername + ".xml");
  823. if (!mapperMatched)
  824. {
  825. mappername = mapper.Replace(".", "_");
  826. mapperMatched = File.Exists(rootPath + _mapperAppend + mappername + ".xml");
  827. }
  828. if (!mapperMatched && col.ContainsKey("table"))
  829. {
  830. mappername = mapper;
  831. if (mappername.Contains("."))
  832. {
  833. mappername = mappername.Substring(mappername.IndexOf(".") + 1);
  834. }
  835. mappername = col["table"] + "_" + mappername;
  836. mapperMatched = File.Exists(rootPath + _mapperAppend + mappername + ".xml");
  837. }
  838. if (!mapperMatched)
  839. {
  840. throw new LJCommonException($"列{col["field"]}未匹配到mapper对应的xml:{mapper}");
  841. }
  842. var mapperreq = new CommonDynamicSelectRequest
  843. {
  844. queryparams = queryParams
  845. };
  846. var mapperrslt = GetXmlResult(cmd, _mapperAppend + mappername, mapperreq, tokendata, true);
  847. col.Add("enum", mapperrslt.datatable);
  848. }
  849. cols.Add(col);
  850. sortid++;
  851. colSortDicDefault[field] = sortid;
  852. }
  853. var colSort = cols.OrderBy(x =>
  854. {
  855. var field = x.GetValue("field")?.ToString();
  856. if (colSortDic.ContainsKey(field))
  857. {
  858. return colSortDic[field];
  859. }
  860. else
  861. {
  862. return int.MaxValue;
  863. }
  864. }).ThenBy(x =>
  865. {
  866. var field = x.GetValue("field")?.ToString();
  867. if (colSortDicDefault.ContainsKey(field))
  868. {
  869. return colSortDicDefault[field];
  870. }
  871. else
  872. {
  873. return int.MaxValue;
  874. }
  875. });
  876. var colSortJArr = new JArray();
  877. foreach (var col in colSort)
  878. {
  879. colSortJArr.Add(col);
  880. }
  881. preferenceobj["columns"] = colSortJArr;
  882. rslt.tableinfo = preferenceobj;
  883. }
  884. #endregion
  885. return rslt;
  886. }
  887. private void handleCustomTitle(SqlCommand cmd, TokenData tokenData, JObject col, string dbfield)
  888. {
  889. var field = col.GetValue("field")?.ToString();
  890. var title = col.GetValue("title")?.ToString();
  891. var custitle = title;
  892. var visibleLimited = false;
  893. // 处理标题文本
  894. /*if (field.Contains("status") && title.Contains("配置"))
  895. {
  896. var opTitle = OptionHelper.GetOpString(cmd, "029");
  897. if (!string.IsNullOrEmpty(opTitle))
  898. {
  899. custitle = custitle.Replace("配置", opTitle);
  900. }
  901. }
  902. else if (field.Contains("woodcode") && title.Contains("配置1"))
  903. {
  904. var opTitle = OptionHelper.GetOpString(cmd, "027");
  905. if (!string.IsNullOrEmpty(opTitle))
  906. {
  907. custitle = custitle.Replace("配置1", opTitle);
  908. }
  909. }
  910. else if (field.Contains("pcode") && title.Contains("配置2"))
  911. {
  912. var opTitle = OptionHelper.GetOpString(cmd, "028");
  913. if (!string.IsNullOrEmpty(opTitle))
  914. {
  915. custitle = custitle.Replace("配置2", opTitle);
  916. }
  917. }
  918. else if (field.Contains("mtrlsectype"))
  919. {
  920. var opTitle = OptionHelper.GetOpString(cmd, "041");
  921. if (!string.IsNullOrEmpty(opTitle))
  922. {
  923. custitle = opTitle;
  924. }
  925. }
  926. else if (field.Contains("zxmtrlmode"))
  927. {
  928. var opTitle = OptionHelper.GetOpString(cmd, "042");
  929. if (!string.IsNullOrEmpty(opTitle))
  930. {
  931. custitle = opTitle;
  932. }
  933. }
  934. else if (field.Contains("usermtrlmode"))
  935. {
  936. var opTitle = OptionHelper.GetOpString(cmd, "128");
  937. if (!string.IsNullOrEmpty(opTitle))
  938. {
  939. custitle = opTitle;
  940. }
  941. }
  942. else if (field.Contains("otheramt"))
  943. {
  944. string opTitle = null;
  945. if (dbfield.Contains("u_outware.otheramt") || dbfield.Contains("u_saletask.otheramt"))
  946. {
  947. opTitle = OptionHelper.GetOpString(cmd, "050");
  948. }
  949. else if (dbfield.Contains("u_inware.otheramt"))
  950. {
  951. opTitle = OptionHelper.GetOpString(cmd, "136");
  952. }
  953. if (!string.IsNullOrEmpty(opTitle))
  954. {
  955. custitle = opTitle;
  956. }
  957. }
  958. else if (field.Contains("excolumn"))
  959. {
  960. var dbcolname = field;
  961. var inputType = 0;
  962. dbcolname = RemoveAS(dbcolname);
  963. if (dbcolname.Contains("."))
  964. {
  965. dbcolname = dbcolname.Substring(dbcolname.LastIndexOf(".") + 1);
  966. }
  967. cmd.CommandText = @"SELECT replacename,inputtype,ifuse FROM u_ext_billcolumn where ifuse = 1 AND columnname = @columnname";
  968. cmd.Parameters.Clear();
  969. cmd.Parameters.AddWithValue("@columnname", dbcolname);
  970. using (var reader = cmd.ExecuteReader())
  971. {
  972. if (reader.Read() && Convert.ToInt32(reader["ifuse"]) == 1)
  973. {
  974. custitle = reader["replacename"].ToString().Trim();
  975. inputType = Convert.ToInt32(reader["inputtype"]);
  976. }
  977. else
  978. {
  979. visibleLimited = true;
  980. }
  981. }
  982. switch (inputType)
  983. {
  984. case 0: // 未指定
  985. break;
  986. case 1: // 数值
  987. col["datatype"] = "number";
  988. break;
  989. case 2: // 文本
  990. break;
  991. case 3: // 日期
  992. col["datatype"] = "date";
  993. break;
  994. case 4: // 复合
  995. break;
  996. default:
  997. break;
  998. }
  999. }*/
  1000. if (!string.Equals(title, custitle))
  1001. {
  1002. col["title"] = custitle;
  1003. }
  1004. //处理显示权限
  1005. if (!col.ContainsKey("funcid"))
  1006. {
  1007. if (dbfield.Contains("u_spt.name") || dbfield.Contains("sptname"))
  1008. {
  1009. if (!title.Contains("甲方名称"))
  1010. {
  1011. col.Add("funcid", 6535);
  1012. }
  1013. }
  1014. }
  1015. if (col.ContainsKey("funcid"))
  1016. {
  1017. var funcid = Convert.ToInt32(col.GetValue("funcid").ToString());
  1018. if (!FuncPowerHelper.CheckFuncPower(cmd, tokenData.userid, funcid))
  1019. {
  1020. visibleLimited = true;
  1021. }
  1022. }
  1023. if (col.ContainsKey("funcid_notequals"))
  1024. {
  1025. var funcid = Convert.ToInt32(col.GetValue("funcid_notequals").ToString());
  1026. if (FuncPowerHelper.CheckFuncPower(cmd, tokenData.userid, funcid))
  1027. {
  1028. visibleLimited = true;
  1029. }
  1030. }
  1031. if (col.ContainsKey("onlyusermode"))
  1032. {
  1033. var usermode = Convert.ToInt32(col.GetValue("onlyusermode").ToString());
  1034. if (tokenData.usermode != usermode)
  1035. {
  1036. visibleLimited = true;
  1037. }
  1038. }
  1039. if (col.ContainsKey("usermode_notequals"))
  1040. {
  1041. var usermode = Convert.ToInt32(col.GetValue("usermode_notequals").ToString());
  1042. if (tokenData.usermode == usermode)
  1043. {
  1044. visibleLimited = true;
  1045. }
  1046. }
  1047. if (visibleLimited)
  1048. {
  1049. col.Add("limited", true);
  1050. }
  1051. }
  1052. private string RemoveAS(string oristr)
  1053. {
  1054. var asindex = oristr.IndexOf(" as ", StringComparison.OrdinalIgnoreCase);
  1055. if (asindex > 0)
  1056. {
  1057. return oristr.Substring(0, asindex);
  1058. }
  1059. return oristr;
  1060. }
  1061. private class QueryResult
  1062. {
  1063. public JArray datatable { get; set; }
  1064. public JObject tableinfo { get; set; }
  1065. public int totalcnt { get; set; }
  1066. public int pageindex { get; set; }
  1067. public int pagesize { get; set; }
  1068. }
  1069. }
  1070. }