From 8ba051f7003c907ef53b0eae4ba397d70f62e09d Mon Sep 17 00:00:00 2001 From: lframework Date: Wed, 30 Apr 2025 09:04:58 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0css=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/sys/login/LoginCaptchaModal.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/sys/login/LoginCaptchaModal.vue b/src/views/sys/login/LoginCaptchaModal.vue index 9fadabc..dc0f1c8 100644 --- a/src/views/sys/login/LoginCaptchaModal.vue +++ b/src/views/sys/login/LoginCaptchaModal.vue @@ -19,6 +19,7 @@ Date: Wed, 30 Apr 2025 18:52:30 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=9A=84=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/system/role/permission.vue | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/views/system/role/permission.vue b/src/views/system/role/permission.vue index f54704e..aebab9b 100644 --- a/src/views/system/role/permission.vue +++ b/src/views/system/role/permission.vue @@ -15,10 +15,18 @@ keep-source row-id="id" :max-height="$vh * 80" - :tree-config="{}" + :tree-config="{ + expandAll: true, + }" :export-config="{}" :data="tableData" - :checkbox-config="{ trigger: 'row', checkRowKeys: selectedRows }" + :checkbox-config="{ + trigger: 'row', + checkRowKeys: selectedRows, + checkStrictly: true, + range: true, + highlight: true, + }" :columns="tableColumn" > @@ -120,11 +128,7 @@ const selectedMenus = []; this.$utils.eachTree(res, (item) => { if (item.selected) { - if (this.$utils.isEmpty(item.children)) { - selectedMenus.push(item.id); - } - - item.selected = false; + selectedMenus.push(item.id); } }); -- Gitee From 6bc391c2b62c6f0bfa4533fa2d07cf5c4c8c73c6 Mon Sep 17 00:00:00 2001 From: lframework Date: Fri, 9 May 2025 23:57:48 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- pnpm-lock.yaml | 15 +- public/resource/hiprint/css/print-lock.css | 352 ++++++++++++++++++ src/api/base-data/print-template/index.ts | 156 ++++++++ .../model/createPrintTemplateVo.ts | 6 + .../model/getPrintTemplateBo.ts | 11 + .../model/getPrintTemplateCompSettingBo.ts | 11 + .../model/getPrintTemplateSettingBo.ts | 21 ++ .../model/queryPrintTemplateBo.ts | 31 ++ .../model/queryPrintTemplateVo.ts | 8 + .../model/updatePrintTemplateDemoDataVo.ts | 11 + .../model/updatePrintTemplateSettingVo.ts | 11 + .../model/updatePrintTemplateVo.ts | 11 + src/api/sc/purchase/order/index.ts | 6 +- .../order/model/printPurchaseOrderBo.ts | 85 +++++ src/api/sc/purchase/receive/index.ts | 6 +- .../receive/model/printReceiveSheetBo.ts | 94 +++++ src/api/sc/purchase/return/index.ts | 6 +- .../return/model/printPurchaseReturnBo.ts | 97 +++++ src/api/sc/retail/out/index.ts | 6 +- .../retail/out/model/printRetailOutSheetBo.ts | 86 +++++ src/api/sc/retail/return/index.ts | 6 +- .../return/model/printRetailReturnBo.ts | 97 +++++ src/api/sc/sale/order/index.ts | 6 +- .../sc/sale/order/model/printSaleOrderBo.ts | 81 ++++ src/api/sc/sale/out/index.ts | 6 +- .../sc/sale/out/model/printSaleOutSheetBo.ts | 89 +++++ src/components/CodeEditor/src/CodeEditor.vue | 2 +- src/components/PrintDesigner/index.ts | 6 + src/components/PrintDesigner/install.js | 77 ++++ .../PrintDesigner/src/PrintDesigner.vue | 153 ++++++++ .../src/components/CommonSettings.ts | 20 + .../src/components/bar-code/PDF417.png | Bin 0 -> 543 bytes .../src/components/bar-code/QRCode.png | Bin 0 -> 1246 bytes .../src/components/bar-code/barCode.png | Bin 0 -> 519 bytes .../src/components/bar-code/index.vue | 90 +++++ .../src/components/bar-code/panel.vue | 79 ++++ .../src/components/bar-code/settings.ts | 51 +++ .../src/components/html/index.vue | 50 +++ .../src/components/html/panel.vue | 65 ++++ .../src/components/html/settings.ts | 76 ++++ .../src/components/image/index.vue | 56 +++ .../src/components/image/panel.vue | 50 +++ .../src/components/image/settings.ts | 50 +++ .../src/components/page/index.vue | 41 ++ .../src/components/page/panel.vue | 112 ++++++ .../src/components/page/settings.ts | 81 ++++ .../src/components/react/index.vue | 30 ++ .../src/components/react/panel.vue | 65 ++++ .../src/components/react/settings.ts | 52 +++ .../src/components/table/index.vue | 90 +++++ .../src/components/table/panel.vue | 113 ++++++ .../src/components/table/settings.ts | 182 +++++++++ .../src/components/txt/index.vue | 55 +++ .../src/components/txt/panel.vue | 148 ++++++++ .../src/components/txt/settings.ts | 90 +++++ .../PrintDesigner/src/constants/LodopStyle.ts | 124 ++++++ .../src/libs/lodop/LodopFuncs.js | 157 ++++++++ .../PrintDesigner/src/libs/lodop/index.js | 276 ++++++++++++++ .../PrintDesigner/src/libs/lodop/tools.js | 29 ++ .../PrintDesigner/src/libs/props.js | 68 ++++ .../PrintDesigner/src/mixins/move.js | 57 +++ .../PrintDesigner/src/panel/index.vue | 60 +++ .../PrintDesigner/src/panel/layers.vue | 79 ++++ .../PrintDesigner/src/panel/options/index.vue | 102 +++++ .../PrintDesigner/src/panel/page.vue | 167 +++++++++ .../PrintDesigner/src/panel/style.vue | 96 +++++ .../PrintDesigner/src/store/printDesigner.js | 228 ++++++++++++ .../PrintDesigner/src/utils/calc.js | 15 + .../PrintDesigner/src/utils/offset.js | 24 ++ .../PrintDesigner/src/viewport/index.vue | 183 +++++++++ .../src/viewport/size-control.vue | 148 ++++++++ src/components/registerGlobComp.ts | 7 +- src/enums/biz/printType.ts | 13 + src/layouts/default/header/index.vue | 1 + src/mixins/print.ts | 12 + src/views/base-data/print-template/add.vue | 103 +++++ .../base-data/print-template/demo-data.vue | 102 +++++ src/views/base-data/print-template/index.vue | 176 +++++++++ src/views/base-data/print-template/modify.vue | 123 ++++++ .../base-data/print-template/setting.vue | 137 +++++++ src/views/sc/purchase/order/detail.vue | 6 +- src/views/sc/purchase/receive/detail.vue | 6 +- src/views/sc/purchase/return/detail.vue | 6 +- src/views/sc/retail/out/detail.vue | 6 +- src/views/sc/retail/return/detail.vue | 6 +- src/views/sc/sale/order/detail.vue | 6 +- src/views/sc/sale/out/detail.vue | 6 +- src/views/sc/sale/return/detail.vue | 6 +- 89 files changed, 5684 insertions(+), 53 deletions(-) create mode 100644 public/resource/hiprint/css/print-lock.css create mode 100644 src/api/base-data/print-template/index.ts create mode 100644 src/api/base-data/print-template/model/createPrintTemplateVo.ts create mode 100644 src/api/base-data/print-template/model/getPrintTemplateBo.ts create mode 100644 src/api/base-data/print-template/model/getPrintTemplateCompSettingBo.ts create mode 100644 src/api/base-data/print-template/model/getPrintTemplateSettingBo.ts create mode 100644 src/api/base-data/print-template/model/queryPrintTemplateBo.ts create mode 100644 src/api/base-data/print-template/model/queryPrintTemplateVo.ts create mode 100644 src/api/base-data/print-template/model/updatePrintTemplateDemoDataVo.ts create mode 100644 src/api/base-data/print-template/model/updatePrintTemplateSettingVo.ts create mode 100644 src/api/base-data/print-template/model/updatePrintTemplateVo.ts create mode 100644 src/api/sc/purchase/order/model/printPurchaseOrderBo.ts create mode 100644 src/api/sc/purchase/receive/model/printReceiveSheetBo.ts create mode 100644 src/api/sc/purchase/return/model/printPurchaseReturnBo.ts create mode 100644 src/api/sc/retail/out/model/printRetailOutSheetBo.ts create mode 100644 src/api/sc/retail/return/model/printRetailReturnBo.ts create mode 100644 src/api/sc/sale/order/model/printSaleOrderBo.ts create mode 100644 src/api/sc/sale/out/model/printSaleOutSheetBo.ts create mode 100644 src/components/PrintDesigner/index.ts create mode 100644 src/components/PrintDesigner/install.js create mode 100644 src/components/PrintDesigner/src/PrintDesigner.vue create mode 100644 src/components/PrintDesigner/src/components/CommonSettings.ts create mode 100644 src/components/PrintDesigner/src/components/bar-code/PDF417.png create mode 100644 src/components/PrintDesigner/src/components/bar-code/QRCode.png create mode 100644 src/components/PrintDesigner/src/components/bar-code/barCode.png create mode 100644 src/components/PrintDesigner/src/components/bar-code/index.vue create mode 100644 src/components/PrintDesigner/src/components/bar-code/panel.vue create mode 100644 src/components/PrintDesigner/src/components/bar-code/settings.ts create mode 100644 src/components/PrintDesigner/src/components/html/index.vue create mode 100644 src/components/PrintDesigner/src/components/html/panel.vue create mode 100644 src/components/PrintDesigner/src/components/html/settings.ts create mode 100644 src/components/PrintDesigner/src/components/image/index.vue create mode 100644 src/components/PrintDesigner/src/components/image/panel.vue create mode 100644 src/components/PrintDesigner/src/components/image/settings.ts create mode 100644 src/components/PrintDesigner/src/components/page/index.vue create mode 100644 src/components/PrintDesigner/src/components/page/panel.vue create mode 100644 src/components/PrintDesigner/src/components/page/settings.ts create mode 100644 src/components/PrintDesigner/src/components/react/index.vue create mode 100644 src/components/PrintDesigner/src/components/react/panel.vue create mode 100644 src/components/PrintDesigner/src/components/react/settings.ts create mode 100644 src/components/PrintDesigner/src/components/table/index.vue create mode 100644 src/components/PrintDesigner/src/components/table/panel.vue create mode 100644 src/components/PrintDesigner/src/components/table/settings.ts create mode 100644 src/components/PrintDesigner/src/components/txt/index.vue create mode 100644 src/components/PrintDesigner/src/components/txt/panel.vue create mode 100644 src/components/PrintDesigner/src/components/txt/settings.ts create mode 100644 src/components/PrintDesigner/src/constants/LodopStyle.ts create mode 100644 src/components/PrintDesigner/src/libs/lodop/LodopFuncs.js create mode 100644 src/components/PrintDesigner/src/libs/lodop/index.js create mode 100644 src/components/PrintDesigner/src/libs/lodop/tools.js create mode 100644 src/components/PrintDesigner/src/libs/props.js create mode 100644 src/components/PrintDesigner/src/mixins/move.js create mode 100644 src/components/PrintDesigner/src/panel/index.vue create mode 100644 src/components/PrintDesigner/src/panel/layers.vue create mode 100644 src/components/PrintDesigner/src/panel/options/index.vue create mode 100644 src/components/PrintDesigner/src/panel/page.vue create mode 100644 src/components/PrintDesigner/src/panel/style.vue create mode 100644 src/components/PrintDesigner/src/store/printDesigner.js create mode 100644 src/components/PrintDesigner/src/utils/calc.js create mode 100644 src/components/PrintDesigner/src/utils/offset.js create mode 100644 src/components/PrintDesigner/src/viewport/index.vue create mode 100644 src/components/PrintDesigner/src/viewport/size-control.vue create mode 100644 src/enums/biz/printType.ts create mode 100644 src/mixins/print.ts create mode 100644 src/views/base-data/print-template/add.vue create mode 100644 src/views/base-data/print-template/demo-data.vue create mode 100644 src/views/base-data/print-template/index.vue create mode 100644 src/views/base-data/print-template/modify.vue create mode 100644 src/views/base-data/print-template/setting.vue diff --git a/package.json b/package.json index 02b2162..a46a71b 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "esbuild": "^0.23.0", "exceljs": "^4.3.0", "js-pinyin": "^0.2.5", + "lodash": "^4.17.21", "lodash-es": "^4.17.21", "mathjs": "^11.11.2", "mockjs": "^1.1.0", @@ -111,7 +112,7 @@ "vue": "^3.3.4", "vue-i18n": "^9.2.2", "vue-json-pretty": "^2.2.4", - "vue-router": "^4.2.3", + "vue-router": "4.0.14", "vue-types": "^5.1.0", "vuedraggable": "^4.1.0", "vxe-pc-ui": "^4.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ee4854..c8fe879 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,6 +77,9 @@ importers: js-pinyin: specifier: ^0.2.5 version: 0.2.7 + lodash: + specifier: ^4.17.21 + version: 4.17.21 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -138,8 +141,8 @@ importers: specifier: ^2.2.4 version: 2.4.0(vue@3.4.38(typescript@5.5.4)) vue-router: - specifier: ^4.2.3 - version: 4.4.3(vue@3.4.38(typescript@5.5.4)) + specifier: 4.0.14 + version: 4.0.14(vue@3.4.38(typescript@5.5.4)) vue-types: specifier: ^5.1.0 version: 5.1.3(vue@3.4.38(typescript@5.5.4)) @@ -4314,6 +4317,7 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. lodash.groupby@4.6.0: resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} @@ -4323,6 +4327,7 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} @@ -6334,8 +6339,8 @@ packages: peerDependencies: vue: '>=3.0.0' - vue-router@4.4.3: - resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==} + vue-router@4.0.14: + resolution: {integrity: sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==} peerDependencies: vue: ^3.2.0 @@ -13370,7 +13375,7 @@ snapshots: dependencies: vue: 3.4.38(typescript@5.5.4) - vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)): + vue-router@4.0.14(vue@3.4.38(typescript@5.5.4)): dependencies: '@vue/devtools-api': 6.6.3 vue: 3.4.38(typescript@5.5.4) diff --git a/public/resource/hiprint/css/print-lock.css b/public/resource/hiprint/css/print-lock.css new file mode 100644 index 0000000..82c1404 --- /dev/null +++ b/public/resource/hiprint/css/print-lock.css @@ -0,0 +1,352 @@ +@media print { + body { + margin: 0px; + padding: 0px; + } +} + +@page { + margin: 0; +} + +.hiprint-printPaper * { + box-sizing: border-box; + -moz-box-sizing: border-box; /* Firefox */ + -webkit-box-sizing: border-box; /* Safari */ +} + +.hiprint-printPaper *:focus { + outline: -webkit-focus-ring-color auto 0px; +} + +.hiprint-printPaper { + position: relative; + padding: 0 0 0 0; + page-break-after: always; + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -moz-user-select: none; /* Firefox */ + user-select: none; + overflow-x: hidden; + overflow: hidden; +} + +.hiprint-printPaper .hiprint-printPaper-content { + position: relative; +} + +/* 火狐浏览器打印 第一页过后 重叠问题 */ +@-moz-document url-prefix() { + .hiprint-printPaper .hiprint-printPaper-content { + position: relative; + margin-top: 20px; + top: -20px + } +} + +.hiprint-printPaper.design { + overflow: visible; +} + + +.hiprint-printTemplate .hiprint-printPanel { + page-break-after: always; +} + +.hiprint-printPaper, hiprint-printPanel { + box-sizing: border-box; + border: 0px; +} + +.hiprint-printPanel .hiprint-printPaper:last-child { + page-break-after: avoid; +} + +.hiprint-printTemplate .hiprint-printPanel:last-child { + page-break-after: avoid; +} + +.hiprint-printPaper .hideheaderLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper .hidefooterLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper.design { + border: 1px dashed rgba(170, 170, 170, 0.7); +} + +.design .hiprint-printElement-table-content, .design .hiprint-printElement-longText-content { + overflow: hidden; + box-sizing: border-box; +} + +.design .resize-panel { + box-sizing: border-box; + border: 1px dotted; +} + +.hiprint-printElement-text { + background-color: transparent; + background-repeat: repeat; + padding: 0 0 0 0; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; +} + +.design .hiprint-printElement-text-content { + border: 1px dashed rgb(206, 188, 188); + box-sizing: border-box; +} + +.hiprint-printElement-longText { + background-color: transparent; + background-repeat: repeat; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*white-space: pre-wrap*/ +} + + +.hiprint-printElement-table { + background-color: transparent; + background-repeat: repeat; + color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); + border-style: none; + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + padding: 0 0 0 0; + box-sizing: border-box; + line-height: 9.75pt; +} + +.hiprint-printElement-table thead { + background: #e8e8e8; + font-weight: 700; +} + +table.hiprint-printElement-tableTarget { + width: 100%; +} + +.hiprint-printElement-tableTarget, .hiprint-printElement-tableTarget tr, .hiprint-printElement-tableTarget td { + border-color: rgb(0, 0, 0); + /*border-style: none;*/ + /*border: 1px solid rgb(0, 0, 0);*/ + font-weight: normal; + direction: ltr; + padding-bottom: 0pt; + padding-left: 4pt; + padding-right: 4pt; + padding-top: 0pt; + text-decoration: none; + vertical-align: middle; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*line-height: 9.75pt; + font-size: 9pt;*/ +} + +.hiprint-printElement-tableTarget-border-all { + border: 1px solid; +} +.hiprint-printElement-tableTarget-border-none { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-lr { + border-left: 1px solid; + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-left { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-right { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-tb { + border-top: 1px solid; + border-bottom: 1px solid; +} +.hiprint-printElement-tableTarget-border-top { + border-top: 1px solid; +} +.hiprint-printElement-tableTarget-border-bottom { + border-bottom: 1px solid; +} + +.hiprint-printElement-tableTarget-border-td-none td { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(:nth-last-child(-n+2)) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(last-child) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child:first-child { + border-left: none; +} + +/*.hiprint-printElement-tableTarget tr,*/ +.hiprint-printElement-tableTarget td { + height: 18pt; +} + +.hiprint-printPaper .hiprint-paperNumber { + font-size: 9pt; +} + +.design .hiprint-printElement-table-handle { + position: absolute; + height: 21pt; + width: 21pt; + background: red; + z-index: 1; +} + +.hiprint-printPaper .hiprint-paperNumber-disabled { + float: right !important; + right: 0 !important; + color: gainsboro !important; +} + +.hiprint-printElement-vline, .hiprint-printElement-hline { + border: 0px none rgb(0, 0, 0); + +} + +.hiprint-printElement-vline { + border-left: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-top: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-hline { + border-top: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-left: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-oval, .hiprint-printElement-rect { + border: 0.75pt solid #000; +} + +.hiprint-text-content-middle { +} + +.hiprint-text-content-middle > div { + display: grid; + align-items: center; +} + +.hiprint-text-content-bottom { +} + +.hiprint-text-content-bottom > div { + display: grid; + align-items: flex-end; +} + +.hiprint-text-content-wrap { +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-nowrap { + white-space: nowrap; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-clip { + white-space: nowrap; + overflow: hidden; + text-overflow: clip; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/*hi-grid-row */ +.hi-grid-row { + position: relative; + height: auto; + margin-right: 0; + margin-left: 0; + zoom: 1; + display: block; + box-sizing: border-box; +} + +.hi-grid-row::after, .hi-grid-row::before { + display: table; + content: ''; + box-sizing: border-box; +} + +.hi-grid-col { + display: block; + box-sizing: border-box; + position: relative; + float: left; + flex: 0 0 auto; +} + +.table-grid-row { + margin-left: -0pt; + margin-right: -0pt; +} + +.tableGridColumnsGutterRow { + padding-left: 0pt; + padding-right: 0pt; +} + +.hiprint-gridColumnsFooter { + text-align: left; + clear: both; +} diff --git a/src/api/base-data/print-template/index.ts b/src/api/base-data/print-template/index.ts new file mode 100644 index 0000000..11fcf4d --- /dev/null +++ b/src/api/base-data/print-template/index.ts @@ -0,0 +1,156 @@ +import { defHttp } from '/@/utils/http/axios'; +import { PageResult } from '@/api/model/pageResult'; +import { ContentTypeEnum } from '@/enums/httpEnum'; +import { UpdatePrintTemplateVo } from '@/api/base-data/print-template/model/updatePrintTemplateVo'; +import { CreatePrintTemplateVo } from '@/api/base-data/print-template/model/createPrintTemplateVo'; +import { GetPrintTemplateBo } from '@/api/base-data/print-template/model/getPrintTemplateBo'; +import { QueryPrintTemplateVo } from '@/api/base-data/print-template/model/queryPrintTemplateVo'; +import { QueryPrintTemplateBo } from '@/api/base-data/print-template/model/queryPrintTemplateBo'; +import { GetPrintTemplateSettingBo } from '@/api/base-data/print-template/model/getPrintTemplateSettingBo'; +import { UpdatePrintTemplateSettingVo } from '@/api/base-data/print-template/model/updatePrintTemplateSettingVo'; +import { + UpdatePrintTemplateDemoDataVo +} from "@/api/base-data/print-template/model/updatePrintTemplateDemoDataVo"; +import { + GetPrintTemplateCompSettingBo +} from "@/api/base-data/print-template/model/getPrintTemplateCompSettingBo"; + +const baseUrl = '/basedata/print/template'; +const region = 'cloud-api'; + +/** + * 查询列表 + */ +export function query(params: QueryPrintTemplateVo): Promise> { + return defHttp.get>( + { + url: baseUrl + '/query', + params, + }, + { + region, + }, + ); +} + +/** + * 根据ID查询 + * @param id + */ +export function get(id: string): Promise { + return defHttp.get( + { + url: baseUrl, + params: { + id: id, + }, + }, + { + region, + }, + ); +} + +/** + * 新增 + * @param data + */ +export function create(data: CreatePrintTemplateVo): Promise { + return defHttp.post( + { + url: baseUrl, + data, + }, + { + contentType: ContentTypeEnum.FORM_URLENCODED, + region, + }, + ); +} + +/** + * 修改 + * @param data + */ +export function update(data: UpdatePrintTemplateVo): Promise { + return defHttp.put( + { + url: baseUrl, + data, + }, + { + contentType: ContentTypeEnum.FORM_URLENCODED, + region, + }, + ); +} + +/** + * 查询设置 + * @param id + */ +export function getSetting(id: string): Promise { + return defHttp.get( + { + url: baseUrl + '/setting', + params: { + id: id, + }, + }, + { + region, + }, + ); +} + +/** + * 修改设置 + * @param data + */ +export function updateSetting(data: UpdatePrintTemplateSettingVo): Promise { + return defHttp.put( + { + url: baseUrl + '/setting', + data, + }, + { + contentType: ContentTypeEnum.FORM_URLENCODED, + region, + }, + ); +} + +/** + * 修改示例数据 + * @param data + */ +export function updateDemoData(data: UpdatePrintTemplateDemoDataVo): Promise { + return defHttp.put( + { + url: baseUrl + '/setting/demo', + data, + }, + { + contentType: ContentTypeEnum.FORM_URLENCODED, + region, + }, + ); +} + +/** + * 查询组件设置 + * @param id + */ +export function getTemplateComp(id: string): Promise { + return defHttp.get( + { + url: baseUrl + '/setting/comp', + params: { + id: id, + }, + }, + { + region, + }, + ); +} diff --git a/src/api/base-data/print-template/model/createPrintTemplateVo.ts b/src/api/base-data/print-template/model/createPrintTemplateVo.ts new file mode 100644 index 0000000..ffc96f7 --- /dev/null +++ b/src/api/base-data/print-template/model/createPrintTemplateVo.ts @@ -0,0 +1,6 @@ +export interface CreatePrintTemplateVo { + /** + * 名称 + */ + name: string; +} diff --git a/src/api/base-data/print-template/model/getPrintTemplateBo.ts b/src/api/base-data/print-template/model/getPrintTemplateBo.ts new file mode 100644 index 0000000..ba452bd --- /dev/null +++ b/src/api/base-data/print-template/model/getPrintTemplateBo.ts @@ -0,0 +1,11 @@ +export interface GetPrintTemplateBo { + /** + * ID + */ + id: string; + + /** + * 名称 + */ + name: string; +} diff --git a/src/api/base-data/print-template/model/getPrintTemplateCompSettingBo.ts b/src/api/base-data/print-template/model/getPrintTemplateCompSettingBo.ts new file mode 100644 index 0000000..a50c9c0 --- /dev/null +++ b/src/api/base-data/print-template/model/getPrintTemplateCompSettingBo.ts @@ -0,0 +1,11 @@ +export interface GetPrintTemplateCompSettingBo { + /** + * ID + */ + id: string; + + /** + * 组件配置 + */ + compJson: object; +} diff --git a/src/api/base-data/print-template/model/getPrintTemplateSettingBo.ts b/src/api/base-data/print-template/model/getPrintTemplateSettingBo.ts new file mode 100644 index 0000000..a48ff5c --- /dev/null +++ b/src/api/base-data/print-template/model/getPrintTemplateSettingBo.ts @@ -0,0 +1,21 @@ +export interface GetPrintTemplateSettingBo { + /** + * ID + */ + id: string; + + /** + * JSON配置 + */ + templateJson: object; + + /** + * 示例数据 + */ + demoData: object; + + /** + * 附加组件配置 + */ + compJsonList: object[]; +} diff --git a/src/api/base-data/print-template/model/queryPrintTemplateBo.ts b/src/api/base-data/print-template/model/queryPrintTemplateBo.ts new file mode 100644 index 0000000..e301fae --- /dev/null +++ b/src/api/base-data/print-template/model/queryPrintTemplateBo.ts @@ -0,0 +1,31 @@ +export interface QueryPrintTemplateBo { + /** + * ID + */ + id: string; + + /** + * 名称 + */ + name: string; + + /** + * 创建人 + */ + createBy: string; + + /** + * 创建时间 + */ + createTime: string; + + /** + * 修改人 + */ + updateBy: string; + + /** + * 修改时间 + */ + updateTime: string; +} diff --git a/src/api/base-data/print-template/model/queryPrintTemplateVo.ts b/src/api/base-data/print-template/model/queryPrintTemplateVo.ts new file mode 100644 index 0000000..d01d52f --- /dev/null +++ b/src/api/base-data/print-template/model/queryPrintTemplateVo.ts @@ -0,0 +1,8 @@ +import { SortPageVo } from '@/api/model/sortPageVo'; + +export interface QueryPrintTemplateVo extends SortPageVo { + /** + * 名称 + */ + name: string; +} diff --git a/src/api/base-data/print-template/model/updatePrintTemplateDemoDataVo.ts b/src/api/base-data/print-template/model/updatePrintTemplateDemoDataVo.ts new file mode 100644 index 0000000..d29f859 --- /dev/null +++ b/src/api/base-data/print-template/model/updatePrintTemplateDemoDataVo.ts @@ -0,0 +1,11 @@ +export interface UpdatePrintTemplateDemoDataVo { + /** + * ID + */ + id: string; + + /** + * 示例数据 + */ + demoData: string; +} diff --git a/src/api/base-data/print-template/model/updatePrintTemplateSettingVo.ts b/src/api/base-data/print-template/model/updatePrintTemplateSettingVo.ts new file mode 100644 index 0000000..7a04cd2 --- /dev/null +++ b/src/api/base-data/print-template/model/updatePrintTemplateSettingVo.ts @@ -0,0 +1,11 @@ +export interface UpdatePrintTemplateSettingVo { + /** + * ID + */ + id: string; + + /** + * JSON配置 + */ + templateJson: string; +} diff --git a/src/api/base-data/print-template/model/updatePrintTemplateVo.ts b/src/api/base-data/print-template/model/updatePrintTemplateVo.ts new file mode 100644 index 0000000..343edaf --- /dev/null +++ b/src/api/base-data/print-template/model/updatePrintTemplateVo.ts @@ -0,0 +1,11 @@ +export interface UpdatePrintTemplateVo { + /** + * ID + */ + id: string; + + /** + * 名称 + */ + name: string; +} diff --git a/src/api/sc/purchase/order/index.ts b/src/api/sc/purchase/order/index.ts index be923da..b9c88aa 100644 --- a/src/api/sc/purchase/order/index.ts +++ b/src/api/sc/purchase/order/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum, ResponseEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { QueryPurchaseOrderVo } from '@/api/sc/purchase/order/model/queryPurchaseOrderVo'; import { PageResult } from '@/api/model/pageResult'; import { QueryPurchaseOrderBo } from '@/api/sc/purchase/order/model/queryPurchaseOrderBo'; @@ -16,6 +15,7 @@ import { PurchaseProductBo } from '@/api/sc/purchase/order/model/purchaseProduct import { QueryPurchaseProductVo } from '@/api/sc/purchase/order/model/queryPurchaseProductVo'; import { PurchaseOrderSelectorVo } from '@/api/sc/purchase/order/model/purchaseOrderSelectorVo'; import { PurchaseOrderSelectorBo } from '@/api/sc/purchase/order/model/purchaseOrderSelectorBo'; +import { PrintPurchaseOrderBo } from '@/api/sc/purchase/order/model/printPurchaseOrderBo'; const baseUrl = '/purchase/order'; const selectorBaseUrl = '/selector'; @@ -51,8 +51,8 @@ export function loadPurchaseOrder(ids: string[]): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/purchase/order/model/printPurchaseOrderBo.ts b/src/api/sc/purchase/order/model/printPurchaseOrderBo.ts new file mode 100644 index 0000000..7c25820 --- /dev/null +++ b/src/api/sc/purchase/order/model/printPurchaseOrderBo.ts @@ -0,0 +1,85 @@ +export interface PrintPurchaseOrderBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 供应商编号 + */ + supplierCode: string; + /** + * 供应商名称 + */ + supplierName: string; + /** + * 采购员姓名 + */ + purchaserName: string; + /** + * 预计到货日期 + */ + expectArriveDate: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: OrderDetailBo[]; +} + +export interface OrderDetailBo { + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 采购数量 + */ + purchaseNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 采购金额 + */ + purchaseAmount: number; +} diff --git a/src/api/sc/purchase/receive/index.ts b/src/api/sc/purchase/receive/index.ts index 46230d2..3894583 100644 --- a/src/api/sc/purchase/receive/index.ts +++ b/src/api/sc/purchase/receive/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum, ResponseEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { PageResult } from '@/api/model/pageResult'; import { ReceiveSheetSelectorVo } from '@/api/sc/purchase/receive/model/receiveSheetSelectorVo'; import { ReceiveSheetSelectorBo } from '@/api/sc/purchase/receive/model/receiveSheetSelectorBo'; @@ -15,6 +14,7 @@ import { CreateReceiveSheetVo } from '@/api/sc/purchase/receive/model/createRece import { UpdateReceiveSheetVo } from '@/api/sc/purchase/receive/model/updateReceiveSheetVo'; import { ApprovePassReceiveSheetVo } from '@/api/sc/purchase/receive/model/approvePassReceiveSheetVo'; import { ApproveRefuseReceiveSheetVo } from '@/api/sc/purchase/receive/model/approveRefuseReceiveSheetVo'; +import { PrintReceiveSheetBo } from '@/api/sc/purchase/receive/model/printReceiveSheetBo'; const baseUrl = '/purchase/receive/sheet'; const selectorBaseUrl = '/selector'; @@ -50,8 +50,8 @@ export function loadReceiveSheet(ids: string[]): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/purchase/receive/model/printReceiveSheetBo.ts b/src/api/sc/purchase/receive/model/printReceiveSheetBo.ts new file mode 100644 index 0000000..3ee892c --- /dev/null +++ b/src/api/sc/purchase/receive/model/printReceiveSheetBo.ts @@ -0,0 +1,94 @@ +export interface PrintReceiveSheetBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 供应商编号 + */ + supplierCode: string; + /** + * 供应商名称 + */ + supplierName: string; + /** + * 采购员姓名 + */ + purchaserName: string; + /** + * 付款日期 + */ + paymentDate: string; + /** + * 到货日期 + */ + receiveDate: string; + /** + * 采购订单号 + */ + purchaseOrderCode: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: OrderDetailBo[]; +} + +export interface OrderDetailBo { + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 收货数量 + */ + receiveNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 收货金额 + */ + receiveAmount: number; +} + diff --git a/src/api/sc/purchase/return/index.ts b/src/api/sc/purchase/return/index.ts index ecc6079..08281c2 100644 --- a/src/api/sc/purchase/return/index.ts +++ b/src/api/sc/purchase/return/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { PageResult } from '@/api/model/pageResult'; import { QueryPurchaseReturnVo } from '@/api/sc/purchase/return/model/queryPurchaseReturnVo'; import { QueryPurchaseReturnBo } from '@/api/sc/purchase/return/model/queryPurchaseReturnBo'; @@ -9,6 +8,7 @@ import { CreatePurchaseReturnVo } from '@/api/sc/purchase/return/model/createPur import { UpdatePurchaseReturnVo } from '@/api/sc/purchase/return/model/updatePurchaseReturnVo'; import { ApprovePassPurchaseReturnVo } from '@/api/sc/purchase/return/model/approvePassPurchaseReturnVo'; import { ApproveRefusePurchaseReturnVo } from '@/api/sc/purchase/return/model/approveRefusePurchaseReturnVo'; +import { PrintPurchaseReturnBo } from '@/api/sc/purchase/return/model/printPurchaseReturnBo'; const baseUrl = '/purchase/return'; const region = 'cloud-api'; @@ -16,8 +16,8 @@ const region = 'cloud-api'; /** * 打印 */ -export function print(id: string): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/purchase/return/model/printPurchaseReturnBo.ts b/src/api/sc/purchase/return/model/printPurchaseReturnBo.ts new file mode 100644 index 0000000..b584fe5 --- /dev/null +++ b/src/api/sc/purchase/return/model/printPurchaseReturnBo.ts @@ -0,0 +1,97 @@ +export interface PrintPurchaseReturnBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 供应商编号 + */ + supplierCode: string; + /** + * 供应商名称 + */ + supplierName: string; + /** + * 采购员姓名 + */ + purchaserName: string; + /** + * 付款日期 + */ + paymentDate: string; + /** + * 采购收货单号 + */ + receiveSheetCode: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: ReturnDetailBo[]; +} + +export interface ReturnDetailBo { + /** + * 明细ID + */ + id: string; + /** + * 商品ID + */ + productId: string; + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 退货数量 + */ + returnNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 退货金额 + */ + returnAmount: number; +} diff --git a/src/api/sc/retail/out/index.ts b/src/api/sc/retail/out/index.ts index 0ecd317..73fecd6 100644 --- a/src/api/sc/retail/out/index.ts +++ b/src/api/sc/retail/out/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { PageResult } from '@/api/model/pageResult'; import { GetPaymentDateBo } from '@/api/sc/purchase/receive/model/getPaymentDateBo'; import { QueryRetailOutSheetVo } from '@/api/sc/retail/out/model/queryRetailOutSheetVo'; @@ -15,6 +14,7 @@ import { ApprovePassRetailOutSheetVo } from '@/api/sc/retail/out/model/approvePa import { ApproveRefuseRetailOutSheetVo } from '@/api/sc/retail/out/model/approveRefuseRetailOutSheetVo'; import { RetailProductBo } from '@/api/sc/retail/out/model/retailProductBo'; import { QueryRetailProductVo } from '@/api/sc/retail/out/model/queryRetailProductVo'; +import { PrintRetailOutSheetBo } from '@/api/sc/retail/out/model/printRetailOutSheetBo'; const baseUrl = '/retail/out/sheet'; const region = 'cloud-api'; @@ -22,8 +22,8 @@ const region = 'cloud-api'; /** * 打印 */ -export function print(id: string): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/retail/out/model/printRetailOutSheetBo.ts b/src/api/sc/retail/out/model/printRetailOutSheetBo.ts new file mode 100644 index 0000000..0ad1599 --- /dev/null +++ b/src/api/sc/retail/out/model/printRetailOutSheetBo.ts @@ -0,0 +1,86 @@ +export interface PrintRetailOutSheetBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 会员编号 + */ + memberCode: string; + /** + * 会员名称 + */ + memberName: string; + /** + * 销售员姓名 + */ + salerName: string; + /** + * 付款日期 + */ + paymentDate: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: OrderDetailBo[]; +} + +export interface OrderDetailBo { + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 收货数量 + */ + receiveNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 收货金额 + */ + receiveAmount: number; +} + diff --git a/src/api/sc/retail/return/index.ts b/src/api/sc/retail/return/index.ts index 33ef331..15ba5c3 100644 --- a/src/api/sc/retail/return/index.ts +++ b/src/api/sc/retail/return/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { PageResult } from '@/api/model/pageResult'; import { QueryRetailReturnBo } from '@/api/sc/retail/return/model/queryRetailReturnBo'; import { QueryRetailReturnVo } from '@/api/sc/retail/return/model/queryRetailReturnVo'; @@ -9,6 +8,7 @@ import { CreateRetailReturnVo } from '@/api/sc/retail/return/model/createRetailR import { UpdateRetailReturnVo } from '@/api/sc/retail/return/model/updateRetailReturnVo'; import { ApprovePassRetailReturnVo } from '@/api/sc/retail/return/model/approvePassRetailReturnVo'; import { ApproveRefuseRetailReturnVo } from '@/api/sc/retail/return/model/approveRefuseRetailReturnVo'; +import { PrintRetailReturnBo } from '@/api/sc/retail/return/model/printRetailReturnBo'; const baseUrl = '/retail/return'; const region = 'cloud-api'; @@ -16,8 +16,8 @@ const region = 'cloud-api'; /** * 打印 */ -export function print(id: string): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/retail/return/model/printRetailReturnBo.ts b/src/api/sc/retail/return/model/printRetailReturnBo.ts new file mode 100644 index 0000000..4b35a6a --- /dev/null +++ b/src/api/sc/retail/return/model/printRetailReturnBo.ts @@ -0,0 +1,97 @@ +export interface PrintRetailReturnBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 客户编号 + */ + memberCode: string; + /** + * 客户名称 + */ + memberName: string; + /** + * 销售员姓名 + */ + salerName: string; + /** + * 付款日期 + */ + paymentDate: string; + /** + * 销售出库单号 + */ + outSheetCode: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: ReturnDetailBo[]; +} + +export interface ReturnDetailBo { + /** + * 明细ID + */ + id: string; + /** + * 商品ID + */ + productId: string; + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 退货数量 + */ + returnNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 退货金额 + */ + returnAmount: number; +} diff --git a/src/api/sc/sale/order/index.ts b/src/api/sc/sale/order/index.ts index e92955f..c105b21 100644 --- a/src/api/sc/sale/order/index.ts +++ b/src/api/sc/sale/order/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { QuerySaleOrderVo } from '@/api/sc/sale/order/model/querySaleOrderVo'; import { PageResult } from '@/api/model/pageResult'; import { QuerySaleOrderBo } from '@/api/sc/sale/order/model/querySaleOrderBo'; @@ -14,6 +13,7 @@ import { SaleOrderWithOutBo } from '@/api/sc/sale/order/model/saleOrderWithOutBo import { QuerySaleOrderWithOutBo } from '@/api/sc/sale/order/model/querySaleOrderWithOutBo'; import { QuerySaleOrderWithOutVo } from '@/api/sc/sale/order/model/querySaleOrderWithOutVo'; import { QuerySaleProductVo } from '@/api/sc/sale/order/model/querySaleProductVo'; +import { PrintSaleOrderBo } from '@/api/sc/sale/order/model/printSaleOrderBo'; const baseUrl = '/sale/order'; const region = 'cloud-api'; @@ -21,8 +21,8 @@ const region = 'cloud-api'; /** * 打印 */ -export function print(id: string): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/sale/order/model/printSaleOrderBo.ts b/src/api/sc/sale/order/model/printSaleOrderBo.ts new file mode 100644 index 0000000..2ea8990 --- /dev/null +++ b/src/api/sc/sale/order/model/printSaleOrderBo.ts @@ -0,0 +1,81 @@ +export interface PrintSaleOrderBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 客户编号 + */ + customerCode: string; + /** + * 客户名称 + */ + customerName: string; + /** + * 销售员姓名 + */ + salerName: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: OrderDetailBo[]; +} + +export interface OrderDetailBo { + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 收货数量 + */ + receiveNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 收货金额 + */ + receiveAmount: number; +} diff --git a/src/api/sc/sale/out/index.ts b/src/api/sc/sale/out/index.ts index 5aec8d7..79aaa17 100644 --- a/src/api/sc/sale/out/index.ts +++ b/src/api/sc/sale/out/index.ts @@ -1,6 +1,5 @@ import { defHttp } from '/@/utils/http/axios'; import { ContentTypeEnum } from '@/enums/httpEnum'; -import { A4ExcelPortraitPrintBo } from '@/api/model/a4ExcelPortraitPrintBo'; import { PageResult } from '@/api/model/pageResult'; import { GetPaymentDateBo } from '@/api/sc/purchase/receive/model/getPaymentDateBo'; import { QuerySaleOutSheetBo } from '@/api/sc/sale/out/model/querySaleOutSheetBo'; @@ -13,6 +12,7 @@ import { CreateSaleOutSheetVo } from '@/api/sc/sale/out/model/createSaleOutSheet import { UpdateSaleOutSheetVo } from '@/api/sc/sale/out/model/updateSaleOutSheetVo'; import { ApprovePassSaleOutSheetVo } from '@/api/sc/sale/out/model/approvePassSaleOutSheetVo'; import { ApproveRefuseSaleOutSheetVo } from '@/api/sc/sale/out/model/approveRefuseSaleOutSheetVo'; +import { PrintSaleOutSheetBo } from '@/api/sc/sale/out/model/printSaleOutSheetBo'; const baseUrl = '/sale/out/sheet'; const region = 'cloud-api'; @@ -20,8 +20,8 @@ const region = 'cloud-api'; /** * 打印 */ -export function print(id: string): Promise { - return defHttp.get( +export function print(id: string): Promise { + return defHttp.get( { url: baseUrl + '/print', params: { diff --git a/src/api/sc/sale/out/model/printSaleOutSheetBo.ts b/src/api/sc/sale/out/model/printSaleOutSheetBo.ts new file mode 100644 index 0000000..2527405 --- /dev/null +++ b/src/api/sc/sale/out/model/printSaleOutSheetBo.ts @@ -0,0 +1,89 @@ +export interface PrintSaleOutSheetBo { + /** + * 单号 + */ + code: string; + /** + * 仓库编号 + */ + scCode: string; + /** + * 仓库名称 + */ + scName: string; + /** + * 客户编号 + */ + customerCode: string; + /** + * 客户名称 + */ + customerName: string; + /** + * 销售员姓名 + */ + salerName: string; + /** + * 付款日期 + */ + paymentDate: string; + /** + * 销售订单号 + */ + saleOrderCode: string; + /** + * 备注 + */ + description: string; + /** + * 创建人 + */ + createBy: string; + /** + * 创建时间 + */ + createTime: string; + /** + * 审核人 + */ + approveBy: string; + /** + * 审核时间 + */ + approveTime: string; + /** + * 订单明细 + */ + details: OrderDetailBo[]; +} + +export interface OrderDetailBo { + /** + * 商品编号 + */ + productCode: string; + /** + * 商品名称 + */ + productName: string; + /** + * SKU编号 + */ + skuCode: string; + /** + * 简码 + */ + externalCode: string; + /** + * 收货数量 + */ + receiveNum: number; + /** + * 采购价 + */ + purchasePrice: number; + /** + * 收货金额 + */ + receiveAmount: number; +} diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue index 37ab7db..3c56da0 100644 --- a/src/components/CodeEditor/src/CodeEditor.vue +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -1,5 +1,5 @@ + + + + diff --git a/src/components/PrintDesigner/src/components/CommonSettings.ts b/src/components/PrintDesigner/src/components/CommonSettings.ts new file mode 100644 index 0000000..b575dfa --- /dev/null +++ b/src/components/PrintDesigner/src/components/CommonSettings.ts @@ -0,0 +1,20 @@ +import { LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; + +export interface CommonSettings { + type: string; + + isEdit: boolean; + + draggable: boolean; + + resizable: boolean; + + width: number; + height: number; + left: number; + top: number; + title: string; + name: string; + + style: LodopStyle; +} diff --git a/src/components/PrintDesigner/src/components/bar-code/PDF417.png b/src/components/PrintDesigner/src/components/bar-code/PDF417.png new file mode 100644 index 0000000000000000000000000000000000000000..8eac90445a431b98a1d6bfc5dba7f3de389a6744 GIT binary patch literal 543 zcmV+)0^t3LP)+^mTq)sYCJDJw zs{2)G>7e5f3MoFWW&+Vg7yYMnXlZqPP~|3tH(a&zD&Ob<9eK>Wq^qKfF8Z&~vDUGG zpbz23zTLY`$GC=oVNcuH_hHjT7hUxG=nQ(C zKMmhE(jVKjv4^ykp4N@e#4OEHfsmCBjXy9-hlu)9hXU3AfJ zrsKd^_N(q4;tAnpmnXk_bl)wZwwt)3i!S<2^tKJo^C}y+4U+Aj|Ir!M_u&gMNxba- hh%Wkj(>302d;lpKa?SbxAfW&N002ovPDHLkV1nis0C@la literal 0 HcmV?d00001 diff --git a/src/components/PrintDesigner/src/components/bar-code/QRCode.png b/src/components/PrintDesigner/src/components/bar-code/QRCode.png new file mode 100644 index 0000000000000000000000000000000000000000..5948354a927c00409aa80e0ee24ee4f20f70bfdb GIT binary patch literal 1246 zcmeAS@N?(olHy`uVBq!ia0y~yU}OPd4xj+T>txYuK#C>Z(btiIVPik{pF~z5Um@8e z$d`ekN{xY`p@o6r7f`6-1p`B=0RzLU1O^7H84L{K1#@-<+5jb(lDyqr82-2SpV<%O zaTa()76WAkL74HB+Gl&9>297bjv*Dd-rl{KcSl2{;bDH*?yd1ely0I5-#;6&4V zux;_??I)-ApPat=s)LdVUC+DvU6U?JI~0?C$A(gi_zFA_>~3X=np#9HTHYoAAg_sWA56z zJDbhEd{nQwmG?FM%X_G&oDNJE`I(jb-ac*S>!Z1Hw%vb11)Cr~uQ2PnBX?Xj-~QOI zfcNuQtu{~V&0nt$3y%+}+kU>feEe;%?B?HMX5BHdawh9G&x4yf^>S&Rt#SG^-s{^# z*O`~gz+5E2G_O~w-CC+$^?Gux$j-Sf>80y@K3_uw}-DdRqT>{(K3u zf?1lc;h|&WJu$ra@rTQ6H|~9zoH}nC!p68MD#39n6ug@c7< zLtgdQ-lvoF|K0lLdQVOf8U&LUGjE%Gr8|9D-urJAA15>-8&_6x;Lzlgi8?74BXwWL z^Q}L-t>KRdA`JZc4CCcB*U8VdT9cX>`^Hu~V|GTZ6wKhQwG)r)%dWFkyDs)lT5MxY zu9)=XeF)9l?tLlLDeC!p@a~3btFsH&P0JDa3HNAr`WC)!ndHPJ6*@Z&IAZOM)2oHP zEk}5?;A!nd{bRq9k3Te>ti-*4{ZlJ{WoTk4*c6k#c-D9M+xj+fGj81dSNmI^Yb88{ zKpKxr$o(q&D*5c{;e_k=t&IArpecoe@w~u2zsI*f>^ojvGv()xk~NszVXfrn_fQHiimp8t{8vs+v*+p`Z;&!&CFd?st<|xifOX@ z=HL7NxZM2Dxr&&(`9B21w;Sc{|B&@Jp!w_N&vuLJ*&+EvfGO{`_|N}H9)gL3UHylh YcmMuB_P1&TfW-`hr>mdKI;Vst036K%g8%>k literal 0 HcmV?d00001 diff --git a/src/components/PrintDesigner/src/components/bar-code/barCode.png b/src/components/PrintDesigner/src/components/bar-code/barCode.png new file mode 100644 index 0000000000000000000000000000000000000000..6e853ac9b7e499d3c664ec5edad104297708d78c GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^$AQ?Ag9#+^f5i_52F7!qE{-7;jBhVFW*spQVZN~J z%fI&1t(O`ep57758?|qpiClEB+^%`ge|~abp!MPNw%F@i%h%04`_OQ=<^B14D)*a} zKP&LNw%W4ZUM}AEZC(2QvN`L22XERpxBvBR{&{EiZ#0+LTAco?pZotmYoc% zUE69oKU`bp?D6A&&wc!$VN;hEYxmCQ@JH>>-*)_;SASl*(ZTz`s;Eg-N(rGGCqyxY zU7d7Am~nMi>lL95tEMfP#}N^#vt(LB=vI}lE(ca6DQ;z1vr2WPI#ZY^_e#}-P+d=3 z!40b-JaidXXL-KrYzRH-l*Jhl>K)|IvPMfRXgC@j^S$=@WS0esAGli;+@F=W`aTCn OFoUP7pUXO@geCyaa^rgd literal 0 HcmV?d00001 diff --git a/src/components/PrintDesigner/src/components/bar-code/index.vue b/src/components/PrintDesigner/src/components/bar-code/index.vue new file mode 100644 index 0000000..a2b306f --- /dev/null +++ b/src/components/PrintDesigner/src/components/bar-code/index.vue @@ -0,0 +1,90 @@ + + + + diff --git a/src/components/PrintDesigner/src/components/bar-code/panel.vue b/src/components/PrintDesigner/src/components/bar-code/panel.vue new file mode 100644 index 0000000..f673d6e --- /dev/null +++ b/src/components/PrintDesigner/src/components/bar-code/panel.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/components/PrintDesigner/src/components/bar-code/settings.ts b/src/components/PrintDesigner/src/components/bar-code/settings.ts new file mode 100644 index 0000000..0c8cb76 --- /dev/null +++ b/src/components/PrintDesigner/src/components/bar-code/settings.ts @@ -0,0 +1,51 @@ +import { CommonSettings } from '../CommonSettings'; +import { LodopStyle, defaultStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm } from '../../utils/calc'; + +export const widgetName: string = 'braid-barcode'; + +export interface BarCodeLodopStyle extends LodopStyle { + /** + * 条码类型,字符型。目前支持的类型(条码规制)如下: + * 128A,128B,128C,128Auto,EAN8,EAN13,EAN128A,EAN128B,EAN128C,Code39,39Extended,2_5interleaved,2_5industrial,2_5matrix,UPC_A,UPC_E0,UPC_E1,UPCsupp2,UPCsupp5,Code93,93Extended,MSI,PostNet,Codabar,QRCode,PDF417。 + * 其中QRCode和PDF417是二维码,其它为一维码。默认情况下“QRCode的版本”、“PDF417压缩模式”、“PDF417容错级别” “PDF417数据列数” “PDF417基条高(倍数)”等参数会根据宽度和高度自动调整,当然页面程序也可以直接设置它们的具体值。 + */ + CodeType: string; +} + +export interface BarCodeWidgetSetting extends CommonSettings { + style: BarCodeLodopStyle; +} + +export const settings: BarCodeWidgetSetting = { + type: widgetName, + isEdit: false, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 200, + height: 40, + left: 50, + top: 0, + title: '条码', + name: '', + style: { + ...defaultStyle, + FontSize: '9', + ShowBarText: '0', // 条码是否显示值 0--不显示 1--显示 + CodeType: 'Code39', // 条码类型 + ItemType: '0', // 打印类型 0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + }, +}; + +export const parser = { + parse(LODOP: object, printItem: BarCodeWidgetSetting) { + LODOP.ADD_PRINT_BARCODE( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + printItem.style.CodeType, + printItem.value, + ); + }, +}; diff --git a/src/components/PrintDesigner/src/components/html/index.vue b/src/components/PrintDesigner/src/components/html/index.vue new file mode 100644 index 0000000..5f13a91 --- /dev/null +++ b/src/components/PrintDesigner/src/components/html/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/components/PrintDesigner/src/components/html/panel.vue b/src/components/PrintDesigner/src/components/html/panel.vue new file mode 100644 index 0000000..2c9cf30 --- /dev/null +++ b/src/components/PrintDesigner/src/components/html/panel.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/PrintDesigner/src/components/html/settings.ts b/src/components/PrintDesigner/src/components/html/settings.ts new file mode 100644 index 0000000..a175264 --- /dev/null +++ b/src/components/PrintDesigner/src/components/html/settings.ts @@ -0,0 +1,76 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm, px2pt } from '../../utils/calc'; + +export const widgetName: string = 'braid-html'; + +export interface HtmlLodopStyle extends LodopStyle { + /** + * 高度自动(模板在该元素位置以下的元素都关联打印) + */ + autoHeight: boolean; + + /** + * 距离下边距 + */ + BottomMargin: number; +} +export interface HtmlWidgetSetting extends CommonSettings { + value: string; + defaultValue: string; + style: HtmlLodopStyle; +} + +export const settings: HtmlWidgetSetting = { + type: widgetName, + isEdit: false, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + title: 'html', + value: '
html
', + defaultValue: '
html
', + name: '', + style: { + ...defaultStyle, + ItemType: '0', // 打印类型 0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + autoHeight: false, // 高度自动(模板在该元素位置以下的元素都关联打印) + BottomMargin: 0, // 距离下边距 + }, +}; + +export const parser = { + parse(LODOP: object, printItem: HtmlWidgetSetting) { + const htmlTempTohtml = (val, style) => { + let styleStr = 'text-align:' + style.Alignment + ';'; + styleStr += 'font-size:' + px2pt(style.FontSize) + 'pt;'; + styleStr += 'color:' + style.FontColor + ';'; + let html = ""; + html += val; + html += ''; + return html; + }; + + const html = htmlTempTohtml(printItem.defaultValue, printItem.style); + if (printItem.style.autoHeight) { + LODOP.ADD_PRINT_HTM( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + 'BottomMargin:' + px2mm(printItem.style.BottomMargin) + 'mm', + html, + ); + } else { + LODOP.ADD_PRINT_HTM( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + html, + ); + } + }, +}; diff --git a/src/components/PrintDesigner/src/components/image/index.vue b/src/components/PrintDesigner/src/components/image/index.vue new file mode 100644 index 0000000..2b00d49 --- /dev/null +++ b/src/components/PrintDesigner/src/components/image/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/PrintDesigner/src/components/image/panel.vue b/src/components/PrintDesigner/src/components/image/panel.vue new file mode 100644 index 0000000..57ecbd2 --- /dev/null +++ b/src/components/PrintDesigner/src/components/image/panel.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/components/PrintDesigner/src/components/image/settings.ts b/src/components/PrintDesigner/src/components/image/settings.ts new file mode 100644 index 0000000..7bef3cb --- /dev/null +++ b/src/components/PrintDesigner/src/components/image/settings.ts @@ -0,0 +1,50 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm } from '../../utils/calc'; + +export const widgetName: string = 'braid-image'; + +export interface ImageLodopStyle extends LodopStyle {} +export interface ImageWidgetSetting extends CommonSettings { + value: string; + defaultValue: string; + style: ImageLodopStyle; +} + +export const settings: ImageWidgetSetting = { + type: widgetName, + title: '图片', + isEdit: false, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + value: '', + defaultValue: '', + name: '', + style: { + ...defaultStyle, + ItemType: '0', // 打印类型 0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + }, +}; + +export const parser = { + parse(LODOP: object, printItem: ImageWidgetSetting) { + const imageTempTohtml = (value) => { + const html = ""; + + return html; + }; + + const html = imageTempTohtml(printItem.value); + LODOP.ADD_PRINT_IMAGE( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + html, + ); + }, +}; diff --git a/src/components/PrintDesigner/src/components/page/index.vue b/src/components/PrintDesigner/src/components/page/index.vue new file mode 100644 index 0000000..2e03030 --- /dev/null +++ b/src/components/PrintDesigner/src/components/page/index.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/PrintDesigner/src/components/page/panel.vue b/src/components/PrintDesigner/src/components/page/panel.vue new file mode 100644 index 0000000..ca819ae --- /dev/null +++ b/src/components/PrintDesigner/src/components/page/panel.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/components/PrintDesigner/src/components/page/settings.ts b/src/components/PrintDesigner/src/components/page/settings.ts new file mode 100644 index 0000000..5864941 --- /dev/null +++ b/src/components/PrintDesigner/src/components/page/settings.ts @@ -0,0 +1,81 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm, px2pt } from '../../utils/calc'; + +export const widgetName: string = 'braid-page'; + +export interface PageLodopStyle extends LodopStyle { + /** + * 高度自动(模板在该元素位置以下的元素都关联打印) + */ + autoHeight: boolean; + + /** + * 距离下边距 + */ + BottomMargin: number; +} +export interface PageWidgetSetting extends CommonSettings { + curPageStyle: string; + splitPageStyle: string; + totalPageStyle: string; + style: PageLodopStyle; +} + +export const settings: PageWidgetSetting = { + type: widgetName, + isEdit: false, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + title: '分页', + curPageStyle: '第##页', + splitPageStyle: '/', + totalPageStyle: '共##页', + name: '', + style: { + ...defaultStyle, + ItemType: '1', // 打印类型 0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + autoHeight: false, // 高度自动(模板在该元素位置以下的元素都关联打印) + BottomMargin: 0, // 距离下边距 + Alignment: 'left', + FontSize: '9', + FontColor: '#000000', + }, +}; + +export const parser = { + parse(LODOP: object, printItem: PageWidgetSetting) { + const htmlTempTohtml = (style) => { + let styleStr = 'text-align:' + style.Alignment + ';'; + styleStr += 'font-size:' + px2pt(style.FontSize) + 'pt;'; + styleStr += 'color:' + style.FontColor + ';'; + let html = "
"; + html += `${printItem.curPageStyle}${printItem.splitPageStyle}${printItem.totalPageStyle}`; + html += '
'; + return html; + }; + + const html = htmlTempTohtml(printItem.style); + if (printItem.style.autoHeight) { + LODOP.ADD_PRINT_HTM( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + 'BottomMargin:' + px2mm(printItem.style.BottomMargin) + 'mm', + html, + ); + } else { + LODOP.ADD_PRINT_HTM( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + html, + ); + } + }, +}; diff --git a/src/components/PrintDesigner/src/components/react/index.vue b/src/components/PrintDesigner/src/components/react/index.vue new file mode 100644 index 0000000..335810d --- /dev/null +++ b/src/components/PrintDesigner/src/components/react/index.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/PrintDesigner/src/components/react/panel.vue b/src/components/PrintDesigner/src/components/react/panel.vue new file mode 100644 index 0000000..2c9cf30 --- /dev/null +++ b/src/components/PrintDesigner/src/components/react/panel.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/PrintDesigner/src/components/react/settings.ts b/src/components/PrintDesigner/src/components/react/settings.ts new file mode 100644 index 0000000..5ba2d09 --- /dev/null +++ b/src/components/PrintDesigner/src/components/react/settings.ts @@ -0,0 +1,52 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm } from '../../utils/calc'; + +export const widgetName: string = 'braid-react'; + +export interface ReactLodopStyle extends LodopStyle { + /** + * 线条类型,数字型,0--实线 1--破折线 2--点线 3--点划线 4--双点划线 + */ + intLineStyle: number; + + /** + * 线条宽,整数型,单位是(打印)像素,缺省值是1,非实线的线条宽也是0。 + */ + intLineWidth: number; +} +export interface ReactWidgetSetting extends CommonSettings { + style: ReactLodopStyle; +} + +export const settings: ReactWidgetSetting = { + type: widgetName, + isEdit: false, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + title: '矩形', + name: '', + style: { + ...defaultStyle, + zIndex: 0, + intLineStyle: 0, + intLineWidth: 1, + }, +}; + +export const parser = { + parse(LODOP: object, printItem: ReactWidgetSetting) { + LODOP.ADD_PRINT_RECT( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + printItem.style.intLineStyle, + printItem.style.intLineWidth, + ); + }, +}; diff --git a/src/components/PrintDesigner/src/components/table/index.vue b/src/components/PrintDesigner/src/components/table/index.vue new file mode 100644 index 0000000..5dc5ec0 --- /dev/null +++ b/src/components/PrintDesigner/src/components/table/index.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/components/PrintDesigner/src/components/table/panel.vue b/src/components/PrintDesigner/src/components/table/panel.vue new file mode 100644 index 0000000..7b0cec6 --- /dev/null +++ b/src/components/PrintDesigner/src/components/table/panel.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/components/PrintDesigner/src/components/table/settings.ts b/src/components/PrintDesigner/src/components/table/settings.ts new file mode 100644 index 0000000..be19084 --- /dev/null +++ b/src/components/PrintDesigner/src/components/table/settings.ts @@ -0,0 +1,182 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm, px2pt } from '../../utils/calc'; +import {isEmpty} from "@/utils/utils"; + +export const widgetName: string = 'braid-table'; + +export interface TableLodopStyle extends LodopStyle { + /** + * 高度自动(模板在该元素位置以下的元素都关联打印) + */ + autoHeight: boolean; + + /** + * 距离下边距 + */ + BottomMargin: number; + + /** + * 边框颜色 + */ + borderColor: string; +} + +export interface TableWidgetSetting extends CommonSettings { + value: any[]; + defaultValue: any[]; + columnsAttr: any[]; + columns: any[]; + selectCol: any[]; + style: TableLodopStyle; +} + +export const settings: TableWidgetSetting = { + type: widgetName, + isEdit: false, // 是否可编辑 + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 240, + height: 60, + left: 50, + top: 10, + title: '表格', + value: [], + defaultValue: [], + columnsAttr: [], // 表格列选项 + columns: [], // 已选表格列表 + selectCol: [], // 已选表格列name数组(用于多选框双向绑定) + name: '', + style: { + ...defaultStyle, + Alignment: 'left', // 对齐方式 1--左靠齐 2--居中 3--右靠齐 + FontSize: '9', + FontColor: '#000000', + borderColor: '#000000', + autoHeight: false, // 高度自动(模板在该元素位置以下的元素都关联打印) + BottomMargin: 0, // 距离下边距 + }, +}; + +export const parser = { + parse(LODOP: object, printItem: TableWidgetSetting) { + const tableTempTohtml = (columns, data, style) => { + // 验证输入参数 + if (!Array.isArray(columns)) { + throw new Error("Invalid input: 'columns' must be an array."); + } + if (!Array.isArray(data)) { + throw new Error("Invalid input: 'data' must be an array."); + } + + // 定义默认样式 + const defaultStyle = { + Alignment: 'left', + FontSize: '12', + FontColor: 'black', + borderColor: '#000000', + }; + + // 合并用户提供的样式与默认样式 + const mergedStyle = { ...defaultStyle, ...style }; + + // 生成样式字符串 + const generateStyleString = (styleObj) => { + return Object.entries(styleObj) + .filter(([key, value]) => value !== undefined && value !== null) + .map(([key, value]) => `${key}:${value}`) + .join(';'); + }; + + const styleStr = generateStyleString({ + 'text-align': mergedStyle.Alignment, + 'font-size': `${px2pt(mergedStyle.FontSize)}pt`, + color: mergedStyle.FontColor, + }); + + // HTML 转义函数,防止 XSS 攻击 + const escapeHtml = (str) => { + if (typeof str !== 'string') { + str = String(str); + } + return str.replace( + /[&<>"']/g, + (match) => + ({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + }[match] || match), + ); + }; + + let html = + ''; + html += ``; + + // 解析表头 + html += ''; + columns.forEach((column) => { + if (column.name === '_seq') { + html += ''; + }); + html += ''; + html += ''; + + // 解析内容 + if (data.length > 0) { + data.forEach((item, idx) => { + html += ''; + columns.forEach((column) => { + if (column.name === '_seq') { + html += ``; + } else { + html += ``; + } + }); + html += ''; + }); + } else { + html += "'; + } + + html += ''; + html += '
'; + } else { + html += ''; + } + html += escapeHtml(column.title); + html += '
${idx + 1}${escapeHtml(isEmpty(item[column.name]) ? '' : item[column.name])}
" + escapeHtml('暂无数据') + '
'; + return html; + }; + + const html = tableTempTohtml( + printItem.columns ? printItem.columns : [], + printItem.defaultValue, + printItem.style, + ); + if (printItem.style.autoHeight) { + LODOP.ADD_PRINT_TABLE( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + 'BottomMargin:' + px2mm(printItem.style.BottomMargin) + 'mm', + html, + ); + } else { + LODOP.ADD_PRINT_TABLE( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + html, + ); + } + }, +}; diff --git a/src/components/PrintDesigner/src/components/txt/index.vue b/src/components/PrintDesigner/src/components/txt/index.vue new file mode 100644 index 0000000..eb89adf --- /dev/null +++ b/src/components/PrintDesigner/src/components/txt/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/PrintDesigner/src/components/txt/panel.vue b/src/components/PrintDesigner/src/components/txt/panel.vue new file mode 100644 index 0000000..709c0b5 --- /dev/null +++ b/src/components/PrintDesigner/src/components/txt/panel.vue @@ -0,0 +1,148 @@ + + + diff --git a/src/components/PrintDesigner/src/components/txt/settings.ts b/src/components/PrintDesigner/src/components/txt/settings.ts new file mode 100644 index 0000000..cea84a4 --- /dev/null +++ b/src/components/PrintDesigner/src/components/txt/settings.ts @@ -0,0 +1,90 @@ +import { CommonSettings } from '../CommonSettings'; +import { defaultStyle, LodopStyle } from '@/components/PrintDesigner/src/constants/LodopStyle'; +import { px2mm } from '../../utils/calc'; + +export const widgetName: string = 'braid-txt'; + +export interface TxtWidgetStyle extends LodopStyle { + /** + * 是否显示边框 + */ + bordered: boolean; + + /** + * 线条类型,数字型,0--实线 1--破折线 2--点线 3--点划线 4--双点划线 + */ + intLineStyle?: number; + + /** + * 线条宽,整数型,单位是(打印)像素,缺省值是1,非实线的线条宽也是0。 + */ + intLineWidth?: number; + + /** + * 文字距离上边框距离 + */ + topOffset?: number; + + /** + * 文字距离左边框距离 + */ + leftOffset?: number; +} + +export interface TxtWidgetSetting extends CommonSettings { + value: string; + style: TxtWidgetStyle; +} + +export const settings: TxtWidgetSetting = { + type: widgetName, + isEdit: true, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + title: '自定义文本', + value: '自定义文本', + name: '', + style: { + ...defaultStyle, + FontSize: '9', + FontColor: '#000000', + Bold: '0', // 1代表粗体,0代表非粗体 + Italic: '0', // 1代表斜体,0代表非斜体 + Underline: '0', // 1代表有下划线,0代表无下划线 + Alignment: 'left', // 对齐方式 + ItemType: '0', // 打印类型 0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + bordered: false, // 是否显示边框 + intLineStyle: 0, + intLineWidth: 1, + topOffset: 0, + leftOffset: 0, + }, +}; + +export const parser = { + parse(LODOP: object, printItem: TxtWidgetSetting) { + if (printItem.style.bordered) { + LODOP.ADD_PRINT_RECT( + px2mm(printItem.top) + 'mm', + px2mm(printItem.left) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + printItem.style.intLineStyle, + printItem.style.intLineWidth, + ); + + LODOP.SET_PRINT_STYLEA(0, 'ItemType', printItem.style.ItemType); + } + LODOP.ADD_PRINT_TEXT( + px2mm(printItem.top + (printItem.style.topOffset || 0)) + 'mm', + px2mm(printItem.left + (printItem.style.leftOffset || 0)) + 'mm', + px2mm(printItem.width) + 'mm', + px2mm(printItem.height) + 'mm', + printItem.value, + ); + }, +}; diff --git a/src/components/PrintDesigner/src/constants/LodopStyle.ts b/src/components/PrintDesigner/src/constants/LodopStyle.ts new file mode 100644 index 0000000..870b594 --- /dev/null +++ b/src/components/PrintDesigner/src/constants/LodopStyle.ts @@ -0,0 +1,124 @@ +/** + * FontName的值: 字符型,与操作系统字体名一致,缺省是“宋体”。 + * + * FontSize的值:数值型,单位是pt,缺省值是9,可以含小数,如13.5。 + * + * FontColor的值:整数或字符型,整数时是颜色的十进制RGB值;字符时是超文本颜色值,可以是“#”加三色16进制值组合,也可以是英文颜色名; + * + * Bold的值:数字型,1代表粗体,0代表非粗体,缺省值是0。 + * + * Italic的值:数字型,1代表斜体,0代表非斜体,缺省值是0。 + * + * Underline的值:数字型,1代表有下划线,0代表无下划线,缺省值是0。 + * + * Alignment的值:数字型,1--左靠齐 2--居中 3--右靠齐,缺省值是1。 + * + * Angle的值:数字型,逆时针旋转角度数,单位是度,0度表示不旋转,旋转时以对象的左上角为原点。 + * + * ItemType的值:数字型,0--普通项 1--页眉页脚 2--页号项 3--页数项 4--多页项 + * 缺省(不调用本函数时)值0。普通项只打印一次;页眉页脚项则每页都在固定位置重复打印;页号项和页数项是特殊的页眉页脚项,其内容包含当前页号和全部页数;多页项每页都打印,直到把内容打印完毕,打印时在每页上的位置和区域大小固定一样(多页项只对纯文本有效) + * 在页号或页数对象的文本中,有两个特殊控制字符: + * “#”特指“页号”,“&”特指“页数”。 + * HOrient的值:数字型,0--左边距锁定 1--右边距锁定 2--水平方向居中 3--左边距和右边距同时锁定(中间拉伸),缺省值是0。 + * + * VOrient的值:数字型,0--上边距锁定 1--下边距锁定 2--垂直方向居中 3--上边距和下边距同时锁定(中间拉伸),缺省值是0。 + * + * PenWidth的值:整数型,单位是(打印)像素,缺省值是1,非实线的线条宽也是0。 + * + * PenStyle的值:数字型,0--实线 1--破折线 2--点线 3--点划线 4--双点划线 + * 缺省值是0。 + * Stretch的值:数字型,0--截取图片 1--扩展(可变形)缩放 2--按原图长和宽比例(不变形)缩放。缺省值是0。 + * + * ShowBarText的值 :字符或逻辑型,真表示显示(一维条码的)码值,假表示隐藏码值,默认值是真。true、“true”、1、“1”代表真,false、“false”、0或“0”代表假 + * + * “LinkedItem”的值: 整数字符型,字符型代表被关联项的项目名,整数代表被关联项的序号,如果是负数,代表当前对象的前几个对象,例如-1代表前一个对象,-2代表前面隔一个对象,使用-1时可以用同一个语句连续顺序关联一串对象。 + * 内容项与别人关联后,会紧跟被关联者之后打印,位置和区域大小随被关联项而定,此时其Top和left不再是上边距和左边距,而是与关联项的间隔空隙及左边距偏移。 + * 如果关联者是页眉页脚对象,那么不会每页输出,仅与被关联对象同页输出。此时输出的位置与被关联对象的位置相对固定,也就是当上边距小于被关联对象的上边距时,那么其起点位置会与被关联者的上边线保持设计时的距离,否则与被关联对象的下边线保持设计时的距离。 + */ +export interface LodopStyle { + zIndex: number; + + /** + * 设定纯文本打印项的字体名称 + */ + FontName?: string; + + /** + * 设定纯文本打印项的字体大小 + */ + FontSize?: string; + + /** + * 设定纯文本打印项的字体颜色 + */ + FontColor?: string; + /** + * 设定纯文本打印项是否粗体 + */ + Bold?: string; + + /** + * 设定纯文本打印项是否斜体 + */ + Italic?: string; + + /** + * 设定纯文本打印项是否下划线 + */ + Underline?: string; + + /** + * 设定纯文本打印项的内容左右靠齐方式 + * 这里使用left center right,在LODOP打印时会转化成1,2,3 + */ + Alignment?: string; + + /** + * 设定纯文本打印项的旋转角度 + */ + Angle?: string; + + /** + * 设定打印项的基本属性 + */ + ItemType?: string; + + /** + * 设定打印项在纸张范围内的水平方向的位置锁定方式 + */ + HOrient?: string; + + /** + * 设定打印项在纸张范围内的垂直方向的位置锁定方式 + */ + VOrient?: string; + + /** + * 线条宽度 + */ + PenWidth?: string; + + /** + * 线条风格 + */ + PenStyle?: string; + + /** + * 图片截取缩放模式 + */ + Stretch?: string; + + /** + * (一维)条码的码值是否显示 + */ + ShowBarText?: string; + + /** + * 设置关联内容项的项目编号 + */ + LinkedItem?: number; +} + +export const defaultStyle: LodopStyle = { + zIndex: 0, +}; diff --git a/src/components/PrintDesigner/src/libs/lodop/LodopFuncs.js b/src/components/PrintDesigner/src/libs/lodop/LodopFuncs.js new file mode 100644 index 0000000..7a4a24d --- /dev/null +++ b/src/components/PrintDesigner/src/libs/lodop/LodopFuncs.js @@ -0,0 +1,157 @@ +/* eslint-disable */ +// ==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序== +import { h } from 'vue'; +import * as msg from '@/hooks/web/msg' + +var CreatedOKLodopObject, CLodopIsLocal, CLodopJsState + +// ==判断是否需要CLodop(那些不支持插件的浏览器):== +function needCLodop() { + try { + var ua = navigator.userAgent + if (ua.match(/Windows\sPhone/i)) return true + if (ua.match(/iPhone|iPod|iPad/i)) return true + if (ua.match(/Android/i)) return true + if (ua.match(/Edge\D?\d+/i)) return true + + var verTrident = ua.match(/Trident\D?\d+/i) + var verIE = ua.match(/MSIE\D?\d+/i) + var verOPR = ua.match(/OPR\D?\d+/i) + var verFF = ua.match(/Firefox\D?\d+/i) + var x64 = ua.match(/x64/i) + if ((!verTrident) && (!verIE) && (x64)) return true + else if (verFF) { + verFF = verFF[0].match(/\d+/) + if ((verFF[0] >= 41) || (x64)) return true + } else if (verOPR) { + verOPR = verOPR[0].match(/\d+/) + if (verOPR[0] >= 32) return true + } else if ((!verTrident) && (!verIE)) { + var verChrome = ua.match(/Chrome\D?\d+/i) + if (verChrome) { + verChrome = verChrome[0].match(/\d+/) + if (verChrome[0] >= 41) return true + } + } + return false + } catch (err) { + return true + } +} + +// 加载CLodop时用双端口(http是8000/18000,而https是8443/8444)以防其中某端口被占, +// 主JS文件名“CLodopfuncs.js”是固定名称,其内容是动态的,与其链接的打印环境有关: +function loadCLodop() { + if (CLodopJsState == 'loading' || CLodopJsState == 'complete') return + CLodopJsState = 'loading' + var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement + var JS1 = document.createElement('script') + var JS2 = document.createElement('script') + + if (window.location.protocol == 'https:') { + JS1.src = 'https://localhost.lodop.net:8443/CLodopfuncs.js' + JS2.src = 'https://localhost.lodop.net:8444/CLodopfuncs.js' + } else { + JS1.src = 'http://localhost:8000/CLodopfuncs.js' + JS2.src = 'http://localhost:18000/CLodopfuncs.js' + } + JS1.onload = JS2.onload = function() { CLodopJsState = 'complete' } + JS1.onerror = JS2.onerror = function(evt) { CLodopJsState = 'complete' } + head.insertBefore(JS1, head.firstChild) + head.insertBefore(JS2, head.firstChild) + CLodopIsLocal = !!((JS1.src + JS2.src).match(/\/\/localho|\/\/127.0.0./i)) +} + +if (needCLodop()) { loadCLodop() }// 开始加载 + +// ==获取LODOP对象主过程,判断是否安装、需否升级:== +function getLodop(oOBJECT, oEMBED) { + var strFontTag = '打印控件' + var strLodopInstall = strFontTag + "未安装!点击这里执行安装" + var strLodopUpdate = strFontTag + "需要升级!点击这里执行升级" + var strLodop64Install = strFontTag + "未安装!点击这里执行安装" + var strLodop64Update = strFontTag + "需要升级!点击这里执行升级" + var strCLodopInstallA = "
Web打印服务CLodop未安装启动,点击这里下载执行安装" + var strCLodopInstallB = "
(若此前已安装过,可点这里直接再次启动)" + var strCLodopUpdate = "
Web打印服务CLodop需升级!点击这里执行升级" + var strLodop7FontTag = '
Web打印服务Lodop7' + var strLodop7HrefX86 = "点击这里下载安装(下载后解压,点击lodop文件开始执行)" + var strLodop7HrefARM = "点击这里下载安装(下载后解压,点击lodop文件开始执行)" + var strLodop7Install_X86 = strLodop7FontTag + '未安装启动,' + strLodop7HrefX86 + var strLodop7Install_ARM = strLodop7FontTag + '未安装启动,' + strLodop7HrefARM + var strLodop7Update_X86 = strLodop7FontTag + '需升级,' + strLodop7HrefX86 + var strLodop7Update_ARM = strLodop7FontTag + '需升级,' + strLodop7HrefARM + var strInstallOK = ',成功后请刷新本页面或重启浏览器。' + var LODOP + try { + var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent)) + var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent)) + var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform)) + var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform)) + + if (needCLodop() || isLinuxX86 || isLinuxARM) { + try { + LODOP = getCLodop() + } catch (err) {} + if (!LODOP && CLodopJsState !== 'complete') { + if (CLodopJsState == 'loading') { + msg.createError('lodop插件还未加载完毕,请稍后再操作.') + } else { + msg.createError('未曾加载Lodop主JS文件,请先调用loadCLodop过程.') + } + return + } + var strAlertMessage + if (!LODOP) { + if (isLinuxX86) strAlertMessage = strLodop7Install_X86; else + if (isLinuxARM) strAlertMessage = strLodop7Install_ARM; else { strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : '') } + msg.errorDialog(h('div', { + innerHTML: strAlertMessage + strInstallOK + }), '打印插件出错') + return + } else { + if (isLinuxX86 && LODOP.CVERSION < '7.0.4.2') strAlertMessage = strLodop7Update_X86; else + if (isLinuxARM && LODOP.CVERSION < '7.0.4.2') strAlertMessage = strLodop7Update_ARM; else + if (CLODOP.CVERSION < '4.1.5.8') strAlertMessage = strCLodopUpdate + + if (strAlertMessage) { + msg.errorDialog(h('div', { + innerHTML: strAlertMessage + strInstallOK + }), '打印插件出错') + } + } + } else { // ==如果页面有Lodop插件就直接使用,否则新建:== + if (oOBJECT || oEMBED) { + if (isWinIE) { LODOP = oOBJECT } else { LODOP = oEMBED } + } else if (!CreatedOKLodopObject) { + LODOP = document.createElement('object') + LODOP.setAttribute('width', 0) + LODOP.setAttribute('height', 0) + LODOP.setAttribute('style', 'position:absolute;left:0px;top:-100px;width:0px;height:0px;') + if (isWinIE) { LODOP.setAttribute('classid', 'clsid:2105C259-1E0C-4534-8141-A753534CB4CA') } else { LODOP.setAttribute('type', 'application/x-print-lodop') } + document.documentElement.appendChild(LODOP) + CreatedOKLodopObject = LODOP + } else { LODOP = CreatedOKLodopObject } + // ==Lodop插件未安装时提示下载地址:== + if ((!LODOP) || (!LODOP.VERSION)) { + msg.errorDialog(h('div', { + innerHTML: (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + }), '打印插件出错') + return LODOP + } + if (LODOP.VERSION < '6.2.2.6') { + msg.errorDialog(h('div', { + innerHTML: (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + }), '打印插件出错') + } + } + // ===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================= + + // =============================================================================== + return LODOP + } catch (err) { + msg.errorDialog('getLodop出错:' + err, '打印插件出错') + } +} + +export { getLodop } diff --git a/src/components/PrintDesigner/src/libs/lodop/index.js b/src/components/PrintDesigner/src/libs/lodop/index.js new file mode 100644 index 0000000..e853d0e --- /dev/null +++ b/src/components/PrintDesigner/src/libs/lodop/index.js @@ -0,0 +1,276 @@ +import { getLodop } from './LodopFuncs'; +import cloneDeep from 'lodash/cloneDeep'; +import { strTempToValue } from './tools'; +import { parser as barCodeParser } from '../../components/bar-code/settings'; +import { parser as htmlParser } from '../../components/html/settings'; +import { parser as imageParser } from '../../components/image/settings'; +import { parser as txtParser } from '../../components/txt/settings'; +import { parser as tableParser } from '../../components/table/settings'; +import { parser as reactParser } from '../../components/react/settings'; +import { parser as pageParser } from '../../components/page/settings'; +import { px2pt } from '../../utils/calc'; + +export default { print, preview, previewTemp }; + +/** + * 打印功能 + * @param {*Object} temp 打印模板 + * @param {*Array} data 打印数据 + */ +function print(temp, data) { + let LODOP = _CreateLodop( + temp.title, + temp.pageDirection, + temp.width, + temp.height, + temp.pageWidth, + temp.pageHeight, + ); + let tempItems = cloneDeep(temp.tempItems); + let printContent = _TempParser(tempItems, data); + if (printContent.length > 1) { + // 打印多份 + printContent.forEach((aPrint, index) => { + LODOP.NewPageA(); + aPrint.forEach((printItem) => { + _AddPrintItem(LODOP, printItem, index); + }); + }); + } else { + // 单份 + printContent[0].forEach((printItem) => { + _AddPrintItem(LODOP, printItem); + }); + } + + let flag = LODOP.PRINT(); + return flag; +} + +/** + * 打印预览功能 + * @param {*Object} temp 打印模板 + * @param {*Array} data 打印数据 + */ +function preview(temp, data) { + let LODOP = _CreateLodop( + temp.title, + temp.pageDirection, + temp.width, + temp.height, + temp.pageWidth, + temp.pageHeight, + ); + let tempItems = cloneDeep(temp.tempItems); + let printContent = _TempParser(tempItems, data); + if (data.length > 1) { + // 打印多份 + printContent.forEach((aPrint, index) => { + LODOP.NewPageA(); + aPrint.forEach((printItem) => { + _AddPrintItem(LODOP, printItem, index); + }); + }); + } else { + // 单份 + printContent[0].forEach((printItem) => { + _AddPrintItem(LODOP, printItem); + }); + } + + let flag = LODOP.PREVIEW(); + return flag; +} + +/** + * 模板预览功能 + * @param {*Object} temp 打印模板 + */ +function previewTemp(temp) { + let LODOP = _CreateLodop( + temp.title, + temp.pageDirection, + temp.width, + temp.height, + temp.pageWidth, + temp.pageHeight, + ); + + let printContent = _TempParser(temp.tempItems); + printContent[0].forEach((printItem) => { + _AddPrintItem(LODOP, printItem); + }); + let flag = LODOP.PREVIEW(); + return flag; +} + +/** + * LODOP 根据属性创建打印 + * @param pageName 纸张名称 + * @param pageDirection 纸张方向 + * @param width 可视区域宽度(单位px) + * @param height 可视区域高度(单位px) + * @param pageWidth 纸张宽度(mm) + * @param pageHeight 纸张高度(mm) + * @param top 可视区域上边距(单位px) + * @param left 可视区域左边距(单位px) + */ +function _CreateLodop( + pageName, + pageDirection, + width, + height, + pageWidth = 0, + pageHeight = 0, + top = 0, + left = 0, +) { + let LODOP = getLodop(); + + // console.log(strCompanyName, strLicense, strLicenseA, strLicenseB) + + // 设置软件产品注册信息 + // LODOP.SET_LICENSES(strCompanyName, strLicense, strLicenseA, strLicenseB); + + LODOP.PRINT_INITA(top, left, width, height, pageName); + LODOP.SET_PRINT_PAGESIZE( + pageDirection, + pageWidth ? pageWidth + 'mm' : 0, + pageHeight ? pageHeight + 'mm' : 0, + '', + ); + + return LODOP; +} + +/** + * 解析模板和数据生成打印项 + * @param {*Array} tempItem 模板打赢项 + * @param {Array} data 打印数据, + * @return {Array} 若data为null则返回处理后的模板 + */ +function _TempParser(tempItem, data) { + let temp = cloneDeep(tempItem); + //修改模板答应项顺序 + //将自适应高度的打印项(item.style.autoHeight == true)放在第一项 + let flag = temp.findIndex((item) => item.style.autoHeight); + if (flag != -1) { + let autoItem = temp[flag]; + temp.splice(flag, 1); + temp.unshift(autoItem); + // 处理位于自适应打印项下方的打印项 + temp.forEach((item) => { + // 位于自适应高度项下的打印项修改top、left,并添加关联属性(style.LinkedItem) + if (item.top > autoItem.top && item.style.ItemType == 0) { + item.top = item.top - autoItem.top - autoItem.height; + item.left = item.left - autoItem.left; + item.style.LinkedItem = 1; + } + }); + } + + if (data && data.length > 0) { + // 解析打印模板和数据,生成生成打印内容 + let tempContent = []; + data.forEach((dataItem) => { + let conItem = temp.map((tempItem) => { + let item = cloneDeep(tempItem); + if (item.name) { + item.defaultValue = dataItem[item.name]; + item.value = strTempToValue(item.value, item.defaultValue); + } + return item; + }); + tempContent.push(conItem); + }); + return tempContent; + } else { + return [temp]; + } +} + +/** + * 添加打印项 + * @param {lodop} LODOP 打印实例 + * @param {Object} printItem 打印项内容 + * @param {Number} pageIndex 当前打印页的开始序号 + */ +function _AddPrintItem(LODOP, tempItem, pageIndex = 0) { + let printItem = cloneDeep(tempItem); + // TempItemStyle转换为LodopItemStyle + let lodopStyle = _createLodopStyle(printItem.style); + + // 批量打印时,修改关联打印项的关联序号 + if (lodopStyle.LinkedItem == 1) { + lodopStyle.LinkedItem = 1 + pageIndex; + } + // 添加打印项 + switch (printItem.type) { + case 'braid-txt': + txtParser.parse(LODOP, printItem); + break; + case 'braid-barcode': + barCodeParser.parse(LODOP, printItem); + break; + case 'braid-html': + htmlParser.parse(LODOP, printItem); + break; + case 'braid-table': + tableParser.parse(LODOP, printItem); + break; + case 'braid-image': + imageParser.parse(LODOP, printItem); + break; + case 'braid-react': + reactParser.parse(LODOP, printItem); + break; + case 'braid-page': + pageParser.parse(LODOP, printItem); + break; + default: + ''; + } + // 设置打印项样式 + Object.keys(lodopStyle).forEach((key) => { + switch (key) { + case 'FontSize': { + LODOP.SET_PRINT_STYLEA(0, key, px2pt(lodopStyle[key])); + break; + } + + default: { + LODOP.SET_PRINT_STYLEA(0, key, lodopStyle[key]); + } + } + }); + // 设置默认LodopStyle + let defaultLodopStyle = printItem.lodopStyle; + if (defaultLodopStyle) { + Object.keys(defaultLodopStyle).forEach((key) => { + LODOP.SET_PRINT_STYLEA(0, key, defaultLodopStyle[key]); + }); + } +} + +/** + * 将模板设计样式转换为lodop样式 + * @param style 模板样式 + * @returns lodop样式对象 + */ +function _createLodopStyle(style) { + let lodopStyle = { + zIndex: style.zIndex, + }; + + for (let key in style) { + if (['bold', 'italic', 'underline', 'ShowBarText'].indexOf(key) > -1) { + lodopStyle[key] = style[key] ? 1 : 0; + } else if (key === 'Alignment') { + lodopStyle[key] = style[key] == 'left' ? 1 : style[key] == 'center' ? 2 : 3; + } else { + lodopStyle[key] = style[key]; + } + } + + return lodopStyle; +} diff --git a/src/components/PrintDesigner/src/libs/lodop/tools.js b/src/components/PrintDesigner/src/libs/lodop/tools.js new file mode 100644 index 0000000..2522411 --- /dev/null +++ b/src/components/PrintDesigner/src/libs/lodop/tools.js @@ -0,0 +1,29 @@ +/** + * 通过模板和模板数据生成打印内容 + * @param temp 打印模板 + * @param data 模板数据 + */ +export const tempToPrint = (temp, data) => { + let printContent = temp.map((item) => { + var reg = /({[^{]*})/g; + let value = item.value.replace(reg, data[item.name] || ''); + return { + top: item.top, + left: item.left, + width: item.width, + height: item.height, + value: value, + }; + }); + return printContent; +}; + +/** + * 将字符串模板中{}内的内容替换成指定值 + * @param str 表格列配置信息 + * @param value 表格数据 + */ +export const strTempToValue = (str, value) => { + let reg = /({[^}^{]*})/g; + return str.replace(reg, value || ''); +}; diff --git a/src/components/PrintDesigner/src/libs/props.js b/src/components/PrintDesigner/src/libs/props.js new file mode 100644 index 0000000..aad6765 --- /dev/null +++ b/src/components/PrintDesigner/src/libs/props.js @@ -0,0 +1,68 @@ +export const getDefaultProps = () => ({ + uuid: '', + type: 'braid-txt', + name: '', + isEdit: true, + draggable: true, // 是否可拖拽 + resizable: true, // 尺寸是否可变 + width: 120, + height: 40, + left: 50, + top: 0, + value: '自定义文本', + title: '自定义文本', + style: { zIndex: 1 }, +}); + +export const getCodeTypeArray = () => [ + '128A', + '128B', + '128C', + '128Auto', + 'EAN8', + 'EAN13', + 'EAN128A', + 'EAN128B', + 'EAN128C', + 'Code39', + '39Extended', + '2_5interleaved', + '2_5industrial', + '2_5matrix', + 'UPC_A', + 'UPC_E0', + 'UPC_E1', + 'UPCsupp2', + 'UPCsupp5', + 'Code93', + '93Extended', + 'MSI', + 'PostNet', + 'Codabar', + 'QRCode', + 'PDF417', +]; + +export const getItemTypeArray = () => [ + { label: '普通项', value: '0' }, + { label: '页眉页脚', value: '1' }, + { label: '页号项', value: '2' }, + { label: '页数项', value: '3' }, + { label: '多页项', value: '4' }, +]; + +export const getIntLineStyleArray = () => [ + { label: '实线', value: 0 }, + { label: '破折线', value: 1 }, + { label: '点线', value: 2 }, + { label: '点划线', value: 3 }, + { label: '双点划线', value: 4 }, +]; + +export const parseIntLineStyle = (style) => { + if (style === 0) { + return 'solid'; + } else { + return 'dashed'; + } +}; diff --git a/src/components/PrintDesigner/src/mixins/move.js b/src/components/PrintDesigner/src/mixins/move.js new file mode 100644 index 0000000..c9e00a4 --- /dev/null +++ b/src/components/PrintDesigner/src/mixins/move.js @@ -0,0 +1,57 @@ +import { usePrintDesignerStore } from '../store/printDesigner'; + +export default { + setup() { + const printDesignerStore = usePrintDesignerStore(); + return { + printDesignerStore, + }; + }, + methods: { + /** + * 初始化鼠标拖拽事件 + * @param {*} e + */ + initmovement(e) { + var target = this.printDesignerStore.activeElement; + + // 设置移动状态初始值 + this.printDesignerStore.initmove({ + startX: e.pageX, + startY: e.pageY, + originX: target.left, + originY: target.top, + }); + + // 绑定鼠标移动事件 + document.addEventListener('mousemove', this.handlemousemove, true); + + // 取消鼠标移动事件 + document.addEventListener('mouseup', this.handlemouseup, true); + }, + + /** + * 鼠标移动 + * @param {*} e + */ + handlemousemove(e) { + e.stopPropagation(); + e.preventDefault(); + + this.printDesignerStore.move({ + x: e.pageX, + y: e.pageY, + }); + }, + + /** + * 鼠标up + */ + handlemouseup() { + document.removeEventListener('mousemove', this.handlemousemove, true); + document.removeEventListener('mouseup', this.handlemouseup, true); + + this.printDesignerStore.stopmove(); + }, + }, +}; diff --git a/src/components/PrintDesigner/src/panel/index.vue b/src/components/PrintDesigner/src/panel/index.vue new file mode 100644 index 0000000..1d8d606 --- /dev/null +++ b/src/components/PrintDesigner/src/panel/index.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/PrintDesigner/src/panel/layers.vue b/src/components/PrintDesigner/src/panel/layers.vue new file mode 100644 index 0000000..9a33e9f --- /dev/null +++ b/src/components/PrintDesigner/src/panel/layers.vue @@ -0,0 +1,79 @@ + + + + diff --git a/src/components/PrintDesigner/src/panel/options/index.vue b/src/components/PrintDesigner/src/panel/options/index.vue new file mode 100644 index 0000000..5dc5a87 --- /dev/null +++ b/src/components/PrintDesigner/src/panel/options/index.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/PrintDesigner/src/panel/page.vue b/src/components/PrintDesigner/src/panel/page.vue new file mode 100644 index 0000000..729d714 --- /dev/null +++ b/src/components/PrintDesigner/src/panel/page.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/components/PrintDesigner/src/panel/style.vue b/src/components/PrintDesigner/src/panel/style.vue new file mode 100644 index 0000000..a67f127 --- /dev/null +++ b/src/components/PrintDesigner/src/panel/style.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/PrintDesigner/src/store/printDesigner.js b/src/components/PrintDesigner/src/store/printDesigner.js new file mode 100644 index 0000000..112ecc8 --- /dev/null +++ b/src/components/PrintDesigner/src/store/printDesigner.js @@ -0,0 +1,228 @@ +import { defineStore } from 'pinia'; +import { getDefaultProps } from '../libs/props.js'; +import printComponents from '../../install'; + +const generate = () => { + const s = []; + const hexDigits = '0123456789abcdef'; + for (let i = 0; i < 36; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); + } + s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010 + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 + + const uuid = s.join(''); + return uuid; +}; + +export const usePrintDesignerStore = defineStore({ + id: 'print-designer-store', + state: () => ({ + zoom: 100, // 画布缩放百分比 + type: 'page', // 选中元素类型 + index: -1, // 选中元素索引 + uuid: -1, // 选中元素uuid + + originX: 0, // 选中元件的横向初始值 + originY: 0, // 选中元件的纵向初始值 + startX: 0, // 鼠标摁下时的横坐标 + startY: 0, // 鼠标摁下时的纵坐标 + moving: false, // 是否正在移动元件(参考线仅在移动元件时显示) + + activeElement: getDefaultProps(), // 选中对象,要么是元件,要么是页面 + + // 模板信息 + page: { + title: 'demo', + width: 750, + height: 550, + pageWidth: 750, + pageHeight: 550, + tempItems: [], // 模板已选项 + }, + optionItems: [], // 可选项 + + //模板参数 + tempId: '', // 模板Id + loading: false, // 是否正在初始化中 + + widgetSetting: printComponents.getWidgetsSetting(), // 模板组件默认属性 + }), + + actions: { + // 添加模板项 + addTempItem(item) { + const def = { uuid: generate(), top: 0, left: 0 }; + const setting = JSON.parse(JSON.stringify(item)); + + this.page.tempItems.push(Object.assign(setting, def)); + // 设置选中 + this.select({ + uuid: this.page.tempItems[this.page.tempItems.length - 1].uuid, + }); + }, + + // 初始化模板设计器 + async designerInit(tempInfo) { + this.initOptionItems(tempInfo.options); + this.initPage(tempInfo.tempValue); + }, + + // 初始化页面属性 + initPage(pageInfo) { + this.page = pageInfo; + // 补全默认样式 + const tempItems = pageInfo.tempItems + ? pageInfo.tempItems.map((item) => { + const optionItem = { + ...this.widgetSetting[item.type], + ...item, + style: { ...this.widgetSetting[item.type].style, ...(item.style || {}) }, + }; + return optionItem; + }) + : []; + + this.page.tempItems = tempItems; + }, + // 初始化可选对象 + initOptionItems(options) { + // 补全默认属性 + const optionsObject = options + ? options.map((item) => { + const optionItem = { + ...this.widgetSetting[item.type], + ...item, + style: { ...this.widgetSetting[item.type].style, ...(item.style || {}) }, + }; + return optionItem; + }) + : []; + + this.optionItems = optionsObject; + }, + + // 初始化选中对象 + initActive() { + this.activeElement = getDefaultProps(); + }, + + // 设置 mousemove 操作的初始值 + initmove(payload) { + this.startX = payload.startX; + this.startY = payload.startY; + this.originX = payload.originX; + this.originY = payload.originY; + this.moving = true; + }, + + // 选中元件与取消选中 + select(temp) { + this.uuid = temp.uuid; + if (temp.uuid === -1) { + this.activeElement = getDefaultProps(); + this.type = 'page'; + } else { + const widget = this.page.tempItems.find((w) => w.uuid === temp.uuid); + if (widget) { + this.activeElement = widget; + this.type = widget.type; + } + } + }, + + // 元件移动结束 + stopmove() { + this.moving = false; + }, + + // 移动元件 + move(track) { + const target = this.activeElement; + const dx = track.x - this.startX; + const dy = track.y - this.startY; + const left = this.originX + Math.floor((dx * 100) / this.zoom); + const top = this.originY + Math.floor((dy * 100) / this.zoom); + + target.left = left > 0 ? left : 0; + target.top = top > 0 ? top : 0; + }, + + // 调整元件尺寸 + resize(track) { + const dx = track.x - this.startX; + const dy = track.y - this.startY; + let value; + + if (track.type === 'right') { + value = this.originX + Math.floor((dx * 100) / this.zoom); + this.activeElement.width = value > 10 ? value : 10; + return; + } + + if (track.type === 'down') { + value = this.originX + Math.floor((dy * 100) / this.zoom); + this.activeElement.height = value > 10 ? value : 10; + return; + } + + if (track.type === 'left') { + const left = this.originX + Math.floor((dx * 100) / this.zoom); + const width = this.originY - Math.floor((dx * 100) / this.zoom); + this.activeElement.left = left > 0 ? left : 0; + this.activeElement.width = width > 10 ? width : 10; + return; + } + + if (track.type === 'up') { + const top = this.originX + Math.floor((dy * 100) / this.zoom); + const height = this.originY - Math.floor((dy * 100) / this.zoom); + this.activeElement.top = top > 0 ? top : 0; + this.activeElement.height = height > 10 ? height : 10; + } + }, + + // 更新元件初始 top 值 + updateSrollTop(top) { + this.top = top; + }, + + // 删除选中元件 + delete(uuid) { + const type = this.type; + if (type === 'page') return; + let index = 0; + this.page.tempItems.forEach((item, idx) => { + if (item.uuid === uuid) { + index = idx; + } + }); + // 删除元件 + this.page.tempItems.splice(index, 1); + + // 重置 activeElement + this.activeElement = getDefaultProps(); + this.type = 'page'; + this.uuid = -1; + }, + + // 更新数据 + updateData({ uuid, value }) { + const widget = this.page.tempItems.find((w) => w.uuid === uuid); + widget ? (widget.value = value) : ''; + }, + + // 设置模板Id + setTempId(id) { + this.tempId = id; + }, + + setLoading(flag) { + this.loading = flag; + }, + // 设置模板默认属性 + setWidgetSetting(settingObj) { + this.widgetSetting = settingObj; + }, + }, +}); diff --git a/src/components/PrintDesigner/src/utils/calc.js b/src/components/PrintDesigner/src/utils/calc.js new file mode 100644 index 0000000..267a983 --- /dev/null +++ b/src/components/PrintDesigner/src/utils/calc.js @@ -0,0 +1,15 @@ +export const mm2px = (mm) => { + return (mm * 96) / 25.4; +}; + +export const px2mm = (px) => { + return (px * 25.4) / 96; +}; + +export const px2pt = (px) => { + return (px * 72) / 96; +}; + +export const pt2px = (pt) => { + return (pt * 96) / 72; +}; diff --git a/src/components/PrintDesigner/src/utils/offset.js b/src/components/PrintDesigner/src/utils/offset.js new file mode 100644 index 0000000..410bc5e --- /dev/null +++ b/src/components/PrintDesigner/src/utils/offset.js @@ -0,0 +1,24 @@ +/** + * 获取元素位置 + * @param {*} el + */ +export function cumulativeOffset(el) { + let top = el.offsetTop; + let left = el.offsetLeft; + + return { + top: top, + left: left, + }; +} + +/** + * 判断元素是否在窗口内 + * @param {*} el + */ +export function checkInView(el) { + let rect = el.getBoundingClientRect(); + return ( + rect.top > 0 && rect.top < window.innerHeight && rect.left < window.innerWidth && rect.right > 0 + ); +} diff --git a/src/components/PrintDesigner/src/viewport/index.vue b/src/components/PrintDesigner/src/viewport/index.vue new file mode 100644 index 0000000..28ecdfc --- /dev/null +++ b/src/components/PrintDesigner/src/viewport/index.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src/components/PrintDesigner/src/viewport/size-control.vue b/src/components/PrintDesigner/src/viewport/size-control.vue new file mode 100644 index 0000000..911db92 --- /dev/null +++ b/src/components/PrintDesigner/src/viewport/size-control.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/components/registerGlobComp.ts b/src/components/registerGlobComp.ts index 3333c2a..b695d23 100644 --- a/src/components/registerGlobComp.ts +++ b/src/components/registerGlobComp.ts @@ -30,12 +30,15 @@ import CustomPage from '@/components/CustomPage'; import OrderTimeLine from '@/components/OrderTimeLine'; import DataDicPicker from '@/components/DataDicPicker'; import BatchHandler from '@/components/BatchHandler'; +import PrintDesigner, { lodop } from '@/components/PrintDesigner'; +import printDesignerInstall from '@/components/PrintDesigner/install.js'; export async function registerGlobComp(app: App) { app .use(Antd) .use(VxeUI) .use(VXETable) + .use(printDesignerInstall) .component('RelativeTime', RelativeTime) .component('JForm', JForm) .component('JFormItem', JFormItem) @@ -53,7 +56,8 @@ export async function registerGlobComp(app: App) { .component('CustomPage', CustomPage) .component('OrderTimeLine', OrderTimeLine) .component('DataDicPicker', DataDicPicker) - .component('BatchHandler', BatchHandler); + .component('BatchHandler', BatchHandler) + .component('PrintDesigner', PrintDesigner); VxeUI.use(VxeUIPluginRenderAntd); VXETable.setup(componentSetting.vxeTable); @@ -75,6 +79,7 @@ export async function registerGlobComp(app: App) { app.config.globalProperties.$defHttp = defHttp; app.config.globalProperties.$vh = (document.documentElement.clientHeight || document.body.clientHeight) / 100; + app.config.globalProperties.$lodop = lodop; await enumsInstall(app); await tagInstall(app); diff --git a/src/enums/biz/printType.ts b/src/enums/biz/printType.ts new file mode 100644 index 0000000..0f57381 --- /dev/null +++ b/src/enums/biz/printType.ts @@ -0,0 +1,13 @@ +import { BaseEnum, BaseEnumItem } from '@/enums/baseEnum'; + +const PRINT_TYPE: BaseEnum = new BaseEnum(); +PRINT_TYPE.set('PURCHASE_ORDER', new BaseEnumItem(1, '采购订单')); +PRINT_TYPE.set('RECEIVE_SHEET', new BaseEnumItem(2, '采购收货单')); +PRINT_TYPE.set('PURCHASE_RETURN', new BaseEnumItem(3, '采购退货单')); +PRINT_TYPE.set('RETAIL_OUT', new BaseEnumItem(4, '零售出库单')); +PRINT_TYPE.set('RETAIL_RETURN', new BaseEnumItem(5, '零售退货单')); +PRINT_TYPE.set('SALE_ORDER', new BaseEnumItem(6, '销售订单')); +PRINT_TYPE.set('SALE_OUT', new BaseEnumItem(7, '销售出库单')); +PRINT_TYPE.set('SALE_RETURN', new BaseEnumItem(8, '销售退货单')); + +export { PRINT_TYPE }; diff --git a/src/layouts/default/header/index.vue b/src/layouts/default/header/index.vue index bca5083..d13eeab 100644 --- a/src/layouts/default/header/index.vue +++ b/src/layouts/default/header/index.vue @@ -46,6 +46,7 @@ diff --git a/src/views/base-data/print-template/demo-data.vue b/src/views/base-data/print-template/demo-data.vue new file mode 100644 index 0000000..6773ba3 --- /dev/null +++ b/src/views/base-data/print-template/demo-data.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/views/base-data/print-template/index.vue b/src/views/base-data/print-template/index.vue new file mode 100644 index 0000000..92fc03c --- /dev/null +++ b/src/views/base-data/print-template/index.vue @@ -0,0 +1,176 @@ + + + + diff --git a/src/views/base-data/print-template/modify.vue b/src/views/base-data/print-template/modify.vue new file mode 100644 index 0000000..e6bab68 --- /dev/null +++ b/src/views/base-data/print-template/modify.vue @@ -0,0 +1,123 @@ + + diff --git a/src/views/base-data/print-template/setting.vue b/src/views/base-data/print-template/setting.vue new file mode 100644 index 0000000..1a46edc --- /dev/null +++ b/src/views/base-data/print-template/setting.vue @@ -0,0 +1,137 @@ + + diff --git a/src/views/sc/purchase/order/detail.vue b/src/views/sc/purchase/order/detail.vue index dfd1614..d20b425 100644 --- a/src/views/sc/purchase/order/detail.vue +++ b/src/views/sc/purchase/order/detail.vue @@ -131,14 +131,15 @@ diff --git a/src/components/Selector/src/CustomerSelector.vue b/src/components/Selector/src/CustomerSelector.vue index ae2985c..600d305 100644 --- a/src/components/Selector/src/CustomerSelector.vue +++ b/src/components/Selector/src/CustomerSelector.vue @@ -10,7 +10,7 @@