danjumuban.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "danjumuban.h"
  2. #include "QtPrintSupport"
  3. #include "QDateTime"
  4. #include "globalinfo.h"
  5. #include <QDir>
  6. #include "configinfo.h"
  7. #include <pqQtlib/utils/pqfileutils.h>
  8. #include <pqQtlib/log/pqlog.h>
  9. DanJuMuBan::DanJuMuBan()
  10. {
  11. path = PQ::PQLogManger::this_()->getSaveFilePath();
  12. QDir dir(path);
  13. if(!dir.exists("xiangdan"))
  14. dir.mkdir("xiangdan");
  15. if(!dir.exists("rukudan"))
  16. dir.mkdir("rukudan");
  17. log = PQ::PQLogManger::this_()->getLog("printer");
  18. save = true;
  19. }
  20. QImage DanJuMuBan::printBoxInfo(QString bar,QSharedPointer<BoxInfo> info)
  21. {
  22. // TODO: 测试打印出来的单子
  23. // if(datalist.isEmpty()){
  24. // return;
  25. // }
  26. // QLogInfo(log) << "prnter " << bar<< " " << info->caseNumber();
  27. QSharedPointer<PackInfo> pinfo = info->parentPack();
  28. if(pinfo.isNull()) return QImage();
  29. QSize size(MAXWIDTH*5,MAXHEIGHT*5);
  30. QImage image(size,QImage::Format_ARGB32);
  31. image.fill(qRgba(255, 255, 255, 255));
  32. QPainter painter(&image);
  33. painter.drawRect(5*5,5*5,90*5,15*5);
  34. painter.drawRect(5*5,20*5,90*5,35*5);
  35. painter.drawLine(20*5,20*5,20*5,55*5);
  36. painter.drawLine(50*5,20*5,50*5,55*5);
  37. painter.drawLine(66*5,20*5,66*5,55*5);
  38. painter.drawLine(5*5,27*5,95*5,27*5);
  39. painter.drawLine(5*5,34*5,95*5,34*5);
  40. painter.drawLine(5*5,41*5,95*5,41*5);
  41. painter.drawLine(5*5,48*5,95*5,48*5);
  42. painter.drawRect(5*5,55*5,90*5,15*5);
  43. painter.drawRect(5*5,70*5,90*5,7*5);
  44. QRect target(0*5, 57*5, 100*5, 65*5);
  45. // QRect source(-10*5, 0, 65*5, 40*5);
  46. barCode.draw(painter,target,bar);
  47. // painter.drawImage(target,barCode.draw(barCode.CodeBinary(bar),bar),source);
  48. painter.setRenderHint(QPainter::Antialiasing,true);
  49. painter.setRenderHint(QPainter::TextAntialiasing,true);
  50. painter.setRenderHint(QPainter::HighQualityAntialiasing,true);
  51. QFont font;
  52. font.setFamily("宋体");
  53. font.setPixelSize(40);
  54. font.setWeight(QFont::ExtraLight);
  55. painter.setFont(font);
  56. painter.drawText(6*5,15*5,pinfo->info()->customer);
  57. qDebug()<< "公司名称:" <<pinfo->info()->customer;
  58. font.setPixelSize(20);
  59. font.setBold(true);
  60. painter.setFont(font);
  61. painter.drawText(8*5,25*5,QStringLiteral("品名"));
  62. painter.drawText(53*5,25*5,QStringLiteral("毛重"));
  63. painter.drawText(8*5,32*5,QStringLiteral("批号"));
  64. painter.drawText(53*5,32*5,QStringLiteral("净重"));
  65. painter.drawText(8*5,39*5,QStringLiteral("规格"));
  66. painter.drawText(53*5,39*5,QStringLiteral("筒数"));
  67. painter.drawText(8*5,46*5,QStringLiteral("等级"));
  68. painter.drawText(53*5,46*5,QStringLiteral("捻向"));
  69. painter.drawText(8*5,53*5,QStringLiteral("箱号"));
  70. painter.drawText(50*5,53*5,QStringLiteral("纸管颜色"));
  71. painter.drawText(21*5,25*5,pinfo->info()->product_type_code);
  72. painter.drawText(21*5,32*5,pinfo->info()->batch_no);
  73. painter.drawText(21*5,39*5,pinfo->info()->specs);
  74. painter.drawText(67*5,25*5,QString("%1 kg").arg(getDecimalbit( info->gross_weight / 1000.00)));//datalist.at(0));
  75. painter.drawText(67*5,32*5,QString("%1 kg").arg(getDecimalbit(info->net_weight / 1000.00)));//datalist.at(1));
  76. painter.drawText(67*5,39*5,QString::number(info->tube_number));//datalist.at(2));
  77. painter.drawText(21*5,46*5,info->Level);//datalist.at(3));
  78. painter.drawText(67*5,46*5,info->twist_type);//datalist.at(4));
  79. painter.drawText(67*5,53*5,info->bucket_color);//datalist.at(6));
  80. font.setPixelSize(17);
  81. painter.setFont(font);
  82. painter.drawText(21*5,53*5,info->caseNumber());//datalist.at(5));
  83. painter.drawText(4*5,75*5," 电话:"+ info->parentPack()->telephone);
  84. print(image);
  85. if(save)
  86. image.save(path+"/xiangdan/code"+bar+".bmp");
  87. return image;
  88. }
  89. void DanJuMuBan::printPackModel(QPainter & painter)
  90. {
  91. painter.drawRect(4*5,4*5,92*5,68*5);
  92. // painter.drawLine(50*5,0,50*5,80*5);
  93. // painter.drawLine(4*5,16*5,96*5,16*5);
  94. // painter.drawLine(4*5,22*5,96*5,22*5);
  95. // painter.drawLine(4*5,28*5,96*5,28*5);
  96. // painter.drawLine(4*5,34*5,96*5,34*5);
  97. // painter.drawLine(4*5,40*5,96*5,40*5);
  98. // painter.drawLine(4*5,46*5,96*5,46*5);
  99. // painter.drawLine(4*5,52*5,96*5,52*5);
  100. // painter.drawLine(4*5,58*5,96*5,58*5);
  101. // painter.drawLine(4*5,65*5,96*5,65*5);
  102. QFont font;
  103. font.setFamily("宋体");
  104. font.setPixelSize(30);
  105. font.setWeight(QFont::ExtraLight);
  106. painter.setFont(font);
  107. painter.drawText(38*5,10*5,QStringLiteral("入 库 单"));
  108. font.setPixelSize(20);
  109. painter.setFont(font);
  110. painter.drawText(8*5,15*5,QStringLiteral("规格:"));
  111. painter.drawText(59*5,15*5,QStringLiteral("类型:"));
  112. painter.drawText(8*5,21*5,QStringLiteral("批号:"));
  113. painter.drawText(59*5,21*5,QStringLiteral("等级:"));
  114. font.setPixelSize(15);
  115. painter.setFont(font);
  116. painter.drawText(8*5,64*5,QStringLiteral("总数"));
  117. painter.drawText(38*5,64*5,QStringLiteral("总重量"));
  118. painter.drawText(68*5,64*5,QStringLiteral("总筒数"));
  119. }
  120. QImage DanJuMuBan::printPackInfo(QString bar, QSharedPointer<PackInfo> info)
  121. {
  122. QSize size(MAXWIDTH*5,MAXHEIGHT*5);
  123. QImage image(size,QImage::Format_ARGB32);
  124. image.fill(qRgba(255, 255, 255, 255));
  125. QPainter painter(&image);
  126. printPackModel(painter);
  127. QFont font;
  128. font.setPixelSize(15);
  129. painter.setFont(font);
  130. int boxSize = info->boxes().size();
  131. for(int i = 0; i < boxSize; ++i){
  132. int line = i / 5;
  133. int cloun = i % 5;
  134. painter.drawText((9 + line * 19)*5,(27 + cloun * 6)*5,QString("%1.").arg(i + 1));
  135. }
  136. QRect target(0*5, 67*5, 100*5, 75*5);
  137. barCode.draw(painter,target,bar);
  138. font.setPixelSize(20);
  139. font.setFamily("黑体");
  140. painter.setFont(font);
  141. painter.drawText(19*5,15*5,info->info()->specs);//QStringLiteral("规格"));
  142. painter.drawText(70*5,15*5,info->info()->category);//QStringLiteral("类型"));
  143. painter.drawText(19*5,21*5,info->info()->batch_no);//QStringLiteral("批号"));
  144. painter.drawText(70*5,21*5,info->level);//info.at(0));
  145. for(int i = 0; i < boxSize; ++i)
  146. {
  147. QString code = getDecimalbit(info->boxes().at(i)->net_weight / 1000);
  148. int line = i / 5;
  149. int cloun = i % 5;
  150. painter.drawText((13 + line * 19)*5,(27.5 + cloun * 6 )*5 ,code);
  151. }
  152. painter.drawText(15*5,64*5,QString::number(info->boxes().size()));
  153. painter.drawText(48*5,64*5,QString("%1 kg").arg(getDecimalbit(info->net_weight() / 1000.00)));
  154. painter.drawText(78*5,64*5,QString::number(info->tube_number()));
  155. print(image);
  156. if(save)
  157. image.save(path+"/rukudan/code"+bar+".bmp");
  158. return image;
  159. }
  160. QImage DanJuMuBan::mapPrintPackInfo(QMap<QString, QString> product, QStringList details)
  161. {
  162. QSize size(MAXWIDTH*5,MAXHEIGHT*5);
  163. QImage image(size,QImage::Format_ARGB32);
  164. image.fill(qRgba(255, 255, 255, 255));
  165. QPainter painter(&image);
  166. printPackModel(painter);
  167. QFont font;
  168. font.setPixelSize(15);
  169. painter.setFont(font);
  170. int boxSize = details.size();
  171. for(int i = 0; i < boxSize; ++i){
  172. int line = i / 5;
  173. int cloun = i % 5;
  174. painter.drawText((9 + line * 19)*5,(27 + cloun * 6)*5,QString("%1.").arg(i + 1));
  175. }
  176. QRect target(0*5, 67*5, 100*5, 75*5);
  177. QString bar = product.value("code_single");
  178. barCode.draw(painter,target,bar);
  179. font.setPixelSize(20);
  180. font.setFamily("黑体");
  181. painter.setFont(font);
  182. painter.drawText(19*5,15*5,product.value("specs"));//QStringLiteral("规格"));
  183. painter.drawText(70*5,15*5,product.value("category"));//QStringLiteral("类型"));
  184. painter.drawText(19*5,21*5,product.value("batch_no"));//QStringLiteral("批号"));
  185. painter.drawText(70*5,21*5,product.value("level_id"));//info.at(0));
  186. for(int i = 0; i < boxSize; ++i)
  187. {
  188. int line = i / 5;
  189. int cloun = i % 5;
  190. painter.drawText((13 + line * 19)*5,(27.5 + cloun * 6 )*5 ,details.at(i));
  191. }
  192. painter.drawText(15*5,64*5,QString::number(details.size()));
  193. painter.drawText(48*5,64*5,QString("%1 kg").arg(getDecimalbit(product.value("net_widget").toDouble() / 1000.00)));
  194. painter.drawText(78*5,64*5,product.value("tube_number"));
  195. print(image);
  196. if(save)
  197. image.save(path+"/rukudan/code"+bar+".bmp");
  198. return image;
  199. }
  200. void DanJuMuBan::print(QImage image)
  201. {
  202. auto name = GlobalInfo::this_()->config()->printerName;
  203. pqInfo(log) << "printer " << name;
  204. QPrinter printer(QPrinterInfo::printerInfo(GlobalInfo::this_()->config()->printerName));
  205. printer.setPageSize(QPrinter::Custom);
  206. printer.setPageSizeMM(QSizeF(100,70));
  207. // printer.setPrinterName();
  208. QPainter painter(&printer); // 创建一个QPainter对象,并指定绘图设备为一个QPainter对象
  209. QRect rect =painter.viewport(); // 获得QPainter对象的视图矩形区域
  210. QSize size(image.width(),image.height()); // 获得图像的大小
  211. /* 按照图形的比例大小重新设置视图矩形区域 */
  212. size.scale(rect.size(),Qt::KeepAspectRatio);
  213. painter.setViewport(rect.x(),rect.y(),size.width()+50,size.height());
  214. // painter.setViewport(rect.x(),rect.y(),size.width(),size.height());
  215. painter.setWindow(image.rect()); // 设置QPainter窗口大小为图像的大小
  216. painter.drawImage(0,0,image); // 打印图像
  217. painter.end();
  218. auto ed = printer.newPage();
  219. pqInfo(log) << "printer newPage:" << ed;
  220. // printer
  221. // }
  222. }