From da7c19af6c60b07764163ab290926270c4392e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?= <12369755+htcloud1@user.noreply.gitee.com> Date: Sat, 22 Aug 2026 16:27:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(detail):=20=E5=8F=82=E4=BC=9A=E4=BA=BA?= =?UTF-8?q?=E8=A1=A8=E6=96=B0=E5=A2=9E=20=E5=A2=9E=E5=80=BC=E7=A8=8E?= =?UTF-8?q?=E5=8F=8A=E9=99=84=E5=8A=A0/=E6=91=98=E8=A6=81/=E7=8E=B0?= =?UTF-8?q?=E5=9C=BA=E7=85=A7=E7=89=87=203=20=E5=88=97=20+=20=E5=8A=B3?= =?UTF-8?q?=E5=8A=A1=E5=8D=8F=E8=AE=AE=E5=B1=95=E7=A4=BA,=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=3D=E5=8A=B3=E5=8A=A1=E5=BD=A2=E5=BC=8F,=20=E8=B4=B9?= =?UTF-8?q?=E9=A1=B9=E6=94=B9=E5=90=8D=20=E5=BA=94=E5=8F=91=E9=87=91?= =?UTF-8?q?=E9=A2=9D/=E4=B8=AA=E7=A8=8E=E7=A8=8E=E9=87=91/=E5=AE=9E?= =?UTF-8?q?=E5=8F=91=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/domain/BizMeetingAttendee.java | 12 + .../business/BizMeetingAttendeeMapper.xml | 19 +- ry-h5/.gitignore | 4 + ry-h5/App.uvue | 51 ++ ry-h5/composables/useCamera.ts | 93 ++++ ry-h5/index.html | 31 ++ ry-h5/main.uts | 9 + ry-h5/manifest.json | 82 ++++ ry-h5/nginx.conf.example | 44 ++ ry-h5/pages.json | 38 ++ ry-h5/pages/index/index.uvue | 154 +++++++ ry-h5/pages/panorama/index.uvue | 299 ++++++++++++ ry-h5/pages/signin/index.uvue | 299 ++++++++++++ ry-h5/platformConfig.json | 5 + ry-h5/static/logo.png | Bin 0 -> 4023 bytes ry-h5/static/overlay/panorama.svg | 18 + ry-h5/static/overlay/signin.svg | 16 + ry-h5/uni.scss | 76 +++ ry-h5/utils/camera.ts | 138 ++++++ ry-ocr-java/.gitignore | 38 ++ ry-ocr-java/README.md | 373 +++++++++++++++ ry-ocr-java/pom.xml | 148 ++++++ .../java/com/ruoyi/ocr/OcrApplication.java | 19 + .../ruoyi/ocr/api/GlobalExceptionHandler.java | 85 ++++ .../java/com/ruoyi/ocr/api/OcrController.java | 181 ++++++++ .../com/ruoyi/ocr/config/OcrProperties.java | 71 +++ .../java/com/ruoyi/ocr/core/CtcDecoder.java | 53 +++ .../com/ruoyi/ocr/core/DbPostProcessor.java | 150 ++++++ .../java/com/ruoyi/ocr/core/Dictionary.java | 56 +++ .../com/ruoyi/ocr/core/ImageProcessor.java | 227 +++++++++ .../java/com/ruoyi/ocr/core/OcrEngine.java | 218 +++++++++ .../java/com/ruoyi/ocr/core/PdfProcessor.java | 86 ++++ .../java/com/ruoyi/ocr/core/TextDetector.java | 156 +++++++ .../com/ruoyi/ocr/core/TextRecognizer.java | 181 ++++++++ .../ocr/exception/OcrTimeoutException.java | 17 + .../com/ruoyi/ocr/model/HealthResponse.java | 27 ++ .../com/ruoyi/ocr/model/InvoiceFields.java | 68 +++ .../com/ruoyi/ocr/model/InvoiceResult.java | 65 +++ .../java/com/ruoyi/ocr/model/OcrLine.java | 36 ++ .../ruoyi/ocr/model/PathRecognizeRequest.java | 21 + .../com/ruoyi/ocr/model/QrDecodeResult.java | 31 ++ .../ruoyi/ocr/service/InvoiceExtractor.java | 434 ++++++++++++++++++ .../java/com/ruoyi/ocr/service/QrDecoder.java | 159 +++++++ .../ruoyi/ocr/service/RecognizeService.java | 312 +++++++++++++ .../java/com/ruoyi/ocr/util/AmountUtils.java | 296 ++++++++++++ .../src/main/resources/application.yml | 44 ++ ry-vue3/src/views/manager/MeetingDetail.vue | 51 +- 47 files changed, 4976 insertions(+), 15 deletions(-) create mode 100644 ry-h5/.gitignore create mode 100644 ry-h5/App.uvue create mode 100644 ry-h5/composables/useCamera.ts create mode 100644 ry-h5/index.html create mode 100644 ry-h5/main.uts create mode 100644 ry-h5/manifest.json create mode 100644 ry-h5/nginx.conf.example create mode 100644 ry-h5/pages.json create mode 100644 ry-h5/pages/index/index.uvue create mode 100644 ry-h5/pages/panorama/index.uvue create mode 100644 ry-h5/pages/signin/index.uvue create mode 100644 ry-h5/platformConfig.json create mode 100644 ry-h5/static/logo.png create mode 100644 ry-h5/static/overlay/panorama.svg create mode 100644 ry-h5/static/overlay/signin.svg create mode 100644 ry-h5/uni.scss create mode 100644 ry-h5/utils/camera.ts create mode 100644 ry-ocr-java/.gitignore create mode 100644 ry-ocr-java/README.md create mode 100644 ry-ocr-java/pom.xml create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/OcrApplication.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/api/GlobalExceptionHandler.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/api/OcrController.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/config/OcrProperties.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/CtcDecoder.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/DbPostProcessor.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/Dictionary.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/ImageProcessor.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/OcrEngine.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/PdfProcessor.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/TextDetector.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/core/TextRecognizer.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/exception/OcrTimeoutException.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/HealthResponse.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/InvoiceFields.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/InvoiceResult.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/OcrLine.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/PathRecognizeRequest.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/model/QrDecodeResult.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/service/InvoiceExtractor.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/service/QrDecoder.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/service/RecognizeService.java create mode 100644 ry-ocr-java/src/main/java/com/ruoyi/ocr/util/AmountUtils.java create mode 100644 ry-ocr-java/src/main/resources/application.yml diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizMeetingAttendee.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizMeetingAttendee.java index fb48e96..090e86d 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizMeetingAttendee.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizMeetingAttendee.java @@ -38,6 +38,12 @@ public class BizMeetingAttendee extends BaseEntity { private BigDecimal feePreTax; private BigDecimal tax; private BigDecimal fee; + /** 增值税及附加成本 (财务口径: 平台承担的开票税 + 附加税) */ + private BigDecimal vatAndSurcharge; + /** 摘要 (备注/说明) */ + private String summary; + /** 现场照片 (OSS URLs, 多张用逗号分隔) */ + private String onSitePhotos; /* ===== 审计 + 签字结果 ===== */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date signedAt; @@ -97,6 +103,12 @@ public class BizMeetingAttendee extends BaseEntity { public void setTax(BigDecimal tax) { this.tax = tax; } public BigDecimal getFee() { return fee; } public void setFee(BigDecimal fee) { this.fee = fee; } + public BigDecimal getVatAndSurcharge() { return vatAndSurcharge; } + public void setVatAndSurcharge(BigDecimal vatAndSurcharge) { this.vatAndSurcharge = vatAndSurcharge; } + public String getSummary() { return summary; } + public void setSummary(String summary) { this.summary = summary; } + public String getOnSitePhotos() { return onSitePhotos; } + public void setOnSitePhotos(String onSitePhotos) { this.onSitePhotos = onSitePhotos; } public Date getSignedAt() { return signedAt; } public void setSignedAt(Date signedAt) { this.signedAt = signedAt; } public String getSignedIp() { return signedIp; } diff --git a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizMeetingAttendeeMapper.xml b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizMeetingAttendeeMapper.xml index 7619993..553773c 100644 --- a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizMeetingAttendeeMapper.xml +++ b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizMeetingAttendeeMapper.xml @@ -22,6 +22,9 @@ + + + @@ -49,10 +52,13 @@ insert into biz_meeting_attendee(meeting_id, user_id, name, phone, work_unit, department, title, id_card, bank_card, bank_name, bank_branch, bank_region, bank_address, account_name, - id_card_attachments, labor_form, fee_pre_tax, tax, fee, create_by, create_time) + id_card_attachments, labor_form, fee_pre_tax, tax, fee, vat_and_surcharge, summary, on_site_photos, + create_by, create_time) values(#{meetingId}, #{userId}, #{name}, #{phone}, #{workUnit}, #{department}, #{title}, #{idCard}, #{bankCard}, #{bankName}, #{bankBranch}, #{bankRegion}, #{bankAddress}, #{accountName}, - #{idCardAttachments}, #{laborForm}, #{feePreTax}, #{tax}, #{fee}, #{createBy}, sysdate()) + #{idCardAttachments}, #{laborForm}, #{feePreTax}, #{tax}, #{fee}, + #{vatAndSurcharge}, #{summary}, #{onSitePhotos}, + #{createBy}, sysdate()) @@ -83,6 +89,9 @@ fee_pre_tax = #{feePreTax}, tax = #{tax}, fee = #{fee}, + vat_and_surcharge = #{vatAndSurcharge}, + summary = #{summary}, + on_site_photos = #{onSitePhotos}, update_by = #{updateBy}, update_time = sysdate() @@ -125,15 +134,15 @@ delete from biz_meeting_attendee where meeting_id = #{meetingId} and user_id = #{userId} + + + +
+ + + + \ No newline at end of file diff --git a/ry-h5/main.uts b/ry-h5/main.uts new file mode 100644 index 0000000..8bdcc86 --- /dev/null +++ b/ry-h5/main.uts @@ -0,0 +1,9 @@ +import App from './App.uvue' + +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} \ No newline at end of file diff --git a/ry-h5/manifest.json b/ry-h5/manifest.json new file mode 100644 index 0000000..88dd4f1 --- /dev/null +++ b/ry-h5/manifest.json @@ -0,0 +1,82 @@ +{ + "name": "ry-h5", + "appid": "__UNI__F1A462A", + "description": "证件/会议拍摄预研 (H5)", + "versionName": "1.0.0", + "versionCode": "100", + "uni-app-x": {}, + "quickapp": {}, + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "mp-alipay": { + "usingComponents": true + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + }, + "vueVersion": "3", + "h5": { + "title": "证件/会议拍摄", + "router": { + "mode": "hash", + "base": "/camera/" + }, + "publicPath": "/camera/", + "devServer": { + "https": false, + "port": 8090, + "disableHostCheck": true, + "publicPath": "/camera/" + }, + "sdkConfigs": {}, + "optimization": { + "treeShaking": { + "enable": true + } + } + }, + "app": { + "distribute": { + "icons": { + "android": { + "hdpi": "", + "xhdpi": "", + "xxhdpi": "", + "xxxhdpi": "" + } + } + } + }, + "app-android": { + "distribute": { + "modules": {}, + "icons": { + "hdpi": "", + "xhdpi": "", + "xxhdpi": "", + "xxxhdpi": "" + }, + "splashScreens": { + "default": {} + } + } + }, + "app-ios": { + "distribute": { + "modules": {}, + "icons": {}, + "splashScreens": {} + } + } +} \ No newline at end of file diff --git a/ry-h5/nginx.conf.example b/ry-h5/nginx.conf.example new file mode 100644 index 0000000..76b6347 --- /dev/null +++ b/ry-h5/nginx.conf.example @@ -0,0 +1,44 @@ +# nginx 配置示例 — 把这个 location 块贴进你已有的 HTTPS server { ... } 里 +# +# 打包: +# HBuilderX → 发行 → 网站-手机H5 +# 产物: unpackage/dist/build/h5/ +# +# 部署: +# sudo cp -r unpackage/dist/build/h5/ /var/www/ry-h5/ +# +# 真机访问: +# https://<你的域名或IP>/camera/ + +# ========== 单 location 块(粘到现有 server 里) ========== + +location /camera/ { + alias /var/www/ry-h5/; + index index.html; + try_files $uri $uri/ /camera/index.html; + + # 长缓存静态资源(JS/CSS/SVG/PNG) + location ~* ^/camera/static/.*\.(js|css|svg|png|jpg|jpeg|gif|woff2?)$ { + alias /var/www/ry-h5/static/; + expires 7d; + add_header Cache-Control "public, max-age=604800, immutable"; + } +} + + +# ========== 完整 server 块参考(若你想独立跑一个 server) ========== + +# HTTPS(用你已有的证书路径替换) +# server { +# listen 443 ssl; +# server_name your-domain.com; +# +# ssl_certificate /etc/nginx/ssl/your-cert.pem; +# ssl_certificate_key /etc/nginx/ssl/your-cert-key.pem; +# +# location /camera/ { +# alias /var/www/ry-h5/; +# index index.html; +# try_files $uri $uri/ /camera/index.html; +# } +# } \ No newline at end of file diff --git a/ry-h5/pages.json b/ry-h5/pages.json new file mode 100644 index 0000000..b5ceaff --- /dev/null +++ b/ry-h5/pages.json @@ -0,0 +1,38 @@ +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "取景拍摄", + "navigationStyle": "custom", + "backgroundColor": "#0d0d0d" + } + }, + { + "path": "pages/signin/index", + "style": { + "navigationBarTitleText": "签到表取景", + "navigationStyle": "custom", + "backgroundColor": "#000000", + "disableScroll": true + } + }, + { + "path": "pages/panorama/index", + "style": { + "navigationBarTitleText": "全景取景", + "navigationStyle": "custom", + "backgroundColor": "#000000", + "disableScroll": true + } + } + ], + "globalStyle": { + "navigationStyle": "custom", + "navigationBarTextStyle": "white", + "navigationBarTitleText": "取景拍摄", + "navigationBarBackgroundColor": "#000000", + "backgroundColor": "#0d0d0d" + }, + "uniIdRouter": {} +} \ No newline at end of file diff --git a/ry-h5/pages/index/index.uvue b/ry-h5/pages/index/index.uvue new file mode 100644 index 0000000..fe94d8d --- /dev/null +++ b/ry-h5/pages/index/index.uvue @@ -0,0 +1,154 @@ + + + + + \ No newline at end of file diff --git a/ry-h5/pages/panorama/index.uvue b/ry-h5/pages/panorama/index.uvue new file mode 100644 index 0000000..bf6dcc1 --- /dev/null +++ b/ry-h5/pages/panorama/index.uvue @@ -0,0 +1,299 @@ + + + + + \ No newline at end of file diff --git a/ry-h5/pages/signin/index.uvue b/ry-h5/pages/signin/index.uvue new file mode 100644 index 0000000..f93bdb9 --- /dev/null +++ b/ry-h5/pages/signin/index.uvue @@ -0,0 +1,299 @@ + + + + + \ No newline at end of file diff --git a/ry-h5/platformConfig.json b/ry-h5/platformConfig.json new file mode 100644 index 0000000..46d14c7 --- /dev/null +++ b/ry-h5/platformConfig.json @@ -0,0 +1,5 @@ +{ + "targets": [ + "H5" + ] +} \ No newline at end of file diff --git a/ry-h5/static/logo.png b/ry-h5/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_ + + + + + + + + + + + + 全景取景 (16:9) + + 当前显示 9 : 16 + + 建议横屏拍摄 · 横屏时为 16:9 + \ No newline at end of file diff --git a/ry-h5/static/overlay/signin.svg b/ry-h5/static/overlay/signin.svg new file mode 100644 index 0000000..823574b --- /dev/null +++ b/ry-h5/static/overlay/signin.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + A4 签到表 + + 将签到表完整放入绿框 + \ No newline at end of file diff --git a/ry-h5/uni.scss b/ry-h5/uni.scss new file mode 100644 index 0000000..b9249e9 --- /dev/null +++ b/ry-h5/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/ry-h5/utils/camera.ts b/ry-h5/utils/camera.ts new file mode 100644 index 0000000..bcfaed7 --- /dev/null +++ b/ry-h5/utils/camera.ts @@ -0,0 +1,138 @@ +/** + * 摄像头工具 (H5 only) + * + * - openCamera(video, facing): 申请摄像头权限并把实时流挂到