SignageDrawRightUtil.java 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868
  1. package com.yeechart.dotMatrix.signage;
  2. import com.aliyuncs.utils.StringUtils;
  3. import com.yeechart.dotMatrix.canvas.DotMatrixCanvasUtil;
  4. import com.yeechart.dotMatrix.canvas.DotMatrixDrawShapeUtil;
  5. import com.yeechart.dotMatrix.canvas.DotMatrixDrawtextUtil;
  6. import com.yeechart.dotMatrix.canvas.DotMatrixImageUtil;
  7. import com.yeechart.dotMatrix.font.XZPFontLoaderUtil;
  8. import com.yeechart.dotMatrix.signage.bean.*;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11. import java.math.BigDecimal;
  12. import java.math.RoundingMode;
  13. import java.text.DecimalFormat;
  14. import java.util.ArrayList;
  15. import java.util.Collections;
  16. import java.util.List;
  17. import java.util.regex.Matcher;
  18. import java.util.regex.Pattern;
  19. @Component
  20. public class SignageDrawRightUtil {
  21. @Autowired
  22. private XZPFontLoaderUtil xzpFontLoaderUtil;
  23. @Autowired
  24. private DotMatrixDrawtextUtil dotMatrixDrawtextUtil;
  25. /*********** 右屏 默认的 点阵数据的形成 ********************/
  26. /**
  27. * 绘制右屏 已配网 终端名称
  28. *
  29. * @param canvasBitmapArrays
  30. * @param ter020201InfoVo
  31. */
  32. public void canvasRightOFFNetworkBitmapArraysTerName(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo, boolean isClean) {
  33. //终端名称
  34. String text = ter020201InfoVo.getTerName();
  35. int startColumnA;
  36. int startRowA = SignageDrawUtil.height / 40 * 11;
  37. int[][] fontBinaryArray;
  38. if (isClean) {
  39. fontBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][10 * SignageDrawUtil.textFontSize];//最多支持的字数
  40. startColumnA = SignageDrawUtil.width / 2 + SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  41. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA);
  42. }
  43. if (StringUtils.isEmpty(text)) {
  44. text = "终端名称";
  45. }
  46. fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  47. startColumnA = SignageDrawUtil.width / 2 + SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  48. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA);
  49. }
  50. /**
  51. * 绘制右屏 已配网 终端编号
  52. *
  53. * @param canvasBitmapArrays
  54. * @param ter020201InfoVo
  55. */
  56. public void canvasRightOFFNetworkBitmapArraysTerWorkCode(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo, boolean isClean) {
  57. //终端编号
  58. String text = ter020201InfoVo.getTerWorkCode();
  59. int[][] fontBinaryArray;
  60. int startColumnB;
  61. int startRowB = SignageDrawUtil.height / 40 * 13;
  62. if (isClean) {
  63. fontBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][10 * SignageDrawUtil.textFontSize];//最多支持的字数
  64. startColumnB = SignageDrawUtil.width / 2 + SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  65. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB);
  66. }
  67. fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  68. startColumnB = SignageDrawUtil.width / 2 + SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  69. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB);
  70. }
  71. /**
  72. * 绘制右屏 关机界面的 未配网 点阵图
  73. * @return 二进制数据
  74. */
  75. /**
  76. * 绘制新版右屏 引导图的 背景图
  77. *
  78. * @return
  79. */
  80. public int[][] canvasRightOFFNotNetworkBitmapArrays(String dId) {
  81. String resourcePath = "image/device/020201/init_right_default_20240601.jpg";
  82. //特殊处理 电信白牌
  83. if("1Ow61P3WM".equals(dId) ||
  84. "1OvYDdG8w".equals(dId) ||
  85. "1OAUzwkak".equals(dId) ||
  86. "1OBP8PIY0".equals(dId) ||
  87. "1OAFPlupi".equals(dId)
  88. ){
  89. resourcePath = "classpath:image/device/020201/init_right_default_20250217.jpg";
  90. }
  91. // int[][] canvasBitmapArrays = XZPImageUtil.twoToCanvasBitmapArrays(XZPImageUtil.canvasImageBitmapArrays(resourcePath,width,height,140),width,height);
  92. // String text = "未绑定设备";
  93. // int[][] fontBinaryArray = XZPDrawtextUtil.drawingText(text,textFontSizeCheck,noChineseFontSizeCheck);
  94. // int startRowA = height/40;
  95. // int startColumnA = width/2 - fontBinaryArray[0].length/2;
  96. // XZPCanvasUtil.mergeDotMatrices(canvasBitmapArrays,fontBinaryArray,startRowA,startColumnA);
  97. return DotMatrixImageUtil.twoToCanvasBitmapArrays(DotMatrixImageUtil.canvasImageBitmapArrays(resourcePath, SignageDrawUtil.width, SignageDrawUtil.height, 140), SignageDrawUtil.width, SignageDrawUtil.height);
  98. }
  99. /**
  100. * 绘制新版右屏 引导图的 未绑定工站 文字
  101. *
  102. * @param canvasBitmapArrays
  103. */
  104. public void canvasRightOFFNetworkBitmapArraysText(int[][] canvasBitmapArrays) {
  105. String text = "未绑定工站";
  106. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSizeCheck, SignageDrawUtil.noChineseFontSizeCheck);
  107. int startRowA = SignageDrawUtil.height / 40;
  108. int startColumnA = SignageDrawUtil.width / 2 - fontBinaryArray[0].length / 2;
  109. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA);
  110. }
  111. /**
  112. * 绘制右屏 已配网 工站名称
  113. *
  114. * @param canvasBitmapArrays
  115. * @param ter020201InfoVo
  116. */
  117. public void canvasRightOFFNetworkBitmapArraysWsName(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo, boolean isClean) {
  118. String text = ter020201InfoVo.getWsName();
  119. int startColumnA;
  120. int startRowA = SignageDrawUtil.height / 40 * 11;
  121. int[][] fontBinaryArray;
  122. if (isClean) {
  123. fontBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][10 * SignageDrawUtil.textFontSize];//最多支持的字数
  124. startColumnA = SignageDrawUtil.width / 2 - SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  125. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA);
  126. }
  127. fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  128. startColumnA = SignageDrawUtil.width / 2 - SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  129. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA);
  130. }
  131. /**
  132. * 绘制右屏 已配网 工站编号
  133. *
  134. * @param canvasBitmapArrays
  135. * @param ter020201InfoVo
  136. */
  137. public void canvasRightOFFNetworkBitmapArraysWsWorkCode(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo, boolean isClean) {
  138. //工站编号
  139. String text = ter020201InfoVo.getWsWorkCode();
  140. int startColumnB;
  141. int startRowB = SignageDrawUtil.height / 40 * 13;
  142. int[][] fontBinaryArray;
  143. if (isClean) {
  144. fontBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][10 * SignageDrawUtil.textFontSize];//最多支持的字数
  145. startColumnB = SignageDrawUtil.width / 2 - SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  146. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB);
  147. }
  148. fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  149. startColumnB = SignageDrawUtil.width / 2 - SignageDrawUtil.width / 8 - fontBinaryArray[0].length / 2;
  150. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB);
  151. }
  152. /*********** 绘制 右屏 业务图 ********************/
  153. /**
  154. * 绘制 右屏 终端名称
  155. *
  156. * @param canvasBitmapArrays
  157. * @param ter020201InfoVo
  158. */
  159. public void canvasBitmapRightTerName(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  160. int startRowA = SignageDrawUtil.height / 40;
  161. //int startColumnB = width/2 - textFontSize*10/2;
  162. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSize2Height)][SignageDrawUtil.width];
  163. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowA, 0);//直接整行
  164. String text = ter020201InfoVo.getTerName();
  165. if (StringUtils.isEmpty(text)) {
  166. text = "终端名称";
  167. }
  168. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize2);
  169. int startColumnA = SignageDrawUtil.width / 2 - fontBinaryArray[0].length / 2;
  170. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA, new int[]{1, 1, 1, 1});
  171. }
  172. /**
  173. * 绘制 右屏 终端编号
  174. *
  175. * @param canvasBitmapArrays
  176. * @param ter020201InfoVo
  177. */
  178. public void canvasBitmapRightTerWorkCode(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  179. int startRowB = SignageDrawUtil.height / 20 + SignageDrawUtil.noChineseFontSize * 3;
  180. // int startColumnA = width/2 - textFontSize*10/2;
  181. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  182. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, 0);//直接整行
  183. String text = ter020201InfoVo.getTerWorkCode();
  184. if (StringUtils.isEmpty(text)) {
  185. text = "00000001";
  186. }
  187. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  188. int startColumnB = SignageDrawUtil.width / 2 - fontBinaryArray[0].length / 2;
  189. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB, new int[]{1, 1, 1, 1});
  190. }
  191. /**
  192. * 绘制 右屏 工站名称
  193. *
  194. * @param canvasBitmapArrays
  195. * @param ter020201InfoVo
  196. */
  197. public void canvasBitmapRightWsName(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  198. int startRowA = SignageDrawUtil.height / 40;
  199. //int startColumnB = width/2 - textFontSize*10/2;
  200. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSize2Height)][SignageDrawUtil.width];
  201. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowA, 0);
  202. String text = ter020201InfoVo.getWsName();
  203. if (StringUtils.isEmpty(text)) {
  204. text = "工站名称";
  205. }
  206. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize2);
  207. int startColumnA = SignageDrawUtil.width / 2 - fontBinaryArray[0].length / 2;
  208. // int startRowA = height/40;
  209. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowA, startColumnA, new int[]{1, 1, 1, 1});
  210. }
  211. /**
  212. * 绘制 右屏 工站编号
  213. *
  214. * @param canvasBitmapArrays
  215. * @param ter020201InfoVo
  216. */
  217. public void canvasBitmapRightWsWorkCode(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  218. int startRowB = SignageDrawUtil.height / 20 + SignageDrawUtil.noChineseFontSize * 3;
  219. // int startColumnA = width/2 - textFontSize*10/2;
  220. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSizeHeight, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  221. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, 0);
  222. String text = ter020201InfoVo.getWsWorkCode();
  223. if (StringUtils.isEmpty(text)) {
  224. text = "00000001";
  225. }
  226. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize, SignageDrawUtil.noChineseFontSize);
  227. int startColumnB = SignageDrawUtil.width / 2 - fontBinaryArray[0].length / 2;
  228. // int startRowB = height/20 + noChineseFontSize*3;
  229. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, fontBinaryArray, startRowB, startColumnB, new int[]{1, 1, 1, 1});
  230. }
  231. /**
  232. * 绘制 右屏 操作员 相关内容
  233. *
  234. * @param canvasBitmapArrays
  235. * @param ter020201InfoVo
  236. */
  237. public void canvasBitmapRightOperator(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  238. int startColumnB = SignageDrawUtil.rightMargins;
  239. int startRowB = SignageDrawUtil.height / 20 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.height / 40;
  240. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  241. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, startColumnB);
  242. TiOnusBean tiOnusBean = ter020201InfoVo.getTiOnusBean();
  243. if (tiOnusBean == null) {
  244. tiOnusBean = new TiOnusBean();
  245. }
  246. //绘制操作员
  247. if (tiOnusBean.getIsOperate() == null || tiOnusBean.getIsOperate() == 0) {
  248. String text = tiOnusBean.getOAlias();
  249. if (StringUtils.isEmpty(text)) {
  250. text = "操作人员";
  251. }
  252. text = text + ": ";
  253. if (!StringUtils.isEmpty(ter020201InfoVo.getOperator())) {
  254. text = text + ter020201InfoVo.getOperator();
  255. }
  256. text = dotMatrixDrawtextUtil.changeTextOneLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2);
  257. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowB, startColumnB, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  258. }
  259. }
  260. /**
  261. * 绘制 右屏 生产责任人 相关内容
  262. *
  263. * @param canvasBitmapArrays
  264. * @param ter020201InfoVo
  265. */
  266. public void canvasBitmapRightProduce(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  267. int startColumnA = SignageDrawUtil.rightMargins;
  268. int startRowA = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2;
  269. //先清除整行
  270. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  271. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowA, startColumnA);
  272. TiOnusBean tiOnusBean = ter020201InfoVo.getTiOnusBean();
  273. if (tiOnusBean == null) {
  274. tiOnusBean = new TiOnusBean();
  275. }
  276. //绘制 生产责任人
  277. if (tiOnusBean.getIsProduce() == null || tiOnusBean.getIsProduce() == 0) {
  278. String text = tiOnusBean.getPAlias();
  279. if (StringUtils.isEmpty(text)) {
  280. text = "生产责任人";
  281. }
  282. text = text + ": ";
  283. if (!StringUtils.isEmpty(ter020201InfoVo.getProduce())) {
  284. text = text + ter020201InfoVo.getProduce();
  285. }
  286. text = dotMatrixDrawtextUtil.changeTextOneLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2);
  287. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowA, startColumnA, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  288. }
  289. }
  290. /**
  291. * 绘制 右屏 维修责任人 相关内容
  292. *
  293. * @param canvasBitmapArrays
  294. * @param ter020201InfoVo
  295. */
  296. public void canvasBitmapRightMaintain(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  297. int startColumnB = SignageDrawUtil.rightMargins;
  298. int startRowB = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 2 + SignageDrawUtil.height / 40;
  299. //先清除整行
  300. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  301. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, startColumnB);
  302. TiOnusBean tiOnusBean = ter020201InfoVo.getTiOnusBean();
  303. if (tiOnusBean == null) {
  304. tiOnusBean = new TiOnusBean();
  305. }
  306. //绘制 维修责任人
  307. if (tiOnusBean.getIsMaintain() == null || tiOnusBean.getIsMaintain() == 0) {
  308. String text = tiOnusBean.getMAlias();
  309. if (StringUtils.isEmpty(text)) {
  310. text = "维修责任人";
  311. }
  312. text = text + ": ";
  313. if (!StringUtils.isEmpty(ter020201InfoVo.getMaintain())) {
  314. text = text + ter020201InfoVo.getMaintain();
  315. }
  316. text = dotMatrixDrawtextUtil.changeTextOneLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2);
  317. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowB, startColumnB, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  318. }
  319. }
  320. /**
  321. * 绘制 右屏 巡检责任人 相关内容
  322. *
  323. * @param canvasBitmapArrays
  324. * @param ter020201InfoVo
  325. */
  326. public void canvasBitmapRightInspection(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  327. int startColumnB = SignageDrawUtil.rightMargins;
  328. int startRowB = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 4 + SignageDrawUtil.height / 40;
  329. //先清除整行
  330. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  331. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, startColumnB);
  332. TiOnusBean tiOnusBean = ter020201InfoVo.getTiOnusBean();
  333. if (tiOnusBean == null) {
  334. tiOnusBean = new TiOnusBean();
  335. }
  336. //绘制 巡检责任人
  337. if (tiOnusBean.getIsInspect() == null || tiOnusBean.getIsInspect() == 0) {
  338. String text = tiOnusBean.getIAlias();
  339. if (StringUtils.isEmpty(text)) {
  340. text = "巡检责任人";
  341. }
  342. text = text + ": ";
  343. if (!StringUtils.isEmpty(ter020201InfoVo.getInspection())) {
  344. text = text + ter020201InfoVo.getInspection();
  345. }
  346. text = dotMatrixDrawtextUtil.changeTextOneLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2);
  347. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowB, startColumnB, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  348. }
  349. }
  350. /**
  351. * 绘制 右屏 保养责任人 相关内容
  352. *
  353. * @param canvasBitmapArrays
  354. * @param ter020201InfoVo
  355. */
  356. public void canvasBitmapRightUpkeep(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  357. int startColumnA = SignageDrawUtil.rightMargins;
  358. int startRowA = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 5 + SignageDrawUtil.height / 20;
  359. //先清除整行
  360. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  361. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowA, startColumnA);
  362. TiOnusBean tiOnusBean = ter020201InfoVo.getTiOnusBean();
  363. if (tiOnusBean == null) {
  364. tiOnusBean = new TiOnusBean();
  365. }
  366. //绘制 保养责任人
  367. if (tiOnusBean.getIsUpkeep() == null || tiOnusBean.getIsUpkeep() == 0) {
  368. String text = tiOnusBean.getUAlias();
  369. if (StringUtils.isEmpty(text)) {
  370. text = "保养责任人";
  371. }
  372. text = text + ": ";
  373. if (!StringUtils.isEmpty(ter020201InfoVo.getUpkeep())) {
  374. text = text + ter020201InfoVo.getUpkeep();
  375. }
  376. text = dotMatrixDrawtextUtil.changeTextOneLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2);
  377. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowA, startColumnA, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  378. }
  379. }
  380. /**
  381. * 绘制 当前在岗 标题
  382. */
  383. public void canvasBitmapRightCheckTitle(int[][] canvasBitmapArrays) {
  384. String text = "当前在岗:";
  385. int textBitmapSumB = text.length() * SignageDrawUtil.textFontSize2;
  386. int startColumnB = SignageDrawUtil.rightMargins;
  387. int startRowB = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8 + SignageDrawUtil.height / 20;
  388. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, text, startRowB, startColumnB, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  389. }
  390. /**
  391. * 绘制 当前在岗打卡 生产
  392. *
  393. * @param canvasBitmapArrays
  394. * @param ter020201InfoVo
  395. */
  396. public void canvasBitmapRightCheckProduce(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  397. int startColumnA = SignageDrawUtil.rightMargins + ((SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2) / 4) / 2;
  398. int startRowA = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8 + SignageDrawUtil.height / 20;
  399. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.textFontSize2 * 5 + SignageDrawUtil.noChineseFontSize * 2];
  400. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  401. cleanBinaryArray,
  402. startRowA,
  403. startColumnA - cleanBinaryArray[0].length / 2);
  404. TiClockBean tiClock = ter020201InfoVo.getTiClock();
  405. if (tiClock == null) {
  406. tiClock = new TiClockBean();
  407. }
  408. //生产
  409. if (tiClock.getProduce() == null || tiClock.getProduce() == 0) {
  410. String text = tiClock.getPAlias();
  411. if (StringUtils.isEmpty(text)) {
  412. text = "生产";
  413. }
  414. if (ter020201InfoVo.getCheckProduce() != null) {
  415. text = text + ter020201InfoVo.getCheckProduce() + "人";
  416. } else {
  417. text = text + "0人";
  418. }
  419. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  420. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  421. fontBinaryArray,
  422. startRowA,
  423. startColumnA - fontBinaryArray[0].length / 2);//,new int[]{1,1,1,1}
  424. }
  425. }
  426. /**
  427. * 绘制 当前在岗打卡 维修
  428. *
  429. * @param canvasBitmapArrays
  430. * @param ter020201InfoVo
  431. */
  432. public void canvasBitmapRightCheckMaintain(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  433. // int textBitmapSumB = text.length() * textFontSize2;
  434. int startColumnB = SignageDrawUtil.rightMargins + ((SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2) / 4) / 2 * 3;
  435. int startRowB = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8 + SignageDrawUtil.height / 20;
  436. //清除
  437. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.textFontSize2 * 5 + SignageDrawUtil.noChineseFontSize * 2];
  438. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  439. cleanBinaryArray,
  440. startRowB,
  441. startColumnB - cleanBinaryArray[0].length / 2);
  442. TiClockBean tiClock = ter020201InfoVo.getTiClock();
  443. if (tiClock == null) {
  444. tiClock = new TiClockBean();
  445. }
  446. //维修
  447. if (tiClock.getMaintain() == null || tiClock.getMaintain() == 0) {
  448. String text = tiClock.getMAlias();
  449. if (StringUtils.isEmpty(text)) {
  450. text = "维修";
  451. }
  452. if (ter020201InfoVo.getCheckMaintain() != null) {
  453. text = text + ter020201InfoVo.getCheckMaintain() + "人";
  454. } else {
  455. text = text + "0人";
  456. }
  457. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  458. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  459. fontBinaryArray,
  460. startRowB,
  461. startColumnB - fontBinaryArray[0].length / 2);//,new int[]{1,1,1,1}
  462. // XZPDrawtextUtil.drawingText(canvasBitmapArrays,text,startRowB,startColumnB,textFontSize2,noChineseFontSize);
  463. }
  464. }
  465. /**
  466. * 绘制 当前在岗打卡 巡检
  467. *
  468. * @param canvasBitmapArrays
  469. * @param ter020201InfoVo
  470. */
  471. public void canvasBitmapRightCheckInspect(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  472. int startColumnB = SignageDrawUtil.rightMargins + ((SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2) / 4) / 2 * 5;
  473. int startRowB = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8 + SignageDrawUtil.height / 20;
  474. //清除
  475. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.textFontSize2 * 5 + SignageDrawUtil.noChineseFontSize * 2];
  476. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  477. cleanBinaryArray,
  478. startRowB,
  479. startColumnB - cleanBinaryArray[0].length / 2);
  480. TiClockBean tiClock = ter020201InfoVo.getTiClock();
  481. if (tiClock == null) {
  482. tiClock = new TiClockBean();
  483. }
  484. //巡检
  485. if (tiClock.getInspect() == null || tiClock.getInspect() == 0) {
  486. String text = tiClock.getIAlias();
  487. if (StringUtils.isEmpty(text)) {
  488. text = "巡检";
  489. }
  490. if (ter020201InfoVo.getCheckInspect() != null) {
  491. text = text + ter020201InfoVo.getCheckInspect() + "人";
  492. } else {
  493. text = text + "0人";
  494. }
  495. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  496. // int textBitmapSumB = text.length() * textFontSize2;
  497. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  498. fontBinaryArray,
  499. startRowB,
  500. startColumnB - fontBinaryArray[0].length / 2);//,new int[]{1,1,1,1}
  501. // XZPDrawtextUtil.drawingText(canvasBitmapArrays,text,startRowB,startColumnB,textFontSize2,noChineseFontSize);
  502. }
  503. }
  504. /**
  505. * 绘制 当前在岗打卡 保养
  506. *
  507. * @param canvasBitmapArrays
  508. * @param ter020201InfoVo
  509. */
  510. public void canvasBitmapRightCheckUpkeep(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  511. int startColumnA = SignageDrawUtil.rightMargins + ((SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2) / 4) / 2 * 7;
  512. int startRowA = SignageDrawUtil.height / 10 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8 + SignageDrawUtil.height / 20;
  513. //清除
  514. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.textFontSize2 * 5 + SignageDrawUtil.noChineseFontSize * 2];
  515. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  516. cleanBinaryArray,
  517. startRowA,
  518. startColumnA - cleanBinaryArray[0].length / 2);
  519. TiClockBean tiClock = ter020201InfoVo.getTiClock();
  520. if (tiClock == null) {
  521. tiClock = new TiClockBean();
  522. }
  523. //保养
  524. if (tiClock.getUpkeep() == null || tiClock.getUpkeep() == 0) {
  525. String text = tiClock.getUAlias();
  526. if (StringUtils.isEmpty(text)) {
  527. text = "保养";
  528. }
  529. if (ter020201InfoVo.getCheckUpkeep() != null) {
  530. text = text + ter020201InfoVo.getCheckUpkeep() + "人";
  531. } else {
  532. text = text + "0人";
  533. }
  534. int[][] fontBinaryArray = dotMatrixDrawtextUtil.drawingText(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  535. // int textBitmapSumA = text.length() * textFontSize2;
  536. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays,
  537. fontBinaryArray,
  538. startRowA,
  539. startColumnA - fontBinaryArray[0].length / 2);//,new int[]{1,1,1,1}
  540. // XZPDrawtextUtil.drawingText(canvasBitmapArrays,text,startRowA,startColumnA,textFontSize2,noChineseFontSize);
  541. }
  542. }
  543. /**
  544. * 绘制 右屏 产能报表图
  545. *
  546. * @param canvasBitmapArrays
  547. * @param ter020201InfoVo
  548. */
  549. public void canvasBitmapRightCapacityChart(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  550. //产能图
  551. //时间
  552. List<String> timeData = new ArrayList<>();
  553. //产能
  554. List<BigDecimal> capacityData = new ArrayList<>();//柱状图
  555. //良品率
  556. List<String> yieldData = new ArrayList<>();//实线折线
  557. //稼动率
  558. List<String> utilizationRateData = new ArrayList<>(); //虚线折线
  559. List<SheetPVo> sheetVos = ter020201InfoVo.getSheetVos();
  560. if (sheetVos == null || sheetVos.isEmpty()) {
  561. sheetVos = new ArrayList<>();
  562. sheetVos.add(new SheetPVo());
  563. sheetVos.add(new SheetPVo());
  564. sheetVos.add(new SheetPVo());
  565. sheetVos.add(new SheetPVo());
  566. sheetVos.add(new SheetPVo());
  567. sheetVos.add(new SheetPVo());
  568. sheetVos.add(new SheetPVo());
  569. sheetVos.add(new SheetPVo());
  570. }
  571. sheetVos.forEach(sheetPVo -> {
  572. boolean isAdd = false;
  573. //时间使用结束时间
  574. String time = sheetPVo.getTimeEnd();
  575. if (time != null) {
  576. Pattern pattern = Pattern.compile("\\d{2}:\\d{2}");
  577. Matcher matcher = pattern.matcher(time);
  578. if (matcher.find()) {
  579. timeData.add(matcher.group());
  580. isAdd = true;
  581. }
  582. }
  583. if (!isAdd) {
  584. //展示时间
  585. timeData.add(sheetPVo.getTime());
  586. }
  587. //2024/07/01 将产能柱状数据改为良品柱状数据
  588. //capacityData.add(Long.valueOf(sheetPVo.getProduction()));
  589. capacityData.add(BigDecimal.valueOf(sheetPVo.getGood()).setScale(2, RoundingMode.DOWN));
  590. yieldData.add(String.valueOf(sheetPVo.getGoodRate()));
  591. utilizationRateData.add(String.valueOf(sheetPVo.getUtilizationRate()));
  592. });
  593. int startColumnB = SignageDrawUtil.rightMargins;
  594. int startRowB = SignageDrawUtil.height / 5 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8;
  595. drawRight1Chart(canvasBitmapArrays,
  596. timeData, capacityData, yieldData, utilizationRateData, ter020201InfoVo.getStandardNum(),
  597. startRowB, startColumnB);
  598. }
  599. /**
  600. * 绘制 右屏 工时图
  601. *
  602. * @param canvasBitmapArrays
  603. * @param ter020201InfoVo
  604. */
  605. public void canvasBitmapRightWorkingTimeChart(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  606. //工时图
  607. //时间
  608. List<String> timeData = new ArrayList<>();
  609. //工时
  610. List<Long> workData = new ArrayList<>();//柱状图
  611. //人数
  612. List<Long> peopleNumData = new ArrayList<>();//实线折线
  613. List<SheetCheckVo> sheetCheckVoList = ter020201InfoVo.getSheetCheckVos();
  614. if (sheetCheckVoList == null || sheetCheckVoList.isEmpty()) {
  615. sheetCheckVoList = new ArrayList<>();
  616. sheetCheckVoList.add(new SheetCheckVo());
  617. sheetCheckVoList.add(new SheetCheckVo());
  618. sheetCheckVoList.add(new SheetCheckVo());
  619. sheetCheckVoList.add(new SheetCheckVo());
  620. sheetCheckVoList.add(new SheetCheckVo());
  621. sheetCheckVoList.add(new SheetCheckVo());
  622. sheetCheckVoList.add(new SheetCheckVo());
  623. sheetCheckVoList.add(new SheetCheckVo());
  624. }
  625. sheetCheckVoList.forEach(sheetCheckVo -> {
  626. boolean isAdd = false;
  627. //时间使用结束时间
  628. String time = sheetCheckVo.getTimeEnd();
  629. if (time != null) {
  630. Pattern pattern = Pattern.compile("\\d{2}:\\d{2}");
  631. Matcher matcher = pattern.matcher(time);
  632. if (matcher.find()) {
  633. timeData.add(matcher.group());
  634. isAdd = true;
  635. }
  636. }
  637. if (!isAdd) {
  638. // 展示时间
  639. timeData.add(sheetCheckVo.getTime());
  640. }
  641. workData.add(Long.valueOf(sheetCheckVo.getWork()));
  642. peopleNumData.add(Long.valueOf(sheetCheckVo.getPeopleNum()));
  643. });
  644. int startColumnB = SignageDrawUtil.rightMargins;
  645. int startRowB = SignageDrawUtil.height / 5 + SignageDrawUtil.noChineseFontSize * 7 + SignageDrawUtil.textFontSize2 * 8;
  646. drawRight2Chart(canvasBitmapArrays, timeData, workData, peopleNumData, startRowB, startColumnB);
  647. }
  648. /**
  649. * 绘制 右屏 工站公告
  650. *
  651. * @param canvasBitmapArrays
  652. * @param ter020201InfoVo
  653. */
  654. public void canvasBitmapRightWsNotice(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  655. //绘制 公告1
  656. String text = "公告: ";
  657. if (!StringUtils.isEmpty(ter020201InfoVo.getWsNotice())) {
  658. text = text + ter020201InfoVo.getWsNotice();
  659. }
  660. List<String> textMoreLine = dotMatrixDrawtextUtil.changeTextMoreLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2, 3);
  661. for (int i = 0; i < 3; i++) {
  662. int startColumnB = SignageDrawUtil.rightMargins;
  663. int startRowB = SignageDrawUtil.height / 5 * 2 + SignageDrawUtil.noChineseFontSize * 11 + SignageDrawUtil.textFontSize2 * (8 + i) + SignageDrawUtil.height / 20 + SignageDrawUtil.height / 80 * i;
  664. //先清除整行
  665. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  666. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowB, startColumnB);
  667. if (i < textMoreLine.size()) {
  668. String dataStr = textMoreLine.get(i);
  669. // int[][] fontBinaryArray = XZPDrawtextUtil.drawingText(dataStr,textFontSize2,noChineseFontSize);
  670. // int textBitmapSumB = dataStr.length() * textFontSize2;
  671. // XZPCanvasUtil.mergeDotMatrices(canvasBitmapArrays,fontBinaryArray,startRowB,startColumnB,new int[]{0,0,0,1});
  672. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, dataStr, startRowB, startColumnB, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  673. }
  674. }
  675. }
  676. /**
  677. * 绘制 右屏 系统公告 or 版本公告
  678. *
  679. * @param canvasBitmapArrays
  680. * @param ter020201InfoVo
  681. */
  682. public void canvasBitmapRightSysNotice(int[][] canvasBitmapArrays, Ter020201InfoVo ter020201InfoVo) {
  683. String text = null;
  684. //优先判断版本公告
  685. if (!StringUtils.isEmpty(ter020201InfoVo.getVerNotice())) {
  686. text = "版本通知: " + ter020201InfoVo.getVerNotice();
  687. } else if (!StringUtils.isEmpty(ter020201InfoVo.getSysNotice())) {
  688. text = "系统通知: " + ter020201InfoVo.getSysNotice();
  689. }
  690. if (StringUtils.isEmpty(text)) {
  691. //没有公告时直接不显示
  692. return;
  693. }
  694. // text = "系统通知: " + text;
  695. List<String> textMoreLine = dotMatrixDrawtextUtil.changeTextMoreLine(text, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize, SignageDrawUtil.width - SignageDrawUtil.rightMargins * 2, 1);
  696. for (int i = 0; i < 1; i++) {
  697. int startColumnA = SignageDrawUtil.rightMargins;
  698. int startRowA = SignageDrawUtil.height / 5 * 2 + SignageDrawUtil.noChineseFontSize * (11 + 1) + SignageDrawUtil.textFontSize2 * (3 + 8 + i) + SignageDrawUtil.height / 20 + SignageDrawUtil.height / 80 * (3 + i);
  699. //先清除整行
  700. int[][] cleanBinaryArray = new int[Math.max(SignageDrawUtil.textFontSize2Height, SignageDrawUtil.noChineseFontSizeHeight)][SignageDrawUtil.width];
  701. DotMatrixCanvasUtil.mergeDotMatrices(canvasBitmapArrays, cleanBinaryArray, startRowA, startColumnA);
  702. if (i < textMoreLine.size()) {
  703. String dataStr = textMoreLine.get(i);
  704. // int[][] fontBinaryArray = XZPDrawtextUtil.drawingText(dataStr,textFontSize2,noChineseFontSize);
  705. // int textBitmapSumA = dataStr.length() * textFontSize2;
  706. // XZPCanvasUtil.mergeDotMatrices(canvasBitmapArrays,fontBinaryArray,startRowA,startColumnA,new int[]{0,0,0,1});
  707. dotMatrixDrawtextUtil.drawingText(canvasBitmapArrays, dataStr, startRowA, startColumnA, SignageDrawUtil.textFontSize2, SignageDrawUtil.noChineseFontSize);
  708. }
  709. }
  710. }
  711. /**
  712. * 绘制 右屏 底部按键 引导图
  713. *
  714. * @param canvasBitmapArrays
  715. */
  716. public void canvasBitmapRightBottomGuide(int[][] canvasBitmapArrays) {
  717. int iconWidth = 24;
  718. int iconHeight = 30;
  719. int[][] bottomGuide = new int[35][280];
  720. //绘制间隔实线
  721. DotMatrixDrawShapeUtil.drawLine(bottomGuide, 1, 0, 0,
  722. bottomGuide.length - iconWidth / 2,
  723. 0,
  724. bottomGuide[0].length);
  725. //开关机图表
  726. String resourcePath = "image/device/020201/开关.png";
  727. byte[] bitmapByte = DotMatrixImageUtil.canvasImageBitmapArrays(resourcePath, iconWidth, iconWidth, 150);//140
  728. int[][] canvas1 = DotMatrixImageUtil.twoToCanvasBitmapArrays(bitmapByte, iconWidth, iconWidth);
  729. //画布
  730. int[][] canvas1final = new int[iconHeight][iconHeight + iconWidth];
  731. DotMatrixCanvasUtil.mergeDotMatricesConfuse(
  732. canvas1final,
  733. canvas1,
  734. canvas1final.length / 2 - canvas1.length / 2,
  735. canvas1final[0].length / 2 - canvas1[0].length / 2,
  736. 0
  737. );
  738. DotMatrixCanvasUtil.mergeDotMatrices(
  739. bottomGuide,
  740. canvas1final,
  741. bottomGuide.length - canvas1final.length,
  742. bottomGuide[0].length / 4 - canvas1final[0].length / 2);
  743. //配网图标
  744. resourcePath = "image/device/020201/Wi-Fi配网.png";
  745. bitmapByte = DotMatrixImageUtil.canvasImageBitmapArrays(resourcePath, iconHeight, iconWidth, 150);//140
  746. int[][] canvas2 = DotMatrixImageUtil.twoToCanvasBitmapArrays(bitmapByte, iconHeight, iconWidth);
  747. //扩大画布
  748. int[][] canvas2final = new int[iconHeight][iconHeight + iconWidth];
  749. DotMatrixCanvasUtil.mergeDotMatricesConfuse(
  750. canvas2final,
  751. canvas2,
  752. canvas2final.length / 2 - canvas2.length / 2,
  753. canvas2final[0].length / 2 - canvas2[0].length / 2,
  754. 0
  755. );
  756. DotMatrixCanvasUtil.mergeDotMatrices(
  757. bottomGuide,
  758. canvas2final,
  759. bottomGuide.length - canvas2final.length,
  760. bottomGuide[0].length / 4 * 3 - canvas2final[0].length / 2);
  761. //绘制竖线 1
  762. DotMatrixDrawShapeUtil.drawVerticalLine(bottomGuide,
  763. 1,
  764. 0,
  765. 0,
  766. bottomGuide.length - canvas1.length / 2,
  767. 0,
  768. bottomGuide.length);
  769. //绘制竖线 2
  770. DotMatrixDrawShapeUtil.drawVerticalLine(bottomGuide,
  771. 1,
  772. 0,
  773. 0,
  774. bottomGuide.length - canvas1.length / 2,
  775. bottomGuide[0].length / 2,
  776. bottomGuide.length);
  777. //绘制竖线 3
  778. DotMatrixDrawShapeUtil.drawVerticalLine(bottomGuide,
  779. 1,
  780. 0,
  781. 0,
  782. bottomGuide.length - canvas1.length / 2,
  783. bottomGuide[0].length - 1,
  784. bottomGuide.length);
  785. //合并画布
  786. DotMatrixCanvasUtil.mergeDotMatricesConfuse(
  787. canvasBitmapArrays,
  788. bottomGuide,
  789. SignageDrawUtil.height - bottomGuide.length,
  790. SignageDrawUtil.width / 2 - bottomGuide[0].length / 2,
  791. 0
  792. );
  793. }
  794. /**
  795. * 绘制 右屏第一图表
  796. *
  797. * @param largeMatrix 画布数组
  798. * @param timeData 时间数据
  799. * @param capacityData 产能数据
  800. * @param yieldData 良品率数据
  801. * @param utilizationRateData 稼动率数据
  802. * @param startRow 内容左上角的横坐标 (列)
  803. * @param startColumn 内容左上角的横坐标 (列)
  804. */
  805. public void drawRight1Chart(int[][] largeMatrix,
  806. List<String> timeData,
  807. List<BigDecimal> capacityData,
  808. List<String> yieldData,
  809. List<String> utilizationRateData,
  810. Integer standardNum,
  811. int startRow,
  812. int startColumn
  813. ) {
  814. int xNumberSize = 5;//X轴的数字大小
  815. int xNumberHigh = 7;//X轴的数字高度
  816. int barChartWidth = 20;//柱状图的宽度
  817. int barChartInterval = 10;//柱状图间隔
  818. int yAxisDataPart = 5;//Y坐标轴数据段
  819. //绘制左侧Y轴
  820. int yLeftNumberSize = 5;//左侧数据每个数字的字体大小
  821. int yLeftNumberHigh = 7;//左侧数据每个数字的字体高度
  822. int yLeftNumberInterval = 25;//左侧数据每个数字的间隔 23
  823. int chartHeight = 135;//纯的柱状图的大小
  824. //左侧Y轴的数据大小
  825. BigDecimal maxNumber = new BigDecimal(0);
  826. if (standardNum != null) {
  827. maxNumber = new BigDecimal(standardNum);
  828. }
  829. BigDecimal minNumber = new BigDecimal(0);
  830. int maxLength = 1;
  831. for (BigDecimal numB : capacityData) {
  832. if (numB.compareTo(maxNumber) > 0) {
  833. maxNumber = numB;
  834. }
  835. if (numB.compareTo(minNumber) < 0) {
  836. minNumber = numB;
  837. }
  838. }
  839. if (BigDecimal.valueOf(0).compareTo(maxNumber) != 0) {
  840. maxNumber = maxNumber.add(new BigDecimal(yAxisDataPart - (maxNumber.subtract(minNumber).doubleValue()) % yAxisDataPart));
  841. }
  842. List<String> dataArrays = new ArrayList<>();
  843. for (int i = yAxisDataPart - 1; i >= 0; i--) {
  844. BigDecimal result = (maxNumber.multiply(new BigDecimal(i))).divide(new BigDecimal(yAxisDataPart - 1), 0, RoundingMode.DOWN);
  845. // int scale = result.stripTrailingZeros().scale();
  846. //
  847. // if(scale > 2){
  848. // result = result.setScale(2, RoundingMode.UP);
  849. // }
  850. // result = result.stripTrailingZeros();
  851. String str = result.toString();//2
  852. if (maxLength < str.length()) {
  853. maxLength = str.length();
  854. }
  855. dataArrays.add(str); //从0 开始
  856. }
  857. //清除画布
  858. int[][] cleanChartBitmapArrays = new int[chartHeight + yLeftNumberHigh + xNumberHigh + yLeftNumberSize + barChartInterval]
  859. [largeMatrix[0].length];
  860. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, cleanChartBitmapArrays,
  861. startRow - yLeftNumberHigh / 2,
  862. startColumn);
  863. //左侧 Y轴
  864. int[][] yLeftAxisCanvasBitmapArrays = new int[chartHeight + yLeftNumberHigh][maxLength * yLeftNumberSize];
  865. for (int i = 0; i < dataArrays.size(); i++) {
  866. String yData = dataArrays.get(i);
  867. int startRowY = i * chartHeight / 4;
  868. int startColumnY = maxLength * yLeftNumberSize - yData.length() * yLeftNumberSize;
  869. dotMatrixDrawtextUtil.drawingText(yLeftAxisCanvasBitmapArrays, yData, startRowY, startColumnY, yLeftNumberSize);
  870. }
  871. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, yLeftAxisCanvasBitmapArrays, startRow - yLeftNumberHigh / 2, startColumn);
  872. //绘制柱状图
  873. int dataPart = capacityData.size();//柱状图数据段
  874. //得出图像点阵的大小
  875. int chartHigh = chartHeight;
  876. int chartWidth = dataPart * barChartWidth + barChartInterval * dataPart;
  877. int[][] barChartBitmapArrays = new int[chartHigh][chartWidth];
  878. if (BigDecimal.valueOf(0).compareTo(maxNumber) != 0) {
  879. for (int i = 0; i < capacityData.size(); i++) {
  880. long number = capacityData.get(i).multiply(new BigDecimal(chartHigh)).divide(maxNumber, 2, RoundingMode.DOWN).longValue();
  881. if (number <= 0) {
  882. if (BigDecimal.valueOf(0).compareTo(capacityData.get(i)) != 0) {
  883. number = 1;
  884. } else {
  885. number = 0;
  886. }
  887. }
  888. for (int j = 0; j < barChartBitmapArrays.length; j++) {
  889. if (j >= barChartBitmapArrays.length - number) {
  890. for (int k = 0; k < barChartBitmapArrays[0].length; k++) {
  891. int leftInterval = barChartInterval / 2 + i * (barChartWidth + barChartInterval);
  892. int rightInterval = barChartWidth + barChartInterval / 2 + i * (barChartWidth + barChartInterval);
  893. if (k >= leftInterval
  894. && k <= rightInterval) {
  895. barChartBitmapArrays[j][k] = 1;
  896. }
  897. }
  898. }
  899. }
  900. }
  901. }
  902. //实线折线图
  903. int[][] solidPolylineBitmapArrays = new int[chartHigh][chartWidth];
  904. List<int[]> yieldDataArrays = new ArrayList<>();
  905. for (int i = 0; i < yieldData.size(); i++) {
  906. String yield = yieldData.get(i);
  907. //折线原点的位置
  908. int row = (int) (Double.parseDouble(yield) * (chartHigh - 1) / 100);//行
  909. int column = barChartInterval / 2 + barChartWidth / 2 + i * (barChartWidth + barChartInterval);//列
  910. yieldDataArrays.add(new int[]{chartHigh - 1 - row, column});
  911. }
  912. yieldDataArrays = DotMatrixDrawShapeUtil.computeBezierCurve(yieldDataArrays);
  913. for (int i = 0; i < yieldDataArrays.size(); i = i + 1) {
  914. int[] yieldArray = yieldDataArrays.get(i);
  915. if (yieldArray[0] >= 0 && yieldArray[0] < solidPolylineBitmapArrays.length &&
  916. yieldArray[1] >= 0 && yieldArray[1] < solidPolylineBitmapArrays[0].length) {
  917. solidPolylineBitmapArrays[yieldArray[0]]
  918. [yieldArray[1]] = 1;
  919. }
  920. }
  921. //虚线折线图
  922. int[][] dottedLineBitmapArrays = new int[chartHigh][chartWidth];
  923. List<int[]> utilizationRateDataArrays = new ArrayList<>();
  924. for (int i = 0; i < utilizationRateData.size(); i++) {
  925. String utilizationRate = utilizationRateData.get(i);
  926. //折线原点的位置
  927. int row = (int) (Double.parseDouble(utilizationRate) * (chartHigh - 1) / 100);// ;//行
  928. int column = barChartInterval / 2 + barChartWidth / 2 + i * (barChartWidth + barChartInterval);//列
  929. utilizationRateDataArrays.add(new int[]{chartHigh - 1 - row, column}); //-1
  930. }
  931. utilizationRateDataArrays = DotMatrixDrawShapeUtil.computeBezierCurve(utilizationRateDataArrays);
  932. boolean isUse = true;
  933. for (int i = 0; i < utilizationRateDataArrays.size(); i = i + 1) {
  934. int[] utilizationRateData1 = utilizationRateDataArrays.get(i);
  935. if (utilizationRateData1[0] >= 0 && utilizationRateData1[0] < dottedLineBitmapArrays.length &&
  936. utilizationRateData1[1] >= 0 && utilizationRateData1[1] < dottedLineBitmapArrays[0].length) {
  937. if (i == 0) {
  938. isUse = true;
  939. } else {
  940. if (i < utilizationRateDataArrays.size() - 1) {
  941. int[] utilizationRateData2 = utilizationRateDataArrays.get(i + 1);
  942. //判断是否是相邻的
  943. if (Math.abs(utilizationRateData1[0] - utilizationRateData2[0]) <= 1 ||
  944. Math.abs(utilizationRateData1[1] - utilizationRateData2[1]) <= 1
  945. ) {
  946. if (isUse) {
  947. //周围的点被使用
  948. isUse = false;
  949. } else {
  950. isUse = true;
  951. }
  952. } else {
  953. isUse = true;
  954. }
  955. }
  956. }
  957. if (isUse) {
  958. dottedLineBitmapArrays[utilizationRateData1[0]]
  959. [utilizationRateData1[1]] = 1;
  960. }
  961. }
  962. }
  963. //产能达标线
  964. int[][] standardNumBitmapArrays = new int[chartHeight][chartWidth];
  965. if (standardNum != null) {
  966. BigDecimal standardNumBigDecimal = new BigDecimal(standardNum);
  967. long number = 0;
  968. if (BigDecimal.valueOf(0).compareTo(maxNumber) != 0) {
  969. number = standardNumBigDecimal.multiply(new BigDecimal(chartHigh)).divide(maxNumber, 2, RoundingMode.DOWN).longValue();
  970. }
  971. if (number <= 0) {
  972. if (BigDecimal.valueOf(0).compareTo(standardNumBigDecimal) != 0) {
  973. number = 1;
  974. } else {
  975. number = 0;
  976. }
  977. }
  978. DotMatrixDrawShapeUtil.drawLine(standardNumBitmapArrays, 1, 1, 1,
  979. (int) (chartHigh - number),
  980. 5, chartWidth - 5);
  981. }
  982. for (int i = 0; i < chartHigh; i++) {
  983. for (int j = 0; j < chartWidth; j++) {
  984. int k = 0;
  985. if (barChartBitmapArrays[i][j] == 1) {
  986. k++;
  987. }
  988. if (standardNum != null) {
  989. if (standardNumBitmapArrays[i][j] == 1) {
  990. k++;
  991. }
  992. }
  993. if (k == 1) {
  994. barChartBitmapArrays[i][j] = 1;
  995. } else {
  996. barChartBitmapArrays[i][j] = 0;
  997. }
  998. }
  999. }
  1000. //合并图像数组
  1001. int[][] chartBitmapArrays = new int[chartHigh][chartWidth];
  1002. for (int i = 0; i < chartHigh; i++) {
  1003. for (int j = 0; j < chartWidth; j++) {
  1004. int k = 0;
  1005. if (barChartBitmapArrays[i][j] == 1) {
  1006. k++;
  1007. }
  1008. if (solidPolylineBitmapArrays[i][j] == 1) {
  1009. k++;
  1010. }
  1011. if (dottedLineBitmapArrays[i][j] == 1) {
  1012. k++;
  1013. }
  1014. if (k == 1) {
  1015. chartBitmapArrays[i][j] = 1;
  1016. }
  1017. }
  1018. }
  1019. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, chartBitmapArrays,
  1020. startRow,
  1021. startColumn + (maxLength * yLeftNumberSize));//+ barChartInterval
  1022. //绘制X轴
  1023. int[][] xAxisCanvasBitmapArrays = new int[xNumberHigh + barChartInterval]
  1024. [barChartWidth * dataPart + barChartInterval * dataPart];
  1025. for (int i = 0; i < timeData.size(); i++) {
  1026. String xData = timeData.get(i);
  1027. if (xData == null || xData.isEmpty()) {
  1028. xData = "00:00";
  1029. }
  1030. int startColumnX = i * (barChartWidth + barChartInterval) + barChartInterval / 2 + barChartWidth / 2 - (xData.length() * xNumberSize) / 2;//(i+1)*(dataPart/2 + barChartWidth/2) - (xData.length() * xNumberSize)/2;
  1031. if (startColumnX <= 0) {
  1032. startColumnX = 0;
  1033. }
  1034. dotMatrixDrawtextUtil.drawingText(xAxisCanvasBitmapArrays, xData, 0, startColumnX, xNumberSize);
  1035. }
  1036. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, xAxisCanvasBitmapArrays,
  1037. startRow + yLeftAxisCanvasBitmapArrays.length + yLeftNumberSize,
  1038. startColumn + (maxLength * yLeftNumberSize));//+ barChartInterval
  1039. //绘制右侧Y轴
  1040. int yRightNumberSize = 5;//右侧数据每个数字的字体大小
  1041. int yRightNumberHigh = 7;//右侧数据每个数字的字体高度 7
  1042. int yRightNumberInterval = 25;//右侧数据每个数字的间隔 20
  1043. dataArrays = new ArrayList<>();
  1044. dataArrays.add("100.0%");
  1045. dataArrays.add("75.0%");
  1046. dataArrays.add("50.0%");
  1047. dataArrays.add("25.0%");
  1048. dataArrays.add("0.0%");
  1049. int[][] yRightAxisCanvasBitmapArrays = new int[chartHeight + yRightNumberHigh]
  1050. ["100.0%".length() * yRightNumberSize];
  1051. for (int i = 0; i < dataArrays.size(); i++) {
  1052. String yData = dataArrays.get(i);
  1053. int startRowY = i * chartHeight / 4;
  1054. dotMatrixDrawtextUtil.drawingText(yRightAxisCanvasBitmapArrays, yData, startRowY, 0, yRightNumberSize);
  1055. }
  1056. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, yRightAxisCanvasBitmapArrays,
  1057. startRow - yRightNumberHigh / 2,
  1058. startColumn + ((maxLength * yLeftNumberSize) + // + barChartInterval)
  1059. dataPart * barChartWidth + barChartInterval * dataPart));//+ barChartInterval
  1060. int chartStartColumn = startColumn + ((maxLength * yLeftNumberSize))//+ barChartInterval
  1061. + dataPart * barChartWidth + barChartInterval * dataPart//+ barChartInterval
  1062. + "100.0%".length() * yRightNumberSize;
  1063. int widthC = SignageDrawUtil.width - SignageDrawUtil.rightMargins - chartStartColumn;
  1064. int startColumnC = chartStartColumn + widthC / 2;
  1065. //绘制最新的数据
  1066. //最新产能
  1067. BigDecimal result = capacityData.get(capacityData.size() - 1);
  1068. int scale = result.stripTrailingZeros().scale();
  1069. if (scale > 2) {
  1070. result = result.setScale(2, RoundingMode.UP);
  1071. }
  1072. String newStr;
  1073. if (result.scale() > 0 && result.stripTrailingZeros().scale() <= 0) {
  1074. // 如果小数点后有零,但是去掉尾部零后,小数位数为0,则返回整数格式
  1075. newStr = new DecimalFormat("#").format(result);
  1076. } else {
  1077. // 否则,保留原样
  1078. newStr = result.toPlainString();
  1079. }
  1080. int textFontSize = 12;
  1081. int textBitmapSum = newStr.length() * textFontSize;
  1082. startColumn = chartStartColumn + widthC / 2 - textBitmapSum / 2;
  1083. startRow = startRow + yLeftNumberHigh + barChartInterval;
  1084. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1085. int startRowC = startRow + textFontSize + SignageDrawUtil.height / 20;
  1086. //最新良品率
  1087. newStr = yieldData.get(yieldData.size() - 1);
  1088. try {
  1089. if (Double.parseDouble(newStr) >= 100) {
  1090. newStr = "100";
  1091. }
  1092. } catch (Exception e) {
  1093. e.printStackTrace();
  1094. }
  1095. newStr = newStr + "%";
  1096. textFontSize = 8;
  1097. int textBitmapSum2 = newStr.length() * textFontSize;
  1098. startColumn = startColumnC - widthC / 4 - textBitmapSum2 / 2;
  1099. startRow = startRowC;
  1100. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1101. newStr = "良品率";//良品率
  1102. textFontSize = 16;
  1103. textBitmapSum = newStr.length() * textFontSize;
  1104. startColumn = startColumnC - widthC / 4 - textBitmapSum / 2;
  1105. startRow = startRowC + SignageDrawUtil.height / 40;
  1106. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1107. //绘制间隔实线
  1108. startRow = startRowC + SignageDrawUtil.height / 40 + textFontSize + 2;
  1109. DotMatrixDrawShapeUtil.drawLine(largeMatrix, 1, 0, 0, startRow, startColumn, startColumn + textBitmapSum);
  1110. //最新稼动率
  1111. newStr = utilizationRateData.get(utilizationRateData.size() - 1);
  1112. try {
  1113. if (Double.parseDouble(newStr) >= 100) {
  1114. newStr = "100.0";
  1115. }
  1116. } catch (Exception e) {
  1117. e.printStackTrace();
  1118. }
  1119. newStr = newStr + "%";
  1120. textFontSize = 8;
  1121. textBitmapSum2 = newStr.length() * textFontSize;
  1122. startColumn = startColumnC + widthC / 4 - textBitmapSum2 / 2;
  1123. startRow = startRowC;
  1124. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1125. newStr = "稼动率";//稼动率
  1126. textFontSize = 16;
  1127. textBitmapSum = newStr.length() * textFontSize;
  1128. startColumn = startColumnC + widthC / 4 - textBitmapSum / 2;
  1129. startRow = startRowC + SignageDrawUtil.height / 40;
  1130. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1131. //绘制间隔实线
  1132. startRow = startRowC + SignageDrawUtil.height / 40 + textFontSize + 2;
  1133. DotMatrixDrawShapeUtil.drawLine(largeMatrix, 1, 1, 1, startRow, startColumn, startColumn + textBitmapSum);
  1134. }
  1135. /**
  1136. * 绘制 右屏第二图表
  1137. *
  1138. * @param largeMatrix 画布数组
  1139. * @param timeData 时间数据
  1140. * @param workData 工时数据
  1141. * @param peopleNumData 人数数据
  1142. * @param startRow 内容左上角的横坐标 (列)
  1143. * @param startColumn 内容左上角的横坐标 (列)
  1144. */
  1145. public void drawRight2Chart(int[][] largeMatrix,
  1146. List<String> timeData,
  1147. List<Long> workData,
  1148. List<Long> peopleNumData,
  1149. int startRow,
  1150. int startColumn
  1151. ) {
  1152. int xNumberSize = 5;//X轴的数字大小
  1153. int xNumberHigh = 7;//X轴的数字高度
  1154. int dataPart = workData.size();//柱状图数据段
  1155. int barChartWidth = 20;//柱状图的宽度
  1156. int barChartInterval = 10;//柱状图间隔
  1157. int yAxisDataPart = 5;//Y坐标轴数据段
  1158. //绘制左侧Y轴
  1159. int yLeftNumberSize = 5;//左侧数据每个数字的字体大小
  1160. int yLeftNumberHigh = 7;//左侧数据每个数字的字体高度 7
  1161. int yLeftNumberInterval = 20;//左侧数据每个数字的间隔 20
  1162. int chartHeight = 135;//纯的柱状图的大小
  1163. //左侧Y轴的数据大小
  1164. long maxNumber = Collections.max(workData);
  1165. ;
  1166. long minNumber = Collections.min(workData);
  1167. ;
  1168. if (maxNumber != 0) {
  1169. maxNumber = maxNumber + (yAxisDataPart - (maxNumber - minNumber) % yAxisDataPart);
  1170. }
  1171. String maxLeftDataStr = String.valueOf(maxNumber);
  1172. List<String> dataArrays = new ArrayList<>();
  1173. // long data = maxNumber / yAxisDataPart;//(maxNumber - minNumber)/yAxisDataPart;
  1174. // for(int i = yAxisDataPart ; i > 0 ; i--){
  1175. // dataArrays.add( String.valueOf( minNumber + data * i));
  1176. // }
  1177. // dataArrays.add(0,"0");//直接添加0
  1178. for (int i = yAxisDataPart - 1; i >= 0; i--) {
  1179. dataArrays.add(String.valueOf(i * maxNumber / (yAxisDataPart - 1))); //从0 开始
  1180. }
  1181. //清除画布
  1182. int[][] cleanChartBitmapArrays = new int[chartHeight + yLeftNumberHigh + xNumberHigh + yLeftNumberSize + barChartInterval]
  1183. [largeMatrix[0].length];
  1184. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, cleanChartBitmapArrays,
  1185. startRow - yLeftNumberHigh / 2,
  1186. startColumn);
  1187. // int[][] yLeftAxisCanvasBitmapArrays = new int[yLeftNumberHigh * yAxisDataPart + yLeftNumberInterval * (yAxisDataPart - 1)][maxLeftDataStr.length() * yLeftNumberSize];
  1188. int[][] yLeftAxisCanvasBitmapArrays = new int[chartHeight + yLeftNumberHigh][maxLeftDataStr.length() * yLeftNumberSize];
  1189. for (int i = 0; i < dataArrays.size(); i++) {
  1190. String yData = dataArrays.get(i);
  1191. // int startRowY = i*(yLeftNumberSize + yLeftNumberInterval);
  1192. int startRowY = i * chartHeight / 4;
  1193. int startColumnY = String.valueOf(maxNumber).length() * yLeftNumberSize - yData.length() * yLeftNumberSize;
  1194. dotMatrixDrawtextUtil.drawingText(yLeftAxisCanvasBitmapArrays, yData, startRowY, startColumnY, yLeftNumberSize);
  1195. }
  1196. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, yLeftAxisCanvasBitmapArrays, startRow - yLeftNumberHigh / 2, startColumn);
  1197. //得出图像点阵的大小
  1198. int chartHigh = chartHeight;//yLeftAxisCanvasBitmapArrays.length;
  1199. int chartWidth = dataPart * barChartWidth + barChartInterval * dataPart;
  1200. //绘制柱状图
  1201. int[][] barChartBitmapArrays = new int[chartHigh][chartWidth];
  1202. if (maxNumber != 0) {
  1203. for (int i = 0; i < workData.size(); i++) {
  1204. long number = workData.get(i) * chartHigh / maxNumber;//(maxNumber - minNumber);
  1205. if (number <= 0) {
  1206. number = 0;
  1207. }
  1208. for (int j = 0; j < barChartBitmapArrays.length; j++) {
  1209. if (j >= barChartBitmapArrays.length - number) {
  1210. for (int k = 0; k < barChartBitmapArrays[0].length; k++) {
  1211. int leftInterval = barChartInterval / 2 + i * (barChartWidth + barChartInterval);
  1212. int rightInterval = barChartWidth + barChartInterval / 2 + i * (barChartWidth + barChartInterval);
  1213. if (k >= leftInterval
  1214. && k <= rightInterval) {
  1215. barChartBitmapArrays[j][k] = 1;
  1216. }
  1217. }
  1218. }
  1219. }
  1220. }
  1221. }
  1222. // XZPCanvasUtil.mergeDotMatrices(largeMatrix,barChartBitmapArrays,
  1223. // startRow,
  1224. // startColumn+ (String.valueOf(maxNumber).length() * yLeftNumberSize) );//+ barChartInterval
  1225. //绘制右侧Y轴
  1226. int yRightNumberSize = 5;//右侧数据每个数字的字体大小
  1227. int yRightNumberHigh = 7;//右侧数据每个数字的字体高度 7
  1228. int yRightNumberInterval = 23;//右侧数据每个数字的间隔 20
  1229. dataArrays = new ArrayList<>();
  1230. long maxNumber2 = Collections.max(peopleNumData);
  1231. ;
  1232. long minNumber2 = Collections.min(peopleNumData);
  1233. ;
  1234. if (maxNumber2 != 0) {
  1235. maxNumber2 = maxNumber2 + (yAxisDataPart - (maxNumber2 - minNumber2) % yAxisDataPart);
  1236. }
  1237. maxLeftDataStr = String.valueOf(maxNumber2);
  1238. dataArrays = new ArrayList<>();
  1239. // data = maxNumber / yAxisDataPart;//(maxNumber - minNumber)/yAxisDataPart;
  1240. //
  1241. //
  1242. // for(int i = yAxisDataPart ; i > 0 ; i--){
  1243. // dataArrays.add( String.valueOf( minNumber + data * i));
  1244. // }
  1245. for (int i = yAxisDataPart - 1; i >= 0; i--) {
  1246. dataArrays.add(String.valueOf(i * maxNumber2 / (yAxisDataPart - 1))); //从0 开始
  1247. }
  1248. // int[][] yRightAxisCanvasBitmapArrays = new int[yRightNumberHigh * yAxisDataPart + yRightNumberInterval * (yAxisDataPart - 1)]
  1249. // [maxLeftDataStr.length() * yRightNumberSize];
  1250. int[][] yRightAxisCanvasBitmapArrays = new int[chartHeight + yRightNumberHigh]
  1251. [maxLeftDataStr.length() * yRightNumberSize];
  1252. for (int i = 0; i < dataArrays.size(); i++) {
  1253. String yData = dataArrays.get(i);
  1254. // int startRowY = i*(yRightNumberSize + yRightNumberInterval);
  1255. int startRowY = i * chartHeight / 4;
  1256. dotMatrixDrawtextUtil.drawingText(yRightAxisCanvasBitmapArrays, yData, startRowY, 0, yRightNumberSize);
  1257. }
  1258. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, yRightAxisCanvasBitmapArrays,
  1259. startRow - yRightNumberHigh / 2,
  1260. startColumn + ((String.valueOf(maxNumber).length() * yLeftNumberSize) + // + barChartInterval)
  1261. dataPart * barChartWidth + barChartInterval * dataPart));//+ barChartInterval
  1262. //实线折线图
  1263. int[][] solidPolylineBitmapArrays = new int[chartHigh][chartWidth];
  1264. List<int[]> yieldDataArrays = new ArrayList<>();
  1265. for (int i = 0; i < peopleNumData.size(); i++) {
  1266. //折线原点的位置
  1267. int row = 0;
  1268. if (maxNumber2 > 0) {
  1269. row = (int) (peopleNumData.get(i) * (chartHigh - 1) / maxNumber2);
  1270. }
  1271. int column = barChartInterval / 2 + barChartWidth / 2 + i * (barChartWidth + barChartInterval);//列
  1272. yieldDataArrays.add(new int[]{chartHigh - 1 - row, column});
  1273. }
  1274. yieldDataArrays = DotMatrixDrawShapeUtil.computeBezierCurve(yieldDataArrays);
  1275. for (int i = 0; i < yieldDataArrays.size(); i++) {
  1276. int[] yieldArray = yieldDataArrays.get(i);
  1277. if (yieldArray[0] >= 0 && yieldArray[0] < solidPolylineBitmapArrays.length &&
  1278. yieldArray[1] >= 0 && yieldArray[1] < solidPolylineBitmapArrays[0].length) {
  1279. solidPolylineBitmapArrays[yieldArray[0]]//solidPolylineBitmapArrays.length - 1 -
  1280. [yieldArray[1]] = 1;//solidPolylineBitmapArrays[0].length - 1 -
  1281. }
  1282. }
  1283. // XZPCanvasUtil.mergeDotMatrices(largeMatrix,solidPolylineBitmapArrays,
  1284. // startRow,
  1285. // startColumn+ (String.valueOf(maxNumber).length() * yLeftNumberSize) );//+ barChartInterval
  1286. //合并图像数组
  1287. int[][] chartBitmapArrays = new int[chartHigh][chartWidth];
  1288. for (int i = 0; i < chartHigh; i++) {
  1289. for (int j = 0; j < chartWidth; j++) {
  1290. int k = 0;
  1291. if (barChartBitmapArrays[i][j] == 1) {
  1292. k++;
  1293. }
  1294. if (solidPolylineBitmapArrays[i][j] == 1) {
  1295. k++;
  1296. }
  1297. if (k == 1) {
  1298. chartBitmapArrays[i][j] = 1;
  1299. }
  1300. }
  1301. }
  1302. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, chartBitmapArrays,
  1303. startRow,
  1304. startColumn + (String.valueOf(maxNumber).length() * yLeftNumberSize));//+ barChartInterval
  1305. //绘制X轴
  1306. int[][] xAxisCanvasBitmapArrays = new int[xNumberHigh + barChartInterval]
  1307. [barChartWidth * dataPart + barChartInterval * dataPart];
  1308. for (int i = 0; i < timeData.size(); i++) {
  1309. String xData = timeData.get(i);
  1310. if (xData == null || xData.isEmpty()) {
  1311. xData = "00:00";
  1312. }
  1313. int startColumnX = i * (barChartWidth + barChartInterval) + barChartInterval / 2 + barChartWidth / 2 - (xData.length() * xNumberSize) / 2;//(i+1)*(dataPart/2 + barChartWidth/2) - (xData.length() * xNumberSize)/2;
  1314. if (startColumnX <= 0) {
  1315. startColumnX = 0;
  1316. }
  1317. dotMatrixDrawtextUtil.drawingText(xAxisCanvasBitmapArrays, xData, 0, startColumnX, xNumberSize);
  1318. }
  1319. DotMatrixCanvasUtil.mergeDotMatrices(largeMatrix, xAxisCanvasBitmapArrays,
  1320. startRow + yLeftAxisCanvasBitmapArrays.length + yLeftNumberSize,
  1321. startColumn + (String.valueOf(maxNumber).length() * yLeftNumberSize));//+ barChartInterval
  1322. int chartStartColumn = startColumn
  1323. + ((String.valueOf(maxNumber).length() * yLeftNumberSize))//+ barChartInterval
  1324. + dataPart * barChartWidth + barChartInterval * dataPart//+ barChartInterval
  1325. + ((String.valueOf(maxNumber2).length() * yLeftNumberSize));
  1326. int widthC = SignageDrawUtil.width - SignageDrawUtil.rightMargins - chartStartColumn;
  1327. int startColumnC = chartStartColumn + widthC / 2;
  1328. //绘制最新的数据
  1329. //最新工时
  1330. String newStr = String.valueOf(workData.get(workData.size() - 1));
  1331. int textFontSize = 12;
  1332. int textBitmapSum = newStr.length() * textFontSize;
  1333. startColumn = startColumnC - textBitmapSum / 2;
  1334. startRow = startRow + yLeftNumberHigh + barChartInterval;
  1335. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1336. int startRowC = startRow + textFontSize + SignageDrawUtil.height / 20;
  1337. //最新人数
  1338. newStr = String.valueOf(peopleNumData.get(peopleNumData.size() - 1));
  1339. textFontSize = 8;
  1340. int textBitmapSum2 = newStr.length() * textFontSize;
  1341. startColumn = startColumnC - textBitmapSum2 / 2;
  1342. startRow = startRowC;
  1343. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1344. newStr = "人数";
  1345. textFontSize = 16;
  1346. textBitmapSum = newStr.length() * textFontSize;
  1347. startColumn = startColumnC - textBitmapSum / 2;
  1348. startRow = startRowC + SignageDrawUtil.height / 40;
  1349. dotMatrixDrawtextUtil.drawingText(largeMatrix, newStr, startRow, startColumn, textFontSize);
  1350. //绘制间隔实线
  1351. startRow = startRowC + SignageDrawUtil.height / 40 + textFontSize + 2;
  1352. DotMatrixDrawShapeUtil.drawLine(largeMatrix, 1, 0, 0, startRow, startColumn, startColumn + textBitmapSum);
  1353. }
  1354. }