123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- import { CARD_VERSION } from "../enumerate";
- import { deepCopy } from "../plugins/utils";
- const initIndex = {
- question: 1,
- absent: 1,
- paperType: 1,
- examNumber: 1,
- selective: 1,
- pageNumber: 1
- };
- /**
- * 格式文档:https://doc.qmth.com.cn/pages/viewpage.action?pageId=19661052
- */
- export default {
- data() {
- return {
- fillAreaIndex: {
- ...initIndex
- },
- VALID_ELEMENTS_FOR_EXTERNAL: [
- "LOCATOR",
- "BARCODE",
- "CARD_HEAD",
- "FILL_QUESTION",
- "FILL_LINE",
- "EXPLAIN",
- "COMPOSITION"
- ]
- };
- },
- methods: {
- getFillAreaIndex(type) {
- return this.fillAreaIndex[type]++;
- },
- getElementHumpName(cont) {
- return cont
- .split("_")
- .map(item => item[0] + item.substr(1).toLowerCase())
- .join("");
- },
- getPreviewElementById(id) {
- return document.getElementById(`preview-${id}`);
- },
- parsePageExchange(pages) {
- const npages = deepCopy(pages);
- // 单页题卡不显示页码涂块
- const pageNumberInfo =
- pages.length <= 2 ? null : this.getPageNumberInfo();
- npages.forEach((page, pindex) => {
- let exchange = {
- card_type: 2,
- page_size: page.pageSize,
- page_image: "",
- locator: this.getLocatorInfo(page.locators),
- fill_locator: [],
- check_area: {
- black_line: [],
- white_line: []
- },
- barcode: [],
- qrcode: [],
- ocr_area: [],
- info_area: [],
- fill_area: [],
- answer_area: [],
- extension: {
- barcode: [],
- fill_area: [],
- ocr_area: [],
- qrcode: []
- }
- };
- const elements = [
- page.globals,
- ...page.columns.map(column => column.elements)
- ];
- elements.forEach(elemGroup => {
- elemGroup.forEach(element => {
- if (this.VALID_ELEMENTS_FOR_EXTERNAL.includes(element.type)) {
- const funcName = this.getElementHumpName(element.type);
- // console.log(funcName);
- const info = this[`get${funcName}Info`](element);
- Object.entries(info).forEach(([key, vals]) => {
- exchange[key] = exchange[key].concat(vals);
- });
- }
- });
- });
- if (!(pindex % 2) && pageNumberInfo) {
- let pnoInfo = deepCopy(pageNumberInfo);
- pnoInfo[0].index = this.getFillAreaIndex("pageNumber");
- exchange.fill_area = exchange.fill_area.concat(pnoInfo);
- }
- page.exchange = exchange;
- });
- this.fillAreaIndex = { ...initIndex };
- return npages;
- },
- getPageNumberInfo() {
- const dom = document.querySelector(".page-box-0");
- let options = [];
- dom
- .querySelector(".page-number-rect-list")
- .childNodes.forEach((item, index) => {
- console.log(item);
- options[index] = this.getOffsetInfo(item);
- });
- return [
- {
- field: "pageNumber",
- index: 1,
- single: true,
- horizontal: true,
- items: [
- {
- main_number: null,
- sub_number: null,
- options,
- recog_info: []
- }
- ]
- }
- ];
- },
- getLocatorInfo(locators) {
- const tops = locators.top.map(locator => {
- return this.getOffsetInfo(document.getElementById(locator.id));
- });
- const bottoms = locators.bottom.map(locator => {
- return this.getOffsetInfo(document.getElementById(locator.id));
- });
- return {
- top: tops,
- bottom: bottoms
- };
- },
- getCardHeadInfo(element) {
- const dom = this.getPreviewElementById(element.id);
- const headArea = this.getOffsetInfo(dom);
- let fill_area = [];
- let barcode = [];
- // 学生考号
- if (element.examNumberStyle === "FILL") {
- // fill_area
- let listInfos = [];
- dom
- .querySelectorAll(".stdno-fill-list")
- .forEach((questionItem, questionIndex) => {
- let options = [];
- questionItem.childNodes.forEach((optionItem, optionIndex) => {
- options[optionIndex] = this.getOffsetInfo(optionItem);
- });
- listInfos[questionIndex] = {
- main_number: null,
- sub_number: null,
- options,
- recog_info: []
- };
- });
- fill_area.push({
- field: "examNumber",
- index: this.getFillAreaIndex("examNumber"),
- single: true,
- horizontal: false,
- items: listInfos
- });
- } else {
- // barcode
- const stdnoDom =
- element.columnNumber <= 2
- ? dom.querySelector(".head-stdno").parentNode
- : dom.querySelector(".head-stdno");
- barcode.push({
- field: "examNumber",
- area: this.getOffsetInfo(stdnoDom)
- });
- }
- // 缺考涂填
- if (element.examAbsent && !element.isSimple) {
- fill_area.push({
- field: "absent",
- index: this.getFillAreaIndex("absent"),
- single: true,
- horizontal: true,
- items: [
- {
- main_number: null,
- sub_number: null,
- options: [
- this.getOffsetInfo(document.getElementById("dynamic-miss-area"))
- ],
- recog_info: []
- }
- ]
- });
- }
- // A/B卷类型
- if (element.aOrB && !element.isSimple) {
- if (element.paperType === "PRINT") {
- // barcode
- barcode.push({
- field: "paperType",
- area: this.getOffsetInfo(
- document.getElementById("dynamic-aorb-barcode")
- )
- });
- } else {
- // fill_area
- let options = [];
- document
- .getElementById("head-dynamic-aorb")
- .querySelectorAll(".head-dynamic-rect")
- .forEach((optionItem, optionIndex) => {
- options[optionIndex] = this.getOffsetInfo(optionItem);
- });
- fill_area.push({
- field: "paperType",
- index: this.getFillAreaIndex("paperType"),
- single: true,
- horizontal: true,
- items: [
- {
- main_number: null,
- sub_number: null,
- options,
- recog_info: []
- }
- ]
- });
- }
- }
- return {
- info_area: [headArea],
- fill_area,
- barcode
- };
- },
- getFillQuestionInfo(element) {
- const dom = this.getPreviewElementById(element.id);
- const single = !element.isMultiply;
- const horizontal = element.optionDirection === "horizontal";
- let fillAreas = [];
- dom.querySelectorAll(".group-item").forEach(groupItem => {
- let listInfos = [];
- groupItem
- .querySelectorAll(".question-item")
- .forEach((questionItem, questionIndex) => {
- let options = [];
- questionItem.childNodes.forEach((optionItem, optionIndex) => {
- if (optionIndex)
- options[optionIndex - 1] = this.getOffsetInfo(optionItem);
- });
- listInfos[questionIndex] = {
- main_number: element.topicNo,
- sub_number: questionItem.firstChild.textContent * 1,
- options,
- recog_info: []
- };
- });
- fillAreas.push({
- field: "question",
- index: this.getFillAreaIndex("question"),
- single,
- horizontal,
- items: listInfos
- });
- });
- return {
- fill_area: fillAreas
- };
- },
- getFillLineInfo(element) {
- const dom = this.getPreviewElementById(element.id);
- let sub_numbers = [];
- for (
- let i = element.startNumber,
- len = element.startNumber + element.questionsCount;
- i < len;
- i++
- ) {
- sub_numbers.push(i);
- }
- return {
- answer_area: [
- {
- main_number: element.topicNo,
- sub_number: sub_numbers.join(),
- area: this.getOffsetInfo(dom)
- }
- ]
- };
- },
- getExplainInfo(element) {
- const dom = this.getPreviewElementById(element.id);
- return {
- answer_area: [
- {
- main_number: element.topicNo,
- sub_number: element.serialNumber,
- area: this.getOffsetInfo(dom)
- }
- ]
- };
- },
- getCompositionInfo(element) {
- const dom = this.getPreviewElementById(element.id);
- return {
- answer_area: [
- {
- main_number: element.topicNo,
- sub_number: null,
- area: this.getOffsetInfo(dom)
- }
- ]
- };
- },
- getOffsetInfo(dom) {
- let { offsetTop, offsetLeft } = dom;
- let parentNode = dom.offsetParent;
- while (parentNode.className.indexOf("page-box") === -1) {
- offsetTop += parentNode.offsetTop;
- offsetLeft += parentNode.offsetLeft;
- parentNode = parentNode.offsetParent;
- }
- const pw = parentNode.offsetWidth;
- const ph = parentNode.offsetHeight;
- const infos = [
- offsetLeft / pw,
- offsetTop / ph,
- dom.offsetWidth / pw,
- dom.offsetHeight / ph
- ];
- return infos.map(num => num.toFixed(10) * 1);
- },
- getPageModel({ cardConfig, paperParams, pages }) {
- let npages = this.parsePageExchange(pages);
- return JSON.stringify(
- {
- version: CARD_VERSION,
- cardConfig,
- paperParams,
- pages: npages
- },
- (k, v) => (k.startsWith("_") ? undefined : v)
- );
- }
- }
- };
|