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 0000000..b5771e2 Binary files /dev/null and b/ry-h5/static/logo.png differ diff --git a/ry-h5/static/overlay/panorama.svg b/ry-h5/static/overlay/panorama.svg new file mode 100644 index 0000000..0392b50 --- /dev/null +++ b/ry-h5/static/overlay/panorama.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + 全景取景 (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): 申请摄像头权限并把实时流挂到