ForecastDal.cs 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  1. using Cksoft.Data;
  2. using DllEapEntity;
  3. using DllEapEntity.Dtos;
  4. using DllEapEntity.OFILM;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.Linq;
  9. using System.Text;
  10. namespace DllEapDal.OFILM
  11. {
  12. public class ForecastDal
  13. {
  14. private IDatabase CurrDb = null;
  15. public ForecastDal(IDatabase db)
  16. {
  17. CurrDb = db;
  18. }
  19. /// <summary>
  20. /// 设备需求预测
  21. /// </summary>
  22. /// <param name="start"></param>
  23. /// <param name="length"></param>
  24. /// <param name="order"></param>
  25. /// <param name="sort"></param>
  26. /// <param name="filter"></param>
  27. /// <param name="errorinfo"></param>
  28. /// <returns></returns>
  29. public IEnumerable<ForecastDto> Get(int start, int length, string order, string sort, string filter, string errorinfo)
  30. {
  31. var sql = $@"
  32. select MAX(id) id,equipmentmodel,park,floor,MAX(score) score,IFNULL(MAX( number ),0) number
  33. FROM (
  34. SELECT MAX(t.id) id,equipmentmodel,park,floor,MAX(score) score,planTime,CEILING(SUM(CASE
  35. WHEN locate('FQC',assignmentContent) >0 THEN genfive(number)
  36. WHEN accounting='0.25' THEN
  37. gensecfive(number)
  38. WHEN accounting='0.5' THEN
  39. genfive(number)
  40. WHEN accounting='1' THEN CEILING(number)
  41. ELSE
  42. number
  43. END
  44. )) number
  45. FROM
  46. (
  47. SELECT tt.equipmentmodel,
  48. tt.id,
  49. tt.park,
  50. tt.floor,
  51. b.machineType,
  52. b.workshopSection,
  53. c.planTime,
  54. tt.score,
  55. c.dayPlan,
  56. b.assignmentContent,
  57. accounting,
  58. b.UPH,
  59. b.eropTurnoverRate,
  60. CASE b.workshopSection
  61. WHEN 'COB' THEN
  62. c.dayPlan/22/0.95/.97/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH
  63. WHEN 'EOL' THEN
  64. c.dayPlan/22/0.95/ replace (b.eropTurnoverRate,'%','')*100/b.UPH
  65. ELSE
  66. 0
  67. END number
  68. from
  69. (
  70. (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as score from equipmentnumber)
  71. UNION
  72. (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as score from equipmentnumber)
  73. UNION
  74. (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as score from equipmentnumber)
  75. UNION
  76. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as score from equipmentnumber)
  77. UNION
  78. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as score from equipmentnumber)
  79. UNION
  80. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as score from equipmentnumber)
  81. UNION
  82. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as score from equipmentnumber)
  83. UNION
  84. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as score from equipmentnumber)
  85. ) tt
  86. LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor
  87. LEFT JOIN (SELECT park,floor,customer,planTime,SUM(dayPlan) dayPlan FROM productionplan WHERE planTime>=CURRENT_DATE() GROUP BY park, floor,customer,planTime) c ON c.customer=b.machineType
  88. and c.Floor = b.Floor
  89. WHERE 1=1
  90. {filter}
  91. order by equipmentmodel,tt.floor
  92. ) t
  93. GROUP BY equipmentmodel,park,floor,planTime
  94. ) e
  95. GROUP BY equipmentmodel,park,floor
  96. limit {start - 1},{length}
  97. ";
  98. var models = CurrDb.FindList<ForecastDto>(sql);
  99. return models;
  100. }
  101. /// <summary>
  102. /// 设备需求预测总数
  103. /// </summary>
  104. /// <param name="filter"></param>
  105. /// <returns></returns>
  106. public int GetCount(string filter)
  107. {
  108. string errorinfo = string.Empty;
  109. var sql = $@" select Count(*) Count
  110. FROM (
  111. SELECT equipmentmodel,park,floor
  112. FROM
  113. (
  114. SELECT tt.equipmentmodel,
  115. tt.park,
  116. tt.floor
  117. from
  118. (
  119. (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as score from equipmentnumber)
  120. UNION
  121. (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as score from equipmentnumber)
  122. UNION
  123. (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as score from equipmentnumber)
  124. UNION
  125. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as score from equipmentnumber)
  126. UNION
  127. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as score from equipmentnumber)
  128. UNION
  129. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as score from equipmentnumber)
  130. UNION
  131. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as score from equipmentnumber)
  132. UNION
  133. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as score from equipmentnumber)
  134. ) tt
  135. LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor
  136. LEFT JOIN (SELECT park,floor,customer FROM productionplan WHERE planTime>=CURRENT_DATE() GROUP BY park, floor,customer) c ON c.customer=b.machineType
  137. WHERE 1=1 {filter}
  138. order by equipmentmodel,tt.floor
  139. ) t
  140. GROUP BY equipmentmodel,park,floor
  141. ) e
  142. ";
  143. var entities = CurrDb.FindList<ForecastDto>(sql).FirstOrDefault();
  144. if (entities != null)
  145. {
  146. return entities.Count;
  147. }
  148. return 0;
  149. }
  150. public IEnumerable<ForecastDto> getMainPlan()
  151. {
  152. string sql = "SELECT DISTINCT planTime FROM productionplan WHERE planTime like '%主计划%'";
  153. var model = CurrDb.FindList<ForecastDto>(sql);
  154. return model;
  155. }
  156. public IEnumerable<ForecastDto> getMaxPlan()
  157. {
  158. string sql = "SELECT max(STR_TO_DATE(planTime,'%Y-%m-%d') ) planTime FROM productionplan WHERE planTime not like '%主计划%'";
  159. var model = CurrDb.FindList<ForecastDto>(sql);
  160. return model;
  161. }
  162. public IEnumerable<ForecastDto> getMinPlan()
  163. {
  164. string sql = "SELECT min(STR_TO_DATE(planTime,'%Y-%m-%d') ) planTime FROM productionplan WHERE planTime not like '%主计划%'";
  165. var model = CurrDb.FindList<ForecastDto>(sql);
  166. return model;
  167. }
  168. public string getsql(string filter,string subfilter)
  169. {
  170. string sql = $@"
  171. SELECT equipmentmodel,park,floor,MAX(sore) score,CEILING(SUM(CASE accounting
  172. WHEN '0.25' THEN
  173. gensecfive(number)
  174. WHEN '0.5' THEN
  175. genfive(number)
  176. ELSE
  177. number
  178. END
  179. )) number
  180. FROM
  181. (
  182. SELECT tt.equipmentmodel,
  183. tt.park,
  184. tt.floor,
  185. b.machineType,
  186. tt.sore,
  187. c.dayPlan,
  188. accounting,
  189. c.planTime,
  190. b.eropTurnoverRate,
  191. CASE b.workshopSection
  192. WHEN 'COB' THEN
  193. c.dayPlan/28/22/0.95/.97/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH
  194. WHEN 'EOL' THEN
  195. c.dayPlan/28/22/0.95/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH
  196. ELSE
  197. 0
  198. END number
  199. from
  200. (
  201. (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as sore from equipmentnumber)
  202. UNION
  203. (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as sore from equipmentnumber)
  204. UNION
  205. (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as sore from equipmentnumber)
  206. UNION
  207. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as sore from equipmentnumber)
  208. UNION
  209. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as sore from equipmentnumber)
  210. UNION
  211. (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as sore from equipmentnumber)
  212. UNION
  213. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as sore from equipmentnumber)
  214. UNION
  215. (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as sore from equipmentnumber)
  216. ) tt
  217. LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor
  218. LEFT JOIN (SELECT * FROM productionplan WHERE planTime = '{filter}') c ON c.customer=b.machineType
  219. WHERE 1=1 {subfilter}
  220. order by equipmentmodel,tt.floor
  221. -- limit 460,20
  222. ) t
  223. GROUP BY equipmentmodel,park,floor";
  224. return sql;
  225. }
  226. /// <summary>
  227. /// 预测详情总览
  228. /// </summary>
  229. /// <returns></returns>
  230. public IEnumerable<ForecastDto> getDetail(string filter)
  231. {
  232. string sql = $@"SELECT equipmentmodel,park,floor,MAX(sore) score,planTime,CEILING(SUM(CASE
  233. WHEN locate('FQC',assignmentContent) >0 THEN genfive(number)
  234. WHEN accounting='0.25' THEN
  235. gensecfive(number)
  236. WHEN accounting='0.5' THEN
  237. genfive(number)
  238. WHEN accounting='1' THEN CEILING(number)
  239. ELSE
  240. number
  241. END
  242. )) number
  243. FROM
  244. (
  245. SELECT tt.equipmentmodel,
  246. tt.park,
  247. tt.floor,
  248. b.machineType,
  249. tt.sore,
  250. b.assignmentContent,
  251. c.dayPlan,
  252. accounting,
  253. DATE_FORMAT(c.planTime, '%Y-%m-%d') planTime,
  254. b.eropTurnoverRate,
  255. CASE b.workshopSection
  256. WHEN 'COB' THEN
  257. c.dayPlan / 22 / 0.95 / .97 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH
  258. WHEN 'EOL' THEN
  259. c.dayPlan / 22 / 0.95 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH
  260. ELSE
  261. 0
  262. END number
  263. from
  264. (
  265. (select id, equipmentmodel, accounting, '三号园区' as park, '2#1F' as floor, IFNULL(threeSecFir, 0) as sore from equipmentnumber)
  266. UNION
  267. (select id, equipmentmodel, accounting, '未来城' as park, 'A1#1F' as floor, IFNULL(futureCity, 0) as sore from equipmentnumber)
  268. UNION
  269. (select id, equipmentmodel, accounting, '未来城' as park, 'A1#3F' as floor, IFNULL(futureCityThird, 0) as sore from equipmentnumber)
  270. UNION
  271. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#1F' as floor, IFNULL(secfirstFir, 0) as sore from equipmentnumber)
  272. UNION
  273. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#2F' as floor, IFNULL(secFirstSec, 0) as sore from equipmentnumber)
  274. UNION
  275. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#3F' as floor, IFNULL(secFirstThird, 0) as sore from equipmentnumber)
  276. UNION
  277. (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#1F' as floor, IFNULL(secSecFirst, 0) as sore from equipmentnumber)
  278. UNION
  279. (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#2F' as floor, IFNULL(secSecSec, 0) as sore from equipmentnumber)
  280. ) tt
  281. LEFT JOIN workingprocedure b on tt.equipmentModel = b.equipmentModel and tt.park = b.park and tt.Floor = b.floor
  282. LEFT JOIN(SELECT* FROM productionplan WHERE planTime not like '%主计划%') c ON c.customer = b.machineType
  283. and c.Floor = b.Floor
  284. WHERE 1 = 1 {filter}
  285. order by equipmentmodel,tt.floor
  286. ) t
  287. WHERE planTime is not null
  288. GROUP BY equipmentmodel,park,floor,planTime
  289. order by planTime";
  290. var model = CurrDb.FindList<ForecastDto>(sql);
  291. return model;
  292. }
  293. public IEnumerable<ForecastDto> getDetailTotal(string filter)
  294. {
  295. string sql = $@"SELECT sum(sore) score,planTime,CEILING(SUM(CASE
  296. WHEN locate('FQC',assignmentContent) >0 THEN genfive(number)
  297. WHEN accounting='0.25' THEN
  298. gensecfive(number)
  299. WHEN accounting='0.5' THEN
  300. genfive(number)
  301. WHEN accounting='1' THEN CEILING(number)
  302. ELSE
  303. number
  304. END
  305. )) number
  306. FROM
  307. (
  308. SELECT tt.equipmentmodel,
  309. tt.park,
  310. tt.floor,
  311. b.machineType,
  312. tt.sore,
  313. b.assignmentContent,
  314. c.dayPlan,
  315. accounting,
  316. DATE_FORMAT(c.planTime, '%Y-%m-%d') planTime,
  317. b.eropTurnoverRate,
  318. CASE b.workshopSection
  319. WHEN 'COB' THEN
  320. c.dayPlan / 22 / 0.95 / .97 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH
  321. WHEN 'EOL' THEN
  322. c.dayPlan / 22 / 0.95 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH
  323. ELSE
  324. 0
  325. END number
  326. from
  327. (
  328. (select id, equipmentmodel, accounting, '三号园区' as park, '2#1F' as floor, IFNULL(threeSecFir, 0) as sore from equipmentnumber)
  329. UNION
  330. (select id, equipmentmodel, accounting, '未来城' as park, 'A1#1F' as floor, IFNULL(futureCity, 0) as sore from equipmentnumber)
  331. UNION
  332. (select id, equipmentmodel, accounting, '未来城' as park, 'A1#3F' as floor, IFNULL(futureCityThird, 0) as sore from equipmentnumber)
  333. UNION
  334. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#1F' as floor, IFNULL(secfirstFir, 0) as sore from equipmentnumber)
  335. UNION
  336. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#2F' as floor, IFNULL(secFirstSec, 0) as sore from equipmentnumber)
  337. UNION
  338. (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#3F' as floor, IFNULL(secFirstThird, 0) as sore from equipmentnumber)
  339. UNION
  340. (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#1F' as floor, IFNULL(secSecFirst, 0) as sore from equipmentnumber)
  341. UNION
  342. (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#2F' as floor, IFNULL(secSecSec, 0) as sore from equipmentnumber)
  343. ) tt
  344. LEFT JOIN workingprocedure b on tt.equipmentModel = b.equipmentModel and tt.park = b.park and tt.Floor = b.floor
  345. LEFT JOIN(SELECT* FROM productionplan WHERE planTime not like '%主计划%') c ON c.customer = b.machineType
  346. WHERE 1 = 1 {filter}
  347. order by equipmentmodel,tt.floor
  348. ) t
  349. WHERE planTime is not null
  350. GROUP BY planTime
  351. order by planTime";
  352. var model = CurrDb.FindList<ForecastDto>(sql);
  353. return model;
  354. }
  355. /// <summary>
  356. /// 预测详情总行数
  357. /// </summary>
  358. /// <param name="filter"></param>
  359. /// <returns></returns>
  360. public int GetEmCount(string filter)
  361. {
  362. string errorinfo = string.Empty;
  363. var sql = $@"select Count(1) Count from ( (select id,equipmentmodel,'三号园区' as park,'2#1F' as floor from equipmentnumber)
  364. UNION
  365. (select id,equipmentmodel,'未来城' as park,'A1#1F' as floor from equipmentnumber)
  366. UNION
  367. (select id,equipmentmodel,'未来城' as park,'A1#3F' as floor from equipmentnumber)
  368. UNION
  369. (select id,equipmentmodel,'二号园区' as park,'A1#1F' as floor from equipmentnumber)
  370. UNION
  371. (select id,equipmentmodel,'二号园区' as park,'A1#2F' as floor from equipmentnumber)
  372. UNION
  373. (select id,equipmentmodel,'二号园区' as park,'A1#3F' as floor from equipmentnumber)
  374. UNION
  375. (select id,equipmentmodel,'二号园区' as park,'A2#1F' as floor from equipmentnumber)
  376. UNION
  377. (select id,equipmentmodel,'二号园区' as park,'A2#2F' as floor from equipmentnumber) )tt
  378. where 1=1 {filter}
  379. ";
  380. var entities = CurrDb.FindList<ForecastDto>(sql).FirstOrDefault();
  381. if (entities != null)
  382. {
  383. return entities.Count;
  384. }
  385. return 0;
  386. }
  387. /// <summary>
  388. /// 获取园区
  389. /// </summary>
  390. /// <param name="filter"></param>
  391. /// <returns></returns>
  392. public IEnumerable<SelectDto<string>> GetMultipleSelects(string filter)
  393. {
  394. var sql = $@"select park value,park label
  395. FROM
  396. (
  397. (select '三号园区' as park)
  398. UNION
  399. (select '未来城' as park)
  400. UNION
  401. (select '二号园区' as park)
  402. ) t";
  403. var entities = CurrDb.FindList<SelectDto<string>>(sql);
  404. return entities;
  405. }
  406. /// <summary>
  407. /// 获取机种下拉框
  408. /// </summary>
  409. /// <param name="filter"></param>
  410. /// <returns></returns>
  411. public IEnumerable<SelectDto<string>> GetMultipleMacTypeSelects(string filter)
  412. {
  413. var sql = $@"select distinct MachineType value,MachineType label
  414. FROM WorkingProcedure where 1=1 {filter}";
  415. var entities = CurrDb.FindList<SelectDto<string>>(sql);
  416. return entities;
  417. }
  418. /// <summary>
  419. /// 获取楼层
  420. /// </summary>
  421. /// <param name="filter"></param>
  422. /// <returns></returns>
  423. public IEnumerable<SelectDto<string>> GetMultipleSelectsFloor(string filter)
  424. {
  425. var sql = $@"
  426. select DISTINCT floor value,floor label
  427. FROM
  428. (
  429. (select '三号园区' as park, '2#1F' as floor )
  430. UNION
  431. (select '未来城' as park, 'A1#1F' as floor )
  432. UNION
  433. (select '未来城' as park, 'A1#3F' as floor )
  434. UNION
  435. (select '二号园区' as park, 'A1#1F' as floor )
  436. UNION
  437. (select '二号园区' as park, 'A1#2F' as floor)
  438. UNION
  439. (select '二号园区' as park, 'A1#3F' as floor )
  440. UNION
  441. (select '二号园区' as park, 'A2#1F' as floor )
  442. UNION
  443. (select '二号园区' as park, 'A2#2F' as floor )
  444. ) t
  445. WHERE 1=1 {filter}";
  446. var entities = CurrDb.FindList<SelectDto<string>>(sql);
  447. return entities;
  448. }
  449. /// <summary>
  450. /// 预测详情转DataTable
  451. /// </summary>
  452. /// <param name="roles"></param>
  453. /// <returns></returns>
  454. public DataTable Getfor(IEnumerable<ForecastDto> roles)
  455. {
  456. string plantime = new ProductPlanDal(CurrDb).getMin().PlanTime;
  457. var plan = getMainPlan();
  458. DataTable dt = new DataTable();
  459. if (!string.IsNullOrEmpty(plantime))
  460. {
  461. string time = plantime;
  462. DateTime st = Convert.ToDateTime(time);
  463. dt.Columns.Add("设备型号");
  464. dt.Columns.Add("园区");
  465. dt.Columns.Add("楼层");
  466. dt.Columns.Add("现有数量");
  467. dt.Columns.Add("ParkRowSpan");
  468. dt.Columns.Add("ModelRowSpan");
  469. dt.Columns.Add(st.ToString("MM") + "月预测");
  470. for (int h = 1; h <= plan.Count(); h++)
  471. {
  472. dt.Columns.Add(st.AddMonths(h).ToString("MM") + "月预测");
  473. }
  474. dt.Columns.Add(st.ToString("MM") + "月利用率");
  475. for (int h = 1; h <= plan.Count(); h++)
  476. {
  477. dt.Columns.Add(st.AddMonths(h).ToString("MM") + "月利用率");
  478. }
  479. dt.Columns.Add("预警");
  480. if (dt != null && dt.Columns.Count > 0)
  481. {
  482. string subfilter = $" and tt.id in ( {string.Join(",", roles.Select(l => l.ID).ToArray())})";
  483. Dictionary<string, IEnumerable<ForecastDto>> dic = new Dictionary<string, IEnumerable<ForecastDto>>();
  484. foreach (var itemd in plan)
  485. {
  486. dic.Add(itemd.PlanTime, CurrDb.FindList<ForecastDto>(getsql(itemd.PlanTime, subfilter)));
  487. }
  488. string Equipmentmodel = "";
  489. var last = roles.LastOrDefault();
  490. foreach (var it in roles)
  491. {
  492. DataRow row = dt.NewRow();
  493. if (string.IsNullOrEmpty(Equipmentmodel))
  494. {
  495. Equipmentmodel = it.Equipmentmodel;
  496. #region
  497. row["设备型号"] = it.Equipmentmodel;
  498. row["园区"] = it.Park;
  499. row["楼层"] = it.Floor;
  500. row["现有数量"] = it.Score;
  501. row["ParkRowSpan"] = "";
  502. row["ModelRowSpan"] = "";
  503. row[st.ToString("MM") + "月预测"] = it.Number;
  504. int i = 0;
  505. foreach (var item in plan)
  506. {
  507. var planNew = dic[item.PlanTime];
  508. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  509. row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number);
  510. i++;
  511. }
  512. if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0")
  513. {
  514. row[st.ToString("MM") + "月利用率"] = "0.00%";
  515. }
  516. else
  517. {
  518. row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  519. }
  520. int m = 0;
  521. foreach (var item in plan)
  522. {
  523. var planNew = dic[item.PlanTime];
  524. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  525. if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0")
  526. {
  527. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%";
  528. }
  529. else
  530. {
  531. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  532. }
  533. m++;
  534. }
  535. row["预警"] = "88%";
  536. dt.Rows.Add(row);
  537. #endregion
  538. }
  539. else
  540. {
  541. if (Equipmentmodel != it.Equipmentmodel)
  542. {
  543. #region 合计
  544. string Scores = roles.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString();
  545. string numbers = roles.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString();
  546. row["设备型号"] = "合计";
  547. row["园区"] = "合计";
  548. row["楼层"] = "合计";
  549. row["现有数量"] = Scores;
  550. row["ParkRowSpan"] = "";
  551. row["ModelRowSpan"] = "";
  552. row[st.ToString("MM") + "月预测"] = numbers;
  553. int i = 0;
  554. foreach (var item in plan)
  555. {
  556. var planNew = dic[item.PlanTime];
  557. string number = planNew.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString();
  558. row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number);
  559. i++;
  560. }
  561. if (Scores == "0" || string.IsNullOrEmpty(Scores) || Scores=="0")
  562. {
  563. row[st.ToString("MM") + "月利用率"] = "0.00%";
  564. }
  565. else
  566. {
  567. row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(numbers) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%";
  568. }
  569. int m = 0;
  570. foreach (var item in plan)
  571. {
  572. var planNew = dic[item.PlanTime];
  573. string number = planNew.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString();
  574. if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0")
  575. {
  576. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%";
  577. }
  578. else
  579. {
  580. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%";
  581. }
  582. m++;
  583. }
  584. row["预警"] = "88%";
  585. dt.Rows.Add(row);
  586. #endregion
  587. Equipmentmodel = it.Equipmentmodel;
  588. #region
  589. row = dt.NewRow();
  590. row["设备型号"] = it.Equipmentmodel;
  591. row["园区"] = it.Park;
  592. row["楼层"] = it.Floor;
  593. row["现有数量"] = it.Score;
  594. row["ParkRowSpan"] = "";
  595. row["ModelRowSpan"] = "";
  596. row[st.ToString("MM") + "月预测"] = it.Number;
  597. i = 0;
  598. foreach (var item in plan)
  599. {
  600. var planNew = dic[item.PlanTime];
  601. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  602. row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number);
  603. i++;
  604. }
  605. if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0")
  606. {
  607. row[st.ToString("MM") + "月利用率"] = "0.00%";
  608. }
  609. else
  610. {
  611. row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  612. }
  613. m = 0;
  614. foreach (var item in plan)
  615. {
  616. var planNew = dic[item.PlanTime];
  617. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  618. if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0")
  619. {
  620. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%";
  621. }
  622. else
  623. {
  624. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  625. }
  626. m++;
  627. }
  628. row["预警"] = "88%";
  629. dt.Rows.Add(row);
  630. #endregion
  631. }
  632. else
  633. {
  634. #region
  635. row["设备型号"] = it.Equipmentmodel;
  636. row["园区"] = it.Park;
  637. row["楼层"] = it.Floor;
  638. row["现有数量"] = it.Score;
  639. row["ParkRowSpan"] = "";
  640. row["ModelRowSpan"] = "";
  641. row[st.ToString("MM") + "月预测"] = it.Number;
  642. int i = 0;
  643. foreach (var item in plan)
  644. {
  645. var planNew = dic[item.PlanTime];
  646. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  647. row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number);
  648. i++;
  649. }
  650. if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0")
  651. {
  652. row[st.ToString("MM") + "月利用率"] = "0.00%";
  653. }
  654. else
  655. {
  656. row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  657. }
  658. int m = 0;
  659. foreach (var item in plan)
  660. {
  661. var planNew = dic[item.PlanTime];
  662. string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault();
  663. if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0")
  664. {
  665. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%";
  666. }
  667. else
  668. {
  669. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%";
  670. }
  671. m++;
  672. }
  673. row["预警"] = "88%";
  674. dt.Rows.Add(row);
  675. #endregion
  676. }
  677. }
  678. }
  679. if (last != null)
  680. {
  681. DataRow row = dt.NewRow();
  682. #region 合计
  683. string Scores = roles.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString();
  684. string numbers = roles.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString();
  685. row["设备型号"] = "合计";
  686. row["园区"] = "合计";
  687. row["楼层"] = "合计";
  688. row["现有数量"] = Scores;
  689. row["ParkRowSpan"] = "";
  690. row["ModelRowSpan"] = "";
  691. row[st.ToString("MM") + "月预测"] = numbers;
  692. int i = 0;
  693. foreach (var item in plan)
  694. {
  695. var planNew = dic[item.PlanTime];
  696. string number = planNew.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString();
  697. row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number);
  698. i++;
  699. }
  700. if (Scores == "0" || string.IsNullOrEmpty(Scores) || Scores=="0")
  701. {
  702. row[st.ToString("MM") + "月利用率"] = "0.00%";
  703. }
  704. else
  705. {
  706. row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(numbers) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%";
  707. }
  708. int m = 0;
  709. foreach (var item in plan)
  710. {
  711. var planNew = dic[item.PlanTime];
  712. string number = planNew.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString();
  713. if (number == "0" || string.IsNullOrEmpty(number) || last.Score=="0")
  714. {
  715. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%";
  716. }
  717. else
  718. {
  719. row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%";
  720. }
  721. m++;
  722. }
  723. row["预警"] = "88%";
  724. dt.Rows.Add(row);
  725. #endregion
  726. }
  727. }
  728. }
  729. var modelGroup = roles.GroupBy(c => c.Equipmentmodel);
  730. // 合并行数
  731. foreach (var model in modelGroup)
  732. {
  733. for (var i = 0; i < dt.Rows.Count; i++)
  734. {
  735. if (dt.Rows[i]["设备型号"].ToString() == model.Key)
  736. {
  737. dt.Rows[i]["ModelRowSpan"] = model.Count()+1;
  738. var parkGroup = roles.Where(l => l.Equipmentmodel == model.Key).GroupBy(c => c.Park);
  739. foreach (var it in parkGroup)
  740. {
  741. if (dt.Rows[i]["园区"].ToString() == it.Key)
  742. {
  743. dt.Rows[i]["ParkRowSpan"] = it.Count();
  744. }
  745. }
  746. }
  747. }
  748. }
  749. return dt;
  750. }
  751. /// <summary>
  752. /// 预测详情转DataTable
  753. /// </summary>
  754. /// <param name="macList"></param>
  755. /// <param name="Equipmentmodels"></param>
  756. /// <returns></returns>
  757. public DataTable GetForDetail(IEnumerable<ForecastDto> macList, IEnumerable<ForecastDto> Equipmentmodels)
  758. {
  759. DataTable dt = new DataTable();
  760. dt.Columns.Add("设备型号");
  761. dt.Columns.Add("园区");
  762. dt.Columns.Add("楼层");
  763. dt.Columns.Add("现有数量");
  764. dt.Columns.Add("ParkRowSpan");
  765. dt.Columns.Add("ModelRowSpan");
  766. DateTime dd = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date.AddMonths(1).AddDays(-1);//当月最后一天
  767. DateTime maxplan = Convert.ToDateTime( getMaxPlan().FirstOrDefault().PlanTime);
  768. DateTime minplan = Convert.ToDateTime(getMinPlan().FirstOrDefault().PlanTime);
  769. int days = maxplan.Subtract(DateTime.Now).Days + 1;
  770. for (int i = 0; i <= days; i++)
  771. {
  772. var date = DateTime.Now.AddDays(i).ToString("MM月dd日");
  773. dt.Columns.Add(date);
  774. }
  775. string Equipmentmodel = "";
  776. var last = Equipmentmodels.LastOrDefault();
  777. if (Equipmentmodels != null)
  778. {
  779. foreach (var mac in Equipmentmodels)
  780. {
  781. DataRow row = dt.NewRow();
  782. if (string.IsNullOrEmpty(Equipmentmodel))
  783. {
  784. Equipmentmodel = mac.Equipmentmodel;
  785. #region
  786. row["设备型号"] = mac.Equipmentmodel;
  787. row["园区"] = mac.Park;
  788. row["楼层"] = mac.Floor;
  789. row["现有数量"] = mac.Score;
  790. row["ParkRowSpan"] = "";
  791. row["ModelRowSpan"] = "";
  792. for (int i = 0; i <= days; i++)
  793. {
  794. var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd");
  795. string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault();
  796. row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number);
  797. }
  798. dt.Rows.Add(row);
  799. #endregion
  800. }
  801. else
  802. {
  803. if (Equipmentmodel != mac.Equipmentmodel)
  804. {
  805. #region 合计
  806. string Scores = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString();
  807. string numbers = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString();
  808. row["设备型号"] = "合计"; ;
  809. row["园区"] = "合计"; ;
  810. row["楼层"] = "合计"; ;
  811. row["现有数量"] = Scores;
  812. row["ParkRowSpan"] = "";
  813. row["ModelRowSpan"] = "";
  814. for (int i = 0; i <= days; i++)
  815. {
  816. var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd");
  817. string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == Equipmentmodel).Sum(l => Convert.ToInt32(l.Number)).ToString();
  818. row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number);
  819. }
  820. dt.Rows.Add(row);
  821. #endregion
  822. Equipmentmodel = mac.Equipmentmodel;
  823. #region
  824. row = dt.NewRow();
  825. row["设备型号"] = mac.Equipmentmodel;
  826. row["园区"] = mac.Park;
  827. row["楼层"] = mac.Floor;
  828. row["现有数量"] = mac.Score;
  829. row["ParkRowSpan"] = "";
  830. row["ModelRowSpan"] = "";
  831. for (int i = 0; i <= days; i++)
  832. {
  833. var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd");
  834. string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault();
  835. row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number);
  836. }
  837. dt.Rows.Add(row);
  838. #endregion
  839. }
  840. else
  841. {
  842. #region
  843. row["设备型号"] = mac.Equipmentmodel;
  844. row["园区"] = mac.Park;
  845. row["楼层"] = mac.Floor;
  846. row["现有数量"] = mac.Score;
  847. row["ParkRowSpan"] = "";
  848. row["ModelRowSpan"] = "";
  849. for (int i = 0; i <= days; i++)
  850. {
  851. var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd");
  852. string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault();
  853. row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number);
  854. }
  855. dt.Rows.Add(row);
  856. #endregion
  857. }
  858. }
  859. }
  860. }
  861. if (last != null)
  862. {
  863. DataRow row = dt.NewRow();
  864. #region 合计
  865. string Scores = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString();
  866. string numbers = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString();
  867. row["设备型号"] = "合计"; ;
  868. row["园区"] = "合计"; ;
  869. row["楼层"] = "合计"; ;
  870. row["现有数量"] = Scores;
  871. row["ParkRowSpan"] = "";
  872. row["ModelRowSpan"] = "";
  873. for (int i = 0; i <= days; i++)
  874. {
  875. var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd");
  876. string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == last.Equipmentmodel).Sum(l => Convert.ToInt32(l.Number)).ToString();
  877. row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number);
  878. }
  879. dt.Rows.Add(row);
  880. #endregion
  881. }
  882. var modelGroup = Equipmentmodels.GroupBy(c => c.Equipmentmodel);
  883. foreach (var model in modelGroup)
  884. {
  885. for (var i = 0; i < dt.Rows.Count; i++)
  886. {
  887. if (dt.Rows[i]["设备型号"].ToString() == model.Key)
  888. {
  889. dt.Rows[i]["ModelRowSpan"] = model.Count()+1;
  890. var parkGroup = Equipmentmodels.Where(l => l.Equipmentmodel == model.Key).GroupBy(c => c.Park);
  891. foreach (var it in parkGroup)
  892. {
  893. if (dt.Rows[i]["园区"].ToString() == it.Key)
  894. {
  895. dt.Rows[i]["ParkRowSpan"] = it.Count();
  896. }
  897. }
  898. }
  899. }
  900. }
  901. return dt;
  902. }
  903. public AntdComplexTableDto GetComplexData(string filter, int start,
  904. int length)
  905. {
  906. string errorinfo = "";
  907. var model = Get(start, length, "", "", filter, errorinfo);
  908. var dt = Getfor(model);
  909. var headers = new List<AntdColumn>();
  910. if (dt != null && dt.Columns.Count > 0)
  911. {
  912. foreach (DataColumn item in dt.Columns)
  913. {
  914. if (item.ColumnName == "ParkRowSpan" || item.ColumnName == "ModelRowSpan")
  915. continue;
  916. headers.Add(new AntdColumn { ColName = item.ColumnName });
  917. }
  918. }
  919. var antdData = new AntdComplexTableDto();
  920. antdData.Columns = headers;
  921. antdData.Datas = dt;
  922. return antdData;
  923. }
  924. public AntdComplexTableDto GetComplexDataDetail(string filter, int start,
  925. int length)
  926. {
  927. var macList = getDetail(filter).ToList();//获取当月预测数据
  928. var en = new EquipmentnumberDal(CurrDb);
  929. var Equipmentmodels = en.getEquipmentmodel(start, length, "", "", filter);//获取机型,园区,楼层
  930. var dt = GetForDetail(macList, Equipmentmodels);
  931. var headers = new List<AntdColumn>();
  932. if (dt != null && dt.Columns.Count > 0)
  933. {
  934. foreach (DataColumn item in dt.Columns)
  935. {
  936. if (item.ColumnName == "ParkRowSpan" || item.ColumnName == "ModelRowSpan")
  937. continue;
  938. headers.Add(new AntdColumn { ColName = item.ColumnName });
  939. }
  940. }
  941. var antdData = new AntdComplexTableDto();
  942. antdData.Columns = headers;
  943. antdData.Datas = dt;
  944. return antdData;
  945. }
  946. }
  947. }