CardRulePreview.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div :class="classes">
  3. <div class="preview-body">
  4. <template v-for="(page, pageNo) in pages">
  5. <div :class="['page-box', `page-box-${pageNo % 2}`]" :key="pageNo">
  6. <div
  7. :class="['page-locators', `page-locators-${page.locators.length}`]"
  8. >
  9. <ul
  10. class="page-locator-group"
  11. v-for="(locator, iind) in page.locators"
  12. :key="iind"
  13. >
  14. <li
  15. v-for="(elem, eindex) in locator"
  16. :key="eindex"
  17. :id="elem.id"
  18. ></li>
  19. </ul>
  20. </div>
  21. <!-- inner edit area -->
  22. <div class="page-main-inner">
  23. <div
  24. :class="['page-main', `page-main-${page.columns.length}`]"
  25. :style="{ margin: `0 -${page.columnGap / 2}px` }"
  26. >
  27. <div
  28. class="page-column"
  29. v-for="(column, columnNo) in page.columns"
  30. :key="columnNo"
  31. :style="{ padding: `0 ${page.columnGap / 2}px` }"
  32. >
  33. <div
  34. class="page-column-main"
  35. :id="[`column-${pageNo}-${columnNo}`]"
  36. >
  37. <div class="page-column-body" v-if="column.elements.length">
  38. <topic-element-preview
  39. class="page-column-element"
  40. v-for="element in column.elements"
  41. :key="element.id"
  42. :data="element"
  43. ></topic-element-preview>
  44. </div>
  45. <div class="page-column-body" v-else>
  46. <div
  47. class="page-column-forbid-area"
  48. v-if="cardConfig.showForbidArea"
  49. >
  50. <p>该区域严禁作答</p>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <!-- outer edit area -->
  58. <div class="page-main-outer">
  59. <page-number
  60. type="rect"
  61. :total="pages.length"
  62. :current="pageNo + 1"
  63. ></page-number>
  64. <page-number
  65. type="text"
  66. :total="pages.length"
  67. :current="pageNo + 1"
  68. ></page-number>
  69. </div>
  70. </div>
  71. </template>
  72. </div>
  73. </div>
  74. </template>
  75. <script>
  76. import TopicElementPreview from "../components/TopicElementPreview";
  77. import PageNumber from "../components/PageNumber";
  78. import { cardConfigInfos } from "../api";
  79. const JsBarcode = require("jsbarcode");
  80. import { getCardHeadModel } from "../elementModel";
  81. const pages = [
  82. {
  83. type: "PAGE",
  84. columnGap: 20,
  85. locators: [
  86. [
  87. {
  88. type: "LOCATOR",
  89. id: "locator-0-00"
  90. },
  91. {
  92. type: "LOCATOR",
  93. id: "locator-0-01"
  94. }
  95. ],
  96. [
  97. {
  98. type: "LOCATOR",
  99. id: "locator-0-10"
  100. },
  101. {
  102. type: "LOCATOR",
  103. id: "locator-0-11"
  104. }
  105. ],
  106. [
  107. {
  108. type: "LOCATOR",
  109. id: "locator-0-20"
  110. },
  111. {
  112. type: "LOCATOR",
  113. id: "locator-0-21"
  114. }
  115. ]
  116. ],
  117. columns: [
  118. {
  119. type: "COLUMN",
  120. elements: []
  121. },
  122. {
  123. type: "COLUMN",
  124. elements: []
  125. }
  126. ]
  127. }
  128. ];
  129. export default {
  130. name: "card-preview",
  131. components: { TopicElementPreview, PageNumber },
  132. data() {
  133. return {
  134. cardRuleId: this.$route.params.cardRuleId,
  135. cardConfig: {},
  136. pages
  137. };
  138. },
  139. computed: {
  140. classes() {
  141. return ["card-preview"];
  142. }
  143. },
  144. mounted() {
  145. if (!this.cardRuleId) {
  146. this.$message.error("题卡规则id缺失!");
  147. return;
  148. }
  149. this.init();
  150. },
  151. methods: {
  152. async init() {
  153. const data = await cardConfigInfos(this.cardRuleId);
  154. if (!data) {
  155. this.$message.error("找不到题卡规则!");
  156. return;
  157. }
  158. let config = {
  159. ...data,
  160. ...{
  161. pageSize: "A3",
  162. columnNumber: 2,
  163. columnGap: 20,
  164. showForbidArea: true,
  165. cardDesc: ""
  166. }
  167. };
  168. config.requiredFields = JSON.parse(config.requiredFields);
  169. config.extendFields = JSON.parse(config.extendFields);
  170. config.cardTitle = config.titleRule;
  171. this.cardConfig = config;
  172. let cardHeadElement = getCardHeadModel(this.cardConfig);
  173. cardHeadElement.fieldInfos = this.fetchFieldInfos(config, {});
  174. this.pages[0].columns[0].elements.push(cardHeadElement);
  175. },
  176. fetchFieldInfos(cardConfig, stdInfo) {
  177. let fieldInfos = {};
  178. const defContent = "相关信息";
  179. const defNumber = "123456789";
  180. [...cardConfig.requiredFields, ...cardConfig.extendFields]
  181. .filter(item => item.enable)
  182. .map(item => {
  183. console.log(item);
  184. fieldInfos[item.code] = stdInfo[item.code] || defContent;
  185. });
  186. if (cardConfig.examNumberStyle === "PRINT") {
  187. fieldInfos.examNumber = this.getBase64Barcode(
  188. stdInfo["examNumber"] || defNumber
  189. );
  190. fieldInfos.examNumberStr = stdInfo["examNumber"] || defNumber;
  191. }
  192. if (cardConfig.aOrB && cardConfig.paperType === "PRINT") {
  193. fieldInfos.paperType = this.getBase64Barcode(
  194. stdInfo["paperType"] || defNumber
  195. );
  196. fieldInfos.paperTypeName = stdInfo["paperTypeName"] || "A";
  197. }
  198. return fieldInfos;
  199. },
  200. getBase64Barcode(str) {
  201. const canvas = document.createElement("CANVAS");
  202. JsBarcode(canvas, str, {
  203. width: 2,
  204. height: 30,
  205. displayValue: false,
  206. marginLeft: 20,
  207. marginRight: 20,
  208. marginTop: 0,
  209. marginBottom: 0
  210. });
  211. return canvas.toDataURL();
  212. }
  213. }
  214. };
  215. </script>